Skip to content

Commit 7a9d6c0

Browse files
authoredSep 13, 2023
Merge pull request #352 from uspdev/issue_161
Issue 161 - relatório por fila
2 parents 02ed031 + 04fc24c commit 7a9d6c0

File tree

9 files changed

+890
-455
lines changed

9 files changed

+890
-455
lines changed
 

‎app/Http/Controllers/FilaController.php

+51-1
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
namespace App\Http\Controllers;
44

55
use App\Http\Requests\FilaRequest;
6+
use App\Models\Chamado;
67
use App\Models\Fila;
78
use App\Models\Setor;
89
use App\Models\User;
910
use Illuminate\Http\Request;
11+
use Spatie\SimpleExcel\SimpleExcelWriter;
1012

1113
class FilaController extends Controller
1214
{
@@ -104,7 +106,7 @@ public function update(Request $request, Fila $fila)
104106
if ($request->card == 'config') {
105107
$settings = $request->settings;
106108
$fila->settings()->set('instrucoes', $settings['instrucoes']);
107-
109+
108110
$config = $request->config;
109111
$fila->config = array_merge(json_decode(json_encode($fila->config), true), $config);
110112
}
@@ -259,4 +261,52 @@ public function storeTemplate(Request $request, Fila $fila)
259261
$request->session()->flash('alert-info', 'Template salvo com sucesso');
260262
return back();
261263
}
264+
265+
/**
266+
* Baixa os chamados especificados
267+
*
268+
* @param $request->ano
269+
* @param $fila
270+
* @return Stream
271+
*/
272+
public function download(Request $request, Fila $fila)
273+
{
274+
$this->authorize('filas.view', $fila);
275+
$request->validate([
276+
'ano' => 'required|between:1970,2050',
277+
]);
278+
$ano = $request->ano;
279+
280+
$chamados = Chamado::listarChamadosPorFila($fila, $ano);
281+
282+
// vamos pegar o template da fila para saber quais são os campos extras
283+
$template = array_keys(json_decode($fila->template, true));
284+
285+
$arr = [];
286+
foreach ($chamados as $chamado) {
287+
$i = [];
288+
$i['nro'] = $chamado->nro . '/' . $ano;
289+
$i['status'] = $chamado->status;
290+
$i['assunto'] = $chamado->assunto;
291+
$i['descricao'] = str_replace('<br />', '', $chamado->descricao);
292+
293+
$autor = $chamado->users()->wherePivot('papel', 'Autor')->first();
294+
$i['autor'] = $autor ? $autor->name : '';
295+
296+
$i['extras'] = $chamado->extras;
297+
$extras = json_decode($chamado->extras, true) ?? [];
298+
foreach ($template as $field) {
299+
$i['extra_' . $field] = isset($extras[$field]) ? $extras[$field] : '';
300+
}
301+
302+
$i['criado_em'] = $chamado->created_at->format('d/m/Y');
303+
$i['fechado_em'] = $chamado->fechado_em ? $chamado->fechado_em->format('d/m/Y') : '';
304+
$i['atualizado_em'] = $chamado->atualizadoEm ? $chamado->atualizadoEm->format('d/m/Y') : '';
305+
306+
$arr[] = $i;
307+
}
308+
309+
$writer = SimpleExcelWriter::streamDownload('chamados_' . $ano . '_fila' . $fila->id . '.xlsx')
310+
->addRows($arr);
311+
}
262312
}

‎app/Models/Chamado.php

+57-3
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@ class Chamado extends Model
2727

