Browse Source

Adicionando modulo de redirects e redirect options

master
guilherme guia 1 year ago
parent
commit
413e5527d5
  1. 58
      .env.example
  2. 34
      Dockerfile
  3. 128
      app/Helpers/Crypt.php
  4. 35
      app/Helpers/Helper.php
  5. 33
      app/Http/Controllers/AgentesController.php
  6. 186
      app/Http/Controllers/DashboardController.php
  7. 94
      app/Http/Controllers/EmpresaController.php
  8. 131
      app/Http/Controllers/RedirectController.php
  9. 235
      app/Http/Controllers/RedirectOptionController.php
  10. 124
      app/Http/Controllers/ResponseStepController.php
  11. 179
      app/Http/Controllers/StepsController.php
  12. 2
      app/Http/Middleware/Authenticate.php
  13. 1
      app/Http/Middleware/RedirectIfAuthenticated.php
  14. 1
      app/Models/Agentes.php
  15. 7
      app/Models/Grupos.php
  16. 23
      app/Models/Redirect.php
  17. 36
      app/Models/RedirectOption.php
  18. 5
      app/Models/SystemMessage.php
  19. 20
      app/Models/Types.php
  20. 2
      app/Providers/AuthServiceProvider.php
  21. 1194
      composer.lock
  22. 2
      package-lock.json
  23. 101
      public/js/cadastroSystemMessage.js
  24. 146
      resources/views/admin/agentesLogados.blade.php
  25. 377
      resources/views/admin/dashboard.blade.php
  26. 42
      resources/views/admin/editPausas.blade.php
  27. 45
      resources/views/admin/editSetores.blade.php
  28. 67
      resources/views/admin/editSupervisores.blade.php
  29. 52
      resources/views/admin/editUsers.blade.php
  30. 34
      resources/views/admin/empresas.blade.php
  31. 34
      resources/views/admin/filas.blade.php
  32. 15
      resources/views/admin/pausas.blade.php
  33. 212
      resources/views/admin/redirectOption.blade.php
  34. 149
      resources/views/admin/redirects.blade.php
  35. 167
      resources/views/admin/responseStep.blade.php
  36. 119
      resources/views/admin/steps.blade.php
  37. 85
      resources/views/admin/systemMessage.blade.php
  38. 62
      resources/views/admin/users.blade.php
  39. 7
      resources/views/components/modal.blade.php
  40. 73
      resources/views/components/modalEditEmpresa.blade.php
  41. 66
      resources/views/components/modalEditRedirect.blade.php
  42. 117
      resources/views/components/modalEditRedirectOption.blade.php
  43. 124
      resources/views/components/modalEditStep.blade.php
  44. 55
      resources/views/components/modalEditSystemMessage.blade.php
  45. 131
      resources/views/components/modalEmpresa.blade.php
  46. 73
      resources/views/components/modalRedirect.blade.php
  47. 128
      resources/views/components/modalRedirectOption.blade.php
  48. 88
      resources/views/components/modalResponseStep.blade.php
  49. 103
      resources/views/components/modalStep.blade.php
  50. 55
      resources/views/components/modalSupervisores.blade.php
  51. 90
      resources/views/components/modalSystemMessage.blade.php
  52. 9
      resources/views/layouts/app.blade.php
  53. 9
      resources/views/layouts/guest.blade.php
  54. 8
      resources/views/layouts/menu.blade.php
  55. 3
      resources/views/layouts/navegation.blade.php
  56. 135
      routes/web.php

58
.env.example

@ -1,58 +0,0 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

34
Dockerfile

@ -0,0 +1,34 @@
# Usar imagem do php 8
FROM php:8.0-fpm
# Atualizar pacotes e instalar dependencias
RUN apt-get update && apt-get install -y \
git \
unzap \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
libzip-dev
# Instalar dependencias PHP
RUN docker-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd pdo pdo_pgsql
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php composer-setup.php --filename=composer --install-dir=/bin
#Diretorio de trabalho
WORKDIR /var/www/html
RUN git clone http://192.168.115.233:3000/guilherme.guia/simples-painel.git
RUN php /bin/composer install
EXPOSE 9000
CMD ["php-fpm"]
# docker image build -t client_whatsapp .
# docker run -d --name client_whatsapp -p 8001:80 client_whatsapp

128
app/Helpers/Crypt.php

@ -1,71 +1,67 @@
<?php
namespace app\Helpers;
/**
* Description of Cripto
*
* @author Lucas Awade
*/
class Crypt {
private $message;
private $key;
private $option;
private $tag;
private $cipher;
private $ivlen;
private $iv;
private $textcrypt;
const CONF_CIPHER_CRYPT = 'aes-256-cbc';
namespace app\Helpers;
class Crypt
{
private $message;
private $key;
private $option;
private $tag;
private $cipher;
private $ivlen;
private $iv;
private $textcrypt;
const CONF_CIPHER_CRYPT = 'aes-256-cbc';
function __construct($cipher = null, $key = null, $option = OPENSSL_RAW_DATA, $tag = null)
{
if (!$cipher) {
$this->cipher = self::CONF_CIPHER_CRYPT;
} else {
$this->cipher = $cipher;
function __construct($cipher = null, $key = null, $option = OPENSSL_RAW_DATA, $tag = null) {
if (!$cipher) {
$this->cipher = self::CONF_CIPHER_CRYPT;
} else {
$this->cipher = $cipher;
}
$this->key = $key;
$this->option = $option;
$this->tag = $tag;
$this->openssl_crypt();
}
public function encrypt($message = null) {
$this->setMessage($message);
$encrypt = openssl_encrypt($this->message, $this->cipher, $this->key, $this->option, $this->iv);
$hashcode = hash_hmac('sha256', $encrypt, $this->key, true);
$this->textcrypt = base64_encode($this->iv . $hashcode . $encrypt);
return $this->textcrypt;
}
public function decrypt($textcrypt = null) {
$c = base64_decode($textcrypt);
$this->iv = substr($c, 0, $this->ivlen);
$hmac = substr($c, $this->ivlen, 32);
$ciphertext_raw = substr($c, $this->ivlen + 32);
$original_plaintext = openssl_decrypt($ciphertext_raw, $this->cipher, $this->key, $options = OPENSSL_RAW_DATA, $this->iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $this->key, true);
if (hash_equals($hmac, $calcmac)) {
return $original_plaintext;
}
}
private function openssl_crypt() {
if (in_array(strtolower($this->cipher), openssl_get_cipher_methods())) {
$this->ivlen = openssl_cipher_iv_length($this->cipher);
$this->iv = openssl_random_pseudo_bytes($this->ivlen);
}
}
public function setKey($key) {
$this->key = $key;
}
public function setOption($option) {
$this->option = $option;
}
$this->key = $key;
$this->option = $option;
$this->tag = $tag;
$this->openssl_crypt();
}
public function encrypt($message = null)
{
$this->setMessage($message);
$encrypt = openssl_encrypt($this->message, $this->cipher, $this->key, $this->option, $this->iv);
$hashcode = hash_hmac('sha256', $encrypt, $this->key, true);
$this->textcrypt = base64_encode($this->iv . $hashcode . $encrypt);
return $this->textcrypt;
}
public function decrypt($textcrypt = null)
{
$c = base64_decode($textcrypt);
$this->iv = substr($c, 0, $this->ivlen);
$hmac = substr($c, $this->ivlen, 32);
$ciphertext_raw = substr($c, $this->ivlen + 32);
$original_plaintext = openssl_decrypt($ciphertext_raw, $this->cipher, $this->key, $options = OPENSSL_RAW_DATA, $this->iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $this->key, true);
if (hash_equals($hmac, $calcmac)) {
return $original_plaintext;
public function setTag($tag) {
$this->tag = $tag;
}
}
private function openssl_crypt()
{
if (in_array(strtolower($this->cipher), openssl_get_cipher_methods())) {
$this->ivlen = openssl_cipher_iv_length($this->cipher);
$this->iv = openssl_random_pseudo_bytes($this->ivlen);
public function setMessage($message) {
$this->message = $message;
}
}
public function setKey($key)
{
$this->key = $key;
}
public function setOption($option)
{
$this->option = $option;
}
public function setTag($tag)
{
$this->tag = $tag;
}
public function setMessage($message)
{
$this->message = $message;
}
}
}

35
app/Helpers/Helper.php

@ -9,41 +9,22 @@ class Helper
return strtoupper($string);
}
public static function parse_obj(array $array)
{
return (object) $array;
}
public static function last_day_in_mouth()
{
$mes = date('m');
$ano = date('Y');
$data_fim = date("Y-m-" . cal_days_in_month(CAL_GREGORIAN, $mes, $ano));
return $data_fim;
}
// public static function formatedArray(object $object)
// {
// $data = [];
// // dd($object);;
// foreach ($object as $objectKey => $value) {
// (array) $value;
// foreach ($objectKey as $keys => $value) {
// $obj[$keys] = $value;
// }
// dd(array_keys($obj));
// die;
// // $data[] = self::parse_obj($obj);
// }
// return $data;
// }

33
app/Http/Controllers/AgentesController.php

@ -11,18 +11,11 @@ use Illuminate\Support\Facades\Hash;
class AgentesController extends Controller
{
//
public function index(Request $request)
{
$selected = (object) ['isSelected' => false, 'isAtivo' => 'ativo'];
$maior_matricula = null;
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
@ -40,14 +33,9 @@ class AgentesController extends Controller
->where('ue.id_empresa', $id_empresa)
->first();
if ($request->status) {
$status = $request->status == 'ativo' ? true : false;
$selected = (object) ['isSelected' => true, 'isAtivo' => $request->status];
$agentes->where('u.status', $status);
} else {
$agentes->where('u.status', true);
@ -58,44 +46,30 @@ class AgentesController extends Controller
$agentes->where(DB::raw('LOWER(u.nome)'), 'like', "%$pesquisa%");
}
$agentes = $agentes->orderBy('u.nome', 'asc')->get();
$maior_matricula = $consulta_matricula->maior_matricula + 1;
return view('admin.users', compact('agentes', 'selected', 'maior_matricula'));
}
public function create(Request $request)
public function store(Request $request)
{
$request->validate([
'nome' => ['required'],
'email' => ['required'],
'email' => ['required', 'unique:'.User::class],
'matricula' => ['required'],
'status' => ['required'],
]);
if (empty($request->nome) || empty($request->email) || empty($request->matricula) || empty($request->status)) {
return redirect('users');
}
$status = $request->status === 'on' ? true : false;
$isMatriculaRegister = Agentes::where('matricula', $request->matricula)->get()->count();
if ($isMatriculaRegister > 0) {
return redirect('/users')->with('status', ' matricula vinculada com outro agente');
}
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
@ -110,7 +84,6 @@ class AgentesController extends Controller
"password" => Hash::make('123'),
]);
GrupoUsuario::create([
'id_usuario' => $agente->id,
'id_grupo' => 3
@ -126,8 +99,8 @@ class AgentesController extends Controller
return redirect('users')->with('status', 'Agente cadastrado');
} catch (\Throwable $th) {
DB::rollBack();
dd($th->getMessage());
return redirect('users')->with('status', 'Erro ao tentar cadastrar agente');
}
}

186
app/Http/Controllers/DashboardController.php

@ -2,29 +2,36 @@
namespace App\Http\Controllers;
use app\Helpers\Crypt;
use App\Helpers\Helper;
use App\Models\Atendimentos;
use App\Models\Filas;
use App\Models\Supervisor;
use DateTime;
use GuzzleHttp\Psr7\Request;
use Illuminate\Support\Facades\DB;
class DashboardController extends Controller
{
//
public function index()
{
return view('admin.dashboard');
}
public function index()
public function getRelatorioDados()
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$atendimentosData = DB::table('supervisor as a')
->leftJoin('atendimento as b', 'b.id_usuario', '=', 'a.id_usuario')
->select('a.nome', DB::raw('count(b.id_usuario) as qtde_atendimento'))
$atendimentosData = DB::table('usuarios as u')
->leftJoin('atendimento as a', 'u.id', '=', 'a.id_usuario')
->select('u.nome', DB::raw('count(a.id_usuario) as qtde_atendimento'))
->where('a.id_empresa', $id_empresa)
->groupBy('a.nome')
->groupBy('u.nome')
->get();
$atendimentosStatusData = DB::table('supervisor as a')
->leftJoin('eventos_atendimento as b', 'a.id_usuario', '=', 'b.id_usuario')
->select('b.evento', DB::raw('count(b.evento) as qtde_usados'))
@ -39,94 +46,172 @@ class DashboardController extends Controller
->groupBy('q.nome')
->get();
$data_inicio = date("Y-m-01");
$data_atual = date('Y-m-d');
$data_fim = Helper::last_day_in_mouth();
$mes = date('m');
$ano = date('Y');
$data_fim = date("Y-m-" . cal_days_in_month(CAL_GREGORIAN, $mes, $ano));
$atendimentosPorMes = Atendimentos::whereDate('data_reg', '>=', $data_inicio)
->whereDate('data_reg', '<=', $data_fim)
->where('id_empresa', $id_empresa)
->count();
$atendimentosPorMes = $this->getAtendimentosMes($data_inicio, $data_fim);
$atendimentosDia = $this->getAtendimentoDia($data_atual);
$totalAgentesAtivos = $this->getAgentesAtivos();
$totalAgentesPausa = $this->getAgentesPausa();
$relatoriosAtendimento = $this->relatoriosDados();
$total_atendimentos = $this->totalAtendimentos($atendimentosData);
$atendimentosDia = Atendimentos::whereDate('data_reg', '=', $data_atual)
->where('id_empresa', $id_empresa)
->count();
$data = [
'atendimentosData' => $atendimentosData,
'atendimentosStatusData' => $atendimentosStatusData,
'filasMaisUsadas' => $filasMaisUsadas,
'atendimentosPorMes' => $atendimentosPorMes,
'atendimentosDia' => $atendimentosDia,
'totalAgentesAtivos' => $totalAgentesAtivos,
'totalAgentesPausa' => $totalAgentesPausa,
'relatoriosAtendimento' => $relatoriosAtendimento,
'total_atendimentos' => $total_atendimentos,
];
$totalAgentesAtivos = DB::table('supervisor as s')
->where([
['s.id_empresa', $id_empresa],
])
->count();
return response()->json(['status' => true, 'data' => $data]);
}
$totalAgentesPausa = DB::table('supervisor as s')
->where([
['s.id_empresa', $id_empresa],
['s.status', 'PAUSA'],
])
->count();
private function totalAtendimentos($atendimentos)
{
$total_atendimentos = 0;
foreach ($atendimentos as $atendimento) {
$total_atendimentos += $atendimento->qtde_atendimento;
}
$supervisores = Supervisor::where('id_empresa',$id_empresa)->get();
return $total_atendimentos;
}
private function relatoriosDados()
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$relatoriosAtendimento = DB::table('queues as q')
$relatorio = DB::table('queues as q')
->leftJoin('supervisor as s', 's.fila', '=', 'q.nome')
->leftJoin('atendimento as a', 'a.id_usuario', '=', 's.id_usuario')
->select('q.id as fila_id', 'q.nome as fila', DB::raw('count( DISTINCT s.id) as quantidade_supervisores'), DB::raw('COALESCE(COUNT(a.id), 0) AS quantidade_atendimentos'))
->where([
['s.id_empresa', $id_empresa],
['q.is_ativa', true],
['q.id_empresa', $id_empresa],
['q.is_ativa', true],
])
->groupBy('q.nome', 'q.id')
->orderBy('q.nome', 'asc')
->get();
return $relatorio;
}
private function getAtendimentosMes($data_inicio, $data_fim)
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$atendimentosPorMes = Atendimentos::whereDate('data_reg', '>=', $data_inicio)
->whereDate('data_reg', '<=', $data_fim)
->where('id_empresa', $id_empresa)
->count();
return $atendimentosPorMes;
}
$jsonGrafico1 = json_encode($atendimentosData);
$jsonGrafico2 = json_encode($atendimentosStatusData);
$jsonGrafico3 = json_encode($filasMaisUsadas);
private function getAtendimentoDia($data_atual)
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$total_atendimentos = 0;
$atendimentoDia = Atendimentos::whereDate('data_reg', '=', $data_atual)
->where('id_empresa', $id_empresa)
->count();
return $atendimentoDia;
}
private function getAgentesAtivos()
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$totalAgentesAtivos = DB::table('supervisor as s')
->where([
['s.id_empresa', $id_empresa],
])
->count();
foreach ($atendimentosData as $atendimento) {
return $totalAgentesAtivos;
}
$total_atendimentos += $atendimento->qtde_atendimento;
private function getAgentesPausa()
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$totalAgentesPausa = DB::table('supervisor as s')
->where([
['s.id_empresa', $id_empresa],
['s.status', 'PAUSA'],
])
->count();
return $totalAgentesPausa;
}
public function agentesLogados($id)
{
if(empty($id))
{
return redirect()->back();
}
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$fila = Filas::where('id', $id)->where('id_empresa', $id_empresa)->first();
return view('admin.dashboard', compact('relatoriosAtendimento', 'supervisores', 'jsonGrafico1', 'jsonGrafico2', 'jsonGrafico3', 'total_atendimentos', 'totalAgentesAtivos', 'totalAgentesPausa', 'atendimentosPorMes', 'atendimentosDia'));
return view('admin.agentesLogados', compact('fila'));
}
public function agentesLogados($id_fila)
public function relatoriosFilas($id)
{
$user = auth()->user();
if(empty($id)){
return response()->json(['data' => "Parametro ID é obrigatorio"]);
}
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$fila = Filas::where('id', $id)->where('id_empresa', $id_empresa)->first();
$fila = Filas::where('id', $id_fila)->where('id_empresa', $id_empresa)->first();
// $agentesNaFila = DB::table('supervisor as s')
// ->leftJoin('atendimento as a', function ($join) {
// $data_atual = date('Y-m-d');
// $join->on('s.id_usuario', '=', 'a.id_usuario')
// ->where(DB::raw('DATE(a.data_reg)'), $data_atual);
// })
// ->select('s.*', DB::raw('COALESCE(COUNT(a.id), 0) AS qtde_atendimento'))
// ->where([
// ['s.id_empresa', $id_empresa],
// ['fila', $fila->nome],
// ])
// ->groupBy('s.id')
// ->get();
$agentesNaFila = DB::table('supervisor as s')
->leftJoin('atendimento as a', function ($join) {
$data_atual = date('Y-m-d');
$data_atual = date('Y-m-d h:i:s');
$join->on('s.id_usuario', '=', 'a.id_usuario')
->where(DB::raw('DATE(a.data_reg)'), $data_atual);
})
->select('s.*', DB::raw('COALESCE(COUNT(a.id), 0) AS qtde_atendimento'))
->select(DB::raw("(now() - s.tempo_login) AS login"), DB::raw('COALESCE(COUNT(a.id), 0) AS qtde_atendimento'), 's.*')
->where([
['s.id_empresa', $id_empresa],
['fila', $fila->nome],
@ -135,8 +220,7 @@ class DashboardController extends Controller
->get();
return response()->json(['data' => $agentesNaFila]);
return view('admin.agentesLogados', compact('agentesNaFila', 'fila'));
}
}

94
app/Http/Controllers/EmpresaController.php

@ -3,23 +3,105 @@
namespace App\Http\Controllers;
use App\Models\Empresa;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
class EmpresaController extends Controller
{
//
public function index()
{
if (Gate::denies('is_permission')) {
return redirect()->back();
}
$empresas = DB::table('empresa')->orderBy('id', 'desc')->get();
return view('admin.empresas', compact('empresas'));
}
public function store(Request $request)
{
if (Gate::denies('is_permission')) {
return redirect('dashboard');
return redirect()->back();
}
$request->validate([
'nome' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:'.Empresa::class],
'token' => ['required', 'string'],
'cnpj' => ['required', 'unique:'.Empresa::class],
]);
$cnpjSemMascara = preg_replace("/[^0-9]/", "", $request->cnpj);
Empresa::create([
'nome' => $request->nome,
'token' => $request->token,
'email' => $request->email,
'cnpj' => $cnpjSemMascara,
]);
return redirect()->back()->with('status', 'Cadastrado com sucesso');
}
public function edit($id)
{
if (empty($id)) {
return response()->json(['data' => 'Parametro ID é obrigatório']);
}
$empresaData = Empresa::find($id);
$response = [
'data' => [
'status' => true,
'empresa_data' => $empresaData,
],
];
return response()->json($response);
}
public function update(Request $request, $id)
{
if (!$id) {
return redirect()->back();
}
$empresa = Empresa::where("id", $id)->first();
$newCnpjOrEmail = $request->cnpj === $empresa->cnpj || $request->email === $empresa->email;
$empresas = Empresa::all();
if($newCnpjOrEmail){
Empresa::where("id", $id)
->update([
'nome' => $request->nome,
]);
return view('admin.empresas', compact('empresas'));
}else{
$request->validate([
'nome' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:'.Empresa::class],
'cnpj' => ['required', 'unique:'.Empresa::class],
]);
$cnpjSemMascara = preg_replace("/[^0-9]/", "", $request->cnpj);
Empresa::where("id", $id)
->update([
'nome' => $request->nome,
'email' => $request->email,
'cnpj' => $cnpjSemMascara,
]);
}
return redirect()->back()->with('status', 'Atualizado com sucesso');
}
}

131
app/Http/Controllers/RedirectController.php

@ -0,0 +1,131 @@
<?php
namespace App\Http\Controllers;
use App\Models\numberChanel;
use App\Models\Redirect;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
class RedirectController extends Controller
{
public function index()
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$redirects = DB::table('redirect as r')
->join('number_channel as nc', 'nc.id', '=', 'r.id_number')
->select('r.*')
->where('nc.id_empresa', $id_empresa)
->get();
$numberChannels = numberChanel::where('id_empresa', $id_empresa)->get();
return view('admin.redirects', compact('redirects', 'numberChannels'));
}
public function store(Request $request)
{
if (Gate::denies('is_permission')) {
return redirect()->back();
}
$request->validate([
'nome' => ['required', 'string'],
'descricao' => ['required'],
'status' => ['required'],
'initial' => ['required'],
'channel' => ['required'],
]);
$status = $request->status === "on" ? true : false;
$initial = $request->initial === "on" ? true : false;
Redirect::create([
'name' => strtoupper($request->nome),
'description' => $request->descricao,
'status' => $status,
'initial' => $initial,
'id_number' => $request->channel,
'data_reg' => date('Y-m-d')
]);
return redirect()->back()->with('status', 'Cadastrado com sucesso');
}
public function edit($id)
{
if (Gate::denies('is_permission')) {
return redirect()->back();
}
if (empty($id)) {
return response()->json(['data' => 'Parametro ID_REDIRECT é obrigatório']);
}
$redirectData = Redirect::find($id);
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$numberChannels = numberChanel::where('id_empresa', $id_empresa)->get();
$response = [
'data' => [
'status' => true,
'numbers' => $numberChannels,
'redirect_data' => $redirectData
],
];
return response()->json($response);
}
public function update(Request $request, $id)
{
if (Gate::denies('is_permission')) {
return redirect()->back();
}
$request->validate([
'nome' => ['required', 'string'],
'descricao' => ['required'],
'status' => ['required'],
'initial' => ['required'],
'channel' => ['required'],
]);
$status = $request->status === "on" ? true : false;
$initial = $request->initial === "on" ? true : false;
Redirect::where("id", $id)
->update([
'name' => strtoupper($request->nome),
'description' => $request->descricao,
'status' => $status,
'initial' => $initial,
'id_number' => $request->channel
]);
return redirect('redirects')->with('status', 'atualizado com sucesso');
}
public function destroy($id)
{
if (Gate::denies('is_permission')) {
return redirect()->back();
}
$pesquisa = Redirect::where('id', '=', $id);
$Redirect = $pesquisa->get();
$rowCount = $Redirect->count();
if ($rowCount > 0) {
$pesquisa->delete();
}
return redirect('redirects')->with('status', 'deletado com sucesso');
}
}

