Browse Source

adicionando modal de horários

Felipe
Felipe Fontana 10 months ago
parent
commit
d36938614b
  1. 171
      app/Http/Controllers/Admin/HorariosController.php
  2. 99
      app/Http/Controllers/Admin/HorariosOptionController.php
  3. 14
      app/Http/Controllers/Admin/NumberChannelController.php
  4. 13
      app/Http/Controllers/Admin/RedirectController.php
  5. 61
      app/Models/Horario.php
  6. 67
      app/Models/HorarioOption.php
  7. 6
      app/Models/NumberChannel.php
  8. 6
      app/Models/Redirect.php
  9. 59
      public/js/views/horarios/atualizaHorarios.js
  10. 35
      public/js/views/horarios/montaSelect.js
  11. 13
      public/js/views/horarios/requestType.js
  12. 101
      resources/views/admin/cadastros/horarios.blade.php
  13. 99
      resources/views/admin/cadastros/horariosOption.blade.php
  14. 77
      resources/views/components/modal/edit/modalEditHorarios.blade.php
  15. 78
      resources/views/components/modal/insert/modalHorarios.blade.php
  16. 177
      resources/views/components/modal/insert/modalHorariosOption.blade.php
  17. 9
      resources/views/layouts/menu.blade.php
  18. 4
      routes/web.php

171
app/Http/Controllers/Admin/HorariosController.php

@ -0,0 +1,171 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use App\Models\Types;
use App\Models\NumberChannel;
use App\Models\Horario;
use App\Models\Agentes;
use App\Models\Filas;
use App\Models\Redirect;
use Illuminate\Support\Facades\DB;
class HorariosController extends Controller
{
public function __construct(
protected Horario $horarioRepository,
protected Agentes $agenteRepository,
protected Filas $queueRepository,
protected Redirect $redirectRepository
) {
}
public function index(Request $request)
{
$user = auth()->user();
if(Gate::forUser($user)->denies('show_redirect')){
abort(404);
}
$id_empresa = Helper::getEmpresas();
if (!is_int($id_empresa)){
$empresasIds = $id_empresa->pluck('id')->toArray();
} else {
$empresasIds = $id_empresa;
}
$types = Types::all();
$horarios = $this->horarioRepository->list(["id_empresa" => $empresasIds]);
$numberChannels = NumberChannel::whereIn('id_empresa', $empresasIds)->get();
return view('admin.cadastros.horarios', compact('horarios', 'numberChannels', 'types'));
}
public function show(Request $request)
{
$data = $request->all();
$id_type = $request->segment(2);
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;
$id_empresa = Helper::getIdEmpresa();
$data = null;
switch ($typeName) {
case 'queue':
$data = $this->queueRepository->list(["id_empresa" => $id_empresa, "status" => true]);
break;
case 'redirect':
$data = $this->redirectRepository->list(["id_empresa" => $id_empresa]);
break;
case 'agent':
$data = $this->agenteRepository->list(["id_empresa" => $id_empresa, "status" => true]);
break;
default:
$data = null;
break;
}
$response = [
'data' => [
'status' => true,
'data' => $data,
],
];
return response()->json($response);
}
public function store(Request $request)
{
$user = auth()->user();
if(Gate::forUser($user)->denies('store_redirect')){
abort(404);
}
$request->validate([
'id_number' => ['required'],
'nome' => ['required', 'string'],
'opcao_nao' => ['required'],
'acao_nao' => ['required'],
'status' => ['required']
]);
$status = $request->status === "on" ? true : false;
$this->horarioRepository->create($request->id_number, strtoupper($request->nome), $request->opcao_nao, $request->acao_nao, $status);
return redirect()->back()->with('status', 'Cadastrado com sucesso');
}
public function edit(Request $request)
{
$id = $request->segment(2);
if (empty($id)) {
return response()->json(['data' => 'Parametro ID é obrigatório']);
}
$optionData = Horario::find($id);
$types = Types::all();
$id_empresa = Helper::getEmpresas();
if (!is_int($id_empresa)){
$empresasIds = $id_empresa->pluck('id')->toArray();
} else {
$empresasIds = $id_empresa;
}
$numberChannels = NumberChannel::whereIn('id_empresa', $empresasIds)->get();
$response = [
'data' => [
'status' => true,
'option_data' => $optionData,
'types' => $types,
'numberChannels' => $numberChannels
],
];
return response()->json($response);
}
public function update(Request $request)
{
$id = $request->segment(2);
if (!$id) {
return redirect()->back();
}
$request->validate([
'id_number' => ['required'],
'nome' => ['required', 'string'],
'opcao_nao' => ['required'],
'acao_nao' => ['required'],
'status' => ['required']
]);
$status = $request->status === "on" ? true : false;
Horario::where("id", $id)
->update([
'id_number' => $request->id_number,
'nome' => $request->nome,
'opcao_nao' => $request->opcao_nao,
'acao_nao' => $request->acao_nao,
'status' => $status
]);
return redirect()->back()->with('status', 'Atualizado com sucesso');
}
}

