Browse Source

Incluindo filtros de data nos graficos do painel

Felipe
Felipe Fontana 10 months ago
parent
commit
def5cfbcd4
  1. 45
      app/Http/Controllers/Admin/GraficosController.php
  2. 35
      public/js/views/graficos/index.js
  3. 22
      resources/views/admin/graficos/graficos.blade.php

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

@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Gate;
use Illuminate\Http\Request;
class GraficosController extends Controller class GraficosController extends Controller
{ {
@ -18,14 +19,14 @@ class GraficosController extends Controller
return view("admin.graficos.graficos"); return view("admin.graficos.graficos");
} }
public function show() public function show(Request $request)
{ {
$data = $this->getRelatorioDados(); $data = $this->getRelatorioDados($request->dataInicio, $request->dataFim);
return response()->json(['status' => true, 'data' => $data]); return response()->json(['status' => true, 'data' => $data]);
} }
private function getRelatorioDados() private function getRelatorioDados($dataInicio, $dataFim)
{ {
$user = auth()->user(); $user = auth()->user();
$id_empresa = $user->empresa->first()->id; $id_empresa = $user->empresa->first()->id;
@ -33,7 +34,17 @@ class GraficosController extends Controller
$atendimentosData = DB::table('usuarios as u') $atendimentosData = DB::table('usuarios as u')
->leftJoin('atendimento as a', 'u.id', '=', 'a.id_usuario') ->leftJoin('atendimento as a', 'u.id', '=', 'a.id_usuario')
->select('u.nome', DB::raw('count(a.id_usuario) as qtde_atendimento')) ->select('u.nome', DB::raw('count(a.id_usuario) as qtde_atendimento'))
->where('a.id_empresa', $id_empresa) ->where('a.id_empresa', $id_empresa);
if ($dataInicio && $dataFim) {
$atendimentosData->whereBetween(DB::raw('a.data_reg::DATE'), [$dataInicio, $dataFim]);
} elseif ($dataInicio) {
$atendimentosData->where(DB::raw('a.data_reg::DATE'), '>=', $dataInicio);
} elseif ($dataFim) {
$atendimentosData->where(DB::raw('a.data_reg::DATE'), '<=', $dataFim);
}
$atendimentosData = $atendimentosData
->groupBy('u.nome') ->groupBy('u.nome')
->get(); ->get();
@ -44,14 +55,34 @@ class GraficosController extends Controller
->where([ ->where([
['ue.id_empresa', '=', $id_empresa], ['ue.id_empresa', '=', $id_empresa],
['ea.evento', '<>', config('event.CONF_EVENT_ESPERA')], ['ea.evento', '<>', config('event.CONF_EVENT_ESPERA')],
]) ]);
if ($dataInicio && $dataFim) {
$atendimentosStatusData->whereBetween(DB::raw('ea.data_reg::DATE'), [$dataInicio, $dataFim]);
} elseif ($dataInicio) {
$atendimentosStatusData->where(DB::raw('ea.data_reg::DATE'), '>=', $dataInicio);
} elseif ($dataFim) {
$atendimentosStatusData->where(DB::raw('ea.data_reg::DATE'), '<=', $dataFim);
}
$atendimentosStatusData = $atendimentosStatusData
->groupBy('ea.evento') ->groupBy('ea.evento')
->get(); ->get();
$filasMaisUsadas = DB::table('queues as q') $filasMaisUsadas = DB::table('queues as q')
->join('eventos_atendimento as ea', 'ea.id_queue', '=', 'q.id') ->join('eventos_atendimento as ea', 'ea.id_queue', '=', 'q.id')
->select('q.nome', DB::raw('count(ea.id_queue) as qtde_fila')) ->select('q.nome', DB::raw('count(ea.id_queue) as qtde_fila'))
->where('q.id_empresa', $id_empresa) ->where('q.id_empresa', $id_empresa);
if ($dataInicio && $dataFim) {
$filasMaisUsadas->whereBetween(DB::raw('ea.data_reg::DATE'), [$dataInicio, $dataFim]);
} elseif ($dataInicio) {
$filasMaisUsadas->where(DB::raw('ea.data_reg::DATE'), '>=', $dataInicio);
} elseif ($dataFim) {
$filasMaisUsadas->where(DB::raw('ea.data_reg::DATE'), '<=', $dataFim);
}
$filasMaisUsadas = $filasMaisUsadas
->groupBy('q.nome') ->groupBy('q.nome')
->get(); ->get();
@ -65,4 +96,6 @@ class GraficosController extends Controller
} }
} }

35
public/js/views/graficos/index.js