235
app/Http/Controllers/RedirectOptionController.php

@ -0,0 +1,235 @@
<?php
namespace App\Http\Controllers;
use App\Models\Agentes;
use App\Models\RedirectOption;
use App\Models\Types;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class RedirectOptionController extends Controller
{
public function index($id)
{
if (empty($id)) {
return redirect('redirects');
}
$options = RedirectOption::where('id_redirect', '=', $id)->OrderBy('sequence', 'asc')->get();
$types = Types::all();
$id_redirect = $id;
return view('admin.redirectOption', compact('options', 'id_redirect', 'types'));
}
public function show(Request $request)
{
$id_type = $request->segment(4);
if (empty($id_type)) {
return response()->json(['data' => 'Parametro ID_TYPE é obrigatório']);
}
$type = DB::table('types')->where([['id', $id_type], ['status', true]])->first();
$typeName = $type->name;
$data = null;
switch ($typeName) {
case 'queue':
$data = $this->queue();
break;
case 'redirect':
$data = $this->redirect();
break;
case 'agent':
$data = $this->agent();
break;
default:
$data = null;
break;
}
$response = [
'data' => [
'status' => true,
'data' => $data,
],
];
return response()->json($response);
}
private function queue()
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$filas = DB::table('queues as q')->select("q.id", "q.nome as name")->where([['id_empresa', $id_empresa], ['is_ativa', true]])->get();
return $filas;
}
private function redirect()
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$redirects = DB::table('redirect as r')
->join('number_channel as nc', 'nc.id', '=', 'r.id_number')
->select('r.id', 'r.name')
->where('nc.id_empresa', $id_empresa)
->get();
return $redirects;
}
private function agent()
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$agentes = DB::table('grupo_usuario as gu')
->join('usuarios as u', 'u.id', '=', 'gu.id_usuario')
->join('grupo as g', 'g.id', '=', 'gu.id_grupo')
->join('usuario_empresa as ue', 'u.id', '=', 'ue.id_usuario')
->join('empresa as e', 'e.id', '=', 'ue.id_empresa')
->select('u.id', "u.nome as name", 'u.matricula')
->where('e.id', $id_empresa)
->where('u.status', true)
->get();
return $agentes;
}
public function store(Request $request)
{
$request->validate([
'sequencia' => ['required'],
'type' => ['required'],
'destino' => ['required'],
'status' => ['required'],
]);
$id = $request->destino;
if ($request->type == 3) {
$id = Agentes::where('id', $request->destino)->first()->matricula;
}
$hidden = $request->status === "on" ? false : true;
RedirectOption::create([
'sequence' => $request->sequencia,
'description' => $request->descricao,
'id_redirect' => $request->id_redirect,
'id_type' => $request->type,
'code_id' => $id,
'hide' => $hidden,
'data_reg' => date("Y-m-d"),
]);
return redirect()->back()->with('status', 'Cadastrado com sucesso');
}
public function sequence($id)
{
if (empty($id)) {
return response()->json(['data' => 'Parametro ID_REDIRECT é obrigatório']);
}
$data = DB::table('redirect_option')->where([['id_redirect', $id]])->orderBy('sequence')->get();
$response = [
'data' => [
'status' => true,
'data' => $data,
],
];
return response()->json($response);
}
public function destroy(Request $request)
{
$id = $request->segment(4);
if (empty($id)) {
return redirect()->back();
}
$pesquisa = RedirectOption::where('id', '=', $id);
$RedirectOption = $pesquisa->get();
$rowCount = $RedirectOption->count();
if ($rowCount > 0) {
$pesquisa->delete();
}
return redirect()->back()->with('status', 'Deletado com sucesso');
}
public function edit(Request $request)
{
$id = $request->segment(4);
if (empty($id)) {
return response()->json(['data' => 'Parametro ID é obrigatório']);
}
$optionData = RedirectOption::find($id);
$types = Types::all();
$response = [
'data' => [
'status' => true,
'option_data' => $optionData,
'types' => $types
],
];
return response()->json($response);
}
public function update(Request $request)
{
$id = $request->segment(4);
if (!$id) {
return redirect()->back();
}
$request->validate([
'sequencia' => ['required'],
'type' => ['required'],
'destino' => ['required'],
'status' => ['required'],
]);
$code_id = $request->destino;
if ($request->type == 3) {
$code_id = Agentes::where('id', $request->destino)->first()->matricula;
}
$hidden = $request->status === "on" ? false : true;
RedirectOption::where("id", $id)
->update([
'sequence' => $request->sequencia,
'description' => $request->descricao,
'id_redirect' => $request->id_redirect,
'id_type' => $request->type,
'code_id' => $code_id,
'hide' => $hidden,
]);
return redirect()->back()->with('status', 'Atualizado com sucesso');
}
}

124
app/Http/Controllers/ResponseStepController.php

@ -1,124 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Models\ResponseStep;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ResponseStepController extends Controller
{
//
public function index($id)
{
if (empty($id)) {
return redirect('steps');
}
$responseStep = ResponseStep::where('id_step', '=', $id)->OrderBy('option', 'asc')->get();
$rowCount = $responseStep->count();
if ($rowCount < 0) {
return redirect('steps');
}
$id_step = $id;
return view('admin.responseStep', compact('responseStep', 'id_step'));
}
public function create(Request $request)
{
$request->validate([
'resposta' => ['string', 'required'],
'opcao' => ['required'],
'id_step' => ['required'],
]);
if (empty($request->resposta) || empty($request->opcao) || empty($request->id_step)) {
return redirect('steps/response/' . $request->id_step)->with('status', 'erro ao cadastrar resposta');
}
$isSequenceExists = DB::table('response_step')
->where([
['id_step', $request->id_step],
['option', $request->opcao]
])->exists();
if ($isSequenceExists) {
return redirect('steps/response/' . $request->id_step)->with('status', 'Response Step com opções iguais');
}
ResponseStep::create([
'response' => $request->resposta,
'id_step' => $request->id_step,
'option' => $request->opcao
]);
return redirect('steps/response/' . $request->id_step)->with('status', 'Cadastrado com Sucesso');
}
public function updateResponseStep(Request $request)
{
if (!$request) {
return redirect('login');
}
if (empty($request->respostas) || empty($request->opcoes) || empty($request->response_step_ids)) {
$response['status'] = false;
$response['message'] = 'informações inválidas';
return response()->json($response);
}
for ($i = 0; $i < count($request->opcoes); $i++) {
DB::table('response_step')
->where('id', (int) $request->response_step_ids[$i])
->update([
'option' => (int) $request->opcoes[$i],
'response' => $request->respostas[$i]
]);
}
$response['status'] = true;
$response['message'] = 'Resposta atualizada com sucesso';
return response()->json($response);
}
public function destroy($id)
{
$pesquisa = ResponseStep::where('id', '=', $id);
$steps = $pesquisa->get();
$rowCount = $steps->count();
if ($rowCount > 0) {
$pesquisa->delete();
}
$stepId = $steps[0]->id_step;
return redirect('steps/response/' . $stepId)->with('status', 'Deletado com sucesso');
}
}

179
app/Http/Controllers/StepsController.php

@ -1,179 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Models\numberChanel;
use App\Models\Steps;
use GuzzleHttp\Psr7\Response;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
class StepsController extends Controller
{
//
public function index()
{
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$steps = DB::table('step as s')
->join('number_channel as nc', 'nc.id', '=', 's.id_number')
->select('s.*')
->where('nc.id_empresa', $id_empresa)
->orderBy('s.sequence', 'asc')
->get();
$numberChannels = numberChanel::where('id_empresa', $id_empresa)->get();
return view('admin.steps', compact('steps', 'numberChannels'));
}
public function create(Request $request)
{
if (Gate::denies('is_permission')) {
return redirect('users');
}
$request->validate([
'titulo' => ['required', 'string'],
'sequencia' => ['required'],
'tipo' => ['required']
]);
if (empty($request->titulo) || empty($request->sequencia) || empty($request->tipo)) {
return redirect('steps')->with('status', 'erro ao cadastrar step');
}
$id_number = '1';
Steps::create([
'title' => $request->titulo,
'sequence' => $request->sequencia,
'type' => $request->tipo,
'id_number' => $id_number
]);
return redirect('steps');
}
public function edit($id)
{
if (empty($id)) {
return redirect('steps');
}
$stepData = Steps::find($id);
$user = auth()->user();
$id_empresa = $user->empresa->first()->id;
$numberChannels = numberChanel::where('id_empresa', $id_empresa)->get();
$response = [
'data' => [
'status' => true,
'numbers' => $numberChannels,
'step_data' => $stepData
],
];
// dd($response);
// echo json_encode($response);
return response()->json($response);
}
public function update(Request $request, $id)
{
$request->validate([
"titulo" => ['required'],
"sequencia" => ['required'],
"tipo" => ['required'],
"channel" => ['required']
]);
if (empty($id) || empty($request->titulo) || empty($request->sequencia) || empty($request->tipo)) {
return redirect('steps');
}
$sequencia = Steps::select('sequence')
->where('id', $id)
->get()
->first();
if ($sequencia->sequence != $request->sequencia) {
$isSequenciaRegister = Steps::where('sequence', $request->sequencia)->get()->count();
if ($isSequenciaRegister > 0) {
return redirect('steps')->with('status', ' sequencia vinculada com outro step');
}
Steps::where("id", $id)
->update([
'title' => $request->titulo,
'sequence' => $request->sequencia,
'type' => $request->tipo,
'id_number' => $request->channel
]);
} else {
Steps::where("id", $id)
->update([
'title' => $request->titulo,
'type' => $request->tipo,
'id_number' => $request->channel
]);
}
return redirect('steps')->with('status', 'atualizado com sucesso');
}
public function destroy($id)
{
$pesquisa = Steps::where('id', '=', $id);
$steps = $pesquisa->get();
$rowCount = $steps->count();
if ($rowCount > 0) {
$pesquisa->delete();
}
return redirect('steps');
}
}

2
app/Http/Middleware/Authenticate.php

@ -12,6 +12,6 @@ class Authenticate extends Middleware
*/
protected function redirectTo(Request $request): ?string
{
return $request->expectsJson() ? null : route('login');
return $request->expectsJson() ? redirect()->back() : route('login');
}
}

1
app/Http/Middleware/RedirectIfAuthenticated.php

@ -7,6 +7,7 @@ use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Route;
class RedirectIfAuthenticated
{

1
app/Models/Agentes.php

@ -17,5 +17,6 @@ class Agentes extends Model
'email',
'matricula',
'status',
'password',
];
}

7
app/Models/Grupos.php

