. */ include_once __DIR__.'/../../core.php'; use Models\Plugin; use Modules\Statistiche\Stats; echo ' '; $start = $_SESSION['period_start']; $end = $_SESSION['period_end']; $translated_months = [ tr('Gennaio'), tr('Febbraio'), tr('Marzo'), tr('Aprile'), tr('Maggio'), tr('Giugno'), tr('Luglio'), tr('Agosto'), tr('Settembre'), tr('Ottobre'), tr('Novembre'), tr('Dicembre') ]; // Fatturato echo '

'.tr('Vendite e acquisti').'

'.tr('Periodi temporali').'


'; // Script per il grafico del fatturato echo ' '; // Clienti top $clienti = $dbo->fetchArray('SELECT SUM(IF(`reversed`=1, - (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`), (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`))) AS totale, (SELECT COUNT(*) FROM `co_documenti` INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id` INNER JOIN `zz_segments` ON `co_documenti`.`id_segment`=`zz_segments`.`id` WHERE `co_documenti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica` AND `co_documenti`.`data` BETWEEN '.prepare($start).' AND '.prepare($end)." AND `co_tipidocumento`.`dir`='entrata' AND `zz_segments`.`autofatture`=0) AS qta, `an_anagrafiche`.`idanagrafica`, `an_anagrafiche`.`ragione_sociale` FROM `co_documenti` INNER JOIN `co_statidocumento` ON `co_statidocumento`.`id` = `co_documenti`.`idstatodocumento` 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).") INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`iddocumento`=`co_documenti`.`id` INNER JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`co_documenti`.`idanagrafica` INNER JOIN `zz_segments` ON `co_documenti`.`id_segment`=`zz_segments`.`id` WHERE `co_tipidocumento`.`dir`='entrata' AND `co_statidocumento_lang`.`title` IN('Pagato', 'Parzialmente pagato', 'Emessa') AND `co_documenti`.`data` BETWEEN ".prepare($start).' AND '.prepare($end).' AND `zz_segments`.`autofatture`=0 GROUP BY `an_anagrafiche`.`idanagrafica` ORDER BY `totale` DESC LIMIT 20'); $totale = $dbo->fetchArray('SELECT SUM(IF(`reversed`=1, -(`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`), (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`))) AS totale FROM `co_documenti` INNER JOIN `co_statidocumento` ON `co_statidocumento`.`id` = `co_documenti`.`idstatodocumento` 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).") INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`iddocumento`=`co_documenti`.`id` INNER JOIN `zz_segments` ON `co_documenti`.`id_segment`=`zz_segments`.`id` WHERE `co_statidocumento_lang`.`title` IN ('Pagato', 'Parzialmente pagato', 'Emessa') AND `co_tipidocumento`.`dir`='entrata' AND `co_documenti`.`data` BETWEEN ".prepare($start).' AND '.prepare($end).' AND `zz_segments`.`autofatture`=0'); echo '

'.tr('I 20 clienti TOP per il periodo').': '.Translator::dateToLocale($start).' - '.Translator::dateToLocale($end).'

'; if (!empty($clienti)) { echo ' '; foreach ($clienti as $cliente) { echo ' '; } echo '
'.tr('Ragione sociale').' '.tr('N. fatture').' '.tr('Totale').' '.tr('Percentuale').' 
'.Modules::link('Anagrafiche', $cliente['idanagrafica'], $cliente['ragione_sociale']).' '.intval($cliente['qta']).' '.moneyFormat($cliente['totale'], 2).' '.Translator::numberToLocale($cliente['totale'] * 100 / ($totale[0]['totale'] != 0 ? $totale[0]['totale'] : 1), 2).' %
'; } else { echo '

'.tr('Nessuna vendita').'...