99
app/Http/Controllers/Admin/HorariosOptionController.php

@ -0,0 +1,99 @@
<?php
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\Horario;
use App\Models\HorarioOption;
use App\Models\Types;
use App\Models\Redirect;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class HorariosOptionController extends Controller
{
public function __construct(
protected Agentes $agenteRepository,
protected Filas $queueRepository,
protected Horario $horarioRepository,
protected HorarioOption $horariosOptionsRepository,
protected Redirect $redirectRepository,
) {
}
public function index($id)
{
if (empty($id)) {
return redirect('horarios');
}
$options = $this->horariosOptionsRepository->list(["id_redirect" => $id]);
$types = Types::all();
$id_horario = $id;
return view('admin.cadastros.horariosOption', compact('options', 'id_horario', '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;
$id_empresa = Helper::getIdEmpresa();
$data = null;
switch ($typeName) {
case 'queue':
$data = $this->queueRepository->list(["id_empresa" => $id_empresa, "status" => true]);
break;
case 'redirect':
$data = $this->redirectRepository->list(["id_empresa" => $id_empresa]);
break;
case 'agent':
$data = $this->agenteRepository->list(["id_empresa" => $id_empresa, "status" => true]);
break;
default:
$data = null;
break;
}
$response = [
'data' => [
'status' => true,
'data' => $data,
],
];
return response()->json($response);
}
public function store(Request $request)
{
$request->validate([
'sequencia' => ['required'],
'type' => ['required'],
'destino' => ['required'],
'status' => ['required'],
]);
$id = $request->destino;
if ($request->type == 3) {
$id = $this->agenteRepository->get(["id" => $request->destino])->matricula;
}
$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"));
if(!$created){
redirect()->back()->with('status', 'Erro ao tentar cadastrar opção');
}
return redirect()->back()->with('status', 'Cadastrado com sucesso');
}
}

14
app/Http/Controllers/Admin/NumberChannelController.php

@ -23,11 +23,21 @@ class NumberChannelController extends Controller
abort(404);
}
$id_empresa = Helper::getIdEmpresa();
$empresas = Helper::getEmpresas();
if (!is_int($empresas)){
$empresasIds = $empresas->pluck('id')->toArray();
} else {
$empresasIds = $empresas;
}
if ($request->empresa) {
$empresasIds = $request->empresa;
}
$search = strtolower($request->pesquisa);
$status = $request->status === "desativado" ? false : true;
$channels = $this->numberChannelRepository->list(["id_empresa" => $id_empresa, "status" => $status, "search" => $search]);
$channels = $this->numberChannelRepository->list(["id_empresa" => $empresasIds, "status" => $status, "search" => $search]);
return view('admin.cadastros.channels', compact('channels', 'status', 'search'));
}

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

@ -23,9 +23,16 @@ class RedirectController extends Controller
abort(404);
}
$id_empresa = Helper::getIdEmpresa();
$redirects = $this->redirectRepository->list(["id_empresa" => $id_empresa]);
$numberChannels = NumberChannel::where('id_empresa', $id_empresa)->get();
$empresas = Helper::getEmpresas();
if (!is_int($empresas)){
$empresasIds = $empresas->pluck('id')->toArray();
} else {
$empresasIds = $empresas;
}
$redirects = $this->redirectRepository->list(["id_empresa" => $empresasIds]);
$numberChannels = NumberChannel::whereIn('id_empresa', $empresasIds)->get();
return view('admin.cadastros.redirects', compact('redirects', 'numberChannels'));
}