@ -18,13 +18,6 @@ class Grupos extends Model
'status'
];
// public function users(): BelongsToMany
// {
// return $this->BelongsToMany(User::class);
// }
public function users(): BelongsToMany
{
return $this->belongsToMany(User::class, 'grupo_usuario','id_usuario', 'id_grupo')->first();

23
app/Models/Redirect.php

@ -0,0 +1,23 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Redirect extends Model
{
use HasFactory;
protected $table = "redirect";
public $timestamps = false;
protected $fillable = [
'name',
'description',
'id_number',
'initial',
'status',
'data_reg',
];
}

36
app/Models/RedirectOption.php

@ -0,0 +1,36 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class RedirectOption extends Model
{
use HasFactory;
protected $table = "redirect_option";
public $timestamps = false;
protected $fillable = [
'sequence',
'description',
'id_redirect',
'id_type',
'code_id',
'hide',
'data_reg',
];
public function redirect(): Redirect
{
return $this->belongsTo(Redirect::class, 'id_redirect')->first();
}
public function type(): Types
{
return $this->belongsTo(Types::class, 'id_type')->first();
}
}

5
app/Models/SystemMessage.php

@ -8,14 +8,9 @@ use Illuminate\Database\Eloquent\Model;
class SystemMessage extends Model
{
use HasFactory;
public $timestamps = false;
protected $table = "system_message";
protected $fillable = [
'data_reg',
'texto',

20
app/Models/Types.php

@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Types extends Model
{
use HasFactory;
protected $table = "types";
public $timestamps = false;
protected $fillable = [
'name',
'status',
'data_reg',
];
}

2
app/Providers/AuthServiceProvider.php

@ -23,8 +23,6 @@ class AuthServiceProvider extends ServiceProvider
*/
public function boot(): void
{
//
$this->registerPolicies();
Gate::define('is_permission', function($user){

1194
composer.lock generated

File diff suppressed because it is too large Load Diff

2
package-lock.json generated

@ -1,5 +1,5 @@
{
"name": "dashboardAdmin",
"name": "simples-painel",
"lockfileVersion": 3,
"requires": true,
"packages": {

101
public/js/cadastroSystemMessage.js

@ -0,0 +1,101 @@
const autoCompleteMessages = [{
id: 1,
value: '@user_name',
},
{
id: 2,
value: '@agente_name',
},
{
id: 3,
value: '@empresa_name',
},
{
id: 4,
value: '@provedor_name',
},
];
const valueEspacamento = 50;
const inputs = document.querySelectorAll('.autoCompleteInput');
inputs.forEach(input => {
input.addEventListener('input', (e) =>{
let cont = 0;
fechaBox();
let selectedTexts = '';
let inputValue = e.target.value;
let isAtSign = inputValue.indexOf("@") >= 0;
// valor padrão para formatação de caixa de itens
const listItemFormatValue = 3;
if (isAtSign) {
let inputText = '@' + inputValue.split("@").pop(); // Obtem o texto depois do arroba
autoCompleteMessages.forEach(message => {
let messageValue = message.value;
const textContainsMessage = messageValue.includes(inputText.toLowerCase())
if (textContainsMessage) {
selectedTexts += `<li class="p-2 dark:text-gray-100 hover:bg-gray-600 cursor-pointer rounded-md mb-3" onclick="selecionaMessage(event)" data-id="${message.id}">
${message.value}
</li>`
if (cont < listItemFormatValue) {
cont++;
};
}
})
if (selectedTexts) {
const alturaBox = calcularAlturaBox(valueEspacamento, cont);
$('.autoCompleteBox').css('bottom', `-${alturaBox}px`);
$(".autoCompleteBox").html(selectedTexts);
abreBox();
}
}
})
})
function selecionaMessage({ target }) {
const id = parseInt(target.getAttribute("data-id"));
const item = autoCompleteMessages.find(message => message.id === id);
const parent = target.parentNode.parentNode;
const input = parent.querySelector(".autoCompleteInput");
const inputValue = input.value;
const indexLastAtSign = inputValue.lastIndexOf("@");
const formatedInputValue = inputValue.substring(0, indexLastAtSign);
const formatedValue = formatedInputValue + item.value;
input.value = formatedValue;
input.focus();
fechaBox();
}
function fechaBox() {
$('.autoCompleteBox').addClass('hidden');
}
function abreBox() {
$('.autoCompleteBox').removeClass('hidden');
}
function calcularAlturaBox(valueEspacamento, qtdeItens) {
if (qtdeItens === 1) return 60;
return qtdeItens * valueEspacamento;
}
function limpaInput() {
$('.autoCompleteInput').val("");
}
function fecharModal() {
fechaBox();
limpaInput();
$('.modal-edit').hide();
}

146
resources/views/admin/agentesLogados.blade.php

@ -3,17 +3,20 @@
<div class="header flex flex-col items-center gap-4">
<a href="{{route('dashboard')}}" style="margin-right: auto;" class="text-blue-500 hover:underline">Voltar</a>
<h1 class=" text-gray-900 dark:text-gray-100 text-3xl font-bold text-center">
<h1 class="mb-5 text-gray-900 dark:text-gray-100 text-3xl font-bold text-center">
Agentes na Fila - {{$fila->nome}}
</h1>
<form action="{{route('supervisor')}}" method="GET" class="flex w-full gap-3 flex-col md:flex-row ">
<div class="m-0 md:ml-auto search bg-white rounded px-3 py-1 overflow-hidden">
<i class="fas fa-search"></i>
<input type="text" name="pesquisa" class="border-none bg-transparent focus:ring-transparent" placeholder="Pesquise Agentes">
<form action="{{route('filas')}}" method="GET" class="flex w-full gap-3 flex-col lg:flex-row ">
<div class="search bg-white dark:bg-gray-800 rounded px-3 py-1 overflow-hidden">
<i class="fas fa-search dark:text-gray-100"></i>
<input type="text" name="pesquisa" class="border-none bg-transparent focus:ring-transparent
placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " placeholder="Pesquise filas">
</div>
<button class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg overflow-hidden">Pesquisar</button>
<select class="border-none rounded overflow-hidden dark:bg-gray-800 dark:text-gray-100" name="status">
<option value="ativo">Livres</option>
<option value="desativado" selected>Ocupados</option>
</select>
<button class="lg:ml-auto ml-0 bg-blue-900 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg overflow-hidden">Pesquisar</button>
</form>
</div>
@ -22,49 +25,104 @@
<table class="w-full">
<thead class="bg-gray-50 dark:bg-gray-700 dark:text-gray-100">
<tr>
<th class="p-3 text-sm font-semibold tracking-wide text-left">ID</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Nome</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Matricula</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Motivo Pausa</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Tempo de Login</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Atendimentos no dia</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Status</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">AÇÕES</th>
<th class="p-3 text-sm font-semibold tracking-wide text-center">ID</th>
<th class="p-3 text-sm font-semibold tracking-wide text-center">NOME</th>
<th class="p-3 text-sm font-semibold tracking-wide text-center">MATRICULA</th>
<th class="p-3 text-sm font-semibold tracking-wide text-center">LOGIN</th>
<th class="p-3 text-sm font-semibold tracking-wide text-center">MOTIVO PAUSA</th>
<th class="p-3 text-sm font-semibold tracking-wide text-center">STATUS</th>
<th class="p-3 text-sm font-semibold tracking-wide text-center">ATENDIMENTOS</th>
{{-- <th class="p-3 text-sm font-semibold tracking-wide text-center">TMA</th> --}}
<th class="p-3 text-sm font-semibold tracking-wide text-center">AÇÕES</th>
</tr>
</thead>
<tbody>
@foreach($agentesNaFila as $supervisor)
<tr class="bg-gray-50 dark:bg-gray-800 dark:text-gray-100">
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$supervisor->id}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$supervisor->nome}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$supervisor->matricula}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
@if($supervisor->motivo_pausa)
{{$supervisor->motivo_pausa}}
@else
Sem Pausa
@endif
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$supervisor->tempo_login}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$supervisor->qtde_atendimento}}</td>
<tbody class="table-relatorio">
</tbody>
</table>
</div>
</div>
@push('agentesLogados')
<script>
const colorStatus = {
LIVRE: "green-500",
OCUPADO: "red-500",
PAUSA: "red-500",
INDISPONIVEL: "orange-400",
CHAMANDO: "orange-400",
}
function getFilaId()
{
const url = window.location.href;
const splitUrl = url.split('/');
const id = splitUrl[splitUrl.length - 1];
return id;
}
@if($supervisor->status == 'LIVRE')
<td class="p-3 text-sm text-green-500">{{$supervisor->status}}</td>
@else
<td class="p-3 text-sm text-orange-400">{{$supervisor->status}}</td>
@endif
function getDadosRelatorioDB(fila_id) {
return new Promise(function(resolve, reject){
$.ajax({
type: "get",
dataType: 'json',
url: `/dashboard/agentes/${fila_id}/fila`,
success: function(response) {
const data = response.data;
resolve(data);
}
});
})
}
// const fila_id = getFilaId();
// getDadosRelatorioDB(fila_id);
async function montarRelatorios()
{
const id = getFilaId();
const data = await getDadosRelatorioDB(id);
let elementsTable = "";
data.forEach(supervisor => {
const tempoFormatado = supervisor.login.split(".")[0];
elementsTable += `
<tr class="bg-gray-50 dark:bg-gray-800 dark:text-gray-100 text-center">
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">${supervisor.id}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">${supervisor.nome}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">${supervisor.matricula}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">${tempoFormatado}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">${supervisor.motivo_pausa ?? "Sem Pausa"}</td>
<td class="p-3 text-sm text-${colorStatus[supervisor.status]}">${supervisor.status}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">${supervisor.qtde_atendimento}</td>
<td class="p-3 text-sm font-bold flex items-center gap-2 flex-wrap">
<a class="bg-blue-600 text-white rounded flex-1 text-xl text-center py-2 px-3" href="supervisor/editar/{{$supervisor->id}}" title="Colocar em Pausa?"><i class="fas fa-pause"></i></a>
<a class="bg-red-600 text-white flex-1 rounded text-xl text-center py-2 px-3" href="supervisor/editar/{{$supervisor->id}}" title="Desconectar Agente?"><i class="fas fa-power-off"></i></a>
<a class="bg-blue-600 text-white rounded flex-1 text-xl text-center py-2 px-3" href="supervisor/editar/$supervisor->id" title="Colocar em Pausa?"><i class="fas fa-pause"></i></a>
<a class="bg-red-600 text-white flex-1 rounded text-xl text-center py-2 px-3" href="supervisor/editar/$supervisor->id" title="Desconectar Agente?"><i class="fas fa-power-off"></i></a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
`
});
$(".table-relatorio").html(elementsTable);
}
montarRelatorios();
setInterval(() => {
montarRelatorios();
}, 10000);
</script>
@endpush
</x-app-layout>

377
resources/views/admin/dashboard.blade.php

@ -1,13 +1,12 @@
<x-app-layout>
<div class="py-12">
<div class="mx-auto sm:px-6 lg:px-8 flex flex-col">
<div class="py-12 " :class="{'mx-auto': open, 'w-full': !open}">
<div class=" sm:px-6 lg:px-8 flex flex-col">
<div class=" grid grid-cols-1 lg:grid-cols-4 place-items-center gap-3">
<div class="py-10 px-5 bg-white dark:bg-gray-800 dark:text-zinc-300 text-gray-900 rounded border-l-8 border-blue-400 flex justify-between items-center
lg:w-full md:w-[60%] w-[90%] flex-wrap">
<div>
<h1 class="font-bold">Agentes Ativos</h1>
<span class="text-2xl">{{$totalAgentesAtivos}}</span>
<span class="text-2xl text-ativos"></span>
</div>
<i class="fas fa-users text-4xl"></i>
</div>
@ -15,7 +14,7 @@
lg:w-full md:w-[60%] w-[90%] flex-wrap">
<div>
<h1 class="font-bold">Agentes Pausa</h1>
<span class="text-2xl">{{$totalAgentesPausa}}</span>
<span class="text-2xl text-pausa"></span>
</div>
<i class="fas fa-users text-4xl"></i>
</div>
@ -23,7 +22,7 @@
lg:w-full md:w-[60%] w-[90%] flex-wrap">
<div>
<h1 class="font-bold">Atendimentos no Dia</h1>
<span class="text-2xl">{{$atendimentosDia}}</span>
<span class="text-2xl text-atendimentoDia"></span>
</div>
<i class="fas fa-calendar-day text-4xl"></i>
</div>
@ -31,14 +30,14 @@
lg:w-full md:w-[60%] w-[90%] flex-wrap">
<div>
<h1 class="font-bold">Atendimentos no Mês</h1>
<span class="text-2xl">{{$atendimentosPorMes}}</span>
<span class="text-2xl text-atendimentosMes"></span>
</div>
<i class="fas fa-calendar-week text-4xl"></i>
</div>
</div>
<div class="body mt-10 overflow-auto rounded-lg shadow bg-gray-50 dark:bg-gray-800">
<div class="body mt-8 overflow-auto rounded-lg shadow bg-gray-50 dark:bg-gray-800">
<h1 class="text-gray-700 dark:text-gray-100 text-center py-5 mb-2 font-bold text-xl">SUPERVISÃO DE RECEPTIVO</h1>
@ -49,191 +48,289 @@
<th></th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">FILA</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">AGENTES</th>
<!-- <th class="p-3 text-sm font-semibold tracking-wide text-left">ORIGINADAS</th> -->
<th class="p-3 text-sm font-semibold tracking-wide text-left">ATENDIMENTO</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">ABANDONADAS</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">AÇÕES</th>
</tr>
</thead>
<tbody>
@foreach($relatoriosAtendimento as $relatorio)
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2">
<td class="text-center" title="Ativar essa fila">
<a href="dashboard/agentes/{{$relatorio->fila_id}}" class="text-xl p-2 hover:bg-gray-100 hover:dark:bg-gray-700 rounded-full"><i class="fas fa-play-circle text-gray-900 dark:text-gray-100"></i></a>
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">{{$relatorio->fila}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">{{$relatorio->quantidade_supervisores}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">{{$relatorio->quantidade_atendimentos}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">teste</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">
<button class="bg-blue-600 dark:bg-blue-900 text-white rounded text-lg w-full py-1" title="Pausar todos os Agentes na Fila"><i class="fas fa-pause"></i></button>
</td>
</tr>
@endforeach
<tbody class="table-relatorio">
</tbody>
</table>
</div>
<!-- <div>
<h1 class="text-white">Mostrar Graficos</h1>
</div> -->
<div class="mt-8 flex gap-5 flex-col md:flex-row justify-between">
<div class="dark:bg-gray-800 px-10 py-4 bg-gray-50 rounded shadow-md flex-1">
<canvas id="myChart" class="max-h-80"></canvas>
</div>
<div class="dark:bg-gray-800 bg-gray-50 rounded p-10 shadow-md ">
<h1 class="dark:text-white text-gray-800 mb-5 text-center text-lg">Atendimentos status</h1>
<canvas id="myChart2" class="max-h-80"></canvas>
</div>
</div>
</div>
</div>
@push('graficos')
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js"></script>
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.2.1/chart.min.js" integrity="sha512-v3ygConQmvH0QehvQa6gSvTE2VdBZ6wkLOlmK7Mcy2mZ0ZF9saNbbk19QeaoTHdWIEiTlWmrwAL4hS8ElnGFbA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> -->
<script>
let eventos = {
// EMESPERA: 'Em espera',
// TRANSFER: 'Transferidos',
const eventos = {
EMESPERA: 'Em espera',
TRANSFER: 'Transferidos',
COMPLETE_CALLER: 'Finalizadas pelo cliente',
LOST_CONNECTION: 'Desconectadas',
COMPLETE_AGENT: 'Finalizas pelo Agente',
START: 'Iniciadas',
}
function getDadosRelatorioDB() {
return new Promise(function(resolve, reject){
$.ajax({
type: "get",
dataType: 'json',
url: `dashboard/getRelatorioDados`,
success: function(response) {
const data = response.data;
resolve(data);
}
});
})
}
async function montarRelatorios()
{
const data = await getDadosRelatorioDB();
$(".text-ativos").text(data.totalAgentesAtivos);
$(".text-pausa").text(data.totalAgentesPausa);
$(".text-atendimentoDia").text(data.atendimentosDia);
$(".text-atendimentosMes").text(data.atendimentosPorMes);
let elementsTable = "";
data.relatoriosAtendimento.forEach(relatorio => {
elementsTable += `
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2">
<td class="text-center" title="Ativar essa fila">
<a href="dashboard/agentes/${relatorio.fila_id}" class="text-xl p-2 hover:bg-gray-100 hover:dark:bg-gray-700 rounded-full">
<i class="fas fa-play-circle text-gray-900 dark:text-gray-100">
</i>
</a>
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">${relatorio.fila}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">${relatorio.quantidade_supervisores}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">${relatorio.quantidade_atendimentos}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">0</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
<div title="Colocar fila em Pausa" class="dark:bg-white bg-gray-800 hover:bg-gray-100 hover:dark:bg-gray-500 rounded-full w-6 h-6 flex items-center justify-center cursor-pointer" onclick="getDadosRelatorioDB()">
<i class="fas fa-pause dark:text-gray-900 text-gray-100 text-xs"></i></button>
</div>
</td>
</tr>
`
});
$(".table-relatorio").html(elementsTable);
}
let grafico1 = <?= ($jsonGrafico1); ?>;
let grafico2 = <?= ($jsonGrafico2); ?>;
let grafico3 = <?= ($jsonGrafico3); ?>;
let labels1 = grafico1.map((value) => value.nome)
let data1 = grafico1.map((value) => value.qtde_atendimento)
function montaGrafico1(dataDB) {
let labels = dataDB.map((value) => value.nome)
let data = dataDB.map((value) => value.qtde_atendimento)
const ctx = document.getElementById('myChart');
new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [{
data: data,
label:"Atendimento Por Agente",
font: 90,
borderWidth: 1,
backgroundColor: [
'rgba(255, 99, 132, 0.7)',
'rgba(255, 159, 64, 0.7)',
'rgba(255, 205, 86, 0.7)',
'rgba(75, 192, 192, 0.7)',
'rgba(54, 162, 235, 0.7)',
'rgba(153, 102, 255, 0.7)',
'rgba(201, 203, 207, 0.7)'
],
borderColor: [
'rgb(255, 99, 132)',
'rgb(255, 159, 64)',
'rgb(255, 205, 86)',
'rgb(75, 192, 192)',
'rgb(54, 162, 235)',
'rgb(153, 102, 255)',
'rgb(201, 203, 207)'
],
}],
},
options: {
color: '#fff',
plugins: {
legend:{
labels:{
font:{
size: 15
}
}
}
},
scales: {
y: {
beginAtZero: true,
},
x: {
ticks: {
color: '#91a0a7',
font: {
size: 13
},
}
}
},
},
});
}
function montaGrafico2(dataDB) {
const ctx2 = document.getElementById('myChart2');
const somaPorEvento = {};
dataDB.forEach(element => {
if(somaPorEvento[element.evento]){
somaPorEvento[element.evento] += element.qtde_usados;
}else{
somaPorEvento[element.evento] = element.qtde_usados;
}
})
let labels = Object.keys(somaPorEvento).map(label => eventos[label]);
let data = Object.values(somaPorEvento);
new Chart(ctx2, {
type: 'doughnut',
data: {
labels: labels,
datasets: [{
data: data,
borderWidth: 1,
backgroundColor: [
'rgba(255, 99, 132, 0.8)',
'rgba(255, 159, 64, 0.8)',
'rgba(75, 192, 192, 0.8)',
'rgba(54, 162, 235, 0.8)',
'rgba(153, 102, 255, 0.8)',
'rgba(201, 203, 207, 0.8)'
],
borderColor: [
'rgb(255, 99, 132)',
'rgb(255, 159, 64)',
'rgb(75, 192, 192)',
'rgb(54, 162, 235)',
'rgb(153, 102, 255)',
'rgb(201, 203, 207)'
],
}]
},
let labels2 = [];
let data2 = [];
options: {
color: '#91a0a7',
grafico2.forEach(e => {
if (eventos[e.evento]) {
labels2.push(eventos[e.evento]);
}
})
scales: {
y: {
beginAtZero: true
}
}
}
});
}
// let labels1 = ['admin', 'admin', 'admin', 'admin', 'admin', 'admin']
// let data1 = [18, 39, 19, 30, 12, 59, 100]
grafico2.forEach(e => {
if (eventos[e.evento]) {
data2.push(e.qtde_usados);
}
})
// let labels2 = [];
// let data2 = [];
// grafico2.forEach(e => {
// if (eventos[e.evento]) {
// data2.push(e.qtde_usados);
// }
// })
// let labels2 = grafico2.map((value) => {
// labels2 = grafico2.map((value) => {
// if (eventos[value.evento]) {
// return eventos[value.evento]
// }
// })
// let data2 = grafico2.map((value) => {
// data2 = grafico2.map((value) => {
// if (eventos[value.evento]) {
// return value.qtde_usados
// }
// })
let labels3 = grafico3.map((value) => value.nome)
// // let labels3 = grafico3.map((value) => value.nome)
let data3 = grafico3.map((value) => value.qtde_fila)
// // let data3 = grafico3.map((value) => value.qtde_fila)
// // const ctx3 = document.getElementById('myChart3');
const ctx = document.getElementById('myChart');
const ctx2 = document.getElementById('myChart2');
const ctx3 = document.getElementById('myChart3');
new Chart(ctx, {
type: 'bar',
data: {
labels: labels1,
datasets: [{
label: 'Quantidade de atendimento',
data: data1,
borderWidth: 1,
backgroundColor: 'rgb(249, 115, 22)',
}]
},
// new Chart(ctx3, {
// type: 'pie',
// data: {
// labels: labels3,
// datasets: [{
// label: 'Quantidade de atendimento',
// data: data3,
// borderWidth: 1,
// backgroundColor: [
// 'rgb(255, 99, 132)',
// 'rgb(54, 162, 235)',
// 'rgb(255, 205, 86)'
// ],
// fontColor: '#fff',
// }]
// },
options: {
color: '#91a0a7',
scales: {
y: {
beginAtZero: true
},
// options: {
// color: '#91a0a7',
},
},
});
new Chart(ctx2, {
type: 'pie',
data: {
labels: labels2,
datasets: [{
label: 'Quantidade de atendimento',
data: data2,
borderWidth: 1,
backgroundColor: [
'rgb(255, 99, 132)',
'rgb(54, 162, 235)',
'rgb(255, 205, 86)',
],
fontColor: '#fff',
}]
},
// scales: {
// y: {
// beginAtZero: true
// }
// }
// }
// });
options: {
color: '#91a0a7',
async function graficos()
{
const data = await getDadosRelatorioDB();
montaGrafico1(data.atendimentosData);
montaGrafico2(data.atendimentosStatusData);
}
montarRelatorios();
graficos();
setInterval(() => {
montarRelatorios();
}, 10000);
scales: {
y: {
beginAtZero: true
}
}
}
});
new Chart(ctx3, {
type: 'pie',
data: {
labels: labels3,
datasets: [{
label: 'Quantidade de atendimento',
data: data3,
borderWidth: 1,
backgroundColor: [
'rgb(255, 99, 132)',
'rgb(54, 162, 235)',
'rgb(255, 205, 86)'
],
fontColor: '#fff',
}]
},
options: {
color: '#91a0a7',
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
@endpush
</x-app-layout>

42
resources/views/admin/editPausas.blade.php

@ -1,42 +0,0 @@
<x-app-layout>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<a href="{{route('pausas')}}" style="margin-right: auto;" class="text-blue-500 hover:underline mb-5 block">Voltar</a>
@if(session('status'))
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg">
{{session('status')}}
</div>
@endif
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
<form method="POST" action="" class="p-6 text-gray-900 dark:text-gray-100">
@csrf
<h1 class="text-2xl font-bold text-center md:text-left">Editar Usuário</h1>
<div class="responseSteps mt-8 flex flex-col gap-4">
<div class="responseStep flex flex-col gap-3 flex-wrap">
<div class="flex flex-col gap-2">
<label for="">Motivo: </label>
<input type="text" class="w-full rounded-md p-2" placeholder="Digite o motivo: " name="motivo" value="{{$pausa->motivo}}">
</div>
<div class="flex-1">
<label for="" class="block ">Ativo: </label>
@if($pausa->is_ativo)
<input type="radio" name="status" value="on" checked> <span class="mr-3">Sim</span>
<input type="radio" name="status" value="off"> <span>Não</span>
@else
<input type="radio" name="status" value="on"> <span class="mr-3">Sim</span>
<input type="radio" name="status" value="off" checked> <span>Não</span>
@endif
</div>
</div>
</div>
<button class="mt-11 bg-blue-500 text-white p-3 rounded-md">Salvar Alterações</button>
</form>
</div>
</div>
</div>
</x-app-layout>

45
resources/views/admin/editSetores.blade.php

@ -1,45 +0,0 @@
<x-app-layout>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<a href="{{route('setores')}}" style="margin-right: auto;" class="text-blue-500 hover:underline mb-5 block">Voltar</a>
@if(session('status'))
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg">
{{session('status')}}
</div>
@endif
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
<form method="POST" action="" class="p-6 text-gray-900 dark:text-gray-100">
@csrf
<h1 class="text-2xl font-bold text-center md:text-left">Editar Usuário</h1>
<div class="responseSteps mt-8 flex flex-col gap-4">
<div class="responseStep flex flex-col gap-3 flex-wrap">
<div class="flex-1 flex flex-col gap-1">
<label>Nome: </label>
<input type="text" class="w-full rounded-md p-2" placeholder="Digite aqui o Nome : " name="nome" value="{{$setor->nome}}">
</div>
<div class="flex-1">
<label for="" class="block ">Ativo: </label>
@if($setor->is_ativa)
<input type="radio" name="status" value="on" checked> <span class="mr-3">Sim</span>
<input type="radio" name="status" value="off"> <span>Não</span>
@else
<input type="radio" name="status" value="on"> <span class="mr-3">Sim</span>
<input type="radio" name="status" value="off" checked> <span>Não</span>
@endif
</div>
</div>
</div>
<button class="mt-11 bg-blue-500 text-white p-3 rounded-md">Salvar Alterações</button>
</form>
</div>
</div>
</div>
</x-app-layout>

67
resources/views/admin/editSupervisores.blade.php

@ -1,67 +0,0 @@
<x-app-layout>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<a href="{{route('supervisor')}}" style="margin-right: auto;" class="text-blue-500 hover:underline mb-5 block">Voltar</a>
@if(session('status'))
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg">
{{session('status')}}
</div>
@endif
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
<form method="POST" action="" class="p-6 text-gray-900 dark:text-gray-100">
@csrf
<h1 class="text-2xl font-bold text-center md:text-left">Editar Usuário</h1>
<div class="responseSteps mt-8 flex flex-col gap-4">
<div class="responseStep flex flex-col gap-3 flex-wrap">
<div class="flex flex-col gap-2">
<label for="">Selecione o Agente: </label>
<select class="w-full" name="agente_id">
@foreach($agentes as $agente)
@if($agente->id == $userData->id_usuario)
<option value="{{$agente->id}}" selected>{{$agente->nome}}</option>
@else
<option value="{{$agente->id}}">{{$agente->nome}}</option>
@endif
@endforeach
</select>
</div>
<div class="flex flex-col gap-2">
<label for="">Selecione a Fila: </label>
<select class="w-full" name="fila">
@foreach($filas as $fila)
@if($fila->nome == $userData->fila)
<option value="{{$fila->nome}}" selected>{{$fila->nome}}</option>
@else
<option value="{{$fila->nome}}">{{$fila->nome}}</option>
@endif
@endforeach
</select>
</div>
<div class="flex flex-col gap-2">
<label for="">Selecione o canal: </label>
<select class="w-full" name="channel">
@foreach($numberChannels as $numberChannel)
@if($numberChannel->id == $userData->id_number_channel)
<option value="{{$numberChannel->id}}" selected>{{$numberChannel->title}}</option>
@else
<option value="{{$numberChannel->id}}">{{$numberChannel->title}}</option>
@endif
@endforeach
</select>
</div>
</div>
</div>
<button class="mt-11 bg-blue-500 text-white p-3 rounded-md">Salvar Alterações</button>
</form>
</div>
</div>
</div>
</x-app-layout>

52
resources/views/admin/editUsers.blade.php

@ -1,52 +0,0 @@
<x-app-layout>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<a href="{{route('users')}}" style="margin-right: auto;" class="text-blue-500 hover:underline mb-5 block">Voltar</a>
@if(session('status'))
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg">
{{session('status')}}
</div>
@endif
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
<form method="POST" action="" class="p-6 text-gray-900 dark:text-gray-100">
@csrf
<h1 class="text-2xl font-bold text-center md:text-left">Editar Usuário</h1>
<div class="responseSteps mt-8 flex flex-col gap-4">
<div class="responseStep flex flex-col gap-3 flex-wrap">
<div class="flex-1 flex flex-col gap-1">
<label>Nome: </label>
<input type="text" class="w-full rounded-md p-2" placeholder="Digite aqui o Nome : " name="nome" value="{{$userData->nome}}">
</div>
<div class="flex-1 flex flex-col gap-1">
<label>Email: </label>
<input type="email" class="w-full rounded-md p-2" placeholder="Digite aqui o email : " name="email" value="{{$userData->email}}">
</div>
<div class="flex-1 flex flex-col gap-1">
<label>Matricula: </label>
<input type="text" class="w-full rounded-md p-2" placeholder="Digite aqui a matricula : " name="matricula" value="{{$userData->matricula}}" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</div>
<div class="flex-1">
<label for="" class="block ">Ativo: </label>
@if($userData->status)
<input type="radio" name="status" value="on" checked> <span class="mr-3">Sim</span>
<input type="radio" name="status" value="off"> <span>Não</span>
@else
<input type="radio" name="status" value="on"> <span class="mr-3">Sim</span>
<input type="radio" name="status" value="off" checked> <span>Não</span>
@endif
</div>
</div>
</div>
<button class="mt-11 bg-blue-500 text-white p-3 rounded-md">Salvar Alterações</button>
</form>
</div>
</div>
</div>
</x-app-layout>

34
resources/views/admin/empresas.blade.php

@ -48,11 +48,11 @@
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$empresa->nome}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$empresa->token}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$empresa->email}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$empresa->cnpj}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100" data-mask="000.000.000-00">{{$empresa->cnpj}}</td>
<td class="p-3 text-sm font-bold flex items-center gap-2 flex-wrap">
<button class="bg-blue-600 dark:bg-blue-900 text-white p-2 rounded flex-1 text-lg text-center" onclick="atualizaUsuario(<?= $empresa->id ?>)"><i class="fas fa-edit"></i></button>
@if($empresa->status)
<button class="bg-blue-600 text-white p-2 rounded flex-1 text-lg text-center" onclick="atualizaRedirectOption(<?= $empresa->id ?>)"><i class="fas fa-edit"></i></button>
{{-- @if($empresa->status)
<form method="POST" id="formulario" action="users/deletar/{{$empresa->id}}" class="flex-1 flex" title="desativar conta?" onclick="javascript: if(!confirm('Deseja desativar esse usuário?')) return false;">
@csrf
@method('delete')
@ -60,17 +60,41 @@
<i class="fas fa-ban"></i>
</button>
</form>
@endif
@endif --}}
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.16/jquery.mask.js"></script>
<script>
function atualizaRedirectOption(empresa_id) {
$.ajax({
type: "get",
url: `empresas/${empresa_id}/edit`,
success: function({data}) {
const empresa_data = data.empresa_data;
console.log(empresa_data);
$(".modal-edit").show();
$(".modal-edit").find('form').attr('action', `empresas/${empresa_id}`);
$(".modal-edit").find("input[name='nome']").val(empresa_data.nome);
$(".modal-edit").find("input[name='token']").val(empresa_data.token);
$(".modal-edit").find("input[name='email']").val(empresa_data.email);
const cnpjFormatado = $(".modal-edit").find("input[name='cnpj']").masked(empresa_data.cnpj);
$(".modal-edit").find("input[name='cnpj']").val(cnpjFormatado);
}
});
}
</script>
</div>
<x-modalEmpresa></x-modalEmpresa>
<x-modalEditEmpresa></x-modalEditEmpresa>
</x-app-layout>

