Skip to content

Commit 504fede

Browse files
committed
feat: aggiunta grafici 20 fornitori TOP e 20 articoli piu acquistati in Statistiche
1 parent 3979de0 commit 504fede

1 file changed

Lines changed: 210 additions & 0 deletions

File tree

modules/statistiche/edit.php

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,216 @@ function init_calendar(calendar) {
431431
</div>
432432
</div>';
433433

434+
// Fornitori top
435+
$fornitori = $dbo->fetchArray('SELECT
436+
SUM(IF(`reversed`=1, - (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`), (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`))) AS totale,
437+
(SELECT
438+
COUNT(*)
439+
FROM
440+
`co_documenti`
441+
INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id`
442+
INNER JOIN `zz_segments` ON `co_documenti`.`id_segment`=`zz_segments`.`id`
443+
WHERE
444+
`co_documenti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica` AND `co_documenti`.`data` BETWEEN '.prepare($start).' AND '.prepare($end)." AND `co_tipidocumento`.`dir`='uscita' AND `zz_segments`.`autofatture`=0) AS qta,
445+
`an_anagrafiche`.`idanagrafica`,
446+
`an_anagrafiche`.`ragione_sociale`
447+
FROM
448+
`co_documenti`
449+
INNER JOIN `co_statidocumento` ON `co_statidocumento`.`id` = `co_documenti`.`idstatodocumento`
450+
LEFT JOIN `co_statidocumento_lang` ON (`co_statidocumento_lang`.`id_record` = `co_statidocumento`.`id` AND `co_statidocumento_lang`.`id_lang` = ".prepare(Models\Locale::getDefault()->id).")
451+
INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id`
452+
INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`iddocumento`=`co_documenti`.`id`
453+
INNER JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`co_documenti`.`idanagrafica`
454+
INNER JOIN `zz_segments` ON `co_documenti`.`id_segment`=`zz_segments`.`id`
455+
WHERE
456+
`co_tipidocumento`.`dir`='uscita'
457+
AND `co_statidocumento_lang`.`title` IN('Pagato', 'Parzialmente pagato', 'Emessa')
458+
AND `co_documenti`.`data` BETWEEN ".prepare($start).' AND '.prepare($end).'
459+
AND `zz_segments`.`autofatture`=0
460+
GROUP BY
461+
`an_anagrafiche`.`idanagrafica`
462+
ORDER BY
463+
`totale` DESC LIMIT 20');
464+
465+
$totale_fornitori = $dbo->fetchArray('SELECT
466+
SUM(IF(`reversed`=1, -(`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`), (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`))) AS totale
467+
FROM
468+
`co_documenti`
469+
INNER JOIN `co_statidocumento` ON `co_statidocumento`.`id` = `co_documenti`.`idstatodocumento`
470+
LEFT JOIN `co_statidocumento_lang` ON (`co_statidocumento_lang`.`id_record` = `co_statidocumento`.`id` AND `co_statidocumento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).")
471+
INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id`
472+
INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`iddocumento`=`co_documenti`.`id`
473+
INNER JOIN `zz_segments` ON `co_documenti`.`id_segment`=`zz_segments`.`id`
474+
WHERE
475+
`co_statidocumento_lang`.`title` IN ('Pagato', 'Parzialmente pagato', 'Emessa')
476+
AND `co_tipidocumento`.`dir`='uscita'
477+
AND `co_documenti`.`data` BETWEEN ".prepare($start).' AND '.prepare($end).'
478+
AND `zz_segments`.`autofatture`=0');
479+
480+
echo '
481+
<div class="row">
482+
<div class="col-md-6">
483+
<div class="card card-info">
484+
<div class="card-header">
485+
<div class="d-flex justify-content-between align-items-center">
486+
<h3 class="card-title">'.tr('I 20 fornitori TOP').'</h3>
487+
<div class="card-tools">
488+
<button type="button" class="btn btn-tool" data-card-widget="collapse">
489+
<i class="fa fa-minus"></i>
490+
</button>
491+
</div>
492+
</div>
493+
</div>
494+
<div class="card-body p-0">
495+
<div class="table-responsive">';
496+
if (!empty($fornitori)) {
497+
echo '
498+
<table class="table table-sm table-hover">
499+
<thead>
500+
<tr>
501+
<th>'.tr('Ragione sociale').'</th>
502+
<th class="text-right" width="100">'.tr('N. fatture').'</th>
503+
<th class="text-right" width="120">'.tr('Totale').' <i class="fa fa-info-circle text-info tip" title="'.tr('Valori iva esclusa').'"></i></th>
504+
<th class="text-right" width="120">'.tr('Percentuale').' <i class="fa fa-info-circle text-info tip" title="'.tr('Incidenza sugli acquisti').'"></i></th>
505+
</tr>
506+
</thead>
507+
<tbody>';
508+
foreach ($fornitori as $fornitore) {
509+
echo '
510+
<tr>
511+
<td>'.Modules::link('Anagrafiche', $fornitore['idanagrafica'], $fornitore['ragione_sociale']).'</td>
512+
<td class="text-right">'.intval($fornitore['qta']).'</td>
513+
<td class="text-right">'.moneyFormat($fornitore['totale'], 2).'</td>
514+
<td class="text-right">
515+
<span class="badge badge-'.($fornitore['totale'] * 100 / ($totale_fornitori[0]['totale'] != 0 ? $totale_fornitori[0]['totale'] : 1) > 10 ? 'info' : 'secondary').'">
516+
'.Translator::numberToLocale($fornitore['totale'] * 100 / ($totale_fornitori[0]['totale'] != 0 ? $totale_fornitori[0]['totale'] : 1), 2).' %
517+
</span>
518+
</td>
519+
</tr>';
520+
}
521+
echo '
522+
</tbody>
523+
</table>';
524+
} else {
525+
echo '
526+
<div class="alert alert-info m-3">
527+
<i class="fa fa-info-circle"></i> '.tr('Nessun acquisto').'...
528+
</div>';
529+
}
530+
echo '
531+
</div>
532+
</div>
533+
</div>
534+
</div>';
535+
536+
// Articoli più acquistati
537+
$articoli_acquistati = $dbo->fetchArray('SELECT
538+
SUM(IF(`reversed`=1, -`co_righe_documenti`.`qta`, `co_righe_documenti`.`qta`)) AS qta,
539+
SUM(IF(`reversed`=1, -(`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`), (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`))) AS totale,
540+
`mg_articoli`.`id`,
541+
`mg_articoli`.`codice`,
542+
`mg_articoli_lang`.`title` as descrizione,
543+
`mg_articoli`.`um`
544+
FROM
545+
`co_documenti`
546+
INNER JOIN `co_statidocumento` ON `co_statidocumento`.`id` = `co_documenti`.`idstatodocumento`
547+
LEFT JOIN `co_statidocumento_lang` ON `co_statidocumento_lang`.`id_record` = `co_statidocumento`.`id` AND `co_statidocumento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).'
548+
INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id`
549+
INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`iddocumento`=`co_documenti`.`id`
550+
INNER JOIN `mg_articoli` ON `mg_articoli`.`id`=`co_righe_documenti`.`idarticolo`
551+
LEFT JOIN `mg_articoli_lang` ON (`mg_articoli_lang`.`id_record`=`mg_articoli`.`id` AND `mg_articoli_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).")
552+
INNER JOIN `zz_segments` ON `co_documenti`.`id_segment`=`zz_segments`.`id`
553+
WHERE
554+
`co_tipidocumento`.`dir`='uscita'
555+
AND `co_statidocumento_lang`.`title` IN ('Pagato', 'Parzialmente pagato', 'Emessa')
556+
AND `co_documenti`.`data` BETWEEN ".prepare($start).' AND '.prepare($end).'
557+
AND `zz_segments`.`autofatture`=0
558+
GROUP BY
559+
`co_righe_documenti`.`idarticolo`
560+
ORDER BY
561+
`qta` DESC LIMIT 20');
562+
563+
$totale_acquistati = $dbo->fetchArray('SELECT
564+
SUM(IF(`reversed`=1, - `co_righe_documenti`.`qta`, `co_righe_documenti`.`qta`)) AS totale_qta,
565+
SUM(IF(`reversed`=1, - (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`), (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`))) AS totale
566+
FROM
567+
`co_documenti`
568+
INNER JOIN `co_statidocumento` ON `co_statidocumento`.`id` = `co_documenti`.`idstatodocumento`
569+
LEFT JOIN `co_statidocumento_lang` ON `co_statidocumento_lang`.`id_record` = `co_statidocumento`.`id` AND `co_statidocumento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id)."
570+
INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id`
571+
INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`iddocumento`=`co_documenti`.`id`
572+
INNER JOIN `mg_articoli` ON `mg_articoli`.`id`=`co_righe_documenti`.`idarticolo`
573+
INNER JOIN `zz_segments` ON `co_documenti`.`id_segment`=`zz_segments`.`id`
574+
WHERE
575+
`co_tipidocumento`.`dir`='uscita'
576+
AND `co_statidocumento_lang`.`title` IN ('Pagato', 'Parzialmente pagato', 'Emessa')
577+
AND `co_documenti`.`data` BETWEEN ".prepare($start).' AND '.prepare($end).'
578+
AND `zz_segments`.`autofatture`=0');
579+
580+
echo '
581+
<div class="col-md-6">
582+
<div class="card card-info">
583+
<div class="card-header">
584+
<div class="d-flex justify-content-between align-items-center">
585+
<h3 class="card-title">'.tr('I 20 articoli più acquistati').'</h3>
586+
<div class="card-tools">
587+
<button type="button" class="btn btn-tool" data-card-widget="collapse">
588+
<i class="fa fa-minus"></i>
589+
</button>
590+
</div>
591+
</div>
592+
</div>
593+
<div class="card-body p-0">
594+
<div class="table-responsive">';
595+
if (!empty($articoli_acquistati)) {
596+
echo '
597+
<table class="table table-sm table-hover">
598+
<thead>
599+
<tr>
600+
<th>'.tr('Articolo').'</th>
601+
<th class="text-right" width="100">'.tr('N. articoli').' <i class="fa fa-info-circle text-info tip" title="'.tr('Numero di articoli acquistati').'"></i></th>
602+
<th class="text-right" width="120">'.tr('Percentuale').' <i class="fa fa-info-circle text-info tip" title="'.tr('Incidenza sul numero di articoli').'"></i></th>
603+
<th class="text-right" width="120">'.tr('Totale').' <i class="fa fa-info-circle text-info tip" title="'.tr('Valori iva esclusa').'"></i></th>
604+
</tr>
605+
</thead>
606+
<tbody>';
607+
foreach ($articoli_acquistati as $articolo) {
608+
echo '
609+
<tr>
610+
<td><div class="text-truncate" style="max-width: 250px;"> '.Modules::link('Articoli', $articolo['id'], $articolo['codice'].' - '.$articolo['descrizione']).'</div></td>
611+
<td class="text-right">'.Translator::numberToLocale($articolo['qta'], 'qta').' '.$articolo['um'].'</td>
612+
<td class="text-right">
613+
<span class="badge badge-'.($articolo['qta'] * 100 / ($totale_acquistati[0]['totale_qta'] != 0 ? $totale_acquistati[0]['totale_qta'] : 1) > 10 ? 'info' : 'secondary').'">
614+
'.Translator::numberToLocale($articolo['qta'] * 100 / ($totale_acquistati[0]['totale_qta'] != 0 ? $totale_acquistati[0]['totale_qta'] : 1), 2).' %
615+
</span>
616+
</td>
617+
<td class="text-right font-weight-bold">'.moneyFormat($articolo['totale'], 2).'</td>
618+
</tr>';
619+
}
620+
echo '
621+
</tbody>
622+
</table>
623+
<div class="d-flex justify-content-between align-items-center p-3 bg-light border-top">
624+
<div>
625+
<span class="text-muted"><small>'.tr('Periodo').': '.Translator::dateToLocale($start).' - '.Translator::dateToLocale($end).'</small></span>
626+
</div>
627+
<div>
628+
'.Modules::link('Articoli', null, '<i class="fa fa-chart-bar"></i> '.tr('Statistiche complete'), 'btn btn-info btn-sm', null, false, 'tab_'.Plugin::where('name', 'Statistiche vendita')->first()->id).'
629+
</div>
630+
</div>';
631+
} else {
632+
echo '
633+
<div class="alert alert-info m-3">
634+
<i class="fa fa-info-circle"></i> '.tr('Nessun articolo acquistato').'...
635+
</div>';
636+
}
637+
echo '
638+
</div>
639+
</div>
640+
</div>
641+
</div>
642+
</div>';
643+
434644
// Numero interventi per tipologia
435645
$tipi = $dbo->fetchArray('SELECT *, in_tipiintervento.id AS idtipointervento FROM `in_tipiintervento` LEFT JOIN `in_tipiintervento_lang` ON (`in_tipiintervento`.`id` = `in_tipiintervento_lang`.`id_record` AND `in_tipiintervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')');
436646

0 commit comments

Comments
 (0)