'; } echo '
'; // Articoli più venduti $articoli = $dbo->fetchArray('SELECT SUM(IF(`reversed`=1, -`co_righe_documenti`.`qta`, `co_righe_documenti`.`qta`)) AS qta, SUM(IF(`reversed`=1, -(`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`), (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`))) AS totale, `mg_articoli`.`id`, `mg_articoli`.`codice`, `mg_articoli_lang`.`title` as descrizione, `mg_articoli`.`um` FROM `co_documenti` INNER JOIN `co_statidocumento` ON `co_statidocumento`.`id` = `co_documenti`.`idstatodocumento` 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).' INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`iddocumento`=`co_documenti`.`id` INNER JOIN `mg_articoli` ON `mg_articoli`.`id`=`co_righe_documenti`.`idarticolo` 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).") INNER JOIN `zz_segments` ON `co_documenti`.`id_segment`=`zz_segments`.`id` WHERE `co_tipidocumento`.`dir`='entrata' AND `co_statidocumento_lang`.`title` IN ('Pagato', 'Parzialmente pagato', 'Emessa') AND `co_documenti`.`data` BETWEEN ".prepare($start).' AND '.prepare($end).' AND `zz_segments`.`autofatture`=0 GROUP BY `co_righe_documenti`.`idarticolo` ORDER BY `qta` DESC LIMIT 20'); $totale = $dbo->fetchArray('SELECT SUM(IF(`reversed`=1, - `co_righe_documenti`.`qta`, `co_righe_documenti`.`qta`)) AS totale_qta, SUM(IF(`reversed`=1, - (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`), (`co_righe_documenti`.`subtotale` - `co_righe_documenti`.`sconto`))) AS totale FROM `co_documenti` INNER JOIN `co_statidocumento` ON `co_statidocumento`.`id` = `co_documenti`.`idstatodocumento` 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)." INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`iddocumento`=`co_documenti`.`id` INNER JOIN `mg_articoli` ON `mg_articoli`.`id`=`co_righe_documenti`.`idarticolo` INNER JOIN `zz_segments` ON `co_documenti`.`id_segment`=`zz_segments`.`id` WHERE `co_tipidocumento`.`dir`='entrata' AND `co_statidocumento_lang`.`title` IN ('Pagato', 'Parzialmente pagato', 'Emessa') AND `co_documenti`.`data` BETWEEN ".prepare($start).' AND '.prepare($end).' AND `zz_segments`.`autofatture`=0'); echo '

'.tr('I 20 articoli più venduti per il periodo').': '.Translator::dateToLocale($start).' - '.Translator::dateToLocale($end).'

'; if (!empty($articoli)) { echo ' '; foreach ($articoli as $articolo) { echo ' '; } echo '
'.tr('Articolo').' '.tr('N. articoli').' '.tr('Percentuale').' '.tr('Totale').'
'.Modules::link('Articoli', $articolo['id'], $articolo['codice'].' - '.$articolo['descrizione']).'
'.Translator::numberToLocale($articolo['qta'], 'qta').' '.$articolo['um'].' '.Translator::numberToLocale($articolo['qta'] * 100 / ($totale[0]['totale_qta'] != 0 ? $totale[0]['totale_qta'] : 1), 2).' % '.moneyFormat($articolo['totale'], 2).'
'; echo "

".Modules::link('Articoli', null, tr('Vedi tutto...'), null, null, false, 'tab_'.Plugin::where('name', 'Statistiche vendita')->first()->id).'

'; } else { echo '

'.tr('Nessun articolo venduto').'...