34
resources/views/admin/filas.blade.php

@ -15,8 +15,6 @@
</h1>
<button class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-base overflow-hidden" @click="modal = !modal" type="button">Cadastrar Fila</button>
</div>
<form action="{{route('filas')}}" method="GET" class="flex w-full gap-3 flex-col lg:flex-row ">
<div class="search bg-white dark:bg-gray-800 rounded px-3 py-1 overflow-hidden">
@ -25,23 +23,18 @@
</div>
<select class="border-none rounded overflow-hidden dark:bg-gray-800 dark:text-gray-100" name="status">
@if($selected->isSelected)
@if($selected->isAtivo == 'ativo')
<option value="ativo" selected>Ativos</option>
<option value="desativado">Desativados</option>
@else
<option value="ativo">Ativos</option>
<option value="desativado" selected>Desativados</option>
@endif
@if($selected->isAtivo == 'ativo')
<option value="ativo" selected>Ativos</option>
<option value="desativado">Desativados</option>
@else
<option value="ativo">Ativos</option>
<option value="desativado" selected>Desativados</option>
@endif
@else
<option value="ativo">Ativos</option>
<option value="desativado">Desativados</option>
<option value="ativo">Ativos</option>
<option value="desativado">Desativados</option>
@endif
</select>
<button class="lg:ml-auto ml-0 bg-blue-900 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg overflow-hidden">Pesquisar</button>
</form>
</div>
@ -70,14 +63,13 @@
<td class="p-3 text-sm text-red-500 font-bold">DESATIVADO</td>
@endif
<td class="p-3 text-sm font-bold flex items-center gap-2 flex-wrap">
<button class="bg-blue-600 dark:bg-blue-900 text-white p-2 rounded flex-1 text-lg text-center" onclick="atualizarFila(<?= $fila->id ?>)"><i class="fas fa-edit"></i></button>
<td class="p-3 text-sm font-bold w-28">
<button class="bg-blue-600 text-white p-2 rounded text-lg text-center w-full mb-2" onclick="atualizarFila(<?= $fila->id ?>)"><i class="fas fa-edit"></i></button>
@if($fila->is_ativa)
<form method="POST" action="filas/deletar/{{$fila->id}}" class="flex-1 flex" title="desativar fila?" onclick="javascript: if(!confirm('Deseja desativar essa fila?')) return false;">
<form method="POST" action="filas/deletar/{{$fila->id}}" title="desativar fila?" onclick="javascript: if(!confirm('Deseja desativar essa fila?')) return false;">
@csrf
@method('delete')
<button class="bg-red-600 dark:bg-red-700 text-white p-2 rounded flex-1 text-lg">
<button class="bg-red-600 dark:bg-red-700 text-white p-2 rounded text-lg w-full">
<i class="fas fa-ban"></i>
</button>
</form>

