guilherme.guia 12 months ago
parent
commit
938615e3a8
  1. 4
      app/Http/Controllers/Admin/AgentesController.php
  2. 4
      app/Http/Controllers/Admin/ConectarAgenteController.php
  3. 2
      app/Http/Controllers/Admin/ContatosController.php
  4. 96
      app/Http/Controllers/Admin/DashboardController.php
  5. 5
      app/Http/Controllers/Admin/GraficosController.php
  6. 23
      app/Http/Controllers/Admin/RedirectController.php
  7. 93
      app/Http/Controllers/Admin/RedirectOptionController.php
  8. 15
      app/Http/Controllers/Admin/Relatorios/RelatorioHistoricoAtendimentoController.php
  9. 5
      app/Http/Controllers/Admin/TemplatesController.php
  10. 6
      app/Models/Agentes.php
  11. 14
      app/Models/Atendimentos.php
  12. 42
      app/Models/Filas.php
  13. 55
      app/Models/Redirect.php
  14. 45
      app/Models/RedirectOption.php
  15. 4
      public/js/relatorios/historicoChamadas/index.js
  16. 4
      public/js/views/agentes/atualizaAgente.js
  17. 15
      public/js/views/agentesLogados/index.js
  18. 4
      public/js/views/contatos/atualizaContato.js
  19. 9
      public/js/views/dashboard/index.js
  20. 3
      public/js/views/empresa/atualizaEmpresa.js
  21. 5
      public/js/views/fila/atualizaFila.js
  22. 42
      public/js/views/graficos/index.js
  23. 2
      public/js/views/menu/index.js
  24. 8
      public/js/views/pausa/atualizaPausa.js
  25. 8
      public/js/views/redirectOption/atualizaRedirectOption.js
  26. 10
      public/js/views/redirectOption/montaSelect.js
  27. 14
      public/js/views/systemMessages/cadastroSystemMessage.js
  28. 52
      public/js/views/templates/cadastroTemplates.js
  29. 8
      resources/views/admin/cadastros/redirectOption.blade.php
  30. 2
      resources/views/admin/conectarAgente/conectarAgente.blade.php
  31. 8
      resources/views/admin/configs/configs.blade.php
  32. 1
      resources/views/admin/dashboard/agentesLogados.blade.php
  33. 4
      resources/views/admin/dashboard/dashboard.blade.php
  34. 4
      resources/views/admin/graficos/graficos.blade.php
  35. 34
      resources/views/admin/relatorios/historicoAtendimentos/historicoAtendimentos.blade.php
  36. 4
      resources/views/components/modal/edit/modalEditContatos.blade.php
  37. 4
      resources/views/components/modal/insert/modalContatos.blade.php

4
app/Http/Controllers/Admin/AgentesController.php

@ -5,12 +5,8 @@ namespace App\Http\Controllers\Admin;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Agentes;
use App\Models\GrupoUsuario;
use App\Models\UsuarioEmpresa;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rule;
class AgentesController extends Controller

4
app/Http/Controllers/Admin/ConectarAgenteController.php

@ -24,7 +24,7 @@ class ConectarAgenteController extends Controller
public function index(){
$idEmpresa = Helper::getIdEmpresa();
$filas = $this->queueRepository->where("id_empresa", $idEmpresa)->get();
$filas = $this->queueRepository->list(["id_empresa" => $idEmpresa, "status" => true]);
return view("admin.conectarAgente.conectarAgente", compact('filas'));
}
@ -35,7 +35,7 @@ class ConectarAgenteController extends Controller
return response()->json("Parametro id é obrigatório", 404);
}
$fila = $this->queueRepository->where('id', $queueId)->first();
$fila = $this->queueRepository->get(["id" => $queueId]);
if(empty($fila)){
return response()->json("Fila não foi encontrada", 404);
}

2
app/Http/Controllers/Admin/ContatosController.php

@ -51,7 +51,7 @@ class ContatosController extends Controller
$request->validate([
'nome' => ['required'],
'email' => ['required', 'email', Rule::unique('usuarios'), Rule::unique('contatos')],
'email' => ['email', Rule::unique('usuarios'), Rule::unique('contatos')],
'contato' => ['required', Rule::unique('contatos')],
'status' => ['required'],
]);

96
app/Http/Controllers/Admin/DashboardController.php

