diff --git a/Dockerfile b/Dockerfile index e05eeda..9e1e751 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,31 @@ FROM php:8.1-fpm +SHELL ["/bin/bash", "--login", "-c"] ARG user=contacte ARG uid=1000 -RUN apt-get update && apt-get install -y curl zip unzip nodejs vim sudo +# RUN apt-get update && apt-get install -y curl zip unzip nodejs npm vim sudo +RUN apt-get update && apt-get install -y curl zip unzip vim sudo RUN apt-get update && apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql RUN curl -sS https://getcomposer.org/installer -o composer-setup.php RUN HASH=`curl -sS https://composer.github.io/installer.sig` RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer +RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash RUN useradd -G www-data,root -u $uid -d /home/$user $user WORKDIR /var/www COPY . . +RUN chown $user:$user -R /var/www +RUN composer install +RUN nvm install 18.17.1 +RUN chmod -R 777 /var/www/storage +RUN npm install +RUN npm run build +RUN php artisan key:generate +EXPOSE 8181 -EXPOSE 80 +ENTRYPOINT [ "php" ] + +CMD ["artisan", "serve", "--host", "0.0.0.0", "--port", "80"]' diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index d82c325..d508009 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -14,18 +14,17 @@ class Helper return (object) $array; } - - public static function last_day_in_mouth() + public static function last_date_in_mouth() { $mes = date('m'); $ano = date('Y'); - $data_fim = date("Y-m-" . cal_days_in_month(CAL_GREGORIAN, $mes, $ano)); + $ultimoDiaMes = self::last_day_in_mouth($mes, $ano); + $data_fim = date("Y-m-" . $ultimoDiaMes); return $data_fim; } - - - - + public static function last_day_in_mouth($month, $year){ + return $month == 2 ? ($year % 4 ? 28 : ($year % 100 ? 29 : ($year % 400 ? 28 : 29))) : (($month - 1) % 7 % 2 ? 30 : 31); + } } diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 33cda67..801c242 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -2,22 +2,22 @@ namespace App\Http\Controllers; -use app\Helpers\Crypt; use App\Helpers\Helper; use App\Models\Atendimentos; use App\Models\Filas; -use App\Models\Supervisor; -use DateTime; -use GuzzleHttp\Psr7\Request; +use App\Models\Pausas; use Illuminate\Support\Facades\DB; class DashboardController extends Controller { public function index() { - return view('admin.dashboard'); - } + $user = auth()->user(); + $id_empresa = $user->empresa->first()->id; + $pausas = Pausas::where(["id_empresa" => $id_empresa, "is_ativo" => true])->get(); + return view('admin.dashboard', compact('pausas')); + } public function getRelatorioDados() { @@ -31,9 +31,9 @@ class DashboardController extends Controller ->groupBy('u.nome') ->get(); - - $atendimentosStatusData = DB::table('supervisor as a') - ->leftJoin('eventos_atendimento as b', 'a.id_usuario', '=', 'b.id_usuario') + $atendimentosStatusData = DB::table('usuarios as u') + ->join('usuario_empresa as ue', 'ue.id_usuario', '=', 'u.id') + ->join('eventos_atendimento as ea', 'ea.id_usuario', '=', 'u.id') ->select('b.evento', DB::raw('count(b.evento) as qtde_usados')) ->where('a.id_empresa', $id_empresa) ->groupBy('b.evento') @@ -48,7 +48,7 @@ class DashboardController extends Controller $data_inicio = date("Y-m-01"); $data_atual = date('Y-m-d'); - $data_fim = Helper::last_day_in_mouth(); + $data_fim = Helper::last_date_in_mouth(); $atendimentosPorMes = $this->getAtendimentosMes($data_inicio, $data_fim); $atendimentosDia = $this->getAtendimentoDia($data_atual); @@ -86,7 +86,6 @@ class DashboardController extends Controller return $total_atendimentos; } - private function relatoriosDados() { $user = auth()->user(); @@ -171,12 +170,12 @@ class DashboardController extends Controller } $user = auth()->user(); $id_empresa = $user->empresa->first()->id; - $fila = Filas::where('id', $id)->where('id_empresa', $id_empresa)->first(); + $fila = Filas::where(['id' => $id, 'id_empresa' => $id_empresa])->first(); + $pausas = Pausas::where(["id_empresa" => $id_empresa, "is_ativo" => true])->get(); - return view('admin.agentesLogados', compact('fila')); + return view('admin.agentesLogados', compact('fila', 'pausas')); } - public function relatoriosFilas($id) { @@ -189,21 +188,6 @@ class DashboardController extends Controller $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'); - - // $join->on('s.id_usuario', '=', 'a.id_usuario') - // ->where(DB::raw('DATE(a.data_reg)'), $data_atual); - // }) - // ->select('s.*', DB::raw('COALESCE(COUNT(a.id), 0) AS qtde_atendimento')) - // ->where([ - // ['s.id_empresa', $id_empresa], - // ['fila', $fila->nome], - // ]) - // ->groupBy('s.id') - // ->get(); - $agentesNaFila = DB::table('supervisor as s') ->leftJoin('atendimento as a', function ($join) { $data_atual = date('Y-m-d h:i:s'); diff --git a/app/Http/Controllers/EmpresaController.php b/app/Http/Controllers/EmpresaController.php index 984ca89..269f7a5 100644 --- a/app/Http/Controllers/EmpresaController.php +++ b/app/Http/Controllers/EmpresaController.php @@ -27,8 +27,6 @@ class EmpresaController extends Controller return redirect()->back(); } - - $request->validate([ 'nome' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:'.Empresa::class], diff --git a/app/Http/Controllers/SupervisorController.php b/app/Http/Controllers/SupervisorController.php index 5dc3dfd..c0be1d9 100644 --- a/app/Http/Controllers/SupervisorController.php +++ b/app/Http/Controllers/SupervisorController.php @@ -2,161 +2,96 @@ namespace App\Http\Controllers; -use App\Models\Agentes; use App\Models\Filas; -use App\Models\numberChanel; -use App\Models\Setores; -use App\Models\Supervisor; +use App\Models\Pausas; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class SupervisorController extends Controller { - // - - public function index(Request $request) + public function desconectarAgente(Request $request) { + $request->validate([ + 'supervisor_id' => ['required'], + ]); - $user = auth()->user(); - - $id_empresa = $user->empresa->first()->id; - - $filas = Filas::where([ - ['is_ativa', true], - ['id_empresa', $id_empresa] - ])->get(); - - - $agentes = DB::table('usuarios as u') - ->join('usuario_empresa as ue', 'ue.id_usuario', '=', 'u.id') - ->select('u.*') - ->where('u.status', true) - ->get(); - - $numberChannels = numberChanel::where('id_empresa', $id_empresa)->get(); - - $supervisores = Supervisor::where('id_empresa', $id_empresa); - - + $deleted = DB::table("supervisor as s")->where("s.id", $request->supervisor_id)->delete(); - if ($request->pesquisa) { - $pesquisa = strtolower($request->pesquisa); - $supervisores->where(DB::raw('LOWER(supervisor.nome)'), 'like', "%$pesquisa%"); + if(!$deleted){ + return redirect()->back()->with('status', 'Erro ao desconectar agente'); } - $supervisores = $supervisores->get(); - - return view('admin.supervisor', compact('filas', 'agentes', 'supervisores', 'numberChannels')); + return redirect()->back()->with('status', 'Desconectado com sucesso'); } - - public function create(Request $request) + public function pausaAgente(Request $request) { - $request->validate([ - 'agente_id' => ['required'], - 'fila' => ['required'], - 'channel' => ['required'] + 'pausa' => ['string', 'required'], + 'supervisor_id' => ['required'], ]); - - if (empty($request->agente_id) || empty($request->fila) || empty($request->channel)) { - return redirect('supervisor'); - } - - - $agenteData = Agentes::find($request->agente_id); - - $user = auth()->user(); - - $id_empresa = $user->empresa->first()->id; - - - Supervisor::create([ - "id_usuario" => $request->agente_id, - "matricula" => $agenteData->matricula, - "nome" => $agenteData->nome, - "fila" => $request->fila, - "id_empresa" => $id_empresa, - "status" => "LIVRE", - "id_number_channel" => $request->channel + $pausa = Pausas::where("id", $request->pausa)->first(); + $updated = DB::table("supervisor as s")->where("s.id", $request->supervisor_id)->update([ + 'motivo_pausa' => strtoupper($pausa->motivo), + 'status' => "PAUSA", ]); - return redirect('supervisor'); - } - - public function destroy($id) - { - if (empty($id)) { - return redirect('supervisor'); + if(!$updated){ + return redirect()->back()->with('status', 'Erro ao pausar agente'); } - Supervisor::where('id', $id)->delete(); - - return redirect('supervisor')->with('status', 'deletado com sucesso'); + return redirect()->back()->with('status', 'Pausado com sucesso'); } - - - public function edit($id) + public function retirarPausaAgente(Request $request) { + $request->validate([ + 'supervisor_id' => ['required'], + ]); - if (empty($id)) { - return redirect('supervisor'); - } - - $filas = Filas::where('is_ativa', '=', true)->get(); - - $agentes = Agentes::where('status', '=', true)->get(); - - $numberChannels = numberChanel::all(); - - $userData = Supervisor::find($id); + $updated = DB::table("supervisor as s")->where("s.id", $request->supervisor_id)->update([ + 'motivo_pausa' => null, + 'status' => "LIVRE", + ]); + if(!$updated){ + return redirect()->back()->with('status', 'Erro ao retirar pausa do agente'); + } - return view('admin.editSupervisores', compact('userData', 'filas', 'agentes', 'numberChannels')); + return redirect()->back()->with('status', 'Pausa retirada com sucesso'); } - - - public function update(Request $request, $id) + public function pausarTodosAgentes(Request $request, $id) { - - - if (empty($id)) { - return redirect('supervisor'); + $fila = Filas::where("id", $id)->first(); + $pausa = Pausas::where("id", $request->pausa)->first(); + + $agentes = DB::table("supervisor as s") + ->where("s.fila", $fila->nome) + ->get(); + + DB::beginTransaction(); + + try { + foreach ($agentes as $agente) { + DB::table("supervisor as s") + ->where('s.id', $agente->id) + ->update([ + 'motivo_pausa' => strtoupper($pausa->motivo), + 'status' => "PAUSA", + ]); + } + + DB::commit(); + + return redirect()->back()->with('status', 'Todos os agentes foram colocados em pausa'); + } catch (\Throwable $th) { + DB::rollBack(); + dd($th->getMessage()); + return redirect('users')->with('status', 'Erro ao tentar pausar todos os agentes'); } - - - $request->validate([ - 'agente_id' => ['required'], - 'fila' => ['required'], - 'channel' => ['required'] - ]); - - if (empty($request->agente_id) || empty($request->fila) || empty($request->channel)) { - return redirect('supervisor'); - } - - - $agenteData = Agentes::find($request->agente_id); - - $user = auth()->user(); - - $id_empresa = $user->empresa->first()->id; - - Supervisor::where('id', $id) - ->update([ - "id_usuario" => $request->agente_id, - "matricula" => $agenteData->matricula, - "nome" => $agenteData->nome, - "fila" => $request->fila, - "id_empresa" => $id_empresa, - "id_number_channel" => $request->channel - ]); - - - return redirect('supervisor')->with('status', 'atualizado com sucesso'); } + } diff --git a/resources/views/admin/agentesLogados.blade.php b/resources/views/admin/agentesLogados.blade.php index d5cfbaf..9dfec3e 100644 --- a/resources/views/admin/agentesLogados.blade.php +++ b/resources/views/admin/agentesLogados.blade.php @@ -3,6 +3,11 @@
Voltar + @if(session('status')) +
+ {{session('status')}} +
+ @endif