15
resources/views/admin/pausas.blade.php

@ -43,7 +43,7 @@
</select>
<button class="lg:ml-auto ml-0 bg-blue-900 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg overflow-hidden">Pesquisar</button>
<button class="lg:ml-auto ml-0 bg-gray-700 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg overflow-hidden">Pesquisar</button>
</form>
</div>
@ -63,24 +63,19 @@
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2">
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$pausa->id}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$pausa->motivo}}</td>
@if($pausa->is_ativo)
<td class="p-3 text-sm text-green-500 font-bold">ATIVO</td>
@else
<td class="p-3 text-sm text-red-500 font-bold">DESATIVADO</td>
@endif
<td class="p-3 text-sm font-bold flex items-center gap-2 flex-wrap">
<button class="bg-blue-600 dark:bg-blue-900 text-white p-2 rounded flex-1 text-lg text-center" onclick="atualizarPausa(<?= $pausa->id ?>)"><i class="fas fa-edit"></i></button>
<td class="p-3 text-sm font-bold w-32">
<button class="bg-blue-600 text-white p-2 rounded text-lg text-center w-full mb-2" onclick="atualizarPausa(<?= $pausa->id ?>)"><i class="fas fa-edit"></i></button>
@if($pausa->is_ativo)
<form method="POST" action="pausas/deletar/{{$pausa->id}}" class="flex-1 flex" onclick="javascript: if(!confirm('Deseja desativar essa pausa?')) return false;" title="Deseja desativar essa pausa?">
<form method="POST" action="pausas/deletar/{{$pausa->id}}" onclick="javascript: if(!confirm('Deseja desativar essa pausa?')) return false;" title="Deseja desativar essa pausa?">
@csrf
@method('delete')
<button class="bg-red-600 dark:bg-red-700 text-white p-2 rounded flex-1 text-lg">
<button class="bg-red-600 text-white p-2 rounded text-lg w-full">
<i class="fas fa-ban"></i>
</button>
</form>

212
resources/views/admin/redirectOption.blade.php

@ -0,0 +1,212 @@
<x-app-layout>
<div class="py-8 px-8">
<a href="{{ route('redirects.index') }}" style="margin-right: auto;"
class="text-blue-500 hover:underline mb-5 block">Voltar</a>
@if (session('status'))
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg alert">
{{ session('status') }}
</div>
@endif
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg alert hidden act">
</div>
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg ">
<div class="p-6 text-gray-900 dark:text-gray-100">
<div class="flex items-center">
<div>
<h1 class="text-2xl font-bold">Configuração Options</h1>
<h2 class="text-lg mt-2">Adicione, edite ou remova suas opções de redirect</h2>
</div>
<button class="ml-auto mt-2 bg-blue-600 text-white py-2 px-6 rounded-md text-lg"
@click="modal = !modal">Adicionar</button>
</div>
<div class="body mt-4 overflow-auto rounded-lg shadow">
<table class="w-full">
<thead class="bg-gray-50 dark:bg-gray-700 dark:text-gray-100">
<tr>
<th class="p-3 text-sm font-semibold tracking-wide text-left ">ID</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Sequência</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Descrição</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Redirect</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Tipo</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Destino</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Status</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Ações</th>
</tr>
</thead>
<tbody>
@foreach ($options as $option)
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2">
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $option->id }}
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
{{ $option->sequence }}
{{-- <input type="text" value="{{ $option->sequence }}"
class=" w-full rounded-md p-2 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 respostas" onkeypress="return event.charCode >= 48 && event.charCode <= 57"> --}}
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
{{ $option->description }}
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
{{ $option->redirect()->name }}
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 uppercase">
{{ $option->type()->name }}
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
{{ $option->code_id }}
</td>
@if ($option->hide)
<td class="p-3 text-sm text-red-500 font-bold">DESATIVADO</td>
@else
<td class="p-3 text-sm text-green-500 font-bold">ATIVO</td>
@endif
<td class="p-3 text-sm font-bold flex-wrap w-32">
<button class="bg-blue-600 text-white p-2 rounded text-lg w-full mb-2"
onclick="atualizaRedirectOption( {{ $option->id }})"><i
class="fas fa-edit"></i></button>
<form method="POST" action="options/{{ $option->id }}" class="flex-1 flex"
onclick="javascript: if(!confirm('Deseja deletar esses dados?')) return false;">
@csrf
@method('delete')
<button class="bg-red-600 text-white p-2 rounded text-lg w-full">
<i class="fas fa-trash"></i>
</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
<x-modalRedirectOption :id_redirect="$id_redirect" :types="$types"></x-modalRedirectOption>
<x-modalEditRedirectOption :id_redirect="$id_redirect"></x-modalEditRedirectOption>
<script>
function requestType(id_type) {
return new Promise(function(resolve, reject) {
$.ajax({
type: "get",
dataType: 'json',
url: `options/${id_type}`,
success: function(response) {
const data = response.data.data;
resolve(data);
}
});
});
}
const modal = document.querySelector(".modal");
let id_type = 1;
montaSelectDestino(id_type, modal);
async function montaSelectDestino(id_type, modal, code_id = null) {
const data = await requestType(id_type);
const selectDestino = modal.querySelector(".select-destino");
const inputDestino = modal.querySelector(".input-destino");
if (!data) {
selectDestino.style.display = 'none';
selectDestino.disabled = true;
inputDestino.disabled = false;
inputDestino.style.display = 'block';
return;
}
selectDestino.style.display = 'block';
selectDestino.disabled = false;
inputDestino.disabled = true;
inputDestino.style.display = 'none';
let selectElements = "";
if (code_id) {
data.forEach(element => {
let matriculaOrId = element.matricula ?? element.id;
if (matriculaOrId.toString() === code_id.toString()) {
selectElements +=
` <option value="${element.id}" selected>${element.name}</option>`
} else {
selectElements +=
` <option value="${element.id}">${element.name}</option>`
}
})
} else {
data.forEach(element => {
selectElements += `<option value="${element.id}">${element.name}</option>`
});
}
selectDestino.innerHTML = selectElements;
}
function atualizaRedirectOption(option_id) {
$.ajax({
type: "get",
url: `options/${option_id}/edit`,
success: async function({
data
}) {
const option_data = data.option_data;
const types = data.types
const redirectsData = await requestType(option_data.id_type);
const modal = document.querySelector('.modal-edit');
modal.style.display = 'block';
modal.setAttribute('data-sequenceDB', option_data.sequence);
modal.querySelector("input[name='sequencia']").value = option_data.sequence;
modal.querySelector("textarea[name='descricao']").value = option_data.description;
modal.querySelector('form').action = `options/${option_id}`;
if (option_data.hide) {
modal.querySelector(".container-radio").innerHTML =
`<input type="radio" name="status" value="on"> <span class="mr-3 dark:text-gray-100" >Sim</span>
<input type="radio" name="status" value="off" checked> <span class="dark:text-gray-100">Não</span>`;
} else {
modal.querySelector(".container-radio").innerHTML =
`<input type="radio" name="status" value="on" checked> <span class="mr-3 dark:text-gray-100" >Sim</span>
<input type="radio" name="status" value="off" > <span class="dark:text-gray-100">Não</span>`;
}
let containerTypes = '';
types.forEach(type => {
if (option_data.id_type === type.id) {
containerTypes +=
` <option value="${type.id}" selected>${type.name}</option>`
} else {
containerTypes +=
` <option value="${type.id}">${type.name}</option>`
}
})
modal.querySelector(".select-types").innerHTML = containerTypes;
montaSelectDestino(option_data.id_type, modal, option_data.code_id);
}
});
}
document.querySelectorAll('.select-types').forEach(el => {
el.addEventListener('change', (e) => {
const select = e.target;
const modal = select.closest('.modal') ?? select.closest('.modal-edit');
const id_redirect = select.value;
montaSelectDestino(id_redirect, modal);
})
})
</script>
</x-app-layout>

149
resources/views/admin/redirects.blade.php

@ -0,0 +1,149 @@
<x-app-layout>
<div class="py-8 px-8">
@if (session('status'))
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg">
{{ session('status') }}
</div>
@endif
<div class="header flex flex-col items-center gap-4 mt-2 mb-8">
<div class="flex justify-between items-center w-full mb-5">
<h1 class=" text-gray-900 dark:text-gray-100 text-3xl font-bold text-center">
Redirects
</h1>
@can('is_permission')
<button
class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-base overflow-hidden"
@click="modal = !modal" type="button">Cadastrar Redirect</button>
@endcan
</div>
</div>
<div class="body mt-4 overflow-auto rounded-lg shadow">
<table class="w-full">
<thead class="bg-gray-50 dark:bg-gray-700 dark:text-gray-100">
<tr>
<th class="p-3 text-sm font-semibold tracking-wide text-left ">ID</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Nome</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Descrição</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Status</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Inicial</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Opções</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Ações</th>
</tr>
</thead>
<tbody>
@foreach ($redirects as $redirect)
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2">
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $redirect->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $redirect->name }}</td>
<td
class="p-3 text-sm text-gray-700 dark:text-gray-100 sequence sequence-{{ $redirect->id }}">
{{ $redirect->description }}</td>
@if ($redirect->status)
<td class="p-3 text-sm text-green-500 font-bold">ATIVO</td>
@else
<td class="p-3 text-sm text-red-500 font-bold">DESATIVADO</td>
@endif
@if ($redirect->initial)
<td class="p-3 text-sm text-green-500 font-bold">INICIAL</td>
@else
<td class="p-3 text-sm text-red-500 font-bold">NÃO INICIAL</td>
@endif
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"><a
href="{{ route('redirects.options.index', ['redirect' => $redirect->id]) }}"
class="text-blue-500 hover:underline">Editar Opções</a></td>
<td class="p-3 text-sm font-bold flex-wrap w-32">
<button class="bg-blue-600 text-white p-2 rounded text-lg w-full mb-2"
onclick="atualizaRedirect( {{ $redirect->id }})"><i
class="fas fa-edit"></i></button>
<form method="POST"
action="{{ route('redirects.destroy', ['redirect' => $redirect->id]) }}"
class="flex-1 flex"
onclick="javascript: if(!confirm('Deseja deletar esses dados?')) return false;">
@csrf
@method('delete')
<button class="bg-red-600 text-white p-2 rounded text-lg w-full">
<i class="fas fa-trash"></i>
</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
<x-modalRedirect :numberChannels="$numberChannels"></x-modalRedirect>
<x-modalEditRedirect :numberChannels="$numberChannels"></x-modalEditRedirect>
@push('updateStep')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E="
crossorigin="anonymous"></script>
<script>
function atualizaRedirect(id_redirect) {
$.ajax({
type: "get",
url: `redirects/${id_redirect}/edit`,
success: function({
data
}) {
const redirect_data = data.redirect_data;
const numbers_channels = data.numbers;
const modal = document.querySelector('.modal-edit');
modal.style.display = 'block';
modal.querySelector('form').action = `redirects/${id_redirect}`;
modal.querySelector("input[name='nome']").value = redirect_data.name;
modal.querySelector("textarea[name='descricao']").value = redirect_data.description;
const containerRadioStatus = document.querySelector(".container-radio-status");
const containerRadioInitial = document.querySelector(".container-radio-initial");
if (redirect_data.status) {
containerRadioStatus.innerHTML =
`<input type="radio" name="status" value="on" checked> <span class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="status" value="off" > <span class="dark:text-gray-100">Não</span>`
} else {
containerRadioStatus.innerHTML =
`<input type="radio" name="status" value="on" > <span class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="status" value="off" checked> <span class="dark:text-gray-100">Não</span>`
}
if (redirect_data.initial) {
containerRadioInitial.innerHTML =
`<input type="radio" name="initial" value="on" checked> <span class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="initial" value="off" > <span class="dark:text-gray-100">Não</span>`
} else {
containerRadioInitial.innerHTML =
`<input type="radio" name="initial" value="on" > <span class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="initial" value="off" checked> <span class="dark:text-gray-100">Não</span>`
}
const containerChannels = modal.querySelector("select[name='channel']");
numbers_channels.forEach(channel => {
if (redirect_data.id_number === channel.id) {
containerChannels.innerHTML =
` <option value="${channel.id}" selected>${channel.title}</option>`
} else {
containerChannels.innerHTML =
` <option value="${channel.id}">${channel.title}</option>`
}
})
}
});
}
function fecharModal() {
document.querySelector('.modal-edit').style.display = 'none';
}
</script>
@endpush
</x-app-layout>

167
resources/views/admin/responseStep.blade.php

@ -1,167 +0,0 @@
<x-app-layout>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<a href="{{route('steps')}}" style="margin-right: auto;" class="text-blue-500 hover:underline mb-5 block">Voltar</a>
@if(session('status'))
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg alert">
{{session('status')}}
</div>
@endif
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg alert hidden act">
</div>
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6 text-gray-900 dark:text-gray-100">
<div class="flex items-center">
<div>
<h1 class="text-2xl font-bold">Configuração Respostas</h1>
<h2 class="text-lg mt-2">Adicione, edite ou remova respostas de suas Steps</h2>
</div>
<button class="ml-auto mt-2 bg-blue-800 text-white py-2 px-6 rounded-md text-lg" @click="modal = !modal">Adicionar</button>
</div>
<div class="responseSteps mt-8 flex flex-col gap-4">
@forelse($responseStep as $response)
<div class="responseStep flex gap-3">
<input type="hidden" name="id_response_step" value="{{$response->id}}">
<div class="flex-1 flex flex-col gap-1">
<label for="" class="dark:text-gray-100">Resposta: </label>
<input type="text" class=" w-full rounded-md p-2 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 respostas" placeholder="Digite aqui a resposta: " value="{{$response->response}}">
</div>
<div class="flex-1 flex flex-col gap-1">
<label for="" class="dark:text-gray-100">Opção: </label>
<input type="text" class="w-full rounded-md p-2 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 opcoes" placeholder="Digite aqui a opção: " onkeypress="return event.charCode >= 48 && event.charCode <= 57" value="{{$response->option}}">
<p class="text-red-500 text-problem hidden">Opção não podem ser iguais</p>
</div>
<form method="POST" class="flex items-end" action="/steps/response/deletar/{{$response->id}}" onclick="javascript: if(!confirm('Deseja deletar esses dados?')) return false;">
@csrf
@method('delete')
<button class="bg-red-600 dark:bg-red-700 px-8 py-2 flex items-center rounded "><i class="fas fa-trash text-lg"></i></button>
</form>
</div>
@empty
<h1 class="font-bold">Não existe registros</h1>
@endforelse
</div>
<?php echo csrf_field() ?>
<button class="mt-11 bg-blue-500 text-white p-3 rounded-md salvar">Salvar Alterações</button>
</div>
</div>
</div>
</div>
@push('updateResponseStep')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"></script>
<script>
$('.salvar').click(function() {
const opcoes = document.querySelectorAll('.opcoes');
const respostas = document.querySelectorAll('.respostas');
const alert = document.querySelector('.alert');
const id_response_steps = document.querySelectorAll('input[name="id_response_step"]');
document.querySelector('.alert').style.display = 'none';
opcoes.forEach(el => {
el.classList.remove('border-red-500')
el.classList.remove('border-2')
const parent = el.parentNode;
parent.querySelector('p').classList.add('hidden');
parent.parentNode.querySelector('form').classList.add('items-end');
parent.parentNode.querySelector('form').classList.remove('items-center');
})
if (hasDuplicates(opcoes)) {
const elDuplicates = findDuplicateIndexes(opcoes);
elDuplicates.forEach(el => {
const parent = opcoes[el].parentNode;
parent.querySelector('p').classList.remove('hidden');
parent.parentNode.querySelector('form').classList.remove('items-end');
parent.parentNode.querySelector('form').classList.add('items-center');
opcoes[el].classList.add('border-red-500')
opcoes[el].classList.add('border-2')
})
return;
}
const opcoesValues = Array.from(opcoes).map(opcao => opcao.value);
const respostaValues = Array.from(respostas).map(resposta => resposta.value);
const idValues = Array.from(id_response_steps).map(response_step => response_step.value);
$.ajax({
type: "post",
url: "{{route('editarResponseStep')}}",
data: {
"opcoes": opcoesValues,
"respostas": respostaValues,
"response_step_ids": idValues,
"_token": $('meta[name="csrf-token"]').attr('content'),
},
dataType: "json",
success: function(response) {
let data = response;
document.querySelector('.alert').style.display = 'block';
document.querySelector('.alert').innerText = response.message;
}
});
})
function hasDuplicates(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i].value === arr[j].value) {
return true;
}
}
}
return false;
}
function findDuplicateIndexes(array) {
let values = [];
let duplicates = [];
for (let i = 0; i < array.length; i++) {
let currentValue = array[i].value;
let index = values.indexOf(currentValue);
if (index !== -1) {
duplicates.push(index);
duplicates.push(i);
}
values.push(currentValue);
}
return duplicates;
}
</script>
@endpush
<x-modalResponseStep :id_step="$id_step"></x-modalResponseStep>
</x-app-layout>

119
resources/views/admin/steps.blade.php

