Skip to content

Commit ce72c09

Browse files
authored
Merge pull request #74 from EstebanSM85/Arreglo-graficas
Cambios propuestos
2 parents 4f1f1b6 + df2d32f commit ce72c09

3 files changed

Lines changed: 117 additions & 60 deletions

File tree

Controller/ReportServicioAT.php

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
namespace FacturaScripts\Plugins\Servicios\Controller;
2121

2222
use DateTime;
23-
use FacturaScripts\Core\Base\Controller;
23+
use FacturaScripts\Core\Template\Controller;
2424

2525
/**
2626
* Informe de servicios: abiertos totales, del último mes, del último año y desglose por estado.
@@ -62,6 +62,9 @@ class ReportServicioAT extends Controller
6262
/** @var int */
6363
public $totalServices;
6464

65+
/** @var float */
66+
public $totalNeto = 0.0;
67+
6568
public function getPageData(): array
6669
{
6770
$data = parent::getPageData();
@@ -71,9 +74,9 @@ public function getPageData(): array
7174
return $data;
7275
}
7376

74-
public function privateCore(&$response, $user, $permissions)
77+
public function run(): void
7578
{
76-
parent::privateCore($response, $user, $permissions);
79+
parent::run();
7780

7881
$this->loadTotalServices();
7982
$this->loadOpenServices();
@@ -86,13 +89,16 @@ public function privateCore(&$response, $user, $permissions)
8689
$this->loadServicesByAgent();
8790
$this->loadServicesByAssigned();
8891
$this->loadServicesByClient();
92+
93+
$this->view('ReportServicioAT.html.twig');
8994
}
9095

9196
protected function loadTotalServices(): void
9297
{
93-
$sql = 'SELECT COUNT(*) as total FROM serviciosat';
94-
$result = $this->dataBase->select($sql);
98+
$sql = 'SELECT COUNT(*) as total, COALESCE(SUM(neto), 0) as neto FROM serviciosat';
99+
$result = $this->db()->select($sql);
95100
$this->totalServices = (int)($result[0]['total'] ?? 0);
101+
$this->totalNeto = (float)($result[0]['neto'] ?? 0.0);
96102
}
97103

98104
protected function loadServicesByNick(): void
@@ -101,7 +107,7 @@ protected function loadServicesByNick(): void
101107
. ' FROM serviciosat'
102108
. ' GROUP BY nick'
103109
. ' ORDER BY total DESC';
104-
$this->servicesByNick = $this->dataBase->select($sql);
110+
$this->servicesByNick = $this->db()->select($sql);
105111
}
106112

107113
protected function loadServicesByAgent(): void
@@ -111,7 +117,7 @@ protected function loadServicesByAgent(): void
111117
. ' LEFT JOIN agentes a ON a.codagente = s.codagente'
112118
. ' GROUP BY s.codagente, a.nombre'
113119
. ' ORDER BY total DESC';
114-
$this->servicesByAgent = $this->dataBase->select($sql);
120+
$this->servicesByAgent = $this->db()->select($sql);
115121
}
116122

117123
protected function loadServicesByAssigned(): void
@@ -120,7 +126,7 @@ protected function loadServicesByAssigned(): void
120126
. ' FROM serviciosat'
121127
. ' GROUP BY asignado'
122128
. ' ORDER BY total DESC';
123-
$this->servicesByAssigned = $this->dataBase->select($sql);
129+
$this->servicesByAssigned = $this->db()->select($sql);
124130
}
125131

126132
protected function loadServicesByClient(): void
@@ -130,30 +136,30 @@ protected function loadServicesByClient(): void
130136
. ' LEFT JOIN clientes c ON c.codcliente = s.codcliente'
131137
. ' GROUP BY s.codcliente, c.nombre'
132138
. ' ORDER BY total DESC';
133-
$this->servicesByClient = $this->dataBase->select($sql);
139+
$this->servicesByClient = $this->db()->select($sql);
134140
}
135141

136142
protected function loadOpenServices(): void
137143
{
138144
$sql = 'SELECT COUNT(*) as total FROM serviciosat'
139-
. ' WHERE editable = ' . $this->dataBase->var2str(true);
140-
$result = $this->dataBase->select($sql);
145+
. ' WHERE editable = ' . $this->db()->var2str(true);
146+
$result = $this->db()->select($sql);
141147
$this->openServices = (int)($result[0]['total'] ?? 0);
142148
}
143149

