diff --git a/app/Http/Controllers/Admin/HorariosController.php b/app/Http/Controllers/Admin/HorariosController.php index 21406bb..e7540fe 100644 --- a/app/Http/Controllers/Admin/HorariosController.php +++ b/app/Http/Controllers/Admin/HorariosController.php @@ -12,6 +12,7 @@ use App\Models\Horario; use App\Models\Agentes; use App\Models\Filas; use App\Models\Redirect; +use App\Models\HorarioOption; use Illuminate\Support\Facades\DB; class HorariosController extends Controller @@ -20,7 +21,8 @@ class HorariosController extends Controller protected Horario $horarioRepository, protected Agentes $agenteRepository, protected Filas $queueRepository, - protected Redirect $redirectRepository + protected Redirect $redirectRepository, + protected HorarioOption $horarioOptionRepository, ) { } @@ -101,9 +103,13 @@ class HorariosController extends Controller $status = $request->status === "on" ? true : false; - $this->horarioRepository->create($request->id_number, strtoupper($request->nome), $request->opcao_nao, $request->acao_nao, $status); + $created = $this->horarioRepository->create($request->id_number, strtoupper($request->nome), $request->opcao_nao, $request->acao_nao, $status); - return redirect()->back()->with('status', 'Cadastrado com sucesso'); + if(!$created){ + redirect()->back()->with('status', 'Erro ao tentar cadastrar horário'); + } + + return redirect()->back()->with('status', 'Cadastrado com sucesso!'); } public function edit(Request $request) @@ -139,7 +145,6 @@ class HorariosController extends Controller return response()->json($response); } - public function update(Request $request) { $id = $request->segment(2); @@ -168,4 +173,25 @@ class HorariosController extends Controller return redirect()->back()->with('status', 'Atualizado com sucesso'); } + + public function destroy($horario_id) + { + if (!$horario_id) { + return redirect()->back(); + } + + $horariosOptions = $this->horarioOptionRepository->list(['id_horario' => $horario_id]); + + if (count($horariosOptions) > 0) { + return redirect()->back()->with('status', 'É necessário deletar todos os subitens primeiro!'); + } + + $deleted = $this->horarioRepository->deletar($horario_id); + + if(!$deleted){ + return redirect()->back()->with('status', 'Erro ao tentar deletar horário'); + } + + return redirect()->back()->with('status', 'Deletado com sucesso!'); + } } diff --git a/app/Http/Controllers/Admin/HorariosOptionController.php b/app/Http/Controllers/Admin/HorariosOptionController.php index 9348f7c..b4d71ab 100644 --- a/app/Http/Controllers/Admin/HorariosOptionController.php +++ b/app/Http/Controllers/Admin/HorariosOptionController.php @@ -12,6 +12,7 @@ use App\Models\Types; use App\Models\Redirect; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Gate; class HorariosOptionController extends Controller { @@ -29,7 +30,7 @@ class HorariosOptionController extends Controller if (empty($id)) { return redirect('horarios'); } - $options = $this->horariosOptionsRepository->list(["id_redirect" => $id]); + $options = $this->horariosOptionsRepository->list(["id_horario" => $id]); $types = Types::all(); $id_horario = $id; @@ -75,22 +76,101 @@ class HorariosOptionController extends Controller public function store(Request $request) { + $user = auth()->user(); + if(Gate::forUser($user)->denies('store_redirect')){ + abort(404); + } + $request->validate([ - 'sequencia' => ['required'], - 'type' => ['required'], - 'destino' => ['required'], - 'status' => ['required'], + 'id_horario' => ['required'], + 'horario_inicio' => ['required'], + 'horario_fim' => ['required'], + 'feriado' => ['required'], + 'todos_dias_semana' => ['required'], + 'todos_meses' => ['required'], + 'todos_dias_mes' => ['required'], ]); - $id = $request->destino; - if ($request->type == 3) { - $id = $this->agenteRepository->get(["id" => $request->destino])->matricula; + $todos_dias_semana = $request->todos_dias_semana === "Sim" ? true : false; + $todos_meses = $request->todos_meses === "Sim" ? true : false; + $todos_dias_mes = $request->todos_dias_mes === "Sim" ? true : false; + $feriado = $request->feriado === "Sim" ? true : false; + + $created = $this->horariosOptionsRepository->create($request->id_horario, $request->horario_inicio, $request->horario_fim, $todos_dias_semana, $request->dias_semana, + $request->dias_semana_fim, $todos_dias_mes, $request->dias_mes, $request->dias_mes_fim, $todos_meses, $request->meses, $request->meses_fim, + $request->type, $request->destino, $feriado); + + if(!$created){ + redirect()->back()->with('status', 'Erro ao tentar cadastrar regra'); + } + + return redirect()->back()->with('status', 'Cadastrado com sucesso'); + } + + public function destroy($id_horario, $id_horario_option) + { + if (!$id_horario_option) { + return redirect()->back(); + } + + $deleted = $this->horariosOptionsRepository->deletar($id_horario_option); + + if(!$deleted){ + redirect()->back()->with('status', 'Erro ao tentar deletar horário'); + } + + 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']); } - $hidden = $request->status === "on" ? false : true; - $created = $this->horariosOptionsRepository->create($request->sequencia, $request->descricao, $request->id_redirect, $request->type, $id, $hidden, date("Y-m-d")); + $optionData = HorarioOption::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([ + 'horario_inicio' => ['required'], + 'horario_fim' => ['required'], + 'feriado' => ['required'], + 'todos_dias_semana' => ['required'], + 'todos_meses' => ['required'], + 'todos_dias_mes' => ['required'], + ]); + + $todos_dias_semana = $request->todos_dias_semana === "Sim" ? true : false; + $todos_meses = $request->todos_meses === "Sim" ? true : false; + $todos_dias_mes = $request->todos_dias_mes === "Sim" ? true : false; + $feriado = $request->feriado === "Sim" ? true : false; + + $created = $this->horariosOptionsRepository->atualizar($id, $request->horario_inicio, $request->horario_fim, $todos_dias_semana, $request->dias_semana, + $request->dias_semana_fim, $todos_dias_mes, $request->dias_mes, $request->dias_mes_fim, $todos_meses, $request->meses, $request->meses_fim, + $request->type, $request->destino, $feriado); + if(!$created){ - redirect()->back()->with('status', 'Erro ao tentar cadastrar opção'); + redirect()->back()->with('status', 'Erro ao tentar cadastrar regra'); } return redirect()->back()->with('status', 'Cadastrado com sucesso'); diff --git a/app/Models/Atendimentos.php b/app/Models/Atendimentos.php index fdc56e7..ba307e4 100644 --- a/app/Models/Atendimentos.php +++ b/app/Models/Atendimentos.php @@ -34,7 +34,7 @@ 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') - ->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')]); + ->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'), config('event.CONF_EVENT_ABANDON')]); if (isset($params['id_empresa'])) { $atendimentos->where('a.id_empresa', $params['id_empresa']); diff --git a/app/Models/Horario.php b/app/Models/Horario.php index f865bff..46de69b 100644 --- a/app/Models/Horario.php +++ b/app/Models/Horario.php @@ -50,12 +50,39 @@ class Horario extends Model public function create(int $id_number, string $nome, string $opcao_nao, string $acao_nao, bool $status) { - DB::table('horarios')->insert([ - 'id_number' => $id_number, - 'nome' => strtoupper($nome), - 'opcao_nao' => $opcao_nao, - 'acao_nao' => $acao_nao, - 'status' => $status - ]); + DB::beginTransaction(); + + try { + DB::table('horarios')->insert([ + 'id_number' => $id_number, + 'nome' => strtoupper($nome), + 'opcao_nao' => $opcao_nao, + 'acao_nao' => $acao_nao, + 'status' => $status + ]); + + DB::commit(); + return true; + } catch (\Throwable $th) { + DB::rollBack(); + return false; + } + } + + public function deletar($id_horario) + { + DB::beginTransaction(); + + try { + DB::table('horarios')->delete([ + 'id' => $id_horario + ]); + + DB::commit(); + return true; + } catch (\Throwable $th) { + DB::rollBack(); + return false; + } } } diff --git a/app/Models/HorarioOption.php b/app/Models/HorarioOption.php index b45aaf4..0c35c7b 100644 --- a/app/Models/HorarioOption.php +++ b/app/Models/HorarioOption.php @@ -14,6 +14,7 @@ class HorarioOption extends Model public $timestamps = false; protected $fillable = [ + 'id_horario', 'horario_inicio', 'horario_fim', 'todos_dias_semana', @@ -43,18 +44,76 @@ class HorarioOption extends Model return $options->orderBy('id', '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) + public function create(int $id_horario, string $horario_inicio, string $horario_fim, bool $todos_dias_semana, ?string $semana, ?string $semana_fim, bool $todos_dias_mes, + ?int $dias_mes, ?int $dias_mes_fim, bool $todos_mes, ?string $mes, ?string $mes_fim, string $opcao, string $acao, bool $feriado) { DB::beginTransaction(); + + try { + DB::table("horarios_itens")->insert([ + 'id_horario' => $id_horario, + 'horario_inicio'=> $horario_inicio, + 'horario_fim' => $horario_fim, + 'todos_dias_semana' => $todos_dias_semana, + 'semana' => $semana, + 'semana_fim'=> $semana_fim, + 'todos_dias_mes'=> $todos_dias_mes, + 'dias_mes' => $dias_mes, + 'dias_mes_fim' => $dias_mes_fim, + 'todos_mes' => $todos_mes, + 'mes' => $mes, + 'mes_fim'=> $mes_fim, + 'opcao' => $opcao, + 'acao' => $acao, + 'feriado' => $feriado + ]); + + DB::commit(); + return true; + } catch (\Throwable $th) { + DB::rollBack(); + return false; + } + } + + public function deletar($id_horario_option) + { + DB::beginTransaction(); + + try { + DB::table('horarios_itens')->delete([ + 'id' => $id_horario_option + ]); + + DB::commit(); + return true; + } catch (\Throwable $th) { + DB::rollBack(); + return false; + } + } + + public function atualizar(int $id, string $horario_inicio, string $horario_fim, bool $todos_dias_semana, ?string $semana, ?string $semana_fim, bool $todos_dias_mes, + ?int $dias_mes, ?int $dias_mes_fim, bool $todos_mes, ?string $mes, ?string $mes_fim, string $opcao, string $acao, bool $feriado) + { + 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::table("horarios_itens")->where("id", $id)->update([ + 'horario_inicio'=> $horario_inicio, + 'horario_fim' => $horario_fim, + 'todos_dias_semana' => $todos_dias_semana, + 'semana' => $semana, + 'semana_fim'=> $semana_fim, + 'todos_dias_mes'=> $todos_dias_mes, + 'dias_mes' => $dias_mes, + 'dias_mes_fim' => $dias_mes_fim, + 'todos_mes' => $todos_mes, + 'mes' => $mes, + 'mes_fim'=> $mes_fim, + 'opcao' => $opcao, + 'acao' => $acao, + 'feriado' => $feriado ]); DB::commit(); diff --git a/config/event.php b/config/event.php index 4ded6b0..c62eebd 100644 --- a/config/event.php +++ b/config/event.php @@ -19,4 +19,5 @@ return [ "CONF_EVENT_START" => "START", "CONF_EVENT_ERRO_ATEND" => "LOST_CONNECTION", "CONF_EVENT_SEND_HSM" => "SENDED", + "CONF_EVENT_ABANDON" => "ABANDON", ]; \ No newline at end of file diff --git a/public/js/views/horarios/atualizaHorarios.js b/public/js/views/horarios/atualizaHorarios.js index 0c806ee..0da2b1a 100644 --- a/public/js/views/horarios/atualizaHorarios.js +++ b/public/js/views/horarios/atualizaHorarios.js @@ -18,7 +18,7 @@ function atualizaHorarios(horario_id) { Não` } else { modal.querySelector(".container-radio").innerHTML = - ` Sim + ` Sim Não`; } let containerTypes = ''; diff --git a/public/js/views/horarios/montaSelect.js b/public/js/views/horarios/montaSelect.js index 5f432ed..bc9ec1f 100644 --- a/public/js/views/horarios/montaSelect.js +++ b/public/js/views/horarios/montaSelect.js @@ -17,7 +17,7 @@ async function montaSelectDestino(id_type, modal, code_id = null) { let selectElements = ""; if (code_id) { data.forEach(element => { - let matriculaOrId = element.matricula ?? element.id; + let matriculaOrId = element.id; if (matriculaOrId.toString() === code_id.toString()) { selectElements += ` ` diff --git a/public/js/views/horariosOption/atualizaHorariosOptions.js b/public/js/views/horariosOption/atualizaHorariosOptions.js new file mode 100644 index 0000000..26194d0 --- /dev/null +++ b/public/js/views/horariosOption/atualizaHorariosOptions.js @@ -0,0 +1,88 @@ +function atualizaHorariosOptions(horario_option_id) { + $.ajax({ + type: "get", + url: `options/${horario_option_id}/edit`, + 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.querySelector("input[name='horario_inicio']").value = option_data.horario_inicio; + modal.querySelector("input[name='horario_fim']").value = option_data.horario_fim; + var selectSemana = document.getElementById("dias_semana2"); + var selectSemanaFim = document.getElementById("dias_semana_fim2"); + var selectMes = document.getElementById("meses2"); + var selectMesFim = document.getElementById("meses_fim2"); + var selectDia = document.getElementById("dias_mes2"); + var selectDiaFim = document.getElementById("dias_mes_fim2"); + modal.querySelector('form').action = `options/${horario_option_id}`; + + if (option_data.feriado) { + modal.querySelector("input[id='feriado_sim']").checked = true; + } else { + modal.querySelector("input[id='feriado_nao']").checked = true; + } + + if (option_data.todos_mes) { + modal.querySelector("input[id='todos_mes']").checked = true; + selectMes.disabled = true; + selectMesFim.disabled = true; + selectMes.selectedIndex = -1; + selectMesFim.selectedIndex = -1; + } else { + modal.querySelector("input[id='todos_mes_nao']").checked = true; + selectMes.selectedIndex = option_data.mes - 1; + selectMesFim.selectedIndex = option_data.mes_fim - 1; + } + + if (option_data.todos_dias_semana) { + modal.querySelector("input[id='todos_dias_semana']").checked = true; + selectSemana.disabled = true; + selectSemanaFim.disabled = true; + selectSemana.selectedIndex = -1; + selectSemanaFim.selectedIndex = -1; + } else { + modal.querySelector("input[id='todos_dias_semana_nao']").checked = true; + selectSemana.selectedIndex = option_data.semana - 1; + selectSemanaFim.selectedIndex = option_data.semana_fim - 1; + } + + if (option_data.todos_dias_mes) { + modal.querySelector("input[id='todos_dias_mes']").checked = true; + selectDia.disabled = true; + selectDiaFim.disabled = true; + selectDia.selectedIndex = -1; + selectDiaFim.selectedIndex = -1; + } else { + modal.querySelector("input[id='todos_dias_mes_nao']").checked = true; + selectDia.selectedIndex = option_data.dias_mes - 1; + selectDiaFim.selectedIndex = option_data.dias_mes_fim - 1; + } + + let containerTypes = ''; + types.forEach(type => { + if (option_data.opcao == type.id) { + containerTypes += + ` ` + } else { + containerTypes += + ` ` + } + }); + modal.querySelector(".select-types").innerHTML = containerTypes; + + montaSelectDestino(option_data.opcao, modal, option_data.acao); + } + }); +} + +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); + }) +}) \ No newline at end of file diff --git a/public/js/views/horariosOption/montaSelect.js b/public/js/views/horariosOption/montaSelect.js new file mode 100644 index 0000000..da4320d --- /dev/null +++ b/public/js/views/horariosOption/montaSelect.js @@ -0,0 +1,37 @@ +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.id; + if (matriculaOrId.toString() === code_id.toString()) { + selectElements += + ` ` + } else { + selectElements += + ` ` + } + }) + } else { + data.forEach(element => { + selectElements += `` + }); + } + + selectDestino.innerHTML = selectElements; +} \ No newline at end of file diff --git a/public/js/views/horariosOption/requestType.js b/public/js/views/horariosOption/requestType.js new file mode 100644 index 0000000..0e16c58 --- /dev/null +++ b/public/js/views/horariosOption/requestType.js @@ -0,0 +1,13 @@ +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); + } + }); + }); +} \ No newline at end of file diff --git a/resources/views/admin/cadastros/horarios.blade.php b/resources/views/admin/cadastros/horarios.blade.php index 9e2f712..79954e5 100644 --- a/resources/views/admin/cadastros/horarios.blade.php +++ b/resources/views/admin/cadastros/horarios.blade.php @@ -57,7 +57,7 @@ @can('show_redirect_option') Editar Opções + class="text-blue-500 hover:underline">Editar Horários Disponíveis @endcan @@ -68,7 +68,7 @@ @endcan @can('destroy_redirect')
@csrf diff --git a/resources/views/admin/cadastros/horariosOption.blade.php b/resources/views/admin/cadastros/horariosOption.blade.php index 7970ed0..b6b0fe2 100644 --- a/resources/views/admin/cadastros/horariosOption.blade.php +++ b/resources/views/admin/cadastros/horariosOption.blade.php @@ -1,3 +1,25 @@ + 'QUEUE', + 2 => 'REDIRECT', + 3 => 'AGENT', + 4 => 'TEXT' + ]; + + $semana = [ + '' => '', + 1 => 'Domingo', + 2 => 'Segunda', + 3 => 'Terça', + 4 => 'Quarta', + 5 => 'Quinta', + 6 => 'Sexta', + 7 => 'Sábado' + ]; + + $meses = ['' => '', 1 => 'Janeiro', 2 => 'Fevereiro', 3 => 'Março', 4 => 'Abril', 5 => 'Maio', 6 => 'Junho', 7 => 'Julho', 8 => 'Agosto', 9 => 'Setembro', 10 => 'Outubro', 11 => 'Novembro', 12 => 'Dezembro']; +?> + + - - - + + + \ No newline at end of file diff --git a/resources/views/components/modal/insert/modalHorariosOption.blade.php b/resources/views/components/modal/insert/modalHorariosOption.blade.php index d1a5488..80beec4 100644 --- a/resources/views/components/modal/insert/modalHorariosOption.blade.php +++ b/resources/views/components/modal/insert/modalHorariosOption.blade.php @@ -12,9 +12,18 @@ $meses = [1 => 'Janeiro', 2 => 'Fevereiro', 3 => 'Março', 4 => 'Abril', 5 => 'Maio', 6 => 'Junho', 7 => 'Julho', 8 => 'Agosto', 9 => 'Setembro', 10 => 'Outubro', 11 => 'Novembro', 12 => 'Dezembro']; ?> + -