@ -1,119 +0,0 @@
<x-app-layout>
<div class="py-8 px-8">
@if(session('status'))
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg">
{{session('status')}}
</div>
@endif
<div class="header flex flex-col items-center gap-4 mt-2 mb-8">
<div class="flex justify-between items-center w-full mb-5">
<h1 class=" text-gray-900 dark:text-gray-100 text-3xl font-bold text-center">
Steps
</h1>
@can('is_permission')
<button class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-base overflow-hidden" @click="modal = !modal" type="button">Cadastrar Steps</button>
@endcan
</div>
</div>
<div class="body mt-4 overflow-auto rounded-lg shadow">
<table class="w-full">
<thead class="bg-gray-50 dark:bg-gray-700 dark:text-gray-100">
<tr>
<th class="p-3 text-sm font-semibold tracking-wide text-left ">ID</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Titulo</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Sequência</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Tipo</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Respostas</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Ações</th>
</tr>
</thead>
<tbody>
@foreach($steps as $step)
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2">
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$step->id}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$step->title}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 sequence sequence-{{$step->id}}">{{$step->sequence}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$step->type}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100"><a href="steps/response/{{$step->id}}" class="text-blue-500 hover:underline">Editar Respostas</a></td>
<td class="p-3 text-sm font-bold flex items-center gap-2 flex-wrap">
<button class="bg-blue-600 text-white p-2 rounded flex-1 text-lg" onclick="atualizaStep(<?= $step->id ?>)"><i class="fas fa-edit"></i></button>
<form method="POST" action="steps/deletar/{{$step->id}}" class="flex-1 flex" onclick="javascript: if(!confirm('Deseja deletar esses dados?')) return false;">
@csrf
@method('delete')
<button class="bg-red-600 text-white p-2 rounded flex-1 text-lg">
<i class="fas fa-trash"></i>
</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
<x-modalStep :numberChannels="$numberChannels"></x-modalStep>
<x-modalEditStep></x-modalEditStep>
@push('updateStep')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"></script>
<script>
function atualizaStep(id_step) {
$.ajax({
type: "get",
url: `steps/editar/${id_step}`,
success: function({
data
}) {
const step_data = data.step_data;
const numbers_channels = data.numbers;
const modal = document.querySelector('.modal-edit');
const sequence_atual = document.querySelector(`.sequence-${id_step}`).innerHTML;
modal.style.display = 'block';
modal.querySelector('form').action = `/steps/editar/${step_data.id}`;
modal.querySelector("textarea[name='titulo']").value = step_data.title;
modal.querySelector("input[name='sequencia']").value = step_data.sequence;
modal.querySelector("input[name='sequence_atual']").value = sequence_atual;
const containerChannels = modal.querySelector("select[name='channel']");
numbers_channels.forEach(el => {
containerChannels.innerHTML = ` <option value="${el.id}">${el.title}</option>`
})
const containerSelect = modal.querySelector(".container-select");
if (step_data.type !== 'listarOption') {
containerSelect.innerHTML = ` <option value="listarOption">Lista de Opções</option>
<option value="listarFilas" selected>Lista de Filas</option>`
}
}
});
}
function fecharModal() {
document.querySelector('.modal-edit').style.display = 'none';
}
</script>
@endpush
</x-app-layout>

85
resources/views/admin/systemMessage.blade.php

@ -56,89 +56,6 @@
<x-modalSystemMessage></x-modalSystemMessage>
<x-modalEditSystemMessage></x-modalEditSystemMessage>
@push('updatesystemMessage')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"></script>
<script>
const moments = [
{
value: 'SAUDACAO',
currentValue: 'SAUDAÇÃO'
},
{
value: 'CANCELAR_FILA',
currentValue: 'Cancelar Fila'
},
{
value: 'INICIAR_ATENDIMENTO',
currentValue: 'Iniciar Atendimento'
},
{
value: 'FINALIZAR_ATENDIMENTO',
currentValue: 'Finalizar Atendimento'
},
{
value: 'ENTRAR_FILA_SEM',
currentValue: 'Entrar Fila Sem'
},
{
value: 'ENTRAR_FILA_COM',
currentValue: 'Entrar Fila Com'
},
]
function atualizasystemMessage(id_systemMessage) {
$.ajax({
type: "get",
url: `systemMessage/editar/${id_systemMessage}`,
success: function({
data
}) {
const systemMessageData = data.systemMessage;
const modal = document.querySelector('.modal-edit');
modal.style.display = 'block';
modal.querySelector('form').action = `/systemMessage/editar/${systemMessageData.id}`;
modal.querySelector("input[name='texto']").value = systemMessageData.texto;
modal.querySelector("input[name='ordem']").value = systemMessageData.ordem;
const containerSelect = modal.querySelector(".container-select");
moments.forEach(el => {
if(systemMessageData.momento === el.value){
containerSelect.innerHTML += `<option value="${el.value}" selected>${el.currentValue}</option>`
}else{
containerSelect.innerHTML += `<option value="${el.value}" >${el.currentValue}</option>`
}
})
}
});
}
function fecharModal() {
document.querySelector('.modal-edit').style.display = 'none';
}
</script>
@endpush
<script src="{{ asset('js/cadastroSystemMessage.js') }}"></script>
</x-app-layout>

62
resources/views/admin/users.blade.php

@ -1,58 +1,44 @@
<x-app-layout>
<div class="py-8 px-8">
@if(session('status'))
<div class="w-full p-5 bg-blue-600 mb-5 text-white rounded uppercase font-bold text-lg">
{{session('status')}}
</div>
@endif
<div class="header flex flex-col items-center gap-4 ">
<div class="flex justify-between items-center w-full mb-5">
<h1 class=" text-gray-900 dark:text-gray-100 text-3xl font-bold text-center">
Meus agentes
</h1>
<button class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-base overflow-hidden" @click="modal = !modal" type="button">Cadastrar Usuário</button>
<button class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-base overflow-hidden" @click="modal = !modal" type="button">Cadastrar Agente</button>
</div>
<form action="{{route('users')}}" method="GET" class="flex w-full gap-3 flex-col lg:flex-row ">
<div class="search bg-white dark:bg-gray-800 rounded px-3 py-1 overflow-hidden">
<i class="fas fa-search dark:text-gray-100"></i>
<input type="text" name="pesquisa" class="border-none bg-transparent focus:ring-transparent placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " placeholder="Pesquise agentes">
</div>
<select class="border-none rounded overflow-hidden dark:bg-gray-800 dark:text-gray-100" name="status">
@if($selected->isSelected)
@if($selected->isAtivo == 'ativo')
<option value="ativo" selected>Ativos</option>
<option value="desativado">Desativados</option>
@else
<option value="ativo">Ativos</option>
<option value="desativado" selected>Desativados</option>
@endif
@if($selected->isAtivo == 'ativo')
<option value="ativo" selected>Ativos</option>
<option value="desativado">Desativados</option>
@else
<option value="ativo">Ativos</option>
<option value="desativado" selected>Desativados</option>
@endif
@else
<option value="ativo">Ativos</option>
<option value="desativado">Desativados</option>
<option value="ativo">Ativos</option>
<option value="desativado">Desativados</option>
@endif
</select>
<button class="lg:ml-auto ml-0 bg-blue-900 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg overflow-hidden">Pesquisar</button>
</form>
</div>
<div class="body mt-4 overflow-auto rounded-lg shadow">
<table class="w-full">
<thead class="bg-gray-50 dark:bg-gray-700 dark:text-gray-100">
<tr>
<th class="p-3 text-sm font-semibold tracking-wide text-left ">ID</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left pl-5">ID</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Nome</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Email</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Matricula</th>
@ -62,9 +48,8 @@
</thead>
<tbody>
@foreach($agentes as $agente)
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2">
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$agente->id}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 pl-5">{{$agente->id}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$agente->nome}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$agente->email}}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{$agente->matricula}}</td>
@ -74,14 +59,14 @@
<td class="p-3 text-sm text-red-500 font-bold">DESATIVADO</td>
@endif
<td class="p-3 text-sm font-bold flex items-center gap-2 flex-wrap">
<td class="p-3 text-sm font-bold w-32">
<button class="bg-blue-600 dark:bg-blue-900 text-white p-2 rounded flex-1 text-lg text-center" onclick="atualizaUsuario(<?= $agente->id ?>)"><i class="fas fa-edit"></i></button>
<button class="bg-blue-600 text-white p-2 rounded text-lg text-center w-full mb-2" onclick="atualizaUsuario(<?= $agente->id ?>)"><i class="fas fa-edit"></i></button>
@if($agente->status)
<form method="POST" id="formulario" action="users/deletar/{{$agente->id}}" class="flex-1 flex" title="desativar conta?" onclick="javascript: if(!confirm('Deseja desativar esse usuário?')) return false;">
<form method="POST" id="formulario" action="users/deletar/{{$agente->id}}" title="desativar conta?" onclick="javascript: if(!confirm('Deseja desativar esse usuário?')) return false;">
@csrf
@method('delete')
<button class="bg-red-600 dark:bg-red-700 text-white p-2 rounded flex-1 text-lg">
<button class="bg-red-600 text-white p-2 rounded text-lg w-full">
<i class="fas fa-ban"></i>
</button>
</form>
@ -93,13 +78,9 @@
</table>
</div>
</div>
<x-modal :maior_matricula="$maior_matricula"></x-modal>
<x-modalEditUsers class="teste"></x-modalEditUsers>
<x-modalEditUsers></x-modalEditUsers>
@push('updateAgente')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"></script>
@ -111,8 +92,6 @@
success: function({
data
}) {
const modal = document.querySelector('.modal-edit');
modal.style.display = 'block';
@ -123,14 +102,12 @@
modal.querySelector("input[name='email']").value = data.email;
modal.querySelector("input[name='matricula']").value = data.matricula;
const containerCheckbox = modal.querySelector(".container-checkbox");
if (!data.status) {
containerCheckbox.innerHTML = `<input type="radio" name="status" value="on"> <span class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="status" value="off" checked> <span class="dark:text-gray-100">Não</span>`
}
}
});
}
@ -141,9 +118,4 @@
</script>
@endpush
</x-app-layout>

7
resources/views/components/modal.blade.php

@ -1,6 +1,6 @@
@props(['maior_matricula'])
<!-- Main modal -->
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full" :class="{'block': modal, 'hidden': !modal}">
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full modal-agentes" :class="{'block': modal, 'hidden': !modal}">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="{{ route('users') }}" class="relative bg-white rounded-lg shadow dark:bg-gray-700">
@ -28,9 +28,8 @@
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Matricula: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " value="{{$maior_matricula}}" name="matricula" onkeypress="return event.charCode >= 48 && event.charCode <= 57" disabled>
<x-input-error :messages="$errors->get('matricula')" class="mt-2" />
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 border-none focus:ring-transparent pointer-events-none" value="{{$maior_matricula}}" name="matricula" onkeypress="return event.charCode >= 48 && event.charCode <= 57" readonly>
<x-input-error :messages="$errors->get('matricula')" class="mt-2" />
</div>
<div>
<label for="" class="dark:text-gray-100 block">Ativo: </label>

73
resources/views/components/modalEditEmpresa.blade.php

@ -0,0 +1,73 @@
<div class="fixed z-50 p-4 bg-gray-900 bg-opacity-60 h-full w-full hidden modal-edit">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="" class="relative bg-white rounded-lg shadow dark:bg-gray-700" >
@method('PUT')
@csrf
<!-- Modal header -->
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3">
Editar Empresa
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" onclick="fecharModal()">
<i class="fas fa-times"></i>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Nome Fantasia: </label>
<input type="text" placeholder="Digite o nome fantasia: " required name="nome" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100">
</div>
{{-- <div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Qual é o Token: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o token: " name="token" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</div> --}}
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o Email: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o email: " name="email" >
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Digite o CPNJ: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o CPNJ: " name="cnpj" onkeypress="return event.charCode >= 48 && event.charCode <= 57" id="cnpj" maxlength="8">
</div>
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center justify-end p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg">Atualizar</button>
</div>
</form>
</div>
</div>
@push('cadastroEmpresa')
<script>
$(document).ready(function(){
$('.modal-edit').find('#cnpj').mask('00.000.000/0000-00', {reverse: true});
})
$('.modal-edit').find('form').submit(function(e){
e.preventDefault();
const inputValue = $(this).find("input[name='cnpj']").val();
if(inputValue.length < 18){
$(this).find("input[name='cnpj']").addClass("border border-red-500");
return;
}
this.submit();
})
function fecharModal() {
$('.modal-edit').hide();
}
</script>
@endpush

66
resources/views/components/modalEditRedirect.blade.php

@ -0,0 +1,66 @@
@props(['numberChannels'])
<!-- Main modal -->
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full modal-edit">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%] ">
<!-- Modal content -->
<form method="POST" action="" class="relative bg-white rounded-lg shadow dark:bg-gray-700" id="formStepEdit">
@method('PUT')
@csrf
<!-- Modal header -->
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3">
Atualizar Step
</h3>
<button type="button"
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white"
onclick="fecharModal()">
<i class="fas fa-times"></i>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Nome: </label>
<input type="text"
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"
placeholder="Digite o nome: " name="nome">
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Descrição: </label>
<textarea placeholder="Digite a descrição: " name="descricao" rows="5"
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"></textarea>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o canal: </label>
<select
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"
name="channel">
@foreach ($numberChannels as $numberChannel)
<option value="{{ $numberChannel->id }}">{{ $numberChannel->title }}</option>
@endforeach
</select>
</div>
<div>
<label for="" class="dark:text-gray-100 block">Ativo: </label>
<div class="container-radio-status">
</div>
</div>
<div>
<label for="" class="dark:text-gray-100 block">Inicial: </label>
<div class="container-radio-initial">
</div>
</div>
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit"
class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg">Atualizar</button>
</div>
</form>
</div>
</div>

117
resources/views/components/modalEditRedirectOption.blade.php

@ -0,0 +1,117 @@
@props(['id_redirect'])
<!-- Main modal -->
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full modal-edit">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="" class="relative bg-white rounded-lg shadow dark:bg-gray-700"
id="formRedirectOptionEdit">
@method("PUT")
@csrf
<!-- Modal header -->
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3">
Editar Resposta
</h3>
<button type="button"
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white"
@click="modal = false" onclick="fecharModal()">
<i class="fas fa-times"></i>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-5">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Qual é a sequência: </label>
<input type="text" value="1"
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 sequence"
placeholder="Digite a sequência: " name="sequencia" required
onkeypress="return event.charCode >= 48 && event.charCode <= 57">
<p class="text-red-500 text-problem hidden">Opção já cadastrada no sistema.</p>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o tipo: </label>
<select
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-types"
name="type">
</select>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o destino: </label>
<select
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-destino"
name="destino">
</select>
<input type="text"
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 input-destino hidden"
placeholder="Digite o texto destino: " name="destino">
</div>
<div>
<label for="" class="dark:text-gray-100 block">Ativo: </label>
<div class="container-radio">
</div>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Descrição: </label>
<textarea class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"
placeholder="Digite a descrição: " name="descricao" rows="3" ></textarea>
</div>
<input type="hidden" name="id_redirect" value="{{ $id_redirect }}">
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit"
class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg btn-sub">Editar</button>
</div>
</form>
</div>
</div>
@push('updateResponseStep')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E="
crossorigin="anonymous"></script>
<script>
$('#formRedirectOptionEdit').submit(async function(e) {
// Impede o envio do formulário
e.preventDefault();
const form = e.target;
const sequences = await requestSequenceOptions();
const sequenceDBValue = document.querySelector('.modal-edit').getAttribute("data-sequenceDB");
const el = form.querySelector('input.sequence')
const parent = el.parentNode;
el.classList.remove('border-red-500')
el.classList.remove('border-2')
parent.querySelector('p').classList.add('hidden');
const hasItemInArray = sequences.includes(el.value);
if(el.value === sequenceDBValue){
return this.submit();
}
if (hasItemInArray) {
parent.querySelector('p').classList.remove('hidden');
el.classList.add('border-red-500')
el.classList.add('border-2')
return;
}
this.submit();
});
function fecharModal() {
$('.modal-edit').hide();
$('.modal-edit').find('input.sequence').removeClass('border-red-500 border-2');
$('.modal-edit').find('.text-problem').addClass('hidden');
}
</script>
@endpush

124
resources/views/components/modalEditStep.blade.php

@ -1,124 +0,0 @@
<!-- Main modal -->
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full modal-edit">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%] ">
<!-- Modal content -->
<form method="POST" action="" class="relative bg-white rounded-lg shadow dark:bg-gray-700" id="formStepEdit">
@csrf
<!-- Modal header -->
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3">
Atualizar Step
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" onclick="fecharModal()">
<i class="fas fa-times"></i>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Titulo: </label>
<textarea name="titulo" rows="5" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o titulo: "></textarea>
<!-- <input type="text" name=""> -->
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Qual é Sequência: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite a sequência: " name="sequencia" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
<p class="text-red-500 text-problem hidden">Opção já cadastrada no sistema.</p>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o canal: </label>
<select class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" name="channel">
</select>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Escolha o tipo:</label>
<select name="tipo" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 container-select">
<option value="listarOption" selected>Lista de Opções</option>
<option value="listarFilas">Lista de Filas</option>
</select>
</div>
<input type="hidden" name="sequence_atual">
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg">Atualizar</button>
</div>
</form>
</div>
</div>
@push('cadastroSequenceRule')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous">
</script>
<script>
$('#formStepEdit').submit(function(e) {
e.preventDefault();
const form = document.querySelector('#formStepEdit')
const opcoes = document.querySelectorAll('.sequence');
const el = form.querySelector("input[name='sequencia']")
const parent = el.parentNode;
const sequence_atual = form.querySelector("input[name='sequence_atual']").value;
el.classList.remove('border-red-500')
el.classList.remove('border-2')
parent.querySelector('p').classList.add('hidden');
if(sequence_atual === el.value){
this.submit();
return;
}
if (hasItemInArray(opcoes, el.value)) {
parent.querySelector('p').classList.remove('hidden');
el.classList.add('border-red-500')
el.classList.add('border-2')
return;
}
this.submit();
});
function hasItemInArray(arr, value) {
for (let i = 0; i < arr.length; i++) {
console.log(value);
if (arr[i].innerHTML === value) {
return true;
}
}
return false;
}
function hasDuplicates(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i].value === arr[j].value) {
return true;
}
}
}
return false;
}
</script>
@endpush