Agentes na Fila - {{$fila->nome}}

@@ -46,7 +51,6 @@ @push('agentesLogados') @endpush + + \ No newline at end of file diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php index 2ba0c78..ed96ab6 100644 --- a/resources/views/admin/dashboard.blade.php +++ b/resources/views/admin/dashboard.blade.php @@ -124,7 +124,7 @@ ${relatorio.quantidade_atendimentos} 0 -
+
@@ -252,69 +252,6 @@ } }); } - // let labels1 = ['admin', 'admin', 'admin', 'admin', 'admin', 'admin'] - // let data1 = [18, 39, 19, 30, 12, 59, 100] - - // let labels2 = []; - // let data2 = []; - - - // grafico2.forEach(e => { - // if (eventos[e.evento]) { - // data2.push(e.qtde_usados); - // } - // }) - - // labels2 = grafico2.map((value) => { - // if (eventos[value.evento]) { - // return eventos[value.evento] - // } - // }) - - - // data2 = grafico2.map((value) => { - // if (eventos[value.evento]) { - // return value.qtde_usados - // } - // }) - - - // // let labels3 = grafico3.map((value) => value.nome) - - // // let data3 = grafico3.map((value) => value.qtde_fila) - - // // const ctx3 = document.getElementById('myChart3'); - - - - // new Chart(ctx3, { - // type: 'pie', - // data: { - // labels: labels3, - // datasets: [{ - // label: 'Quantidade de atendimento', - // data: data3, - // borderWidth: 1, - // backgroundColor: [ - // 'rgb(255, 99, 132)', - // 'rgb(54, 162, 235)', - // 'rgb(255, 205, 86)' - // ], - // fontColor: '#fff', - // }] - // }, - - // options: { - // color: '#91a0a7', - - // scales: { - // y: { - // beginAtZero: true - // } - // } - // } - // }); - async function graficos() { @@ -324,6 +261,12 @@ montaGrafico2(data.atendimentosStatusData); } + function selecionaFila(fila_id){ + const modal = document.querySelector(".modal"); + modal.style.display = "block"; + modal.querySelector("form").action = `/dashboard/agentes/${fila_id}/pausarAgentesFila`; + } + montarRelatorios(); graficos(); @@ -333,4 +276,7 @@ @endpush + + + \ No newline at end of file diff --git a/resources/views/components/modalPausarAgente.blade.php b/resources/views/components/modalPausarAgente.blade.php new file mode 100644 index 0000000..821f56c --- /dev/null +++ b/resources/views/components/modalPausarAgente.blade.php @@ -0,0 +1,50 @@ +@props(['pausas']) + + + + + + \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 80ae1ea..33a4147 100644 --- a/routes/web.php +++ b/routes/web.php @@ -9,7 +9,7 @@ use App\Http\Controllers\DashboardController; use App\Http\Controllers\EmpresaController; use App\Http\Controllers\RedirectController; use App\Http\Controllers\RedirectOptionController; -use App\Http\Controllers\RelatoriosController; +use App\Http\Controllers\SupervisorController; use App\Http\Controllers\SystemMessageController; use Illuminate\Support\Facades\Route; @@ -42,6 +42,10 @@ Route::middleware(['auth', 'verified'])->group(function () { Route::get('/dashboard/getRelatorioDados', [DashboardController::class, 'getRelatorioDados'])->name('dashboard.relatorios'); Route::get('/dashboard/agentes/{id}', [DashboardController::class, 'agentesLogados'])->name('dashboard.agentesLogados'); Route::get('/dashboard/agentes/{id}/fila', [DashboardController::class, 'relatoriosFilas'])->name('dashboard.agentesLogados.relatorios'); + Route::post('/dashboard/agentes/{id}/pausar', [SupervisorController::class, 'pausaAgente'])->name('agentesLogados.pausar'); + Route::post('/dashboard/agentes/{id}/retirarPausa', [SupervisorController::class, 'retirarPausaAgente'])->name('agentesLogados.pausar'); + Route::post('/dashboard/agentes/{id}/desconectar', [SupervisorController::class, 'desconectarAgente'])->name('agentesLogados.desconectar'); + Route::post('/dashboard/agentes/{id}/pausarAgentesFila', [SupervisorController::class, 'pausarTodosAgentes'])->name('agentesLogados.pausarTodosAgentes'); Route::get('/configs', [ConfigAtendimentoController::class, 'index'])->name('configs'); Route::post('/configs', [ConfigAtendimentoController::class, 'create'])->name('configs'); @@ -77,25 +81,6 @@ Route::middleware(['auth', 'verified'])->group(function () { }); - - - - - - - - - - - - - - - - - - - Route::middleware('auth')->group(function () { Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');