61
app/Models/Horario.php

@ -0,0 +1,61 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class Horario extends Model
{
use HasFactory;
protected $table = "horarios";
public $timestamps = false;
protected $fillable = [
'id_number',
'nome',
'opcao_nao',
'acao_nao',
'status',
];
public function list(array $params)
{
$horarios = DB::table('horarios as h')
->join('number_channel as nc', 'nc.id', '=', 'h.id_number')
->select('h.*');
if (is_array($params['id_empresa'])) {
$horarios->whereIn('nc.id_empresa', $params['id_empresa']);
} else {
$horarios->where('nc.id_empresa', $params['id_empresa']);
}
if(isset($params['id_number'])){
$horarios->where('h.id_number', $params['id_number']);
}
if(isset($params['nome'])){
$horarios->where('h.nome', $params['nome']);
}
if(isset($params['status'])){
$horarios->where('h.status', $params['status']);
}
return $horarios->get();
}
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
]);
}
}

67
app/Models/HorarioOption.php

@ -0,0 +1,67 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class HorarioOption extends Model
{
use HasFactory;
protected $table = "horarios_itens";
public $timestamps = false;
protected $fillable = [
'horario_inicio',
'horario_fim',
'todos_dias_semana',
'semana',
'semana_fim',
'todos_dias_mes',
'dias_mes',
'dias_mes_fim',
'todos_mes',
'mes',
'mes_fim',
'opcao',
'acao',
'feriado'
];
public function list(array $params)
{
$options = DB::table('horarios_itens as hi')
->join("horarios as h", "h.id", "=", "hi.id_horario")
->select("hi.*", "h.nome as horario_nome");
if (isset($params['id_horario'])) {
$options->where('hi.id_horario', $params['id_horario']);
}
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)
{
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;
}
}
}

6
app/Models/NumberChannel.php

@ -41,7 +41,11 @@ class NumberChannel extends Model
->join('empresa as e', 'e.id', '=', 'nc.id_empresa')
->select('nc.*');
if (isset($params['id_empresa'])) {
if (is_array($params['id_empresa'])) {
// Se $params['id_empresa'] for um array, use a condição whereIn
$channels->whereIn('nc.id_empresa', $params['id_empresa']);
} else {
// Se for um único valor, use a condição normal
$channels->where('nc.id_empresa', $params['id_empresa']);
}

6
app/Models/Redirect.php

@ -49,7 +49,11 @@ class Redirect extends Model
->join('number_channel as nc', 'nc.id', '=', 'r.id_number')
->select('r.*');
if(isset($params['id_empresa'])){
if (is_array($params['id_empresa'])) {
// Se $params['id_empresa'] for um array, use a condição whereIn
$redirects->whereIn('nc.id_empresa', $params['id_empresa']);
} else {
// Se for um único valor, use a condição normal
$redirects->where('nc.id_empresa', $params['id_empresa']);
}

59
public/js/views/horarios/atualizaHorarios.js

@ -0,0 +1,59 @@
function atualizaHorarios(horario_id) {
$.ajax({
type: "get",
url: `horarios/${horario_id}/edit`,
success: async function({
data
}) {
const option_data = data.option_data;
const types = data.types;
const channels = data.numberChannels;
const modal = document.querySelector('.modal-edit');
modal.style.display = 'block';
modal.querySelector("input[name='nome']").value = option_data.nome;
modal.querySelector('form').action = `horarios/${horario_id}`;
if (option_data.status) {
modal.querySelector(".container-radio").innerHTML =
`<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='mr-3 dark:text-gray-100'>Não</span>`
} else {
modal.querySelector(".container-radio").innerHTML =
`<input type='radio' name='status' value='off'> <span class='mr-3 dark:text-gray-100'>Sim</span>
<input type='radio' name='status' checked value='off'> <span class='mr-3 dark:text-gray-100'>Não</span>`;
}
let containerTypes = '';
types.forEach(type => {
if (option_data.opcao_nao == 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;
let containerChannels = '';
channels.forEach(channel => {
if (option_data.id_number === channel.id) {
containerChannels +=
` <option value="${channel.id}" selected>${channel.name}</option>`
} else {
containerChannels +=
` <option value="${channel.id}">${channel.name}</option>`
}
});
modal.querySelector(".select-channels").innerHTML = containerChannels;
montaSelectDestino(option_data.opcao_nao, modal, option_data.acao_nao);
}
});
}
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);
})
})