55
resources/views/components/modalEditSystemMessage.blade.php

@ -2,7 +2,7 @@
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full modal-edit">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%] ">
<!-- Modal content -->
<form method="POST" action="" class="relative bg-white rounded-lg shadow dark:bg-gray-700" id="formStepEdit">
<form method="POST" action="" class="relative bg-white rounded-lg shadow dark:bg-gray-700" >
@csrf
<!-- Modal header -->
@ -21,10 +21,9 @@
<div class="flex flex-col gap-2 relative">
<label class="dark:text-gray-100">Texto: </label>
<input type="text" placeholder="Digite o texto: " name="texto" id="inputTitle" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" />
<input type="text" placeholder="Digite o texto: " name="texto" id="inputTitleEdit" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 autoCompleteInput" autocomplete="off" />
<ul class="autoCompleteBox w-full z-50 bg-gray-800 p-2 absolute bottom-[-60px] rounded-md flex flex-col gap-3 opacity-0 max-h-36 overflow-y-scroll">
<ul class="autoCompleteBox w-full z-50 bg-gray-800 p-2 absolute hidden bottom-[-60px] rounded-md max-h-36 overflow-y-scroll">
</ul>
</div>
@ -40,7 +39,7 @@
<div class="flex flex-col gap-2 mt-2">
<label class="dark:text-gray-100">Escolha o momento:</label>
<select name="momento" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 container-select">
</select>
</div>
</div>
@ -53,3 +52,49 @@
</form>
</div>
</div>
@push('updatesystemMessage')
<script>
const moments = [
'SAUDACAO',
'CANCELAR_FILA',
'INICIAR_ATENDIMENTO',
'FINALIZAR_ATENDIMENTO',
'ENTRAR_FILA_SEM',
'ENTRAR_FILA_COM',
]
function atualizasystemMessage(id_systemMessage) {
$.ajax({
type: "get",
url: `systemMessage/editar/${id_systemMessage}`,
success: function({
data
}) {
const systemMessageData = data.systemMessage;
const modal = document.querySelector('.modal-edit');
modal.style.display = 'block';
modal.querySelector('form').action = `/systemMessage/editar/${systemMessageData.id}`;
modal.querySelector("input[name='texto']").value = systemMessageData.texto;
modal.querySelector("input[name='ordem']").value = systemMessageData.ordem;
const containerSelect = modal.querySelector(".container-select");
containerSelect.innerHTML = '';
moments.forEach(value => {
if (systemMessageData.momento === value) {
containerSelect.innerHTML += `<option value="${value}" selected>${value}</option>`
} else {
containerSelect.innerHTML += `<option value="${value}" >${value}</option>`
}
})
}
});
}
</script>
@endpush

131
resources/views/components/modalEmpresa.blade.php

@ -1,83 +1,7 @@
{{--<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full" :class="{'block': modal, 'hidden': !modal}">
<div class="fixed z-50 p-4 bg-gray-900 bg-opacity-60 h-full w-full hidden modal" :class="{'block': modal, 'hidden': !modal}">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="{{ route('steps') }}" class="relative bg-white rounded-lg shadow dark:bg-gray-700" id="formStep">
@csrf
<!-- Modal header -->
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3">
Cadastrar Empresa
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" @click="modal = false">
<i class="fas fa-times"></i>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-3">
<ul class="flex">
<li>
<span>Empresa</span>
<span>1</span>
</li>
<li>
<span>Number Channel</span>
<span>2</span>
</li>
<li>
<span>Configurações Atendimento</span>
<span>3</span>
</li>
<li>
<span>Mensagens de Sistema</span>
<span>4</span>
</li>
<li>
<span>Steps e Response</span>
<span>5</span>
</li>
</ul>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Nome: </label>
<textarea placeholder="Digite o nome: " name="nome" rows="5" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"></textarea>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Qual é o Token: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o token: " name="token" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o Email: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o email: " name="email" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Digite o CPNJ: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o CPNJ: " name="cnpj" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</div>
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg">Cadastrar</button>
</div>
</form>
</div>
</div>--}}
<div class="fixed z-50 p-4 bg-gray-900 bg-opacity-60 h-full w-full">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="{{ route('steps') }}" class="relative bg-white rounded-lg shadow dark:bg-gray-700" id="formStep">
<form method="POST" action="{{route('empresas.store')}}" class="relative bg-white rounded-lg shadow dark:bg-gray-700">
@csrf
<!-- Modal header -->
@ -92,36 +16,21 @@
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-3">
<div class="etapas m-auto w-[400px] flex items-center justify-between relative z-10">
<span class="circle h-[50px] w-[50px] bg-white flex items-center justify-center rounded-full border-4 border-slate-300">1</span>
<span class="circle h-[50px] w-[50px] bg-white flex items-center justify-center rounded-full border-4 border-slate-300">2</span>
<span class="circle h-[50px] w-[50px] bg-white flex items-center justify-center rounded-full border-4 border-slate-300">3</span>
<span class="circle h-[50px] w-[50px] bg-white flex items-center justify-center rounded-full border-4 border-slate-300">4</span>
<span class="circle h-[50px] w-[50px] bg-white flex items-center justify-center rounded-full border-4 border-slate-300">5 </span>
<div class="progress-bar absolute w-full h-1 bg-slate-300 z-[-1]">
<div class="indicator h-full absolute w-[33%] bg-blue-500"></div>
</div>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Nome: </label>
<textarea placeholder="Digite o nome: " name="nome" rows="5" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"></textarea>
<label class="dark:text-gray-100">Nome Fantasia: </label>
<input type="text" placeholder="Digite o nome fantasia: " required name="nome" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100">
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Qual é o Token: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o token: " name="token" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o token: " name="token" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o Email: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o email: " name="email" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o email: " name="email" >
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Digite o CPNJ: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o CPNJ: " name="cnpj" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o CPNJ: " name="cnpj" onkeypress="return event.charCode >= 48 && event.charCode <= 57" id="cnpj">
</div>
</div>
@ -132,4 +41,28 @@
</div>
</form>
</div>
</div>
</div>
@push('cadastroEmpresa')
<script>
$('.modal').find('form').submit(function(e){
e.preventDefault();
const inputValue = $(this).find("input[name='cnpj']").val();
if(inputValue.length < 18){
$(this).find("input[name='cnpj']").addClass("border border-red-500");
return;
}
this.submit();
})
$(document).ready(function(){
$('.modal').find('#cnpj').mask('00.000.000/0000-00', {reverse: true});
})
</script>
@endpush

73
resources/views/components/modalRedirect.blade.php

@ -0,0 +1,73 @@
@props(['numberChannels'])
<!-- Main modal -->
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full" :class="{ 'block': modal, 'hidden': !modal }">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="{{ route('redirects.store') }}"
class="relative bg-white rounded-lg shadow dark:bg-gray-700" >
@csrf
<!-- Modal header -->
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3">
Cadastrar Redirect
</h3>
<button type="button"
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white"
@click="modal = false">
<i class="fas fa-times"></i>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Nome: </label>
<input type="text"
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"
placeholder="Digite o nome: " name="nome">
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o canal: </label>
<select
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"
name="channel">
@foreach ($numberChannels as $numberChannel)
<option value="{{ $numberChannel->id }}">{{ $numberChannel->title }}</option>
@endforeach
</select>
</div>
<div >
<label for="" class="dark:text-gray-100 block">Ativo: </label>
<div class="container-radio">
<input type="radio" name="status" checked value="on"> <span
class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="status" value="off"> <span
class="dark:text-gray-100">Não</span>
</div>
</div>
<div >
<label for="" class="dark:text-gray-100 block">Inicial: </label>
<div class="container-radio">
<input type="radio" name="initial" checked value="on"> <span
class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="initial" value="off"> <span
class="dark:text-gray-100">Não</span>
</div>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Descrição: </label>
<textarea placeholder="Digite a descrição: " name="descricao" rows="5"
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"></textarea>
</div>
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit"
class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg">Cadastrar</button>
</div>
</form>
</div>
</div>

128
resources/views/components/modalRedirectOption.blade.php

@ -0,0 +1,128 @@
@props(['id_redirect', 'types'])
<!-- Main modal -->
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full modal" :class="{ 'block': modal, 'hidden': !modal }">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="{{ route('redirects.options.store', ['redirect' => $id_redirect]) }}"
class="relative bg-white rounded-lg shadow dark:bg-gray-700" id="formRedirectOption">
@csrf
<!-- Modal header -->
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3">
Cadastrar Resposta
</h3>
<button type="button"
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white"
@click="modal = false">
<i class="fas fa-times"></i>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-5">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Qual é a sequência: </label>
<input type="text"
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 sequence"
placeholder="Digite a sequência: " name="sequencia" required
onkeypress="return event.charCode >= 48 && event.charCode <= 57">
<p class="text-red-500 text-problem hidden">Opção já cadastrada no sistema.</p>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o tipo: </label>
<select
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-types"
name="type">
@foreach ($types as $type)
<option value="{{ $type->id }}" class="uppercase">{{ $type->name }}</option>
@endforeach
</select>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o destino: </label>
<select
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-destino"
name="destino">
</select>
<input type="text"
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 input-destino"
placeholder="Digite o texto destino: " name="destino">
</div>
<div>
<label for="" class="dark:text-gray-100 block">Ativo: </label>
<div class="container-radio">
<input type="radio" name="status" value="on" checked> <span
class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="status" value="off"> <span
class="dark:text-gray-100">Não</span>
</div>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Descrição: </label>
<textarea class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"
placeholder="Digite a descrição: " name="descricao" rows="3" ></textarea>
</div>
<input type="hidden" name="id_redirect" value="{{ $id_redirect }}">
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit"
class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg btn-sub">Cadastrar</button>
</div>
</form>
</div>
</div>
@push('cadastroOptionRule')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E="
crossorigin="anonymous"></script>
<script>
$('#formRedirectOption').submit(async function(e) {
// Impede o envio do formulário
e.preventDefault();
const form = e.target;
const sequences = await requestSequenceOptions();
const el = document.querySelector('input.sequence')
const parent = el.parentNode;
el.classList.remove('border-red-500')
el.classList.remove('border-2')
parent.querySelector('p').classList.add('hidden');
const hasItemInArray = sequences.includes(el.value);
if (hasItemInArray) {
parent.querySelector('p').classList.remove('hidden');
el.classList.add('border-red-500')
el.classList.add('border-2')
return;
}
this.submit();
});
function requestSequenceOptions() {
return new Promise(function(resolve, reject) {
$.ajax({
type: "get",
dataType: 'json',
url: "{{ route('options.sequence', ['redirect' => $id_redirect]) }}",
success: function(response) {
const data = response.data.data;
const sequences = data.map(item => item.sequence);
return resolve(sequences);
}
});
});
}
</script>
@endpush

88
resources/views/components/modalResponseStep.blade.php

@ -1,88 +0,0 @@
@props(['idStep'])
<!-- Main modal -->
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full" :class="{'block': modal, 'hidden': !modal}">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="{{route('AdicionarRespostas')}}" class="relative bg-white rounded-lg shadow dark:bg-gray-700" id="formResponseStep">
@csrf
<!-- Modal header -->
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3">
Cadastrar Resposta
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" @click="modal = false">
<i class="fas fa-times"></i>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-5">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Resposta: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o titulo: " name="resposta">
</div>
<input type="hidden" name="id_step" value="{{$idStep}}">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Qual é a opção: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 opcao" placeholder="Digite a sequência: " name="opcao" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
<p class="text-red-500 text-problem hidden">Opção já cadastrada no sistema.</p>
</div>
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg btn-sub">Cadastrar</button>
</div>
</form>
</div>
</div>
@push('cadastroOptionRule')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous">
</script>
<script>
$('#formResponseStep').submit(function(e) {
// Impede o envio do formulário
e.preventDefault();
const opcoes = document.querySelectorAll('.opcoes');
const el = document.querySelector('input.opcao')
const parent = el.parentNode;
el.classList.remove('border-red-500')
el.classList.remove('border-2')
parent.querySelector('p').classList.add('hidden');
if (hasItemInArray(opcoes, el.value)) {
parent.querySelector('p').classList.remove('hidden');
el.classList.add('border-red-500')
el.classList.add('border-2')
return;
}
this.submit();
});
// this.submit();
function hasItemInArray(arr, value) {
for (let i = 0; i < arr.length; i++) {
if (arr[i].value === value) {
return true;
}
}
return false;
}
</script>
@endpush

103
resources/views/components/modalStep.blade.php

@ -1,103 +0,0 @@
@props(['numberChannels'])
<!-- Main modal -->
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full" :class="{'block': modal, 'hidden': !modal}">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="{{ route('steps') }}" class="relative bg-white rounded-lg shadow dark:bg-gray-700" id="formStep">
@csrf
<!-- Modal header -->
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3">
Cadastrar Step
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" @click="modal = false">
<i class="fas fa-times"></i>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Titulo: </label>
<textarea placeholder="Digite o titulo: " name="titulo" rows="5" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"></textarea>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Qual é Sequência: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite a sequência: " name="sequencia" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
<p class="text-red-500 text-problem hidden">Opção já cadastrada no sistema.</p>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o canal: </label>
<select class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" name="channel">
@foreach($numberChannels as $numberChannel)
<option value="{{$numberChannel->id}}">{{$numberChannel->title}}</option>
@endforeach
</select>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Escolha o tipo:</label>
<select name="tipo" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100">
<option value="listarOption" selected>Lista de Opções</option>
<option value="listarFilas">Lista de Filas</option>
</select>
</div>
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg">Cadastrar</button>
</div>
</form>
</div>
</div>
@push('cadastroSequenceRule')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous">
</script>
<script>
$('#formStep').submit(function(e) {
// Impede o envio do formulário
e.preventDefault();
const opcoes = document.querySelectorAll('.sequence');
const el = document.querySelector("input[name='sequencia']")
const parent = el.parentNode;
el.classList.remove('border-red-500')
el.classList.remove('border-2')
parent.querySelector('p').classList.add('hidden');
if (hasItemInArray(opcoes, el.value)) {
parent.querySelector('p').classList.remove('hidden');
el.classList.add('border-red-500')
el.classList.add('border-2')
return;
}
this.submit();
});
// this.submit();
function hasItemInArray(arr, value) {
for (let i = 0; i < arr.length; i++) {
console.log(value);
if (arr[i].innerHTML === value) {
return true;
}
}
return false;
}
</script>
@endpush

55
resources/views/components/modalSupervisores.blade.php

@ -1,55 +0,0 @@
@props(['filas', 'agentes', 'numberChannels'])
<!-- Main modal -->
<div class="fixed z-50 hidden p-4 bg-gray-900 bg-opacity-60 h-full w-full" :class="{'block': modal, 'hidden': !modal}">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="{{ route('supervisor') }}" class="relative bg-white rounded-lg shadow dark:bg-gray-700">
@csrf
<!-- Modal header -->
<div class="flex items-start justify-between border-b rounded-t dark:border-gray-600 px-3 py-4">
<h3 class="text-xl font-semibold text-gray-900 dark:text-white">
Cadastrar Agente
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" @click="modal = false">
<i class="fas fa-times"></i>
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="flex flex-col gap-4">
<div class="flex flex-col gap-2">
<label for="">Selecione o Agente: </label>
<select class="w-full" name="agente_id">
@foreach($agentes as $agente)
<option value="{{$agente->id}}">{{$agente->nome}}</option>
@endforeach
</select>
</div>
<div class="flex flex-col gap-2">
<label for="">Selecione a Fila: </label>
<select class="w-full" name="fila">
@foreach($filas as $fila)
<option value="{{$fila->nome}}" selec>{{$fila->nome}}</option>
@endforeach
</select>
</div>
<div class="flex flex-col gap-2">
<label for="">Selecione o canal: </label>
<select class="w-full" name="channel">
@foreach($numberChannels as $numberChannel)
<option value="{{$numberChannel->id}}">{{$numberChannel->title}}</option>
@endforeach
</select>
</div>
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg">Cadastrar</button>
</div>
</form>
</div>
</div>

90
resources/views/components/modalSystemMessage.blade.php

