diff --git a/gulpfile.js b/gulpfile.js index b63c6a14f..d23d3d325 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -198,6 +198,14 @@ gulp.task('colorpicker', function () { .pipe(gulp.dest(config.production + '/' + config.paths.images + '/bootstrap-colorpicker')); }); +gulp.task('chartjs', function () { + gulp.src([ + config.main.bowerDirectory + '/chart.js/dist/Chart.min.js', + ]) + .pipe(flatten()) + .pipe(gulp.dest(config.production + '/' + config.paths.js + '/chartjs')); +}); + // Elaborazione e minificazione delle informazioni sull'internazionalizzazione gulp.task('i18n', function () { gulp.src([ @@ -298,6 +306,7 @@ gulp.task('bower', ['clean'], function () { gulp.task('other', ['clean'], function () { gulp.start('ckeditor'); gulp.start('colorpicker'); + gulp.start('chartjs'); gulp.start('i18n'); gulp.start('php-debugbar'); }); diff --git a/modules/statistiche/edit.php b/modules/statistiche/edit.php new file mode 100644 index 000000000..a2f2d8133 --- /dev/null +++ b/modules/statistiche/edit.php @@ -0,0 +1,271 @@ +'; + +$start = $_SESSION['period_start']; +$end = $_SESSION['period_end']; + +echo ' +

+ '.tr('Periodo dal _START_ al _END_', [ + '_START_' => Translator::dateToLocale($start), + '_END_' => Translator::dateToLocale($end), + ]).' +

+
+ +'; + +// Differenza delle date in mesi +$d1 = new DateTime($start); +$d2 = new DateTime($end); +$count = $d1->diff($d2)->m + ($d1->diff($d2)->y * 12) + 1; + +$fatturato = $dbo->fetchArray("SELECT SUM(subtotale - sconto) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='uscita' AND co_tipidocumento.descrizione!='Bozza' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC'); + +$entrate = $dbo->fetchArray("SELECT SUM(subtotale - sconto) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti 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 co_movimenti ON co_movimenti.iddocumento=co_documenti.id AND primanota=1 WHERE co_tipidocumento.dir='entrata' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC'); + +$uscite = $dbo->fetchArray("SELECT SUM(subtotale - sconto) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti 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 co_movimenti ON co_movimenti.iddocumento=co_documenti.id AND primanota=1 WHERE co_tipidocumento.dir='uscita' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC'); + +$month = intval($d1->format('m')) - 1; +for ($i = 0; $i < $count; ++$i) { + $month = $month % 12; + + if (intval($fatturato[$i]['month']) != $month + 1) { + array_splice($fatturato, $i, 0, [[ + 'totale' => 0, + ]]); + } + + if (intval($entrate[$i]['month']) != $month + 1) { + array_splice($entrate, $i, 0, [[ + 'totale' => 0, + ]]); + } + + if (intval($uscite[$i]['month']) != $month + 1) { + array_splice($uscite, $i, 0, [[ + 'totale' => 0, + ]]); + } + + ++$month; +} + +// Fatturato +echo ' +
+
+

'.tr('Fatturato').'

+ +
+ +
+
+ +
'; + +// Script per il grafico del fatturato +echo ' +'; + +// Clienti top +$clienti = $dbo->fetchArray("SELECT SUM(subtotale - sconto) AS totale, (SELECT COUNT(*) FROM co_documenti WHERE co_documenti.idanagrafica =an_anagrafiche.idanagrafica) AS qta, an_anagrafiche.idanagrafica, an_anagrafiche.ragione_sociale FROM co_documenti 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 WHERE co_tipidocumento.dir='entrata' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY an_anagrafiche.idanagrafica ORDER BY SUM(subtotale - sconto) DESC LIMIT 15'); + +echo ' +
+
+
+
+

'.tr('Clienti TOP').'

+ +
+ +
+
+
'; +if (!empty($clienti)) { + echo ' +
    '; + foreach ($clienti as $cliente) { + echo ' +
  • '.Modules::link('Anagrafiche', $cliente['idanagrafica'], tr('_PERSON_, con _TOT_ fatture', [ + '_PERSON_' => $cliente['ragione_sociale'], + '_TOT_' => intval($cliente['qta']), + ])).' + '.Translator::numberToLocale($cliente['totale']).' € +
  • '; + } + echo ' +
'; +} else { + echo ' +

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

'; +} +echo ' + +
+
+
'; + +// Articoli più venduti +$articoli = $dbo->fetchArray("SELECT SUM(co_righe_documenti.qta) AS qta, mg_articoli.id, mg_articoli.codice, mg_articoli.descrizione, mg_articoli.um FROM co_documenti 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 WHERE co_tipidocumento.dir='entrata' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY co_righe_documenti.idarticolo ORDER BY SUM(qta) DESC LIMIT 15'); + +echo ' +
+
+
+

'.tr('Articoli più venduti').'

+ +
+ +
+
+
'; +if (!empty($articoli)) { + echo ' +
    '; + foreach ($articoli as $articolo) { + echo ' +
  • '.Modules::link('Articoli', $articolo['id'], $articolo['codice'].' - '.$articolo['descrizione']).' + '.Translator::numberToLocale($articolo['qta']).' '.$articolo['um'].' +
  • '; + } + echo ' +
'; +} else { + echo ' +

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