'; } echo '
'; // Numero interventi per tipologia $tipi = $dbo->fetchArray('SELECT * 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).')'); $dataset = ''; foreach ($tipi as $tipo) { $interventi = $dbo->fetchArray(' SELECT COUNT(`in_interventi`.`id`) AS result, YEAR(`sessioni`.`orario_fine`) AS `year`, MONTH(`sessioni`.`orario_fine`) AS `month` FROM `in_interventi` LEFT JOIN(SELECT `in_interventi_tecnici`.`idintervento`, MAX(`orario_fine`) AS orario_fine FROM `in_interventi_tecnici` GROUP BY `idintervento`) sessioni ON `in_interventi`.`id` = `sessioni`.`idintervento` WHERE `in_interventi`.`idtipointervento` = '.prepare($tipo['id']).' AND `sessioni`.`orario_fine` BETWEEN '.prepare($start).' AND '.prepare($end).' GROUP BY YEAR(`sessioni`.`orario_fine`), MONTH(`sessioni`.`orario_fine`) ORDER BY YEAR(`sessioni`.`orario_fine`) ASC, MONTH(`sessioni`.`orario_fine`) ASC'); $interventi = Stats::monthly($interventi, $start, $end); // Random color $background = '#'.dechex(random_int(256, 16777215)); $dataset .= '{ label: "'.$tipo['title'].'", backgroundColor: "'.$background.'", data: [ '.implode(',', array_column($interventi, 'result')).' ] },'; } echo '

'.tr('Numero interventi per tipologia').'

'; // Script for the chart displaying the number of interventions by type echo ' '; // Ore interventi per tipologia $dataset = ''; foreach ($tipi as $tipo) { $interventi = $dbo->fetchArray('SELECT ROUND(SUM(in_interventi_tecnici.ore), 2) AS result, YEAR(in_interventi_tecnici.orario_fine) AS year, MONTH(in_interventi_tecnici.orario_fine) AS month FROM in_interventi INNER JOIN in_interventi_tecnici ON in_interventi.id=in_interventi_tecnici.idintervento WHERE in_interventi.idtipointervento = '.prepare($tipo['id']).' AND in_interventi.data_richiesta BETWEEN '.prepare($start).' AND '.prepare($end).' AND in_interventi_tecnici.orario_fine BETWEEN '.prepare($start).' AND '.prepare($end).' GROUP BY YEAR(in_interventi_tecnici.orario_fine), MONTH(in_interventi_tecnici.orario_fine) ORDER BY YEAR(in_interventi_tecnici.orario_fine) ASC, MONTH(in_interventi_tecnici.orario_fine) ASC'); $interventi = Stats::monthly($interventi, $start, $end); // Random color $background = '#'.dechex(random_int(256, 16777215)); $dataset .= '{ label: "'.$tipo['title'].'", backgroundColor: "'.$background.'", data: [ '.implode(',', array_column($interventi, 'result')).' ] },'; } echo '

'.tr('Ore interventi per tipologia').'

'; // Script per il grafico delle ore interventi per tipologia echo ' '; // Interventi per tecnico $tecnici = $dbo->fetchArray('SELECT `an_anagrafiche`.`idanagrafica` AS id, `ragione_sociale`, `colore` FROM `an_anagrafiche` INNER JOIN `an_tipianagrafiche_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`an_tipianagrafiche_anagrafiche`.`idanagrafica` INNER JOIN `an_tipianagrafiche` ON `an_tipianagrafiche_anagrafiche`.`idtipoanagrafica`=`an_tipianagrafiche`.`id` LEFT JOIN `an_tipianagrafiche_lang` ON (`an_tipianagrafiche_lang`.`id_record` = `an_tipianagrafiche`.`id` AND `an_tipianagrafiche_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).") LEFT JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idtecnico` = `an_anagrafiche`.`idanagrafica` INNER JOIN `in_interventi` ON `in_interventi_tecnici`.`idintervento`=`in_interventi`.`id` WHERE `an_anagrafiche`.`deleted_at` IS NULL AND `an_tipianagrafiche_lang`.`title`='Tecnico' GROUP BY `an_anagrafiche`.`idanagrafica` ORDER BY `ragione_sociale` ASC"); $dataset = ''; if ($_SESSION['superselect']['idtipiintervento']) { $where = '`in_interventi_tecnici`.`id` IN('.implode(',', (array) json_decode((string) $_SESSION['superselect']['idtipiintervento'])).')'; } else { $where = '1=1'; } foreach ($tecnici as $tecnico) { $sessioni = $dbo->fetchArray('SELECT SUM(`in_interventi_tecnici`.`ore`) AS result, CONCAT(CAST(SUM(`in_interventi_tecnici`.`ore`) AS char(20)),\' ore\') AS ore_lavorate, YEAR(`in_interventi_tecnici`.`orario_inizio`) AS year, MONTH(`in_interventi_tecnici`.`orario_inizio`) AS month FROM `in_interventi_tecnici` INNER JOIN `in_interventi` ON `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id` LEFT JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`id` WHERE `in_interventi_tecnici`.`idtecnico` = '.prepare($tecnico['id']).' AND `in_interventi_tecnici`.`orario_inizio` BETWEEN '.prepare($start).' AND '.prepare($end).' AND `in_statiintervento`.`is_completato` AND '.$where.' GROUP BY YEAR(`in_interventi_tecnici`.`orario_inizio`), MONTH(`in_interventi_tecnici`.`orario_inizio`) ORDER BY YEAR(`in_interventi_tecnici`.`orario_inizio`) ASC, MONTH(`in_interventi_tecnici`.`orario_inizio`) ASC'); $sessioni = Stats::monthly($sessioni, $start, $end); // Colore tecnico $background = strtoupper((string) $tecnico['colore']); if (empty($background) || $background == '#FFFFFF') { // Random color $background = '#'.dechex(random_int(256, 16777215)); } $dataset .= '{ label: "'.$tecnico['ragione_sociale'].'", backgroundColor: "'.$background.'", data: [ '.implode(',', array_column($sessioni, 'result')).' ], },'; } echo '

'.tr('Ore di lavoro per tecnico').'

'; if ($_SESSION['superselect']['idtipiintervento']) { echo ' {["type": "select", "multiple": "1", "label": "'.tr('Tipi attività').'", "name": "idtipiintervento[]", "ajax-source": "tipiintervento", "value": "'.implode(',', (array) json_decode((string) $_SESSION['superselect']['idtipiintervento'])).'", "placeholder": "Tutti" ]}'; } echo '
'; // Script per il grafico ore interventi per tecnico echo ' '; $dataset = ''; $nuovi_clienti = $dbo->fetchArray('SELECT COUNT(*) AS result, GROUP_CONCAT(`an_anagrafiche`.`ragione_sociale`, "
") AS ragioni_sociali, YEAR(`an_anagrafiche`.`created_at`) AS year, MONTH(`an_anagrafiche`.`created_at`) AS month FROM `an_anagrafiche` INNER JOIN `an_tipianagrafiche_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`an_tipianagrafiche_anagrafiche`.`idanagrafica` INNER JOIN `an_tipianagrafiche` ON `an_tipianagrafiche_anagrafiche`.`idtipoanagrafica`=`an_tipianagrafiche`.`id` LEFT JOIN `an_tipianagrafiche_lang` ON (`an_tipianagrafiche`.`id` = `an_tipianagrafiche_lang`.`id_record` AND `an_tipianagrafiche_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `an_tipianagrafiche_lang`.`title` = "Cliente" AND `deleted_at` IS NULL AND `an_anagrafiche`.`created_at` BETWEEN '.prepare($start).' AND '.prepare($end).' GROUP BY YEAR(`an_anagrafiche`.`created_at`), MONTH(`an_anagrafiche`.`created_at`) ORDER BY YEAR(`an_anagrafiche`.`created_at`) ASC, MONTH(`an_anagrafiche`.`created_at`) ASC'); $nuovi_fornitori = $dbo->fetchArray('SELECT COUNT(*) AS result, GROUP_CONCAT(`an_anagrafiche`.`ragione_sociale`, "
") AS ragioni_sociali, YEAR(`an_anagrafiche`.`created_at`) AS year, MONTH(`an_anagrafiche`.`created_at`) AS month FROM `an_anagrafiche` INNER JOIN `an_tipianagrafiche_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`an_tipianagrafiche_anagrafiche`.`idanagrafica` INNER JOIN `an_tipianagrafiche` ON `an_tipianagrafiche_anagrafiche`.`idtipoanagrafica`=`an_tipianagrafiche`.`id` LEFT JOIN `an_tipianagrafiche_lang` ON (`an_tipianagrafiche`.`id` = `an_tipianagrafiche_lang`.`id_record` AND `an_tipianagrafiche_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `an_tipianagrafiche_lang`.`title` = "Fornitore" AND `deleted_at` IS NULL AND `an_anagrafiche`.`created_at` BETWEEN '.prepare($start).' AND '.prepare($end).' GROUP BY YEAR(`an_anagrafiche`.`created_at`), MONTH(`an_anagrafiche`.`created_at`) ORDER BY YEAR(`an_anagrafiche`.`created_at`) ASC, MONTH(`an_anagrafiche`.`created_at`) ASC'); // Nuovi clienti per i quali ho emesso almeno una fattura di vendita $clienti_acquisiti = $dbo->fetchArray('SELECT COUNT(*) AS result, GROUP_CONCAT(`an_anagrafiche`.`ragione_sociale`, "
") AS ragioni_sociali, YEAR(`an_anagrafiche`.`created_at`) AS year, MONTH(`an_anagrafiche`.`created_at`) AS month FROM `an_anagrafiche` INNER JOIN `co_documenti` ON `an_anagrafiche`.`idanagrafica` = `co_documenti`.`idanagrafica` INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id` INNER JOIN `an_tipianagrafiche_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`an_tipianagrafiche_anagrafiche`.`idanagrafica` INNER JOIN `an_tipianagrafiche` ON `an_tipianagrafiche_anagrafiche`.`idtipoanagrafica`=`an_tipianagrafiche`.`id` LEFT JOIN `an_tipianagrafiche_lang` ON (`an_tipianagrafiche`.`id` = `an_tipianagrafiche_lang`.`id_record` AND `an_tipianagrafiche_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `an_tipianagrafiche_lang`.`title` = "Cliente" AND `co_tipidocumento`.`dir` = "entrata" AND `an_anagrafiche`.`created_at` BETWEEN '.prepare($start).' AND '.prepare($end).' GROUP BY YEAR(`an_anagrafiche`.`created_at`), MONTH(`an_anagrafiche`.`created_at`) ORDER BY YEAR(`an_anagrafiche`.`created_at`) ASC, MONTH(`an_anagrafiche`.`created_at`) ASC'); // Random color $background = '#'.dechex(random_int(256, 16777215)); $dataset .= '{ label: "'.tr('Nuovi clienti').'", backgroundColor: "'.$background.'", data: [ '.implode(',', array_column($nuovi_clienti, 'result')).' ] },'; // Random color $background = '#'.dechex(random_int(256, 16777215)); $dataset .= '{ label: "'.tr('Clienti acquisiti').'", backgroundColor: "'.$background.'", data: [ '.implode(',', array_column($clienti_acquisiti, 'result')).' ] },'; // Random color $background = '#'.dechex(random_int(256, 16777215)); $dataset .= '{ label: "'.tr('Nuovi fornitori').'", backgroundColor: "'.$background.'", data: [ '.implode(',', array_column($nuovi_fornitori, 'result')).' ] },'; echo '

'.tr('Nuove anagrafiche').'

'; // Script per il grafico dei nuovi clienti per mese echo ' ';