2828
/**
2929
* The attributes that should be mutated to dates.
30-
* https://laravel.com/docs/5.6/eloquent-mutators#date-mutators
30+
* https://laravel.com/docs/8.x/eloquent-mutators#date-casting
3131
*
3232
* @var array
3333
*/
34-
protected $dates = [
35-
'fechado_em',
34+
protected $casts = [
35+
'created_at' => 'date:d/m/Y',
36+
'updated_at' => 'date:d/m/Y',
37+
'fechado_em' => 'date:d/m/Y',
38+
'atualizadoEm' => 'date:d/m/Y',
3639
];
3740

3841
/**
@@ -91,6 +94,51 @@ public static function anos()
9194
return range(date('Y'), 2020, -1);
9295
}
9396

97+
/**
98+
* Retorna a contagem de chamados por ano
99+
*
100+
* Se passar $fila a contagem é somente da fila, se não é de todo o sistema
101+
*
102+
* @param \App\Models\Fila $fila
103+
* @return Int
104+
*/
105+
public static function contarChamadosPorAno($fila = null)
106+
{
107+
$contagem = Chamado::selectRaw('year(created_at) ano, count(*) count')
108+
->where('fila_id', $fila->id)
109+
->whereYear('created_at', '>=', date('Y') - 5) // ultimos 5 anos
110+
->groupBy('ano')->get();
111+
return $contagem;
112+
}
113+
114+
/**
115+
* Retorna a contagem de chamados por mês de determinado ano
116+
*
117+
* Se passar $fila a contagem é somente da fila, se não é de todo o sistema
118+
*
119+
* Retorno em array sendo o 1o elemento correspondente à contagem de janeiro,
120+
* o segundo elemento é a contagem de fevereiro, e assim por diante.
121+
* o array de retorno, portanto, possui 12 elementos
122+
*
123+
* @param Int $ano
124+
* @param \App\Models\Fila $fila
125+
* @return Array
126+
*/
127+
public static function contarChamadosPorMes($ano, $fila = null)
128+
{
129+
$contagem = Chamado::selectRaw('month(created_at) mes, count(*) count')
130+
->where('fila_id', $fila->id)
131+
->whereYear('created_at', $ano)
132+
->groupBy('mes')->get();
133+
134+
// vamos organizar em array por mês para facilitar a apresentação
135+
$ret = [];
136+
for ($i = 0; $i < 12; $i++) {
137+
$ret[] = $contagem->where('mes', $i + 1)->first()->count ?? '';
138+
}
139+
return $ret;
140+
}
141+
94142
/**
95143
* Valores possiveis para pivot do relacionamento com users
96144
*/
@@ -244,6 +292,12 @@ public static function listarChamados($ano, $nro = null, $assunto = null, $final
244292
return $chamados;
245293
}
246294

295+
public static function listarChamadosPorFila($fila, $ano)
296+
{
297+
$chamados = Chamado::where('fila_id', $fila->id)->whereYear('created_at', $ano)->get();
298+
return $chamados;
299+
}
300+
247301
/**
248302
* A numeração do chamado é sequencial por ano.
249303
* Para isso temos esse método que pega o próximo número disponível

‎app/Models/Fila.php

+17-6
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
namespace App\Models;
44

5-
use Illuminate\Support\Facades\Gate;
6-
use Illuminate\Database\Eloquent\Model;
75
use Illuminate\Database\Eloquent\Factories\HasFactory;
6+
use Illuminate\Database\Eloquent\Model;
7+
use Illuminate\Support\Facades\Gate;
88

99
class Fila extends Model
1010
{
@@ -315,8 +315,8 @@ public static function listarFilasParaNovoChamado()
315315
}
316316

317317
# liberando pessoas específicas listadas na fila
318-
$customCodpes = explode(PHP_EOL,$fila->settings()->get('visibilidade.customCodpes'));
319-
if(in_array(\Auth::user()->codpes, $customCodpes)) {
318+
$customCodpes = explode(PHP_EOL, $fila->settings()->get('visibilidade.customCodpes'));
319+
if (in_array(\Auth::user()->codpes, $customCodpes)) {
320320
return true;
321321
}
322322

@@ -333,16 +333,27 @@ public static function listarFilasParaNovoChamado()
333333
*
334334
* @return Int
335335
*/
336-
public function contarCustomCodpes() {
336+
public function contarCustomCodpes()
337+
{
337338
$customCodpes = $this->settings()->get('visibilidade.customCodpes');
338339
if (empty($customCodpes)) {
339340
return 0;
340341
} else {
341-
$customCodpes = explode(PHP_EOL,$customCodpes);
342+
$customCodpes = explode(PHP_EOL, $customCodpes);
342343
return count($customCodpes);
343344
}
344345
}
345346

347+
public function contarChamadosPorAno()
348+
{
349+
return Chamado::contarChamadosPorAno($this);
350+
}
351+
352+
public function contarChamadosPorMes($ano)
353+
{
354+
return Chamado::contarChamadosPorMes($ano, $this);
355+
}
356+
346357
/**
347358
* Relacionamento: fila pertence a setor
348359
*/

‎composer.json

+5-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
],
99
"license": "MIT",
1010
"require": {
11-
"php": "^7.3",
11+
"php": "^7.3|^8.1",
1212
"fideloper/proxy": "^4.2",
1313
"fruitcake/laravel-cors": "^1.0",
1414
"glorand/laravel-model-settings": "^4.2",
@@ -20,12 +20,12 @@
2020
"laravel/ui": "^3.0",
2121
"laravelcollective/html": "^6.2",
2222
"masakik/supervisor": "dev-master",
23+
"spatie/simple-excel": "^1.13",
2324
"uspdev/laravel-replicado": "^1.0",
24-
"uspdev/laravel-tools": "^1.2",
25-
"uspdev/laravel-usp-theme": "^2.0",
25+
"uspdev/laravel-tools": "^1.3",
26+
"uspdev/laravel-usp-theme": "^2.8",
2627
"uspdev/laravel-usp-validators": "^1.0",
27-
"uspdev/replicado": "^1.5",
28-
"uspdev/senhaunica-socialite": "^4.0"
28+
"uspdev/senhaunica-socialite": "^4.3"
2929
},
3030
"require-dev": {
3131
"facade/ignition": "^2.3.6",

‎composer.lock

+703-437
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
@section('styles')
2+
@parent
3+
<style>
4+
#card-fila-relatorios {
5+
border: 1px solid blue;
6+
border-top: 3px solid blue;
7+
}
8+
</style>
9+
@endsection
10+
11+
<div class="card mb-3" id="card-fila-relatorios">
12+
<div class="card-header">
13+
<i class="fas fa-chart-line"></i> Relatórios
14+
</div>
15+
<div class="card-body">
16+
<ul class="list-unstyled">
17+
<li>Contagem (últimos 5 anos)
18+
@include('filas.partials.chamados-por-ano')
19+
</li>
20+
</ul>
21+
</div>
22+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<table class="table table-bordered table-sm text-center">
2+
<tr>
3+
<th>Ano</th>
4+
<th>Tot.</th>
5+
<th>jan</th>
6+
<th>fev</th>
7+
<th>mar</th>
8+
<th>abr</th>
9+
<th>mai</th>
10+
<th>jun</th>
11+
<th>jul</th>
12+
<th>ago</th>
13+
<th>set</th>
14+
<th>out</th>
15+
<th>nov</th>
16+
<th>dez</th>
17+
</tr>
18+
@foreach ($fila->contarChamadosPorAno() as $anual)
19+
<tr>
20+
<th>{{ $anual->ano }}</th>
21+
<th>
22+
{{ $anual->count }}
23+
<a href="{{ route('filas.download', $fila) }}?ano={{ $anual->ano }}" title="Fazer download dos chamados"><i class="fas fa-download"></i></a>
24+
</th>
25+
@foreach ($fila->contarChamadosPorMes($anual->ano) as $mes)
26+
<td>{{ $mes }}</td>
27+
@endforeach
28+
</tr>
29+
@endforeach
30+
</table>

‎resources/views/filas/show.blade.php

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
</div>
3939
<div class="col-md-5">
4040
@include('filas.partials.pessoas-card') {{-- Secundário --}}
41+
@include('filas.partials.card-relatorio') {{-- Secundário --}}
4142
@include('filas.partials.visibilidade-card') {{-- Secundário --}}
4243
</div>
4344
</div>

‎routes/web.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
Route::get('ajuda/manual_atendente', [IndexController::class, 'manual_atendente']);
1919

2020
/* Senha única */
21-
Route::get('login', [LoginController::class, 'redirectToProvider'])->name('login');
22-
Route::get('callback', [LoginController::class, 'handleProviderCallback']);
23-
Route::post('logout', [LoginController::class, 'logout'])->name('logout');
21+
// Route::get('login', [LoginController::class, 'redirectToProvider'])->name('login');
22+
// Route::get('callback', [LoginController::class, 'handleProviderCallback']);
23+
// Route::post('logout', [LoginController::class, 'logout'])->name('logout');
2424

2525
// SETORES
2626
Route::post('setores/{setor}/pessoas', [SetorController::class, 'storePessoa']);
@@ -35,6 +35,7 @@
3535
Route::post('filas/{fila}/template_json', [FilaController::class, 'storeTemplateJson']);
3636
Route::get('filas/{fila}/template', [FilaController::class, 'createTemplate'])->name('filas.createtemplate');
3737
Route::post('filas/{fila}/template', [FilaController::class, 'storeTemplate'])->name('filas.storetemplate');
38+
Route::get('filas/{fila}/download', [FilaController::class, 'download'])->name('filas.download');
3839

3940
// USERS
4041
Route::get('search/partenome', [UserController::class, 'partenome']);

0 commit comments

Comments
 (0)
Please sign in to comment.