144150
protected function loadOpenServicesLastMonth(): void
145151
{
146152
$since = date('Y-m-d', strtotime('-1 month'));
147153
$sql = "SELECT COUNT(*) as total FROM serviciosat WHERE fecha >= '" . $since . "'";
148-
$result = $this->dataBase->select($sql);
154+
$result = $this->db()->select($sql);
149155
$this->openServicesLastMonth = (int)($result[0]['total'] ?? 0);
150156
}
151157

152158
protected function loadOpenServicesLastYear(): void
153159
{
154160
$since = date('Y-m-d', strtotime('-1 year'));
155161
$sql = "SELECT COUNT(*) as total FROM serviciosat WHERE fecha >= '" . $since . "'";
156-
$result = $this->dataBase->select($sql);
162+
$result = $this->db()->select($sql);
157163
$this->openServicesLastYear = (int)($result[0]['total'] ?? 0);
158164
}
159165

@@ -173,7 +179,7 @@ protected function loadServicesByMonth(): void
173179
. " WHERE fecha >= '" . $since . "'"
174180
. " GROUP BY DATE_FORMAT(fecha, '%Y-%m')"
175181
. ' ORDER BY periodo ASC';
176-
foreach ($this->dataBase->select($sql) as $row) {
182+
foreach ($this->db()->select($sql) as $row) {
177183
if (isset($this->servicesByMonth[$row['periodo']])) {
178184
$this->servicesByMonth[$row['periodo']] = (int)$row['total'];
179185
}
@@ -186,18 +192,19 @@ protected function loadServicesByYear(): void
186192
. ' FROM serviciosat'
187193
. ' GROUP BY YEAR(fecha)'
188194
. ' ORDER BY periodo ASC';
189-
foreach ($this->dataBase->select($sql) as $row) {
195+
foreach ($this->db()->select($sql) as $row) {
190196
$this->servicesByYear[(string)$row['periodo']] = (int)$row['total'];
191197
}
192198
}
193199

194200
protected function loadServicesByStatus(): void
195201
{
196-
$sql = 'SELECT e.id, e.nombre, e.color, e.editable, COUNT(s.idservicio) as total'
202+
$sql = 'SELECT e.id, e.nombre, e.color, e.editable, COUNT(s.idservicio) as total,'
203+
. ' COALESCE(SUM(s.neto), 0) as neto'
197204
. ' FROM serviciosat_estados e'
198205
. ' LEFT JOIN serviciosat s ON s.idestado = e.id'
199206
. ' GROUP BY e.id, e.nombre, e.color, e.editable'
200207
. ' ORDER BY total DESC';
201-
$this->servicesByStatus = $this->dataBase->select($sql);
208+
$this->servicesByStatus = $this->db()->select($sql);
202209
}
203210
}

Translation/es_ES.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
"services-by-status": "Por estado",
7171
"services-by-year": "Servicios por año",
7272
"ticket-footer-text": "Texto del pie del ticket",
73+
"total-net": "Neto total",
7374
"total-services": "Total de servicios",
7475
"verifications": "Verificaciones"
7576
}

View/ReportServicioAT.html.twig

Lines changed: 92 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,24 @@
3838
</div>
3939
</div>
4040