@ -8,7 +8,6 @@ use App\Models\Atendimentos;
use App\Models\Filas;
use App\Models\Pausas;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
class DashboardController extends Controller
{
@ -89,18 +88,35 @@ class DashboardController extends Controller
private function relatoriosDados()
{
$id_empresa = Helper::getIdEmpresa();
$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([
['q.id_empresa', $id_empresa],
['q.is_ativa', true],
])
->groupBy('q.nome', 'q.id')
->orderBy('q.nome', 'asc')
->get();
->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(
"(
SELECT count(*) from atendimento ma
INNER JOIN eventos_atendimento ea ON ea.uniqueid = ma.uniqueid
WHERE ma.data_reg >= current_date AND ea.id_queue = q.id AND evento = 'START')
as atendimento_dia"
),
DB::raw(
"(
SELECT count(*) from atendimento ma
INNER JOIN eventos_atendimento ea ON ea.uniqueid = ma.uniqueid
WHERE ma.data_reg >= current_date AND ea.id_queue = q.id AND evento in ('ABANDON', 'LOST_CONNECTION')
) as atendimentos_abandonados"
)
)
->where([
['q.id_empresa', $id_empresa],
['q.is_ativa', true],
])
->groupBy('q.nome', 'q.id')
->orderBy('q.nome', 'asc')
->get();
return $relatorio;
}
@ -110,14 +126,13 @@ class DashboardController extends Controller
$id_empresa = Helper::getIdEmpresa();
$atendimentosPorMes = Atendimentos::whereDate('data_reg', '>=', $data_inicio)
->whereDate('data_reg', '<=', $data_fim)
->where('id_empresa', $id_empresa)
->count();
->whereDate('data_reg', '<=', $data_fim)
->where('id_empresa', $id_empresa)
->count();
return $atendimentosPorMes;
}
private function getAtendimentoDia($data_atual)
{
$id_empresa = Helper::getIdEmpresa();
@ -125,7 +140,7 @@ class DashboardController extends Controller
$atendimentoDia = Atendimentos::whereDate('data_reg', '=', $data_atual)
->where('id_empresa', $id_empresa)
->count();
return $atendimentoDia;
}
@ -139,7 +154,7 @@ class DashboardController extends Controller
])
->count();
return $totalAgentesAtivos;
return $totalAgentesAtivos;
}
private function getAgentesPausa()
@ -153,18 +168,15 @@ class DashboardController extends Controller
])
->count();
return $totalAgentesPausa;
return $totalAgentesPausa;
}
public function agentesLogados($id)
{
if(empty($id))
{
if (empty($id)) {
return redirect()->back();
}
$id_empresa = Helper::getIdEmpresa();
$fila = Filas::where(['id' => $id, 'id_empresa' => $id_empresa])->first();
$pausas = Pausas::where(["id_empresa" => $id_empresa, "is_ativo" => true])->get();
@ -173,26 +185,40 @@ class DashboardController extends Controller
public function relatoriosFilas($id)
{
if(empty($id)){
if (empty($id)) {
return response()->json(['data' => "Parametro ID é obrigatorio"]);
}
$id_empresa = Helper::getIdEmpresa();
$fila = Filas::where('id', $id)->where('id_empresa', $id_empresa)->first();
$agentesNaFila = DB::table('supervisor as s')
->leftJoin('atendimento as a', function ($join) {
$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);
})
$agentesNaFila = DB::table("supervisor as s")
->leftJoin("queues as q", "q.nome", "=", "s.fila")
->join("tokens as t", "t.id_usuario", "=", "s.id_usuario")
->select(DB::raw("(now() - s.tempo_login) AS login"), DB::raw('COALESCE(COUNT(a.id), 0) AS qtde_atendimento'), 's.*', 't.token')
->select(
"s.id",
"s.nome",
"s.matricula",
"s.motivo_pausa",
"s.fila",
"s.status",
"t.token",
"q.id as id_queue",
DB::raw("(now() - s.tempo_login) AS login"),
DB::raw(
"(
SELECT count(*) FROM atendimento ma
WHERE 'START' = (SELECT m2.evento FROM eventos_atendimento m2
WHERE ma.uniqueid = m2.uniqueid
ORDER BY m2.id DESC LIMIT 1)
AND ma.matricula = s.matricula
) as atendimentos_atuais"
)
)
->where([
['s.id_empresa', $id_empresa],
['fila', $fila->nome],
["s.id_empresa", "=", $id_empresa],
['q.nome', $fila->nome],
])
->groupBy('s.id', 't.token')
->groupBy('s.id', 't.token', "q.id")
->get();
return response()->json(['data' => $agentesNaFila]);

5
app/Http/Controllers/Admin/GraficosController.php

@ -41,7 +41,10 @@ class GraficosController extends Controller
->join('usuario_empresa as ue', 'ue.id_usuario', '=', 'u.id')
->join('eventos_atendimento as ea', 'ea.id_usuario', '=', 'u.id')
->select('ea.evento', DB::raw('count(ea.evento) as qtde_usados'))
->where('ue.id_empresa', $id_empresa)
->where([
['ue.id_empresa', '=', $id_empresa],
['ea.evento', '<>', config('event.CONF_EVENT_ESPERA')],
])
->groupBy('ea.evento')
->get();

23
app/Http/Controllers/Admin/RedirectController.php

@ -7,11 +7,15 @@ use App\Http\Controllers\Controller;
use App\Models\NumberChannel;
use App\Models\Redirect;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
class RedirectController extends Controller
{
public function __construct(
protected Redirect $redirectRepository,
) {
}
public function index()
{
$user = auth()->user();
@ -20,12 +24,7 @@ class RedirectController extends Controller
}
$id_empresa = Helper::getIdEmpresa();
$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();
$redirects = $this->redirectRepository->list(["id_empresa" => $id_empresa]);
$numberChannels = NumberChannel::where('id_empresa', $id_empresa)->get();
return view('admin.cadastros.redirects', compact('redirects', 'numberChannels'));
@ -49,19 +48,11 @@ class RedirectController extends Controller
$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')
]);
$this->redirectRepository->create(strtoupper($request->nome),$request->descricao, $status, $initial, $request->channel, date('Y-m-d'));
return redirect()->back()->with('status', 'Cadastrado com sucesso');
}
public function edit($id)
{
$user = auth()->user();

93
app/Http/Controllers/Admin/RedirectOptionController.php

@ -2,8 +2,11 @@
namespace App\Http\Controllers\Admin;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Agentes;
use App\Models\Filas;
use App\Models\Redirect;
use App\Models\RedirectOption;
use App\Models\Types;
use Illuminate\Http\Request;
@ -11,13 +14,20 @@ use Illuminate\Support\Facades\DB;
class RedirectOptionController extends Controller
{
public function __construct(
protected Agentes $agenteRepository,
protected Filas $queueRepository,
protected Redirect $redirectRepository,
protected RedirectOption $redirectOptionsRepository,
) {
}
public function index($id)
{
if (empty($id)) {
return redirect('redirects');
}
$options = RedirectOption::where('id_redirect', '=', $id)->OrderBy('sequence', 'asc')->get();
$options = $this->redirectOptionsRepository->list(["id_redirect" => $id]);
$types = Types::all();
$id_redirect = $id;
@ -34,17 +44,17 @@ class RedirectOptionController extends Controller
$type = DB::table('types')->where([['id', $id_type], ['status', true]])->first();
$typeName = $type->name;
$id_empresa = Helper::getIdEmpresa();
$data = null;
switch ($typeName) {
case 'queue':
$data = $this->queue();
$data = $this->queueRepository->list(["id_empresa" => $id_empresa, "status" => true]);
break;
case 'redirect':
$data = $this->redirect();
$data = $this->redirectRepository->list(["id_empresa" => $id_empresa]);
break;
case 'agent':
$data = $this->agent();
$data = $this->agenteRepository->list(["id_empresa" => $id_empresa, "status" => true]);
break;
default:
$data = null;
@ -61,50 +71,6 @@ class RedirectOptionController extends Controller
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([
@ -115,35 +81,26 @@ class RedirectOptionController extends Controller
]);
$id = $request->destino;
if ($request->type == 3) {
$id = Agentes::where('id', $request->destino)->first()->matricula;
$id = $this->agenteRepository->get(["id" => $request->destino])->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"),
]);
$created = $this->redirectOptionsRepository->create($request->sequencia, $request->descricao, $request->id_redirect, $request->type, $id, $hidden, date("Y-m-d"));
if(!$created){
redirect()->back()->with('status', 'Erro ao tentar cadastrar opção');
}
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();
$data = $this->redirectOptionsRepository->list(["id_redirect" => $id]);
$response = [
'data' => [
'status' => true,
@ -157,13 +114,11 @@ class RedirectOptionController extends Controller
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();
@ -171,14 +126,12 @@ class RedirectOptionController extends Controller
$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']);
}
@ -200,7 +153,6 @@ class RedirectOptionController extends Controller
public function update(Request $request)
{
$id = $request->segment(4);
if (!$id) {
return redirect()->back();
}
@ -213,7 +165,6 @@ class RedirectOptionController extends Controller
]);
$code_id = $request->destino;
if ($request->type == 3) {
$code_id = Agentes::where('id', $request->destino)->first()->matricula;
}

15
app/Http/Controllers/Admin/Relatorios/RelatorioHistoricoAtendimentoController.php

@ -31,20 +31,9 @@ class RelatorioHistoricoAtendimentoController extends Controller
$selected = (object) $request->all();
$idEmpresa = Helper::getIdEmpresa();
$quantidadeRegistros = $selected->registros ?? 20;
$atendimentos = $this->atendimentosRepository->getCompletAtend(["id_empresa" => $idEmpresa, "search" => $request->search, "atendente" => $request->atendente]);
$atendimentos = $this->atendimentosRepository->getCompletAtend(["id_empresa" => $idEmpresa, "protocolo" => $request->protocolo, "atendente" => $request->atendente, "usuario" => $request->usuario]);
$arrFilter = $atendimentos;
if ($request->atendente) {
$arrFilter = $this->atendimentosRepository->getCompletAtend(["id_empresa" => $idEmpresa, "atendente" => strtolower($request->atendente)]);
}
$filtro_atendentes = $this->agenteRepository->list(["id_empresa" => $idEmpresa]);
// $filtro_usuarios = array_values(array_reduce($arrFilter->items(), function ($carry, $item) {
// $carry[$item->nome_client] = $item->nome_client;
// return $carry;
// }, []));
// dd($atendimentos);
return view('admin.relatorios.historicoAtendimentos.historicoAtendimentos', compact('atendimentos', 'selected', 'filtro_atendentes'));
return view('admin.relatorios.historicoAtendimentos.historicoAtendimentos', compact('atendimentos', 'selected'));
}
public function show($uniqueid): View

5
app/Http/Controllers/Admin/TemplatesController.php

@ -22,8 +22,9 @@ class TemplatesController extends Controller
public function show()
{
if (Gate::denies('is_permission')) {
return response()->json(["message" => "Sem autorização"], 404);
$user = auth()->user();
if(Gate::forUser($user)->denies('show_templates')){
abort(404);
}
$id_empresa = Helper::getIdEmpresa();

6
app/Models/Agentes.php

@ -48,6 +48,10 @@ class Agentes extends Model
$agentes->where('u.status', $params['status']);
}
if (isset($params['id'])) {
$agentes->where('u.id', $params['id']);
}
return $agentes->orderBy('u.nome', 'asc')->first();
}
@ -58,7 +62,7 @@ class Agentes extends Model
->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.*', 'g.name');
->select('u.*', 'g.name as cargo');
if (isset($params['id_empresa'])) {
$agentes->where('ue.id_empresa', $params['id_empresa']);

14
app/Models/Atendimentos.php

@ -34,7 +34,6 @@ class Atendimentos extends Model
->join('protocolo_reg as r', "r.uniqueid", "=", "a.uniqueid")
->leftJoin('contatos as c', "c.contato", "=", "a.cliente_id")
->select(DB::raw('DISTINCT a.uniqueid'), DB::raw('COALESCE(c.nome, a.nome) AS nome_client'), 'u.nome as nome_atendente', 'r.protocolo as protocolo')
// ->select(DB::raw('DISTINCT a.uniqueid'), DB::raw('a.nome nome_client'), 'u.nome as nome_atendente', 'r.protocolo as protocolo')
->whereIn('ea.evento', [config('event.CONF_EVENT_TIMERMINO_CLIENTE'), config('event.CONF_EVENT_TIMERMINO_AGENTE'), config('event.CONF_EVENT_TIMEOUT_CLIENTE'), config('event.CONF_EVENT_TIMEOUT_AGENTE')]);
if (isset($params['id_empresa'])) {
@ -47,24 +46,13 @@ class Atendimentos extends Model
if (isset($params['usuario'])) {
$atendimentos->where(DB::raw('LOWER(a.nome)'), 'LIKE', "%{$params['usuario']}%");
// ->orWhere(DB::raw('LOWER(c.nome)'), 'LIKE', "%{$params['usuario']}%");
}
if (isset($params['atendente'])) {
$atendimentos->where(DB::raw('LOWER(u.nome)'), 'LIKE', "%{$params['atendente']}%");
}
if (isset($params['search'])) {
$atendimentos->where(DB::raw('LOWER(a.nome)'), 'LIKE', "%{$params['search']}%")
->orWhere(DB::raw('r.protocolo'), 'LIKE', "%{$params['search']}%");
}
$atendimentos->orderByDesc('r.protocolo');
// dd($atendimentos->paginate(10));
// dd($atendimentos->get());
return $atendimentos->paginate(10);
// return $atendimentos->get();
return $atendimentos->orderByDesc('r.protocolo')->paginate($quantidade);
}
public function get(array $params = [])

42
app/Models/Filas.php

@ -19,4 +19,46 @@ class Filas extends Model
'id_empresa',
'is_ativa',
];
public function list(array $params)
{
$filas = DB::table('queues as q')->select("q.id", "q.nome as name");
if (isset($params['id_empresa'])) {
$filas->where('q.id_empresa', $params['id_empresa']);
}
if (isset($params['search'])) {
$filas->where(DB::raw('LOWER(u.nome)'), 'LIKE', "%{$params['search']}%");
}
if (isset($params['status'])) {
$filas->where('q.is_ativa', $params['status']);
}
return $filas->orderBy('q.nome', 'asc')->get();
}
public function get(array $params)
{
$filas = DB::table('queues as q')->select("q.id", "q.nome as name");
if (isset($params['id'])) {
$filas->where('q.id', $params['id']);
}
if (isset($params['id_empresa'])) {
$filas->where('q.id_empresa', $params['id_empresa']);
}
if (isset($params['search'])) {
$filas->where(DB::raw('LOWER(u.nome)'), 'LIKE', "%{$params['search']}%");
}
if (isset($params['status'])) {
$filas->where('q.is_ativa', $params['status']);
}
return $filas->orderBy('q.nome', 'asc')->first();
}
}

55
app/Models/Redirect.php

@ -4,6 +4,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class Redirect extends Model
{
@ -20,4 +21,58 @@ class Redirect extends Model
'status',
'data_reg',
];
public function get(array $params)
{
$redirects = DB::table('redirect as r')
->join('number_channel as nc', 'nc.id', '=', 'r.id_number')
->select('r.*');
if(isset($params['id_empresa'])){
$redirects->where('nc.id_empresa', $params['id_empresa']);
}
if(isset($params['id_number'])){
$redirects->where('r.id_number', $params['id_number']);
}
if(isset($params['name'])){
$redirects->where('r.name', $params['name']);
}
return $redirects->first();
}
public function list(array $params)
{
$redirects = DB::table('redirect as r')
->join('number_channel as nc', 'nc.id', '=', 'r.id_number')
->select('r.*');
if(isset($params['id_empresa'])){
$redirects->where('nc.id_empresa', $params['id_empresa']);
}
if(isset($params['id_number'])){
$redirects->where('r.id_number', $params['id_number']);
}
if(isset($params['name'])){
$redirects->where('r.name', $params['name']);
}
return $redirects->get();
}
public function create(string $nome, string $description, bool $status, bool $initial, string|int $id_number, string $data_reg)
{
DB::table('redirect')->insert([
'name' => strtoupper($nome),
'description' => $description,
'status' => $status,
'initial' => $initial,
'id_number' => $id_number,
'data_reg' => date('Y-m-d')
]);
}
}

