Aggiunto modulo per le statistiche di base

This commit is contained in:
Thomas Zilio 2017-09-18 15:45:47 +02:00
parent 88e9eb3e13
commit f2463b5d5b
4 changed files with 294 additions and 6 deletions

View File

@ -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');
});

View File

@ -0,0 +1,271 @@
<?php
include_once __DIR__.'/../../core.php';
echo '
<script src="'.$rootdir.'/assets/dist/js/chartjs/Chart.min.js"></script>';
$start = $_SESSION['period_start'];
$end = $_SESSION['period_end'];
echo '
<h3 class="text-center">
<span class="label label-primary">'.tr('Periodo dal _START_ al _END_', [
'_START_' => Translator::dateToLocale($start),
'_END_' => Translator::dateToLocale($end),
]).'</span>
</h3>
<hr>
<script>
$(document).ready(function() {
start = moment("'.$start.'");
end = moment("'.$end.'");
months = [];
while(start.isSameOrBefore(end, "month")){
string = start.format("MMMM YYYY");
months.push(string.charAt(0).toUpperCase() + string.slice(1));
start.add(1, "months");
}
});
</script>';
// 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 '
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Fatturato').'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-minus"></i>
</button>
</div>
</div>
<canvas class="box-body collapse in" id="fatturato"></canvas>
</div>';
// Script per il grafico del fatturato
echo '
<script>
$(document).ready(function() {
new Chart(document.getElementById("fatturato").getContext("2d"), {
type: "bar",
data: {
labels: months,
datasets: [
{
label: "'.tr('Fatturato').'",
backgroundColor: "yellow",
data: [
'.implode(',', array_column($fatturato, 'totale')).'
]
},
{
label: "'.tr('Entrate').'",
backgroundColor: "green",
data: [
'.implode(',', array_column($entrate, 'totale')).'
]
},
{
label: "'.tr('Uscite').'",
backgroundColor: "red",
data: [
'.implode(',', array_column($uscite, 'totale')).'
]
}
]
},
options: {
responsive: true,
legend: {
position: "bottom",
},
}
});
});
</script>';
// 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 '
<div class="row">
<div class="col-xs-12 col-md-6">
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Clienti TOP').'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-minus"></i>
</button>
</div>
</div>
<div class="box-body collapse in">';
if (!empty($clienti)) {
echo '
<ul>';
foreach ($clienti as $cliente) {
echo '
<li>'.Modules::link('Anagrafiche', $cliente['idanagrafica'], tr('_PERSON_, con _TOT_ fatture', [
'_PERSON_' => $cliente['ragione_sociale'],
'_TOT_' => intval($cliente['qta']),
])).'
<span class="label label-success pull-right">'.Translator::numberToLocale($cliente['totale']).' &euro;</span>
</li>';
}
echo '
</ul>';
} else {
echo '
<p>'.tr('Nessun articolo è stato venduto').'...</p>';
}
echo '
</div>
</div>
</div>';
// 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 '
<div class="col-xs-12 col-md-6">
<div class="box box-danger">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Articoli più venduti').'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-minus"></i>
</button>
</div>
</div>
<div class="box-body collapse in">';
if (!empty($articoli)) {
echo '
<ul>';
foreach ($articoli as $articolo) {
echo '
<li>'.Modules::link('Articoli', $articolo['id'], $articolo['codice'].' - '.$articolo['descrizione']).'
<span class="label label-info pull-right">'.Translator::numberToLocale($articolo['qta']).' '.$articolo['um'].'</span>
</li>';
}
echo '
</ul>';
} else {
echo '
<p>'.tr('Nessun articolo è stato venduto').'...</p>';
}
echo '
</div>
</div>
</div>
</div>';
// 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 '
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Interventi per stato').'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-minus"></i>
</button>
</div>
</div>
<canvas class="box-body collapse in" id="interventi"></canvas>
</div>';
// Script per il grafico del fatturato
echo '
<script>
$(document).ready(function() {
new Chart(document.getElementById("interventi").getContext("2d"), {
type: "bar",
data: {
labels: months,
datasets: [
'.$dataset.'
]
},
options: {
responsive: true,
legend: {
position: "bottom",
},
}
});
});
</script>';

View File

@ -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",

View File

@ -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` = '';