'; +} +echo ' + +
+
+
+
'; + +// Interventi per stato +$stati = $dbo->fetchArray('SELECT * FROM `in_statiintervento`'); + +$dataset = ''; +foreach ($stati as $stato) { + $interventi = $dbo->fetchArray('SELECT COUNT(*) AS totale, YEAR(in_interventi.data_richiesta) AS year, MONTH(in_interventi.data_richiesta) AS month FROM in_interventi WHERE in_interventi.idstatointervento = '.prepare($stato['idstatointervento']).' AND in_interventi.data_richiesta BETWEEN '.prepare($start).' AND '.prepare($end).' GROUP BY YEAR(in_interventi.data_richiesta), MONTH(in_interventi.data_richiesta) ORDER BY YEAR(in_interventi.data_richiesta) ASC, MONTH(in_interventi.data_richiesta) ASC'); + + $month = intval($d1->format('m')) - 1; + for ($i = 0; $i < $count; ++$i) { + $month = $month % 12; + + if (intval($interventi[$i]['month']) != $month + 1) { + array_splice($interventi, $i, 0, [[ + 'totale' => 0, + ]]); + } + + ++$month; + } + + $dataset .= '{ + label: "'.$stato['descrizione'].'", + backgroundColor: "'.$stato['colore'].'", + data: [ + '.implode(',', array_column($interventi, 'totale')).' + ] + },'; +} + +echo ' +
+
+

'.tr('Interventi per stato').'

+ +
+ +
+
+ +
'; + +// Script per il grafico del fatturato +echo ' +'; diff --git a/package.json b/package.json index 2198272c4..a1c5a5722 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "bootstrap": "^3.3.7", "bootstrap-colorpicker": "^2.5.1", "bootstrap-daterangepicker": "^2.1.25", + "chart.js": "^2.7.0", "ckeditor": "^4.6.2", "components-jqueryui": "^1.12.1", "core-js": "^2.5.1", @@ -98,6 +99,9 @@ "ckeditor": { "ignore": true }, + "chart.js": { + "ignore": true + }, "admin-lte": { "main": [ "dist/css/AdminLTE.css", diff --git a/update/2_3.sql b/update/2_3.sql index 2ad844da5..435e5c624 100644 --- a/update/2_3.sql +++ b/update/2_3.sql @@ -377,8 +377,6 @@ CREATE TABLE IF NOT EXISTS `zz_semaphores` ( -- Aggiornamento zz_modules INSERT INTO `zz_modules` (`id`, `name`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `level`, `parent`, `default`, `enabled`) VALUES (NULL, 'Strumenti', '', '', '', 'fa fa-cog', '2.3', '2.3', '1', '0', '', '1', '1'); -UPDATE `zz_modules` `t1` INNER JOIN (SELECT MAX(`order`) AS `order` FROM `zz_modules`) `t2` ON (`t1`.`name` = 'Strumenti') SET `t1`.`order` = `t2`.`order`+1; - ALTER TABLE `zz_modules` DROP `level`; UPDATE `zz_modules` SET `options` = 'menu' WHERE `options` = ''; @@ -934,12 +932,9 @@ UPDATE `co_iva` SET `dicitura` = 'Operazione soggetta a reverse charge ex art. 1 ALTER TABLE `co_pagamenti` ADD `idconto_vendite` int(11), ADD `idconto_acquisti` int(11); -- Aggiunta del modulo Stampe contabili -INSERT INTO `zz_modules` (`id`, `name`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`) VALUES (NULL, 'Stampe contabili', 'stampe_contabili', 'custom', '', 'fa fa-angle-right', '2.3', '2.3', '1', 1, '1', '1'); +INSERT INTO `zz_modules` (`id`, `name`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`) VALUES (NULL, 'Stampe contabili', 'stampe_contabili', 'custom', '', 'fa fa-angle-right', '2.3', '2.3', '1', NULL, '1', '1'); UPDATE `zz_modules` `t1` INNER JOIN `zz_modules` `t2` ON (`t1`.`name` = 'Stampe contabili' AND `t2`.`name` = 'Contabilità') SET `t1`.`parent` = `t2`.`id`; --- Impostazione dei titoli di default -UPDATE `zz_modules` SET `title` = `name` WHERE `title` = ''; - -- Aggiunta del campo per introdurre l'help nei widget ALTER TABLE `zz_widgets` ADD `help` varchar(255); @@ -951,3 +946,12 @@ ALTER TABLE `zz_widgets` ADD `help` varchar(255); INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`) VALUES ('Google Maps API key', '', 'string', '1', 'Generali'); ALTER TABLE `an_anagrafiche` ADD `gaddress` varchar(255), ADD `lat` float(10, 5), ADD `lng` float(10, 5); + +-- Aggiunta del modulo Statistiche +INSERT INTO `zz_modules` (`id`, `name`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`) VALUES (NULL, 'Statistiche', 'statistiche', 'custom', '', 'fa fa-bar-chart', '2.3', '2.3', '1', NULL, '1', '1'); + +UPDATE `zz_modules` `t1` INNER JOIN (SELECT MAX(`order`) AS `order` FROM `zz_modules`) `t2` ON (`t1`.`name` = 'Statistiche') SET `t1`.`order` = `t2`.`order`+1; +UPDATE `zz_modules` `t1` INNER JOIN (SELECT MAX(`order`) AS `order` FROM `zz_modules`) `t2` ON (`t1`.`name` = 'Strumenti') SET `t1`.`order` = `t2`.`order`+1; + +-- Impostazione dei titoli di default +UPDATE `zz_modules` SET `title` = `name` WHERE `title` = '';