45
app/Models/RedirectOption.php

@ -4,7 +4,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\DB;
class RedirectOption extends Model
{
@ -33,4 +33,47 @@ class RedirectOption extends Model
return $this->belongsTo(Types::class, 'id_type')->first();
}
public function list(array $params)
{
$options = DB::table('redirect_option as ro')
->join("redirect as r", "r.id", "=", "ro.id_redirect")
->join("types as t", "t.id", "=", "ro.id_type")
->select("ro.*", "r.name as redirect_name", "t.name as type_name");
if (isset($params['sequence'])) {
$options->where('ro.sequence', $params['sequence']);
}
if (isset($params['search'])) {
$options->where(DB::raw('LOWER(ro.nome)'), 'LIKE', "%{$params['search']}%");
}
if (isset($params['id_redirect'])) {
$options->where('ro.id_redirect', $params['id_redirect']);
}
return $options->orderBy('sequence', 'asc')->get();
}
public function create(string|int $sequence, string $description, string|int $id_redirect, string|int $id_type, string|int $code_id, bool $hide, string $data_reg)
{
DB::beginTransaction();
try {
DB::table("redirect_option")->insert([
'sequence' => $sequence,
'description' => $description,
'id_redirect' => $id_redirect,
'id_type' => $id_type,
'code_id' => $code_id,
'hide' => $hide,
'data_reg' => $data_reg
]);
DB::commit();
return true;
} catch (\Throwable $th) {
DB::rollBack();
return false;
}
}
}

