|
38 | 38 | </div> |
39 | 39 | </div> |
40 | 40 |
|
| 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 | + |
41 | 59 | <div class="col-xl-3 col-md-6 mb-4"> |
42 | 60 | <div class="card border-left-primary shadow h-100 py-2"> |
43 | 61 | <div class="card-body"> |
|
104 | 122 | </h6> |
105 | 123 | </div> |
106 | 124 | <div class="card-body"> |
107 | | - <div id="chartByMonth"></div> |
| 125 | + <div style="position:relative;height:300px;"> |
| 126 | + <canvas id="chartByMonth"></canvas> |
| 127 | + </div> |
108 | 128 | </div> |
109 | 129 | </div> |
110 | 130 | </div> |
|
117 | 137 | </h6> |
118 | 138 | </div> |
119 | 139 | <div class="card-body"> |
120 | | - <div id="chartByYear"></div> |
| 140 | + <div style="position:relative;height:300px;"> |
| 141 | + <canvas id="chartByYear"></canvas> |
| 142 | + </div> |
121 | 143 | </div> |
122 | 144 | </div> |
123 | 145 | </div> |
|
140 | 162 | <tr> |
141 | 163 | <th>{{ trans('status') }}</th> |
142 | 164 | <th class="text-end">{{ trans('quantity') }}</th> |
| 165 | + <th class="text-end">{{ trans('net') }}</th> |
143 | 166 | </tr> |
144 | 167 | </thead> |
145 | 168 | <tbody> |
|
158 | 181 | </a> |
159 | 182 | </td> |
160 | 183 | <td class="text-end fw-bold">{{ row.total }}</td> |
| 184 | + <td class="text-end">{{ money(row.neto) }}</td> |
161 | 185 | </tr> |
162 | 186 | {% else %} |
163 | 187 | <tr> |
164 | | - <td colspan="2" class="text-center text-muted py-3"> |
| 188 | + <td colspan="3" class="text-center text-muted py-3"> |
165 | 189 | {{ trans('no-data') }} |
166 | 190 | </td> |
167 | 191 | </tr> |
|
186 | 210 | </div> |
187 | 211 | <div class="card-body p-0"> |
188 | 212 | <div class="p-3 pb-0"> |
189 | | - <div id="chartByNick"></div> |
| 213 | + <canvas id="chartByNick" height="240"></canvas> |
190 | 214 | </div> |
191 | 215 | <div class="text-end px-3 py-1 border-top"> |
192 | 216 | <a class="small text-muted text-decoration-none" data-bs-toggle="collapse" |
|
238 | 262 | </div> |
239 | 263 | <div class="card-body p-0"> |
240 | 264 | <div class="p-3 pb-0"> |
241 | | - <div id="chartByAgent"></div> |
| 265 | + <canvas id="chartByAgent" height="240"></canvas> |
242 | 266 | </div> |
243 | 267 | <div class="text-end px-3 py-1 border-top"> |
244 | 268 | <a class="small text-muted text-decoration-none" data-bs-toggle="collapse" |
|
290 | 314 | </div> |
291 | 315 | <div class="card-body p-0"> |
292 | 316 | <div class="p-3 pb-0"> |
293 | | - <div id="chartByAssigned"></div> |
| 317 | + <canvas id="chartByAssigned" height="240"></canvas> |
294 | 318 | </div> |
295 | 319 | <div class="text-end px-3 py-1 border-top"> |
296 | 320 | <a class="small text-muted text-decoration-none" data-bs-toggle="collapse" |
|
342 | 366 | </div> |
343 | 367 | <div class="card-body p-0"> |
344 | 368 | <div class="p-3 pb-0"> |
345 | | - <div id="chartByClient"></div> |
| 369 | + <canvas id="chartByClient" height="240"></canvas> |
346 | 370 | </div> |
347 | 371 | <div class="text-end px-3 py-1 border-top"> |
348 | 372 | <a class="small text-muted text-decoration-none" data-bs-toggle="collapse" |
|
390 | 414 |
|
391 | 415 | {% block javascripts %} |
392 | 416 | {{ 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> |
394 | 418 | <script> |
395 | 419 | var monthData = {{ fsc.servicesByMonth | json_encode | raw }}; |
396 | 420 | var yearData = {{ fsc.servicesByYear | json_encode | raw }}; |
|
399 | 423 | var assignedData = {{ fsc.servicesByAssigned | json_encode | raw }}; |
400 | 424 | var clientData = {{ fsc.servicesByClient | json_encode | raw }}; |
401 | 425 |
|
402 | | - function donutChart(selector, data, labelKey) { |
| 426 | + var PALETTE = ['#4e73df','#1cc88a','#36b9cc','#f6c23e','#e74a3b','#858796']; |
| 427 | +
|
| 428 | + function donutChart(canvasId, data, labelKey) { |
403 | 429 | if (!data.length) { return; } |
404 | 430 | var MAX = 5; |
405 | | - var labels, series; |
| 431 | + var labels, values; |
406 | 432 | if (data.length > MAX) { |
407 | 433 | 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); }); |
409 | 435 | var rest = data.slice(MAX).reduce(function (sum, r) { return sum + parseInt(r.total); }, 0); |
410 | 436 | labels.push('Otros'); |
411 | | - series.push(rest); |
| 437 | + values.push(rest); |
412 | 438 | } else { |
413 | 439 | 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); }); |
415 | 441 | } |
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 | + }); |
424 | 453 | } |
425 | 454 |
|
426 | 455 | $(document).ready(function () { |
|
429 | 458 | return new Date(p[0], p[1] - 1).toLocaleDateString('es-ES', {month: 'short', year: '2-digit'}); |
430 | 459 | }); |
431 | 460 |
|
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 | + }); |
441 | 480 |
|
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 | + }); |
451 | 500 |
|
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'); |
456 | 505 | }); |
457 | 506 | </script> |
458 | 507 | {% endblock %} |
0 commit comments