Browse Source

Resolvendo bug dashboard

master
guilherme guia 1 year ago
parent
commit
7a156e34e5
  1. 17
      Dockerfile
  2. 13
      app/Helpers/Helper.php
  3. 42
      app/Http/Controllers/DashboardController.php
  4. 2
      app/Http/Controllers/EmpresaController.php
  5. 183
      app/Http/Controllers/SupervisorController.php
  6. 46
      resources/views/admin/agentesLogados.blade.php
  7. 74
      resources/views/admin/dashboard.blade.php
  8. 50
      resources/views/components/modalPausarAgente.blade.php
  9. 25
      routes/web.php

17
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"]'

13
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);
}
}

42
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');

2
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],

183
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');
}
}

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

@ -3,6 +3,11 @@
<div class="header flex flex-col items-center gap-4">
<a href="{{route('dashboard')}}" style="margin-right: auto;" class="text-blue-500 hover:underline">Voltar</a>
@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
<h1 class="mb-5 text-gray-900 dark:text-gray-100 text-3xl font-bold text-center">
Agentes na Fila - {{$fila->nome}}
</h1>
@ -46,7 +51,6 @@
@push('agentesLogados')
<script>
const colorStatus = {
LIVRE: "green-500",
OCUPADO: "red-500",
@ -77,19 +81,29 @@
})
}
// const fila_id = getFilaId();
// getDadosRelatorioDB(fila_id);
async function montarRelatorios()
{
const id = getFilaId();
const data = await getDadosRelatorioDB(id);
let elementsTable = "";
data.forEach(supervisor => {
const tempoFormatado = supervisor.login.split(".")[0];
const btnPlay = `
<form method="POST" action="/dashboard/agentes/{{$fila->id}}/retirarPausa" title="Retirar Pausa?" class="bg-blue-600 text-white rounded flex-1 text-xl text-center py-2 px-3 cursor-pointer" >
@csrf
<input type="hidden" name="supervisor_id" value="${supervisor.id}">
<button >
<i class="fas fa-play-circle"></i>
</button>
</form>
`
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>
@ -104,10 +118,16 @@
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">${supervisor.qtde_atendimento}</td>
<td class="p-3 text-sm font-bold flex items-center gap-2 flex-wrap">
${agenteIsPausa}
<a class="bg-blue-600 text-white rounded flex-1 text-xl text-center py-2 px-3" href="supervisor/editar/$supervisor->id" title="Colocar em Pausa?"><i class="fas fa-pause"></i></a>
<a class="bg-red-600 text-white flex-1 rounded text-xl text-center py-2 px-3" href="supervisor/editar/$supervisor->id" title="Desconectar Agente?"><i class="fas fa-power-off"></i></a>
<form method="POST" action="/dashboard/agentes/{{$fila->id}}/desconectar" title="Desconectar Pausa?" class="bg-red-600 text-white flex-1 rounded text-xl text-center py-2 px-3" >
@csrf
<input type="hidden" name="supervisor_id" value="${supervisor.id}">
<button >
<i class="fas fa-power-off"></i>
</button>
</form>
</td>
</tr>
`
@ -116,7 +136,15 @@
$(".table-relatorio").html(elementsTable);
}
function selecionaAgente(supervisor_id){
console.log(supervisor_id);
const modal = document.querySelector(".modal");
modal.style.display = "block";
modal.querySelector("form").action = `/dashboard/agentes/{{$fila->nome}}/pausar`;
modal.querySelector("input[name='supervisor_id']").value = supervisor_id;
}
montarRelatorios();
setInterval(() => {
@ -125,4 +153,6 @@
</script>
@endpush
<x-modalPausarAgente :pausas="$pausas"></x-modalPausarAgente>
</x-app-layout>

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

@ -124,7 +124,7 @@
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">${relatorio.quantidade_atendimentos}</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100 text-left">0</td>
<td class="p-3 text-sm text-gray-700 dark:text-gray-100">
<div title="Colocar fila em Pausa" class="dark:bg-white bg-gray-800 hover:bg-gray-100 hover:dark:bg-gray-500 rounded-full w-6 h-6 flex items-center justify-center cursor-pointer" onclick="getDadosRelatorioDB()">
<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 dark:text-gray-900 text-gray-100 text-xs"></i></button>
</div>
</td>
@ -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 @@
</script>
@endpush
<x-modalPausarAgente :pausas="$pausas"></x-modalPausarAgente>
</x-app-layout>

50
resources/views/components/modalPausarAgente.blade.php

@ -0,0 +1,50 @@
@props(['pausas'])
<!-- 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="" 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 ">
Pausar agente
</h3>
<button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-xl ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" onclick="fecharModal()">
<i class="fas fa-times"></i>
</button>
</div>
<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">Selecione a Pausa: </label>
<select
class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100"
name="pausa">
@foreach ($pausas as $pausa)
<option value="{{ $pausa->id }}">{{ $pausa->motivo }}</option>
@endforeach
</select>
</div>
<input type="hidden" name="supervisor_id">
</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">Pausar</button>
</div>
</form>
</div>
</div>
<script>
function fecharModal(supervisor_id){
const modal = document.querySelector(".modal");
modal.style.display = "none";
}
</script>

25
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');

Loading…
Cancel
Save