4
public/js/relatorios/historicoChamadas/index.js

@ -2,7 +2,6 @@ const chat = document.querySelector('.chat');
const icontypes = ['csv', 'doc', 'pdf', 'txt', 'xls', 'zip', 'ppt']
function montaChat(messages, cliente_id) {
messages.forEach((message) => {
const datesend = converdata(new Date(message.msg_date).getTime());
let typesend = cliente_id == message.src ? "sender" : "receiver";
@ -17,7 +16,6 @@ function montaChat(messages, cliente_id) {
</div>
`;
}
if (message.type == "transfer") {
chat.innerHTML += `
<div class="events">
@ -25,7 +23,6 @@ function montaChat(messages, cliente_id) {
</div>
`;
}
if (message.type == "finish" || message.type == "re_start" || message.type == "recover") {
chat.innerHTML += `
<div class="events">
@ -57,7 +54,6 @@ function converdata(timestamp, horario_server = false) {
if (horario_server) {
timestamp = timestamp * 1000
}
let date = new Date(timestamp);
let day = addZero(date.getDate())
let month = addZero(date.getMonth() + 1)

4
public/js/views/agentes/atualizaAgente.js

@ -5,17 +5,13 @@ function atualizaUsuario(id_user) {
success: function ({
data
}) {
const modal = document.querySelector('.modal-edit');
modal.style.display = 'block';
modal.querySelector('form').action = `/users/editar/${data.id}`;
modal.querySelector("input[name='nome']").value = data.nome;
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>`

15
public/js/views/agentesLogados/index.js

@ -31,32 +31,24 @@ async function montarRelatorios() {
const id = getFilaId();
const data = await getDadosRelatorioDB(id);
let elementsTable = "";
data.forEach(supervisor => {
const tempoFormatado = supervisor.login.split(".")[0];
const btnPlay = `
<button class="bg-blue-600 text-white rounded flex-1 text-xl text-center py-2 px-3 cursor-pointer" onclick="retirarPausa(${supervisor.matricula}, '${supervisor.token}')">
<i class="fas fa-play-circle"></i>
</button>
`
const btnPausa = `<a class="bg-blue-600 text-white rounded flex-1 text-xl text-center py-2 px-3 cursor-pointer" title="Colocar em Pausa?" onclick="selecionaAgente(${supervisor.id})"><i class="fas fa-pause"></i></a>`;
const agenteIsPausa = supervisor.status === "PAUSA" ? btnPlay : btnPausa;
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 text-gray-700 dark:text-gray-100">${supervisor.atendimentos_atuais}</td>
<td class="p-3 text-sm font-bold flex items-center gap-2 flex-wrap">
${agenteIsPausa}
<button class="bg-red-600 text-white flex-1 rounded text-xl text-center py-2 px-3" onclick="desconectarAgente(${supervisor.matricula}, '${supervisor.token}')">
@ -66,13 +58,12 @@ async function montarRelatorios() {
</tr>
`
});
$(".table-relatorio").html(elementsTable);
}
async function desconectarAgente(matricula, token) {
if (confirm("Deseja realmente desconectar do sistema?")) {
logoff(matricula, token).then((res) => {
logoff(matricula, token).then(() => {
montarRelatorios();
})
}
@ -80,7 +71,7 @@ async function desconectarAgente(matricula, token) {
async function retirarPausa(matricula, token) {
if (confirm("Deseja retirar a pausa do agente?")) {
sairPausa(matricula, token).then((res) => {
sairPausa(matricula, token).then(() => {
montarRelatorios();
})
}

4
public/js/views/contatos/atualizaContato.js

@ -6,17 +6,13 @@ function atualizaContato(id_contato) {
data
}) {
const contato_data = data.contato_data;
$(".modal-edit").show();
$(".modal-edit").find('form').attr('action', `contatos/${id_contato}`);
$(".modal-edit").find("input[name='nome']").val(contato_data.nome);
$(".modal-edit").find("input[name='email']").val(contato_data.email);
$(".modal-edit").find("textarea[name='descricao']").val(contato_data.notes);
const numeroFormatado = $(".modal-edit").find("input[name='contato']").masked(contato_data.contato);
$(".modal-edit").find("input[name='contato']").val(numeroFormatado);
if (contato_data.status) {
$(".modal-edit").find(".container-radio").
html(`<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>`)

9
public/js/views/dashboard/index.js

@ -24,14 +24,11 @@ function getDadosRelatorioDB() {
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">
@ -43,8 +40,8 @@ async function montarRelatorios()
</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 text-left">${relatorio.atendimento_dia}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">${relatorio.atendimentos_abandonados}</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="selecionaFila(${relatorio.fila_id})">
<i class="fas fa-pause text-gray-900 text-xs"></i></button>
@ -53,8 +50,6 @@ async function montarRelatorios()
</tr>
`
});
$(".table-relatorio").html(elementsTable);
}

3
public/js/views/empresa/atualizaEmpresa.js

@ -4,11 +4,8 @@ function atualizaEmpresa(empresa_id) {
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);

5
public/js/views/fila/atualizaFila.js

@ -7,15 +7,10 @@ function atualizarFila(id_fila) {
}) {
console.log(data)
const modal = document.querySelector('.modal-edit');
modal.style.display = 'block';
modal.querySelector('form').action = `/filas/editar/${data.id}`;
modal.querySelector("input[name='nome']").value = data.nome;
const containerCheckbox = modal.querySelector(".container-checkbox");
if (!data.is_ativa) {
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>`

42
public/js/views/graficos/index.js

@ -5,6 +5,8 @@ const eventos = {
LOST_CONNECTION: 'Desconectadas',
COMPLETE_AGENT: 'Finalizas pelo Agente',
START: 'Iniciadas',
ABANDON: 'Abandonadas',
SENDED: 'Enviadas pelo agente'
}
function getDadosRelatorioDB() {
@ -37,22 +39,22 @@ function montaGrafico1(dataDB) {
font: 90,
borderWidth: 1,
backgroundColor: [
'rgba(255, 99, 132, 0.7)',
'rgba(255, 159, 64, 0.7)',
'rgba(255, 205, 86, 0.7)',
'rgba(255, 99, 132, 0.7)',
'rgba(75, 192, 192, 0.7)',
'rgba(255, 205, 86, 0.7)',
'rgba(54, 162, 235, 0.7)',
'rgba(201, 203, 207, 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(255, 99, 132)',
'rgb(75, 192, 192)',
'rgb(255, 205, 86)',
'rgb(54, 162, 235)',
'rgb(201, 203, 207)',
'rgb(153, 102, 255)',
'rgb(201, 203, 207)'
],
}],
},
@ -85,21 +87,17 @@ function montaGrafico1(dataDB) {
}
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: {
@ -108,20 +106,22 @@ function montaGrafico2(dataDB) {
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)'
'rgba(255, 159, 64, 0.7)',
'rgba(255, 99, 132, 0.7)',
'rgba(75, 192, 192, 0.7)',
'rgba(255, 205, 86, 0.7)',
'rgba(54, 162, 235, 0.7)',
'rgba(201, 203, 207, 0.7)',
'rgba(153, 102, 255, 0.7)',
],
borderColor: [
'rgb(255, 99, 132)',
'rgb(255, 159, 64)',
'rgb(255, 99, 132)',
'rgb(75, 192, 192)',
'rgb(255, 205, 86)',
'rgb(54, 162, 235)',
'rgb(201, 203, 207)',
'rgb(153, 102, 255)',
'rgb(201, 203, 207)'
],
}]
},
@ -139,12 +139,9 @@ function montaGrafico2(dataDB) {
}
function montaGrafico3(dataDB) {
const ctx3 = document.getElementById('myChart3');
let labels3 = dataDB.map((value) => value.nome)
let data3 = dataDB.map((value) => value.qtde_fila)
new Chart(ctx3, {
type: 'pie',
data: {
@ -174,7 +171,6 @@ function montaGrafico3(dataDB) {
async function graficos() {
const data = await getDadosRelatorioDB();
montaGrafico1(data.atendimentosData);
montaGrafico2(data.atendimentosStatusData);
montaGrafico3(data.filasMaisUsadas);

2
public/js/views/menu/index.js

@ -3,10 +3,10 @@ function clickedMenu(event) {
parent.querySelector(".submenu").classList.toggle('hidden');
parent.querySelector(".dropIcon").classList.toggle('selected');
}
function responsiveSidebar(event) {
const shadow = event.currentTarget;
const sidebar = document.querySelector('.sidebar');
sidebar.classList.remove('show');
shadow.classList.add('hidden');
}

8
public/js/views/pausa/atualizaPausa.js

@ -5,19 +5,11 @@ function atualizarPausa(id_user) {
success: function({
data
}) {
const modal = document.querySelector('.modal-edit');
modal.style.display = 'block';
modal.querySelector('form').action = `/pausas/editar/${data.id}`;
modal.querySelector("input[name='motivo']").value = data.motivo;
const containerCheckbox = modal.querySelector(".container-checkbox");
if (!data.is_ativo) {
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>`

8
public/js/views/redirectOption/atualizaRedirectOption.js

@ -5,18 +5,14 @@ function atualizaRedirectOption(option_id) {
success: async function({
data
}) {
const option_data = data.option_data;
const types = data.types
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>
@ -26,9 +22,7 @@ function atualizaRedirectOption(option_id) {
`<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 +=
@ -38,7 +32,6 @@ function atualizaRedirectOption(option_id) {
` <option value="${type.id}">${type.name}</option>`
}
})
modal.querySelector(".select-types").innerHTML = containerTypes;
montaSelectDestino(option_data.id_type, modal, option_data.code_id);
}
@ -50,7 +43,6 @@ document.querySelectorAll('.select-types').forEach(el => {
const select = e.target;
const modal = select.closest('.modal') ?? select.closest('.modal-edit');
const id_redirect = select.value;
montaSelectDestino(id_redirect, modal);
})
})

10
public/js/views/redirectOption/montaSelect.js

@ -2,7 +2,6 @@ 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;
@ -11,29 +10,26 @@ async function montaSelectDestino(id_type, modal, code_id = null) {
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>`
` <option value="${element.id}" selected>${element.name ?? element.nome}</option>`
} else {
selectElements +=
` <option value="${element.id}">${element.name}</option>`
` <option value="${element.id}">${element.name ?? element.nome}</option>`
}
})
} else {
data.forEach(element => {
selectElements += `<option value="${element.id}">${element.name}</option>`
selectElements += `<option value="${element.id}">${element.name ?? element.nome}</option>`
});
}
selectDestino.innerHTML = selectElements;
}

14
public/js/views/systemMessages/cadastroSystemMessage.js

@ -16,28 +16,24 @@ const autoCompleteMessages = [{
},
];
const listItemFormatValue = 3;
const valueEspacamento = 50;
const inputs = document.querySelectorAll('.autoCompleteInput');
inputs.forEach(input => {
input.addEventListener('input', (e) =>{
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
let inputText = '@' + inputValue.split("@").pop(); // Pega o valor 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>`
@ -46,9 +42,7 @@ inputs.forEach(input => {
};
}
})
if (selectedTexts) {
const alturaBox = calcularAlturaBox(valueEspacamento, cont);
$('.autoCompleteBox').css('bottom', `-${alturaBox}px`);
$(".autoCompleteBox").html(selectedTexts);
@ -60,7 +54,6 @@ inputs.forEach(input => {
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");
@ -68,7 +61,6 @@ function selecionaMessage({ target }) {
const indexLastAtSign = inputValue.lastIndexOf("@");
const formatedInputValue = inputValue.substring(0, indexLastAtSign);
const formatedValue = formatedInputValue + item.value;
input.value = formatedValue;
input.focus();
fechaBox();

52
public/js/views/templates/cadastroTemplates.js

@ -3,11 +3,9 @@ const form = document.querySelector("#cadastro-template");
const steps = modal.querySelectorAll('.step');
/* Events */
function nextStep() {
const currentStep = getCurrentStep() === 1;
const isValidated = currentStep ? validationInput() : validationTextArea();
if (isValidated) {
toogleNextStep();
}
@ -21,7 +19,6 @@ function showInput(e) {
const target = e.target;
const labelSwitch = target.parentNode;
const containerToogle = labelSwitch.parentNode;
labelSwitch.querySelector('span').classList.toggle('hidden');
containerToogle.querySelector('p').classList.toggle('hidden');
containerToogle.querySelector('.input-text').classList.toggle('hidden');
@ -32,7 +29,6 @@ function showButtons(e) {
const labelSwitch = target.parentNode;
const btnAdd = document.querySelector('.btn-add');
const containerInputs = document.querySelector('.container-inputs');
containerInputs.classList.toggle('hidden');
labelSwitch.querySelector('span').classList.toggle('hidden');
btnAdd.classList.toggle('hidden');
@ -40,12 +36,9 @@ function showButtons(e) {
function cadastroTemplate(e) {
e.preventDefault();
const token = form.querySelector("input[name='token']").value;
const components = montaComponents();
const data = createFormData(components);
handleBtnCadastro();
fetchCadastroPositus(data, token);
}
@ -54,11 +47,9 @@ function addInput() {
const containerInputs = document.querySelector('.container-inputs');
const inputs = [...containerInputs.querySelectorAll('.input')];
const countInputs = inputs.length;
if (countInputs > 2) {
return;
}
const input = `<div class="flex-col gap-2 border border-slate-500 p-3 mb-2 input relative">
<i class="fas fa-times dark:text-gray-100 absolute right-[-22px] top-7 cursor-pointer p-1" onclick="removeInput(event)"></i>
<input type="text"
@ -67,7 +58,6 @@ function addInput() {
<p class="mt-2 dark:bg-gray-80 dark:text-gray-100 text-sm flex justify-end" data-limit="25">Limite de caracteres 0/60</p>
</div>
`;
containerInputs.insertAdjacentHTML("beforeend", input);
}
@ -77,24 +67,19 @@ function removeInput(e) {
const containerInputs = document.querySelector('.container-inputs');
const inputs = containerInputs.querySelectorAll('.input');
const countInputs = inputs.length;
if (countInputs <= 1) {
return;
}
containerInputClicked.remove();
}
function caracteLimit(e) {
const target = e.target;
const containerName = target.parentNode;
let inputContent = target.value;
const contentCount = inputContent.length;
const paragraph = containerName.querySelector('p');
const limit = paragraph.getAttribute("data-limit");
if (contentCount > limit) {
target.value = inputContent.slice(0, limit);
return;
@ -104,12 +89,9 @@ function caracteLimit(e) {
}
/* Functions */
function toogleNextStep() {
let selected;
let next;
for (let i = 0; i < steps.length; i++) {
const isHidden = steps[i].classList.contains('hidden');
if (!isHidden) {
@ -117,27 +99,22 @@ function toogleNextStep() {
next = steps[i + 1];
}
}
selected.classList.toggle('hidden');
next.classList.toggle('hidden');
const [btnStep, btnBackStep, btnCadastro] = getButtons();
/* True adiciona Classe | false remove Classe*/
const isStep3 = next.classList.contains('step-3');
btnCadastro.classList.toggle("hidden", !isStep3);
btnStep.classList.toggle("hidden", isStep3);
const isHidden = btnCadastro.classList.contains('hidden');
if (isHidden) {
btnBackStep.classList.remove('hidden')
}
}
function toogleBackStep() {
function toogleBackStep() {
let selected;
let back;
for (let i = 0; i < steps.length; i++) {
const isHidden = steps[i].classList.contains('hidden');
if (!isHidden) {
@ -145,19 +122,14 @@ function toogleBackStep() {
back = steps[i - 1];
}
}
selected.classList.toggle('hidden');
back.classList.toggle('hidden');
const [btnStep, btnBackStep, btnCadastro] = getButtons();
const isHidden = btnCadastro.classList.contains('hidden');
/* True adiciona Classe | false remove Classe*/
const isStep3 = back.classList.contains('step-3');
btnCadastro.classList.toggle("hidden", !isStep3);
btnStep.classList.remove("hidden", isStep3);
if (isHidden) {
btnBackStep.classList.toggle('hidden')
}
@ -173,25 +145,23 @@ function toogleInputAction(input, status = false) {
function validationInput() {
const input = modal.querySelector("input[name='name']");
if (input.value.length < 1) {
input.classList.add('border-2', 'border-red-500');
return false;
}
input.classList.remove('border-2', 'border-red-500');
return true;
}
function validationTextArea() {
const textArea = modal.querySelector("textarea[name='body']");
if (textArea.value.length < 1) {
textArea.classList.add('border-2', 'border-red-500');
return false;
}
textArea.classList.remove('border-2', 'border-red-500');
return true;
}
@ -205,14 +175,13 @@ function getButtons() {
function getCurrentStep() {
let selected;
for (let i = 0; i < steps.length; i++) {
const isHidden = steps[i].classList.contains('hidden');
if (!isHidden) {
selected = i + 1;
}
}
return selected;
}
@ -239,9 +208,6 @@ function fetchCadastroPositus(data, token) {
function fetchCadastroDB(data) {
const csrfToken = document.querySelector("input[name='_token']").value;
let btnCadastro = modal.querySelector('.btn-cadastro');
$.ajax({
type: "post",
data: data,
@ -261,7 +227,6 @@ function fetchCadastroDB(data) {
function cadastroSucess(message) {
fechaModal();
montaTemplates();
const header = document.querySelector(".header");
const div = document.createElement('div');
div.classList.add("w-full", "p-5", "bg-blue-600", "mb-5", "text-white", "rounded", "uppercase", "font-bold", "text-lg");
@ -276,7 +241,6 @@ function fechaModal() {
function montaComponents() {
const components = []
const checkedHeader = document.querySelector('.header-checkbox').checked;
if (checkedHeader) {
components.push({
type: 'HEADER',
@ -284,28 +248,22 @@ function montaComponents() {
text: document.querySelector("input[name='header']").value,
});
}
components.push(
{
type: 'BODY',
text: document.querySelector("textarea[name='body']").value,
},
);
const checkedFooter = document.querySelector('.footer-checkbox').checked;
if (checkedFooter) {
components.push({
type: 'FOOTER',
text: document.querySelector("input[name='footer']"),
});
}
const buttonCheckbox = document.querySelector('.button-checkbox').checked;
if (buttonCheckbox) {
const inputs = [...document.querySelectorAll('.input')];
const formatedArray = inputs.map(input => {
const inputValue = input.querySelector('.input-text').value;
return {
@ -313,7 +271,6 @@ function montaComponents() {
type: "QUICK_REPLY"
}
});
components.push(
{
type: "BUTTONS",
@ -321,6 +278,7 @@ function montaComponents() {
}
)
}
return components;
}

8
resources/views/admin/cadastros/redirectOption.blade.php

@ -33,8 +33,8 @@
<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">Redirect</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">Destino</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>
@ -46,17 +46,15 @@
</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->redirect()->name }}
{{ $option->redirect_name }}
</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 uppercase">
{{ $option->type()->name }}
{{ $option->type_name }}
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
{{ $option->code_id }}

2
resources/views/admin/conectarAgente/conectarAgente.blade.php

@ -12,7 +12,7 @@
<label>Escolha a fila: </label>
<select name="queue_id" class="rounded-md p-2 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100">
@foreach($filas as $fila)
<option value="{{$fila->id}}">{{$fila->nome}}</option>
<option value="{{$fila->id}}">{{$fila->name}}</option>
@endforeach
</select>
</div>

8
resources/views/admin/configs/configs.blade.php

@ -13,13 +13,13 @@
<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" placeholder="Digite aqui a quantidade : " value="{{$configAtendimento->quantidade_simutaneo}}" onkeypress="return event.charCode >= 48 && event.charCode <= 57" name="qtde_atendimento">
</div>
<div class="flex-1 flex flex-col gap-1">
<label>Timeout do Cliente: </label>
<label>Timeout do Cliente (em segundos): </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" placeholder="Digite aqui o timeout em minutos: " onkeypress="return event.charCode >= 48 && event.charCode <= 57" value="{{$configAtendimento->timeout_client}}" name="timeout_cliente">
<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" placeholder="Digite aqui o timeout em segundos: " onkeypress="return event.charCode >= 48 && event.charCode <= 57" value="{{$configAtendimento->timeout_client}}" name="timeout_cliente">
</div>
<div class="flex-1 flex flex-col gap-1">
<label>Timeout do Agente: </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" placeholder="Digite aqui o timeout em minutos: " onkeypress="return event.charCode >= 48 && event.charCode <= 57" value="{{$configAtendimento->timeout_agent}}" name="timeout_agente">
<label>Timeout do Agente (em segundos): </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" placeholder="Digite aqui o timeout em segundos: " onkeypress="return event.charCode >= 48 && event.charCode <= 57" value="{{$configAtendimento->timeout_agent}}" name="timeout_agente">
</div>
<input type="hidden" value="{{$configAtendimento->id_empresa}}" name="id_empresa">
</div>

1
resources/views/admin/dashboard/agentesLogados.blade.php

@ -24,7 +24,6 @@
<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>

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

@ -49,8 +49,8 @@
<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">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">ATENDIMENTOS NO DIA</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">ABANDONADAS NO DIA</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">AÇÕES</th>
</tr>

4
resources/views/admin/graficos/graficos.blade.php

@ -22,11 +22,7 @@
<h1 class="dark:text-white text-gray-800 mb-5 text-center text-lg">Filas Mais Usadas</h1>
<canvas id="myChart3" class="max-h-80"></canvas>
</div>
<!-- <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>
</div>
</div>
</div>

34
resources/views/admin/relatorios/historicoAtendimentos/historicoAtendimentos.blade.php

@ -11,28 +11,17 @@
<h1 class="text-gray-100">Filtrar por: </h1>
<div class="search bg-white dark:bg-gray-800 rounded overflow-hidden px-3 py-1">
<i class="fas fa-search dark:text-gray-100"></i>
<input type="text" name="search" value="{{$selected->search ?? ""}}" class="min-w-[250px] border-none bg-transparent focus:ring-transparent placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " placeholder="Protocolo/Agente">
<input type="text" name="protocolo" value="{{$selected->protocolo ?? ""}}" class="min-w-[250px] border-none bg-transparent focus:ring-transparent placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " placeholder="Protocolo: ">
</div>
{{-- <select class="border-none rounded overflow-hidden dark:bg-gray-800 dark:text-gray-100 py-3" name="usuario">
<option value="">Usuário</option>
@foreach ($filtro_usuarios as $usuario)
@if (isset($selected->usuario) && $selected->usuario === $usuario)
<option value="{{$usuario}}" selected>{{$usuario}}</option>
@else
<option value="{{$usuario}}">{{$usuario}}</option>
@endif
@endforeach
</select> --}}
<select class="border-none rounded overflow-hidden dark:bg-gray-800 dark:text-gray-100 py-3" name="atendente">
<option value="" selected>Atendente</option>
@foreach ( $filtro_atendentes as $atendente)
@if (isset($selected->atendente) && $selected->atendente === $atendente->nome)
<option value="{{$atendente->nome}}" selected>{{$atendente->nome}}</option>
@else
<option value="{{$atendente->nome}}">{{$atendente->nome}}</option>
@endif
@endforeach
</select>
<div class="search bg-white dark:bg-gray-800 rounded overflow-hidden px-3 py-1">
<i class="fas fa-search dark:text-gray-100"></i>
<input type="text" name="atendente" value="{{$selected->atendente ?? ""}}" class="min-w-[250px] border-none bg-transparent focus:ring-transparent placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " placeholder="Agente: ">
</div>
<div class="search bg-white dark:bg-gray-800 rounded overflow-hidden px-3 py-1">
<i class="fas fa-search dark:text-gray-100"></i>
<input type="text" name="usuario" value="{{$selected->usuario ?? ""}}" class="min-w-[250px] border-none bg-transparent focus:ring-transparent placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " placeholder="Usuario: ">
</div>
<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 class="filtros flex">
@ -68,7 +57,8 @@
</div>
@endforelse
{{$atendimentos->appends([
'search' => request()->get('search', ''),
'protocolo' => request()->get('protocolo', ''),
'usuario' => request()->get('usuario', ''),
'atendente' => request()->get('atendente', ''),
])->links()}}
</div>

4
resources/views/components/modal/edit/modalEditContatos.blade.php

@ -26,7 +26,7 @@
<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 número de telefone: " name="contato" id="numero" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Email: </label>
<label class="dark:text-gray-100">Email ( opcional ): </label>
<input type="email" 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>
@ -37,7 +37,7 @@
</div>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Descrição: </label>
<label class="dark:text-gray-100">Descrição ( opcional ): </label>
<textarea placeholder="Digite alguma nota para o contato: " 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>

4
resources/views/components/modal/insert/modalContatos.blade.php

@ -26,7 +26,7 @@
<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 número de telefone: " name="contato" id="numero" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Email: </label>
<label class="dark:text-gray-100">Email ( opcional ): </label>
<input type="email" 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>
@ -37,7 +37,7 @@
</div>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Descrição: </label>
<label class="dark:text-gray-100">Descrição ( opcional ): </label>
<textarea placeholder="Digite alguma nota para o contato: " 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>

Loading…
Cancel
Save