41+
<div class="col-xl-3 col-md-6 mb-4">
42+
<div class="card border-left-dark shadow h-100 py-2">
43+
<div class="card-body">
44+
<div class="row no-gutters align-items-center">
45+
<div class="col mr-2">
46+
<div class="text-xs font-weight-bold text-dark text-uppercase mb-1">
47+
{{ trans('total-net') }}
48+
</div>
49+
<div class="h4 mb-0 font-weight-bold text-gray-800">{{ money(fsc.totalNeto) }}</div>
50+
</div>
51+
<div class="col-auto">
52+
<i class="fa-solid fa-coins fa-2x text-gray-300"></i>
53+
</div>
54+
</div>
55+
</div>
56+
</div>
57+
</div>
58+
4159
<div class="col-xl-3 col-md-6 mb-4">
4260
<div class="card border-left-primary shadow h-100 py-2">
4361
<div class="card-body">
@@ -104,7 +122,9 @@
104122
</h6>
105123
</div>
106124
<div class="card-body">
107-
<div id="chartByMonth"></div>
125+
<div style="position:relative;height:300px;">
126+
<canvas id="chartByMonth"></canvas>
127+
</div>
108128
</div>
109129
</div>
110130
</div>
@@ -117,7 +137,9 @@
117137
</h6>
118138
</div>
119139
<div class="card-body">
120-
<div id="chartByYear"></div>
140+
<div style="position:relative;height:300px;">
141+
<canvas id="chartByYear"></canvas>
142+
</div>
121143
</div>
122144
</div>
123145
</div>
@@ -140,6 +162,7 @@
140162
<tr>
141163
<th>{{ trans('status') }}</th>
142164
<th class="text-end">{{ trans('quantity') }}</th>
165+
<th class="text-end">{{ trans('net') }}</th>
143166
</tr>
144167
</thead>
145168
<tbody>
@@ -158,10 +181,11 @@
158181
</a>
159182
</td>
160183
<td class="text-end fw-bold">{{ row.total }}</td>
184+
<td class="text-end">{{ money(row.neto) }}</td>
161185
</tr>
162186
{% else %}
163187
<tr>
164-
<td colspan="2" class="text-center text-muted py-3">
188+
<td colspan="3" class="text-center text-muted py-3">
165189
{{ trans('no-data') }}
166190
</td>
167191
</tr>
@@ -186,7 +210,7 @@
186210
</div>
187211
<div class="card-body p-0">
188212
<div class="p-3 pb-0">
189-
<div id="chartByNick"></div>
213+
<canvas id="chartByNick" height="240"></canvas>
190214
</div>
191215
<div class="text-end px-3 py-1 border-top">
192216
<a class="small text-muted text-decoration-none" data-bs-toggle="collapse"
@@ -238,7 +262,7 @@
238262
</div>
239263
<div class="card-body p-0">
240264
<div class="p-3 pb-0">
241-
<div id="chartByAgent"></div>
265+
<canvas id="chartByAgent" height="240"></canvas>
242266
</div>
243267
<div class="text-end px-3 py-1 border-top">
244268
<a class="small text-muted text-decoration-none" data-bs-toggle="collapse"
@@ -290,7 +314,7 @@
290314
</div>
291315
<div class="card-body p-0">
292316
<div class="p-3 pb-0">
293-
<div id="chartByAssigned"></div>
317+
<canvas id="chartByAssigned" height="240"></canvas>
294318
</div>
295319
<div class="text-end px-3 py-1 border-top">
296320
<a class="small text-muted text-decoration-none" data-bs-toggle="collapse"
@@ -342,7 +366,7 @@
342366
</div>
343367
<div class="card-body p-0">
344368
<div class="p-3 pb-0">
345-
<div id="chartByClient"></div>
369+
<canvas id="chartByClient" height="240"></canvas>
346370
</div>
347371
<div class="text-end px-3 py-1 border-top">
348372
<a class="small text-muted text-decoration-none" data-bs-toggle="collapse"
@@ -390,7 +414,7 @@
390414