35
public/js/views/horarios/montaSelect.js

@ -0,0 +1,35 @@
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 ?? element.nome}</option>`
} else {
selectElements +=
` <option value="${element.id}">${element.name ?? element.nome}</option>`
}
})
} else {
data.forEach(element => {
selectElements += `<option value="${element.id}">${element.name ?? element.nome}</option>`
});
}
selectDestino.innerHTML = selectElements;
}

13
public/js/views/horarios/requestType.js

@ -0,0 +1,13 @@
function requestType(id_type) {
return new Promise(function(resolve, reject) {
$.ajax({
type: "get",
dataType: 'json',
url: `horarios/${id_type}`,
success: function(response) {
const data = response.data.data;
resolve(data);
}
});
});
}

101
resources/views/admin/cadastros/horarios.blade.php

@ -0,0 +1,101 @@
<?php
$tipos = [
1 => 'QUEUE',
2 => 'REDIRECT',
3 => 'AGENT',
4 => 'TEXT'
];
?>
<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">
Horários
</h1>
@can('store_redirect')
<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 Horários</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">ID Canal</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Opção Fora de Horário</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Açã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">Opções</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left">Ações</th>
</tr>
</thead>
<tbody>
@foreach ($horarios as $horario)
<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">{{ $horario->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $horario->nome }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $horario->id_number }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $tipos[$horario->opcao_nao] }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">{{ $horario->acao_nao }}</td>
@if ($horario->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
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
@can('show_redirect_option')
<a
href="{{ route('horarios.options.index', ['horario' => $horario->id]) }}"
class="text-blue-500 hover:underline">Editar Opções</a>
@endcan
</td>
<td class="p-3 text-sm font-bold flex-wrap w-32">
@can('edit_redirect')
<button class="bg-blue-600 text-white p-2 rounded text-lg w-full mb-2" title="editar horário"
onclick="atualizaHorarios( {{ $horario->id }})"><i
class="fas fa-edit"></i></button>
@endcan
@can('destroy_redirect')
<form method="POST"
action="{{ route('redirects.destroy', ['redirect' => $horario->id]) }}"
class="flex-1 flex" title="deletar horário"
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>
@endcan
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
<x-modal.insert.modalHorarios :types="$types" :numberChannels="$numberChannels"></x-modalHorarios>
<x-modal.edit.modalEditHorarios :types="$types" :numberChannels="$numberChannels"></x-modalEditHorarios>
<script src="{{ asset('js/views/horarios/montaSelect.js') }}"></script>
<script src="{{ asset('js/views/horarios/requestType.js') }}"></script>
<script src="{{ asset('js/views/horarios/atualizaHorarios.js') }}"></script>
<script>
const modal = document.querySelector(".modal");
const id_type = 1;
montaSelectDestino(id_type, modal);
</script>
</x-app-layout>

99
resources/views/admin/cadastros/horariosOption.blade.php

@ -0,0 +1,99 @@
<x-app-layout>
<div class="py-8 px-8">
<a href="{{ route('horarios.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">Horários Disponíveis</h1>
</div>
@can('store_redirect_option')
<button class="ml-auto mt-2 bg-blue-600 text-white py-2 px-6 rounded-md text-lg"
@click="modal = !modal">Adicionar</button>
@endcan
</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 border text-center">Feriado</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center" colspan="2">Horário</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center" colspan="3">Dia da Semana</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center" colspan="3">Dia do Mês</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center" colspan="3">Meses</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center" colspan="2">Caso Combine</th>
<th class="p-3 text-sm font-semibold tracking-wide text-left border text-center">Ações</th>
</tr>
</thead>
<tbody>
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2">
<td></td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Início</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Fim</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Todos</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Inicio</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Fim</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Todos</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Inicio</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Fim</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Todos</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Inicio</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Fim</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Opção</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">Ação</td>
<td></td>
</tr>
</tbody>
@foreach ($options as $option)
<tbody>
<tr class="bg-white dark:bg-gray-800 dark:border-gray-600 border-b-2">
<td>{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 border">{{ $option->id }}</td>
<td>{{ $option->id }}</td>
</tr>
</tbody>
@endforeach
</table>
</div>
</div>
</div>
</div>
<x-modal.insert.modalHorariosOption :id_horario="$id_horario" :types="$types"></x-modalHorarioOption>
<script src="{{ asset('js/views/redirectOption/atualizaRedirectOption.js') }}"></script>
<script src="{{ asset('js/views/redirectOption/montaSelect.js') }}"></script>
<script src="{{ asset('js/views/redirectOption/requestType.js') }}"></script>
<script>
const modal = document.querySelector(".modal");
const id_type = 1;
montaSelectDestino(id_type, modal);
</script>
</x-app-layout>

77
resources/views/components/modal/edit/modalEditHorarios.blade.php

@ -0,0 +1,77 @@
@props(['types', '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="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 Horário
</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">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">Canal: </label>
<select
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase select-channels"
name="id_number">
</select>
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Opção fora de Horário: </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="opcao_nao">
</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="acao_nao">
</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="acao_nao">
</div>
<div>
<label for="" class="dark:text-gray-100 block">Ativo: </label>
<div class="container-radio">
</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 btn-sub">Editar</button>
</div>
</form>
</div>
</div>
<script>
function fecharModal() {
$('.modal-edit').hide();
$('.modal-edit').find('input.sequence').removeClass('border-red-500 border-2');
$('.modal-edit').find('.text-problem').addClass('hidden');
}
</script>

78
resources/views/components/modal/insert/modalHorarios.blade.php

@ -0,0 +1,78 @@
@props(['numberChannels', '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('horarios.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 Horarios
</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="id_number">
@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">Opção fora de Horário: </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="opcao_nao">
@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="acao_nao">
</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="acao_nao">
</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>
</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>

177
resources/views/components/modal/insert/modalHorariosOption.blade.php

@ -0,0 +1,177 @@
@props(['id_horario', 'types'])
<?php
$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'];
?>
<!-- Main modal -->
<div class="flex 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('horarios.options.store', ['horario' => $id_horario]) }}"
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
</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>
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr class="bg-white dark:bg-gray-700 dark:border-gray-900 border">
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" width="50%" valign="top">
<fieldset>
<legend class="dark:text-gray-100">Horário: </legend>
Início
<input class="dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 input-inicio" name="horario_inicio" type="text" id="horario_inicio" size="5" maxlength="5" value="08:00"/>
Fim
<input class="dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 input-fim" name="horario_fim" type="text" id="horario_fim" value="17:59" size="5" maxlength="5"/>
</fieldset>
</td>
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" width="50%" valign="top">
<fieldset>
<legend class="dark:text-gray-100">Feriado: </legend>
<span>
Sim<input name="feriado" type="radio" id="feriado_sim" value="Sim" />
Não<input name="feriado" type="radio" id="feriado_nao" value="Nao" checked="checked" />
</span>
</fieldset>
</td>
</tr>
</table>
<tr class="bg-white dark:bg-gray-700">
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr class="bg-white dark:bg-gray-700 dark:border-gray-900 border">
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" width="33%" valign="top">
<fieldset>
<label class="dark:text-gray-100">Dia da Semana: </label>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr class="bg-white dark:bg-gray-700">
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" colspan="2">
<input name="todos_dias_semana" type="radio" id="todos_dias_semana" value="Sim" checked/>
Todos
<label><input name="todos_dias_semana" type="radio" value="Não"/>Intervalo </label>
</td>
</tr>
<tr class="bg-white dark:bg-gray-700">
<td class="p-3 text-sm text-gray-780 dark:text-gray-100">
<fieldset>
<label class="dark:text-gray-100">Inicio: </label>
<select class="w-45 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase" name="dias_semana" size="1" id="dias_semana" disabled="disabled">
@for ($i = 1; $i <= 7; $i++)
<option value="{{ $i }}">{{ $semana[$i] }}</option>
@endfor
</select>
</fieldset>
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100" width="50%">
<fieldset>
<label class="dark:text-gray-100">Fim: </label>
<select class="w-45 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase" name="dias_semana_fim" size="1" id="dias_semana_fim" disabled="disabled">
@for ($i = 1; $i <= 7; $i++)
<option value="{{ $i }}">{{ $semana[$i] }}</option>
@endfor
</select>
</fieldset>
</td>
</tr>
</table>
</fieldset>
</td>
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" width="33%" valign="top">
<fieldset>
<label class="dark:text-gray-100">Dia do Mês: </label>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr class="bg-white dark:bg-gray-700">
<td class="p-3 text-sm text-gray-800 dark:text-gray-100" colspan="2">
<input name="todos_dias_mes" type="radio" id="todos_dias_mes" value="Sim" checked/>
Todos
<label><input name="todos_dias_mes" type="radio" value="Não"/>Intervalo </label>
</td>
</tr>
<tr class="bg-white dark:bg-gray-700">
<td class="p-3 text-sm text-gray-780 dark:text-gray-100">
<fieldset>
<label class="dark:text-gray-100">Inicio: </label>
<select class="w-10 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase" name="dias_mes" size="1" id="dias_mes" disabled="disabled">
@for ($i = 1; $i <= 31; $i++)
<option value="{{ $i }}">{{ $i }}</option>
@endfor
</select>
</fieldset>
</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100" width="50%">
<fieldset>
<label class="dark:text-gray-100">Fim: </label>
<select class="w-10 dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 uppercase" name="dias_mes_fim" size="1" id="dias_mes_fim" disabled="disabled">
@for ($i = 1; $i <= 31; $i++)
<option value="{{ $i }}">{{ $i }}</option>
@endfor
</select>
</fieldset>
</td>
</tr>
</table>
</fieldset>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr class="bg-white dark:bg-gray-700 dark:border-gray-900 border">
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
<table cellpadding="0" cellspacing="0" border="0">
<tr class="bg-white dark:bg-gray-700 dark:border-gray-900">
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
<fieldset>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o tipo: </label>
<select class="w-48 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-48 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-48 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>
</fieldset>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- 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>

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

@ -115,6 +115,15 @@
</x-nav-link>
</li>
@endcan
@can('show_channels')
<li>
<x-nav-link class="p-2 mt-3 ml-4 flex items-center flex-row rounded-md px-2 md:px-4 duration-300 cursor-pointer hover:bg-blue-600 text-white" :href="route('horarios.index')" :active="request()->routeIs('horarios.index')">
<i class="fas fa-clock text-sm"></i>
<span class="text-[14px] ml-3 text-gray-300">Horários</span>
</x-nav-link>
</li>
@endcan
</ul>
</div>
@endcan

4
routes/web.php

@ -10,6 +10,8 @@ use App\Http\Controllers\Admin\PausasController;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Admin\EmpresaController;
use App\Http\Controllers\Admin\GraficosController;
use App\Http\Controllers\Admin\HorariosController;
use App\Http\Controllers\Admin\HorariosOptionController;
use App\Http\Controllers\Admin\RedirectController;
use App\Http\Controllers\Admin\RedirectOptionController;
use App\Http\Controllers\Admin\Relatorios\RelatorioHistoricoAtendimentoController;
@ -29,6 +31,8 @@ Route::middleware(['auth', 'verified'])->group(function () {
'graficos' => GraficosController::class,
'contatos' => ContatosController::class,
'templates' => TemplatesController::class,
'horarios' => HorariosController::class,
'horarios.options' => HorariosOptionController::class
]);
Route::get("relatorio/historicoAtendimento", [RelatorioHistoricoAtendimentoController::class, 'index'])->name('relatorio.historicoAtendimento.index');

Loading…
Cancel
Save