@ -10,7 +10,7 @@
<h3 class="text-xl font-semibold text-gray-900 dark:text-white pl-3">
Cadastrar Mensagem de Sistema
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" @click="modal = false">
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" @click="modal = false" onclick="fecharModal()">
<i class="fas fa-times"></i>
</button>
</div>
@ -21,15 +21,13 @@
<div class="flex flex-col gap-2 relative">
<label class="dark:text-gray-100">Texto: </label>
<input type="text" placeholder="Digite o texto: " name="texto" id="inputTitle" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" />
<input type="text" placeholder="Digite o texto: " name="texto" id="inputTitleCadastro" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 autoCompleteInput" autocomplete="off"/>
<ul class="autoCompleteBox w-full z-50 bg-gray-800 p-2 absolute bottom-[-60px] rounded-md flex flex-col gap-3 opacity-0 max-h-36 overflow-y-scroll">
<ul class="autoCompleteBox w-full z-50 bg-gray-800 p-2 absolute bottom-[-60px] rounded-md hidden max-h-36 overflow-y-scroll">
</ul>
</div>
<div class="flex flex-col gap-2 mt-2">
<label class="dark:text-gray-100">Qual é Ordem: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite a ordem: " name="ordem" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
@ -40,12 +38,12 @@
<div class="flex flex-col gap-2 mt-2">
<label class="dark:text-gray-100">Escolha o momento:</label>
<select name="momento" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100">
<option value="SAUDACAO" selected>Saudação</option>
<option value="CANCELAR_FILA">Cancelar Fila</option>
<option value="INICIAR_ATENDIMENTO">Iniciar Atendimento</option>
<option value="FINALIZAR_ATENDIMENTO">Finalizar Atendimento</option>
<option value="ENTRAR_FILA_SEM">Entrar Fila Sem</option>
<option value="ENTRAR_FILA_COM">Entrar Fila Com</option>
<option value="SAUDACAO" selected>SAUDACAO</option>
<option value="CANCELAR_FILA">CANCELAR_FILA</option>
<option value="INICIAR_ATENDIMENTO">INICIAR_ATENDIMENTO</option>
<option value="FINALIZAR_ATENDIMENTO">FINALIZAR_ATENDIMENTO</option>
<option value="ENTRAR_FILA_SEM">ENTRAR_FILA_SEM</option>
<option value="ENTRAR_FILA_COM">ENTRAR_FILA_COM</option>
</select>
</div>
</div>
@ -58,73 +56,3 @@
</form>
</div>
</div>
@push('cadastroSystemMessage')
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous">
</script>
<script>
const autoCompleteMessages = [{
id: 1,
autoComplete: '@user_name',
},
{
id: 2,
autoComplete: '@agente_name',
},
{
id: 2,
autoComplete: '@agente_name',
},
{
id: 2,
autoComplete: '@agente_name',
},
];
const valueEspacamento = 50;
let cont = 1;
let autoCompleteString = '';
$("#inputTitle").on('input', (function() {
cont = 1;
$('.autoCompleteBox').addClass('opacity-0')
let selectedTexts = '';
let value = $(this).val();
if (value.indexOf("@") >= 0) {
let inputText = '@' + value.split("@").pop(); // Obtem o texto depois da barra invertida
console.log(inputText);
autoCompleteMessages.forEach(text => {
if (text.autoComplete.toLowerCase().includes(inputText.toLowerCase())) {
selectedTexts += `<li class="p-2 dark:text-gray-100 hover:bg-gray-600 cursor-pointer rounded-md" data-id="${text.id}">${text.autoComplete}</li>`
if (cont < 3) {
cont++;
};
}
})
$('.autoCompleteBox').css('bottom', `-${valueEspacamento * cont}px`);
console.log(inputText);
console.log(selectedTexts);
if (selectedTexts) {
$(".autoCompleteBox").html(selectedTexts);
$('.autoCompleteBox').removeClass('opacity-0')
}
}
}))
</script>
@endpush

9
resources/views/layouts/app.blade.php

@ -15,7 +15,8 @@
<link rel="icon" href="/img/favicon.ico" type="image/x-icon">
<!-- Scripts -->
@vite(['resources/css/app.css', 'resources/js/app.js'])
<script src="https://code.jquery.com/jquery-3.6.4.js" integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous">
</script>
</head>
<body class="font-sans antialiased">
@ -32,6 +33,7 @@
</div>
@stack('graficos')
@stack('relatoriosDB')
@stack('updateResponseStep')
@stack('updateAgente')
@stack('updateFila')
@ -42,7 +44,8 @@
@stack('cadastroOptionRule')
@stack('cadastroSequenceRule')
@stack('cadastroSystemMessage')
@stack('agentesLogados')
@stack('cadastroEmpresa')
<script>
selectTheme()
@ -53,9 +56,7 @@
} else {
document.documentElement.classList.remove('dark')
}
}
</script>
</body>
</html>

9
resources/views/layouts/guest.blade.php

@ -18,21 +18,12 @@
<body class="font-sans text-gray-900 antialiased">
<div class="min-h-screen flex flex-col justify-center items-center pt-6 sm:pt-0 dark:bg-gray-900" style="background-image: linear-gradient(90deg,#006BFF 0%,#FF0071 100%); ">
<!-- <div>
<a href="/">
<x-application-logo class="w-20 h-20 fill-current text-gray-500" />
</a>
</div> -->
<div class="w-full sm:max-w-md px-6 py-4 bg-white dark:bg-white shadow-md overflow-hidden sm:rounded-lg">
{{ $slot }}
</div>
</div>
<script>
localStorage.setItem('theme', 'dark')
</script>
</body>
</html>

8
resources/views/layouts/menu.blade.php

@ -14,7 +14,7 @@
<input type="text" placeholder="Pesquise: " class="text-[15px] ml-4 w-full bg-transparent border-none focus:ring-transparent">
</div> --}}
<x-nav-link class="p-2 mt-3 flex items-center flex-col md:flex-row rounded-md px-2 md:px-4 duration-300 cursor-pointer hover:bg-blue-600 text-white" :href="route('dashboard')" :active="request()->routeIs('dashboard')">
<x-nav-link class="p-2 mt-3 flex items-center flex-col md:flex-row rounded-md px-2 md:px-4 duration-300 cursor-pointer hover:bg-blue-600 text-white" :href="route('dashboard')" :active="request()->routeIs(['dashboard', 'dashboard.agentesLogados'])">
<i class="fas fa-home text-sm"></i>
<span class="text-[15px] md:ml-4 ml-0 text-gray-200">Dashboard</span>
</x-nav-link>
@ -31,14 +31,14 @@
<span class="text-[15px] md:ml-4 ml-0 text-gray-200">Pausas</span>
</x-nav-link>
@can('is_permission')
<x-nav-link class="p-2 mt-3 flex items-center flex-col md:flex-row rounded-md px-2 md:px-4 duration-300 cursor-pointer hover:bg-blue-600 text-white" :href="route('empresas')" :active="request()->routeIs('empresas')">
<x-nav-link class="p-2 mt-3 flex items-center flex-col md:flex-row rounded-md px-2 md:px-4 duration-300 cursor-pointer hover:bg-blue-600 text-white" :href="route('empresas.index')" :active="request()->routeIs('empresas.index')">
<i class="fas fa-building text-sm"></i>
<span class="text-[15px] md:ml-4 ml-0 text-gray-200">Empresas</span>
</x-nav-link>
@endcan
<x-nav-link class="p-2 mt-3 flex items-center flex-col md:flex-row rounded-md px-2 md:px-4 duration-300 cursor-pointer hover:bg-blue-600 text-white" :href="route('steps')" :active="request()->routeIs('steps')">
<x-nav-link class="p-2 mt-3 flex items-center flex-col md:flex-row rounded-md px-2 md:px-4 duration-300 cursor-pointer hover:bg-blue-600 text-white" :href="route('redirects.index')" :active="request()->routeIs(['redirects.index', 'redirects.options.index'])">
<i class="fas fa-step-forward text-sm"></i>
<span class="text-[15px] md:ml-4 ml-0 text-gray-200">Steps</span>
<span class="text-[15px] md:ml-4 ml-0 text-gray-200">Redirects</span>
</x-nav-link>
<x-nav-link class="p-2 mt-3 flex items-center flex-col md:flex-row rounded-md px-2 md:px-4 duration-300 cursor-pointer hover:bg-blue-600 text-white" :href="route('systemMessage')" :active="request()->routeIs('systemMessage')">
<i class="fas fa-comments text-sm"></i>

3
resources/views/layouts/navegation.blade.php

@ -11,7 +11,6 @@
<!-- Settings Dropdown -->
<div class="sm:flex sm:items-center sm:ml-6 flex items-center">
<x-dropdown align="right" width="48">
<x-slot name="trigger">
<button class="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 dark:text-gray-400 bg-white dark:bg-gray-800 hover:text-gray-700 dark:hover:text-gray-300 focus:outline-none ">
@ -49,11 +48,9 @@
<script>
function toogleTheme() {
let value = localStorage.theme === 'dark' ? 'light' : 'dark';
document.querySelector('.btn-theme').innerHTML = value === 'dark' ? '<i class="fas fa-moon text-xl"></i>' : '<i class="fas fa-sun text-xl" ></i>';
localStorage.setItem('theme', value);
selectTheme();
}
</script>

135
routes/web.php

@ -5,10 +5,10 @@ use App\Http\Controllers\ProfileController;
use App\Http\Controllers\ConfigAtendimentoController;
use App\Http\Controllers\FilasController;
use App\Http\Controllers\PausasController;
use App\Http\Controllers\ResponseStepController;
use App\Http\Controllers\StepsController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\EmpresaController;
use App\Http\Controllers\RedirectController;
use App\Http\Controllers\RedirectOptionController;
use App\Http\Controllers\RelatoriosController;
use App\Http\Controllers\SystemMessageController;
@ -26,104 +26,71 @@ use Illuminate\Support\Facades\Route;
*/
Route::get('/', function () {
return view('auth.login');
return redirect('login');
});
Route::get('/dashboard', [DashboardController::class, 'index'])->middleware(['auth', 'verified'])->name('dashboard');
Route::get('/dashboard/agentes/{id}', [DashboardController::class, 'agentesLogados'])->middleware(['auth', 'verified']);
Route::get('/relatorios', [RelatoriosController::class, 'index'])->middleware(['auth', 'verified'])->name('relatorios');
Route::get('/configs', [ConfigAtendimentoController::class, 'index'])->middleware(['auth', 'verified'])->name('configs');
Route::post('/configs', [ConfigAtendimentoController::class, 'create'])->middleware(['auth', 'verified'])->name('configs');
Route::get('/steps', [StepsController::class, 'index'])->middleware(['auth', 'verified'])->name('steps');
Route::post('/steps', [StepsController::class, 'create'])->middleware(['auth', 'verified'])->name('steps');
Route::delete('/steps/deletar/{id}', [StepsController::class, 'destroy'])->middleware(['auth', 'verified'])->name('stepsDeletar');
Route::get('/steps/editar/{id}', [StepsController::class, 'edit'])->middleware(['auth', 'verified'])->name('stepsEditar');
Route::post('/steps/editar/{id}', [StepsController::class, 'update'])->middleware(['auth', 'verified'])->name('stepsEditar');
Route::get('/steps/response/{id}', [ResponseStepController::class, 'index'])->middleware(['auth', 'verified'])->name('editarRespostas');
Route::post('/steps/response/adicionar', [ResponseStepController::class, 'create'])->middleware(['auth', 'verified'])->name('AdicionarRespostas');
Route::delete('steps/response/deletar/{id}', [ResponseStepController::class, 'destroy'])->middleware(['auth', 'verified'])->name('deletarRespostas');
Route::post('/steps/response/editar', [ResponseStepController::class, 'updateResponseStep'])->middleware(['auth', 'verified'])->name('editarResponseStep');
Route::get('/filas', [FilasController::class, 'index'])->middleware(['auth', 'verified'])->name('filas');
Route::post('/filas', [FilasController::class, 'create'])->middleware(['auth', 'verified'])->name('filas');
Route::get('/filas/editar/{id}', [FilasController::class, 'edit'])->middleware(['auth', 'verified'])->name('filasEditar');
Route::post('/filas/editar/{id}', [FilasController::class, 'update'])->middleware(['auth', 'verified'])->name('filasEditar');
Route::delete('/filas/deletar/{id}', [FilasController::class, 'destroy'])->middleware(['auth', 'verified'])->name('filasDeletar');
Route::post('/pausas', [PausasController::class, 'create'])->middleware(['auth', 'verified'])->name('pausas');
Route::get('/pausas', [PausasController::class, 'index'])->middleware(['auth', 'verified'])->name('pausas');
Route::get('/pausas/editar/{id}', [PausasController::class, 'edit'])->middleware(['auth', 'verified'])->name('pausasEditar');
Route::post('/pausas/editar/{id}', [PausasController::class, 'update'])->middleware(['auth', 'verified'])->name('pausasEditar');
Route::delete('/pausas/deletar/{id}', [PausasController::class, 'destroy'])->middleware(['auth', 'verified'])->name('pausasDeletar');
Route::get('/users', [AgentesController::class, 'index'])->middleware(['auth', 'verified'])->name('users');
Route::post('/users', [AgentesController::class, 'create'])->middleware(['auth', 'verified'])->name('users');
Route::delete('/users/deletar/{id}', [AgentesController::class, 'destroy'])->middleware(['auth', 'verified'])->name('usersDeletar');
Route::get('/users/editar/{id}', [AgentesController::class, 'edit'])->middleware(['auth', 'verified'])->name('usersEditar');
Route::middleware(['auth', 'verified'])->group(function () {
Route::resources([
'redirects' => RedirectController::class,
'redirects.options' => RedirectOptionController::class,
'empresas' => EmpresaController::class
]);
Route::get('/redirects/{redirect}/sequence', [RedirectOptionController::class, 'sequence'])->name('options.sequence');
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::get('/dashboard/getRelatorioDados', [DashboardController::class, 'getRelatorioDados'])->name('dashboard.relatorios');
Route::get('/dashboard/agentes/{id}', [DashboardController::class, 'agentesLogados'])->name('dashboard.agentesLogados');
Route::get('/dashboard/agentes/{id}/fila', [DashboardController::class, 'relatoriosFilas'])->name('dashboard.agentesLogados.relatorios');
Route::get('/configs', [ConfigAtendimentoController::class, 'index'])->name('configs');
Route::post('/configs', [ConfigAtendimentoController::class, 'create'])->name('configs');
Route::get('/steps/response/{id}', [ResponseStepController::class, 'index'])->name('editarRespostas');
Route::post('/steps/response/adicionar', [ResponseStepController::class, 'create'])->name('AdicionarRespostas');
Route::delete('steps/response/deletar/{id}', [ResponseStepController::class, 'destroy'])->name('deletarRespostas');
Route::post('/steps/response/editar', [ResponseStepController::class, 'updateResponseStep'])->name('editarResponseStep');
Route::get('/filas', [FilasController::class, 'index'])->name('filas');
Route::post('/filas', [FilasController::class, 'create'])->name('filas');
Route::get('/filas/editar/{id}', [FilasController::class, 'edit'])->name('filasEditar');
Route::post('/filas/editar/{id}', [FilasController::class, 'update'])->name('filasEditar');
Route::delete('/filas/deletar/{id}', [FilasController::class, 'destroy'])->name('filasDeletar');
Route::post('/pausas', [PausasController::class, 'create'])->name('pausas');
Route::get('/pausas', [PausasController::class, 'index'])->name('pausas');
Route::get('/pausas/editar/{id}', [PausasController::class, 'edit'])->name('pausasEditar');
Route::post('/pausas/editar/{id}', [PausasController::class, 'update'])->name('pausasEditar');
Route::delete('/pausas/deletar/{id}', [PausasController::class, 'destroy'])->name('pausasDeletar');
Route::get('/users', [AgentesController::class, 'index'])->name('users');
Route::post('/users', [AgentesController::class, 'create'])->name('users');
Route::delete('/users/deletar/{id}', [AgentesController::class, 'destroy'])->name('usersDeletar');
Route::get('/users/editar/{id}', [AgentesController::class, 'edit'])->name('usersEditar');
Route::post('/users/editar/{id}', [AgentesController::class, 'update'])->name('usersEditar');
Route::get('/systemMessage', [SystemMessageController::class, 'index'])->name('systemMessage');
Route::get('/systemMessage/editar/{id}', [SystemMessageController::class, 'edit'])->name('systemMessageEditar');
Route::post('/systemMessage/editar/{id}', [SystemMessageController::class, 'update'])->name('systemMessageEditar');
Route::post('/systemMessage', [SystemMessageController::class, 'create'])->name('systemMessage');
Route::delete('/systemMessage/deletar/{id}', [SystemMessageController::class, 'destroy'])->name('systemMessageDeletar');
});
Route::post('/users/editar/{id}', [AgentesController::class, 'update'])->middleware(['auth', 'verified'])->name('usersEditar');
Route::get('/systemMessage', [SystemMessageController::class, 'index'])->middleware(['auth', 'verified'])->name('systemMessage');
Route::get('/systemMessage/editar/{id}', [SystemMessageController::class, 'edit'])->middleware(['auth', 'verified'])->name('systemMessageEditar');
Route::post('/systemMessage/editar/{id}', [SystemMessageController::class, 'update'])->middleware(['auth', 'verified'])->name('systemMessageEditar');
Route::post('/systemMessage', [SystemMessageController::class, 'create'])->middleware(['auth', 'verified'])->name('systemMessage');
Route::delete('/systemMessage/deletar/{id}', [SystemMessageController::class, 'destroy'])->middleware(['auth', 'verified'])->name('systemMessageDeletar');
Route::get('/empresas', [EmpresaController::class, 'index'])->middleware(['auth', 'verified'])->name('empresas');
@ -135,6 +102,4 @@ Route::middleware('auth')->group(function () {
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});
require __DIR__ . '/auth.php';

Loading…
Cancel
Save