@ -13,12 +13,16 @@ const eventos = {
} }
function getDadosRelatorioDB() { function getDadosRelatorioDB(dataInicio, dataFim) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
$.ajax({ $.ajax({
type: "get", type: "get",
dataType: 'json', dataType: 'json',
url: `graficos/getDados`, url: `graficos/getDados`,
data: {
dataInicio: dataInicio,
dataFim: dataFim
},
success: function(response) { success: function(response) {
const data = response.data; const data = response.data;
resolve(data); resolve(data);
@ -28,12 +32,16 @@ function getDadosRelatorioDB() {
} }
function montaGrafico1(dataDB) { function montaGrafico1(dataDB) {
let labels = dataDB.map((value) => value.nome) let labels = dataDB.map((value) => value.nome)
let data = dataDB.map((value) => value.qtde_atendimento) let data = dataDB.map((value) => value.qtde_atendimento)
const ctx = document.getElementById('myChart'); const ctx = document.getElementById('myChart');
new Chart(ctx, { let chartStatus = Chart.getChart("myChart");
if (chartStatus != undefined) {
chartStatus.destroy();
}
var myChart = new Chart(ctx, {
type: 'bar', type: 'bar',
data: { data: {
labels: labels, labels: labels,
@ -102,7 +110,13 @@ function montaGrafico2(dataDB) {
}); });
let labels = Object.keys(somaPorEvento).map(label => eventos[label]); let labels = Object.keys(somaPorEvento).map(label => eventos[label]);
let data = Object.values(somaPorEvento); let data = Object.values(somaPorEvento);
new Chart(ctx2, {
let chartStatus = Chart.getChart("myChart2");
if (chartStatus != undefined) {
chartStatus.destroy();
}
var myChart2 = new Chart(ctx2, {
type: 'doughnut', type: 'doughnut',
data: { data: {
labels: labels, labels: labels,
@ -146,7 +160,13 @@ function montaGrafico3(dataDB) {
const ctx3 = document.getElementById('myChart3'); const ctx3 = document.getElementById('myChart3');
let labels3 = dataDB.map((value) => value.nome) let labels3 = dataDB.map((value) => value.nome)
let data3 = dataDB.map((value) => value.qtde_fila) let data3 = dataDB.map((value) => value.qtde_fila)
new Chart(ctx3, {
let chartStatus = Chart.getChart("myChart3");
if (chartStatus != undefined) {
chartStatus.destroy();
}
var myChart3= new Chart(ctx3, {
type: 'pie', type: 'pie',
data: { data: {
labels: labels3, labels: labels3,
@ -174,7 +194,10 @@ function montaGrafico3(dataDB) {
} }
async function graficos() { async function graficos() {
const data = await getDadosRelatorioDB(); document.getElementById('graficos').hidden = false;
var dataInicio = document.getElementById('dataInicio').value;
var dataFim = document.getElementById('dataFim').value;
const data = await getDadosRelatorioDB(dataInicio, dataFim);
montaGrafico1(data.atendimentosData); montaGrafico1(data.atendimentosData);
montaGrafico2(data.atendimentosStatusData); montaGrafico2(data.atendimentosStatusData);
montaGrafico3(data.filasMaisUsadas); montaGrafico3(data.filasMaisUsadas);

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

@ -1,12 +1,28 @@
@props(['atendimentosData'])
<x-app-layout> <x-app-layout>
<div class="py-12 sm:px-6 lg:px-8" :class="{'mx-auto': open, 'w-full': !open}"> <div class="py-12 sm:px-6 lg:px-8" :class="{'mx-auto': open, 'w-full': !open}">
<div class="header flex flex-col gap-4"> <div class="header flex flex-col gap-4">
<h1 class="text-gray-900 dark:text-gray-100 text-3xl font-bold"> <h1 class="text-gray-900 dark:text-gray-100 text-3xl font-bold">
Gráficos Gráficos
</h1> </h1>
<div class="flex gap-4">
<div class="fixed-1 flex flex-col gap-1">
<label>Data Inicio: </label>
<input type="date" class="w-20 rounded-md p-2 text-sm dark:bg-gray-800 placeholder-text-gray-800 dark:placeholder-text-gray-100 dark:text-gray-100" name="dataInicio" id="dataInicio" value="{{ $selected->dataInicio ?? '' }}" placeholder="Data de Início">
</div>
<div class="fixed-1 flex flex-col gap-1">
<label>Data Fim: </label>
<input type="date" class="w-20 rounded-md p-2 text-sm dark:bg-gray-800 placeholder-text-gray-800 dark:placeholder-text-gray-100 dark:text-gray-100" name="dataFim" id="dataFim" value="{{ $selected->dataFim ?? '' }}" placeholder="Data de Fim">
</div>
<div class="flex-1 flex flex-col gap-1" style="background-color: transparent; margin-top: 25px;">
<button onclick="graficos()" class="lg:ml-auto ml-0 bg-blue-900 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg overflow-hidden">Gerar Gráficos</button>
</div>
</div>
</div> </div>
<div> <div id="graficos" hidden>
<div class=" flex flex-col"> <div class=" flex flex-col">
<div class="mt-8 flex gap-5 flex-col md:flex-row justify-between"> <div class="mt-8 flex gap-5 flex-col md:flex-row justify-between">
<div class="dark:bg-gray-800 px-10 py-4 bg-gray-50 rounded shadow-md flex-1"> <div class="dark:bg-gray-800 px-10 py-4 bg-gray-50 rounded shadow-md flex-1">
@ -28,8 +44,4 @@
</div> </div>
<script src="{{ asset('js/views/graficos/index.js') }}"></script> <script src="{{ asset('js/views/graficos/index.js') }}"></script>
<script>
graficos();
</script>
</x-app-layout> </x-app-layout>
Loading…
Cancel
Save