391415
{% block javascripts %}
392416
{{ parent() }}
393-
<script src="{{ asset('Plugins/Servicios/node_modules/apexcharts/dist/apexcharts.min.js') }}"></script>
417+
<script src="{{ asset('node_modules/chart.js/dist/Chart.min.js') }}"></script>
394418
<script>
395419
var monthData = {{ fsc.servicesByMonth | json_encode | raw }};
396420
var yearData = {{ fsc.servicesByYear | json_encode | raw }};
@@ -399,28 +423,33 @@
399423
var assignedData = {{ fsc.servicesByAssigned | json_encode | raw }};
400424
var clientData = {{ fsc.servicesByClient | json_encode | raw }};
401425
402-
function donutChart(selector, data, labelKey) {
426+
var PALETTE = ['#4e73df','#1cc88a','#36b9cc','#f6c23e','#e74a3b','#858796'];
427+
428+
function donutChart(canvasId, data, labelKey) {
403429
if (!data.length) { return; }
404430
var MAX = 5;
405-
var labels, series;
431+
var labels, values;
406432
if (data.length > MAX) {
407433
labels = data.slice(0, MAX).map(function (r) { return r[labelKey] || '---'; });
408-
series = data.slice(0, MAX).map(function (r) { return parseInt(r.total); });
434+
values = data.slice(0, MAX).map(function (r) { return parseInt(r.total); });
409435
var rest = data.slice(MAX).reduce(function (sum, r) { return sum + parseInt(r.total); }, 0);
410436
labels.push('Otros');
411-
series.push(rest);
437+
values.push(rest);
412438
} else {
413439
labels = data.map(function (r) { return r[labelKey] || '---'; });
414-
series = data.map(function (r) { return parseInt(r.total); });
440+
values = data.map(function (r) { return parseInt(r.total); });
415441
}
416-
new ApexCharts(document.querySelector(selector), {
417-
series: series,
418-
chart: {type: 'donut', height: 240, toolbar: {show: false}},
419-
labels: labels,
420-
legend: {position: 'bottom', fontSize: '12px'},
421-
plotOptions: {pie: {donut: {size: '60%'}}},
422-
dataLabels: {enabled: false}
423-
}).render();
442+
var colors = labels.map(function (_, i) { return PALETTE[i % PALETTE.length]; });
443+
new Chart(document.getElementById(canvasId).getContext('2d'), {
444+
type: 'doughnut',
445+
data: {labels: labels, datasets: [{data: values, backgroundColor: colors}]},
446+
options: {
447+
responsive: true,
448+
maintainAspectRatio: false,
449+
legend: {position: 'bottom', labels: {fontSize: 12}},
450+
cutoutPercentage: 60
451+
}
452+
});
424453
}
425454
426455
$(document).ready(function () {
@@ -429,30 +458,50 @@
429458
return new Date(p[0], p[1] - 1).toLocaleDateString('es-ES', {month: 'short', year: '2-digit'});
430459
});
431460
432-
new ApexCharts(document.querySelector('#chartByMonth'), {
433-
series: [{name: '{{ trans('services') | capitalize }}', data: Object.values(monthData)}],
434-
chart: {height: 300, type: 'bar', toolbar: {show: true}},
435-
plotOptions: {bar: {borderRadius: 2, dataLabels: {position: 'top'}}},
436-
dataLabels: {enabled: false},
437-
xaxis: {categories: monthLabels, axisBorder: {show: false}, axisTicks: {show: false}},
438-
yaxis: {labels: {formatter: function (v) { return Math.round(v); }}},
439-
colors: ['#4e73df']
440-
}).render();
461+
new Chart(document.getElementById('chartByMonth').getContext('2d'), {
462+
type: 'bar',
463+
data: {
464+
labels: monthLabels,
465+
datasets: [{
466+
label: '{{ trans('services') | capitalize }}',
467+
data: Object.values(monthData),
468+
backgroundColor: '#4e73df'
469+
}]
470+
},
471+
options: {
472+
responsive: true,
473+
maintainAspectRatio: false,
474+
scales: {
475+
yAxes: [{ticks: {beginAtZero: true, callback: function (v) { return Number.isInteger(v) ? v : ''; }}}]
476+
},
477+
legend: {display: false}
478+
}
479+
});
441480
442-
new ApexCharts(document.querySelector('#chartByYear'), {
443-
series: [{name: '{{ trans('services') | capitalize }}', data: Object.values(yearData)}],
444-
chart: {height: 300, type: 'bar', toolbar: {show: true}},
445-
plotOptions: {bar: {borderRadius: 2, dataLabels: {position: 'top'}}},
446-
dataLabels: {enabled: false},
447-
xaxis: {categories: Object.keys(yearData), axisBorder: {show: false}, axisTicks: {show: false}},
448-
yaxis: {labels: {formatter: function (v) { return Math.round(v); }}},
449-
colors: ['#1cc88a']
450-
}).render();
481+
new Chart(document.getElementById('chartByYear').getContext('2d'), {
482+
type: 'bar',
483+
data: {
484+
labels: Object.keys(yearData),
485+
datasets: [{
486+
label: '{{ trans('services') | capitalize }}',
487+
data: Object.values(yearData),
488+
backgroundColor: '#1cc88a'
489+
}]
490+
},
491+
options: {
492+
responsive: true,
493+
maintainAspectRatio: false,
494+
scales: {
495+
yAxes: [{ticks: {beginAtZero: true, callback: function (v) { return Number.isInteger(v) ? v : ''; }}}]
496+
},
497+
legend: {display: false}
498+
}
499+
});
451500
452-
donutChart('#chartByNick', nickData, 'nick');
453-
donutChart('#chartByAgent', agentData, 'nombre');
454-
donutChart('#chartByAssigned', assignedData, 'asignado');
455-
donutChart('#chartByClient', clientData, 'nombre');
501+
donutChart('chartByNick', nickData, 'nick');
502+
donutChart('chartByAgent', agentData, 'nombre');
503+
donutChart('chartByAssigned', assignedData, 'asignado');
504+
donutChart('chartByClient', clientData, 'nombre');
456505
});
457506
</script>
458507
{% endblock %}

0 commit comments

Comments
 (0)