2017-09-18 15:45:47 +02:00
< ? php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager : il software gestionale open source per l ' assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright ( C ) DevCode s . r . l .
2020-09-07 15:04:06 +02:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*/
2017-09-18 15:45:47 +02:00
include_once __DIR__ . '/../../core.php' ;
2019-07-05 17:26:58 +02:00
use Modules\Statistiche\Stats ;
2017-09-18 15:45:47 +02:00
echo '
2022-07-07 15:31:53 +02:00
< script src = " '.base_path().'/assets/dist/js/chartjs/chart.min.js " ></ script >
2022-07-02 20:46:18 +02:00
< script src = " '. $structure->fileurl ('js/functions.js').' " ></ script >
< script src = " '. $structure->fileurl ('js/calendar.js').' " ></ script >
< script src = " '. $structure->fileurl ('js/manager.js').' " ></ script >
< script src = " '. $structure->fileurl ('js/stat.js').' " ></ script >
< script src = " '. $structure->fileurl ('js/stats/line_chart.js').' " ></ script > ' ;
2017-09-18 15:45:47 +02:00
$start = $_SESSION [ 'period_start' ];
$end = $_SESSION [ 'period_end' ];
echo '
2019-07-11 12:04:22 +02:00
< div class = " box box-warning " >
< div class = " box-header " >
< h4 class = " box-title " >
'.tr(' Periodi temporali ').'
</ h4 >
< div class = " box-tools pull-right " >
< button class = " btn btn-warning btn-xs " onclick = " add_calendar() " >
< i class = " fa fa-plus " ></ i > '.tr(' Aggiungi periodo ').'
</ button >
< button type = " button " class = " btn btn-box-tool " data - widget = " collapse " >
< i class = " fa fa-minus " ></ i >
</ button >
</ div >
</ div >
2020-07-31 14:25:50 +02:00
2019-07-11 12:04:22 +02:00
< div class = " box-body collapse in " id = " calendars " >
2020-07-31 14:25:50 +02:00
2019-07-11 12:04:22 +02:00
</ div >
</ div > ' ;
2017-09-18 15:45:47 +02:00
// Fatturato
echo '
< div class = " box box-success " >
< div class = " box-header with-border " >
2017-12-05 00:58:10 +01:00
< h3 class = " box-title " > '.tr(' Vendite e acquisti ').' </ h3 >
2017-09-18 15:45:47 +02:00
< 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 >
2017-12-05 01:19:40 +01:00
< canvas class = " box-body collapse in " id = " fatturato " height = " 100 " ></ canvas >
2017-09-18 15:45:47 +02:00
</ div > ' ;
// Script per il grafico del fatturato
echo '
< script >
2019-07-11 12:04:22 +02:00
start = moment ( " '. $start .' " );
end = moment ( " '. $end .' " );
months = get_months ( start , end );
var chart_options = {
type : " line " ,
data : {
labels : [],
datasets : [],
},
options : {
responsive : true ,
tooltips : {
callbacks : {
label : function ( tooltipItem , data ) {
var dataset = data . datasets [ tooltipItem . datasetIndex ];
var label = dataset . labels ? dataset . labels [ tooltipItem . index ] : " " ;
if ( label ) {
label += " : " ;
}
2020-07-31 14:25:50 +02:00
2019-07-11 12:04:22 +02:00
label += tooltipItem . yLabel ;
2020-07-31 14:25:50 +02:00
2019-07-11 12:04:22 +02:00
return label ;
2017-09-18 15:45:47 +02:00
}
2019-07-11 12:04:22 +02:00
}
2017-09-18 15:45:47 +02:00
},
2020-07-20 09:15:44 +02:00
elements : {
line : {
tension : 0
}
},
2020-07-09 18:50:10 +02:00
annotation : {
annotations : [{
type : " line " ,
mode : " horizontal " ,
scaleID : " y-axis-0 " ,
value : 0 ,
label : {
enabled : false ,
}
}]
},
hover : {
mode : " nearest " ,
intersect : false
},
2019-07-11 12:04:22 +02:00
scales : {
2023-09-06 17:37:44 +02:00
x : {
2020-07-09 18:50:10 +02:00
display : true ,
scaleLabel : {
display : true ,
2020-07-16 16:49:36 +02:00
labelString : " '.tr('Periodo').' "
2020-07-09 18:50:10 +02:00
}
2023-09-06 17:37:44 +02:00
},
y : {
2020-07-09 18:50:10 +02:00
display : true ,
scaleLabel : {
display : true ,
2020-07-16 16:49:36 +02:00
labelString : " '.tr('Andamento').' "
2020-07-09 18:50:10 +02:00
},
2019-07-11 12:04:22 +02:00
ticks : {
// Include a dollar sign in the ticks
callback : function ( value , index , values ) {
2020-05-15 18:51:27 +02:00
return \ '' . html_entity_decode ( currency ()) . ' \ ' + value ;
2019-07-11 12:04:22 +02:00
}
}
2023-09-06 17:37:44 +02:00
}
2019-07-11 12:04:22 +02:00
},
}
};
// Inzializzazione manager
var info = {
url : " '.str_replace('edit.php', '', $structure->fileurl ('edit.php')).' " ,
id_module : globals . id_module ,
id_record : globals . id_record ,
start_date : globals . start_date ,
end_date : globals . end_date ,
}
var manager = new Manager ( info );
var chart_fatturato , chart_acquisti ;
2020-07-31 14:25:50 +02:00
$ ( document ) . ready ( function () {
2019-07-11 12:04:22 +02:00
var fatturato_canvas = document . getElementById ( " fatturato " ) . getContext ( " 2d " );
//var acquisti_canvas = document.getElementById("acquisti").getContext("2d");
2020-07-31 14:25:50 +02:00
2019-07-11 12:04:22 +02:00
chart_fatturato = new Chart ( fatturato_canvas , chart_options );
//chart_acquisti = new Chart(fatturato_canvas, chart_options);
2020-07-31 14:25:50 +02:00
2019-07-11 12:04:22 +02:00
add_calendar ();
2017-09-18 15:45:47 +02:00
});
2019-07-11 12:04:22 +02:00
function init_calendar ( calendar ) {
var fatturato = new LineChart ( calendar , " actions.php " , { op : " fatturato " }, chart_fatturato );
var acquisti = new LineChart ( calendar , " actions.php " , { op : " acquisti " }, chart_fatturato );
calendar . addElement ( fatturato );
calendar . addElement ( acquisti );
}
2017-09-18 15:45:47 +02:00
</ script > ' ;
// Clienti top
2022-07-15 12:22:34 +02:00
$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 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.descrizione = 'Pagato' OR co_statidocumento.descrizione = 'Parzialmente pagato' OR co_statidocumento.descrizione = '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' );
2017-09-18 15:45:47 +02:00
2022-07-15 12:22:34 +02:00
$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 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.descrizione = 'Pagato' OR co_statidocumento.descrizione = 'Parzialmente pagato' OR co_statidocumento.descrizione = 'Emessa') AND co_tipidocumento.dir='entrata' AND co_documenti.data BETWEEN " . prepare ( $start ) . ' AND ' . prepare ( $end ) . ' AND zz_segments.autofatture=0' );
2017-09-18 18:11:19 +02:00
2017-09-18 15:45:47 +02:00
echo '
< div class = " row " >
2018-02-20 16:46:23 +01:00
< div class = " col-md-6 " >
2017-09-18 15:45:47 +02:00
< div class = " box box-warning " >
< div class = " box-header with-border " >
2022-06-30 11:34:26 +02:00
< h3 class = " box-title " > '.tr(' I 20 clienti TOP per il periodo ').' : '.Translator::dateToLocale($start).' - '.Translator::dateToLocale($end).' </ h3 >
2017-09-18 15:45:47 +02:00
< 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 '
2017-09-18 18:11:19 +02:00
< table class = " table table-striped " >
< tr >
2020-04-07 16:21:38 +02:00
< th > '.tr(' Ragione sociale ').' </ th >
2022-06-30 11:34:26 +02:00
< th class = " text-right " width = " 100 " > '.tr(' N . fatture ').' </ th >
< th class = " text-right " width = " 120 " > '.tr(' Totale ').' < span class = " tip " title = " '.tr('Valori iva esclusa').' " > < i class = " fa fa-question-circle-o " aria - hidden = " true " ></ i ></ span ></ th >
2020-04-07 16:21:38 +02:00
< th class = " text-right " width = " 120 " > '.tr(' Percentuale ').' < span class = " tip " title = " '.tr('Incidenza sul fatturato').' " >& nbsp ; < i class = " fa fa-question-circle-o " aria - hidden = " true " ></ i ></ span ></ th >
2017-09-18 18:11:19 +02:00
</ tr > ' ;
2017-09-18 15:45:47 +02:00
foreach ( $clienti as $cliente ) {
echo '
2017-09-18 18:11:19 +02:00
< tr >
< td > '.Modules::link(' Anagrafiche ', $cliente[' idanagrafica '], $cliente[' ragione_sociale ']).' </ td >
2020-04-07 16:21:38 +02:00
< td class = " text-right " > '.intval($cliente[' qta ']).' </ td >
< td class = " text-right " > '.moneyFormat($cliente[' totale '], 2).' </ td >
2023-12-05 10:39:26 +01:00
< td class = " text-right " > '.Translator::numberToLocale($cliente[' totale '] * 100 / ($totale[0][' totale '] != 0 ? $totale[0][' totale '] : 1), 2).' %</ td >
2017-09-18 18:11:19 +02:00
</ tr > ' ;
2017-09-18 15:45:47 +02:00
}
echo '
2017-09-18 18:11:19 +02:00
</ table > ' ;
2017-09-18 15:45:47 +02:00
} else {
echo '
2019-06-26 11:42:11 +02:00
< p > '.tr(' Nessuna vendita ').' ...</ p > ' ;
2017-09-18 15:45:47 +02:00
}
echo '
</ div >
</ div >
</ div > ' ;
// Articoli più venduti
2022-07-15 12:22:34 +02:00
$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.descrizione, mg_articoli.um FROM co_documenti INNER JOIN co_statidocumento ON co_statidocumento.id = co_documenti.idstatodocumento 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.descrizione = 'Pagato' OR co_statidocumento.descrizione = 'Parzialmente pagato' OR co_statidocumento.descrizione = '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' );
2019-06-13 15:57:55 +02:00
2022-07-15 12:22:34 +02:00
$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 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.descrizione = 'Pagato' OR co_statidocumento.descrizione = 'Parzialmente pagato' OR co_statidocumento.descrizione = 'Emessa') AND co_documenti.data BETWEEN " . prepare ( $start ) . ' AND ' . prepare ( $end ) . ' AND zz_segments.autofatture=0' );
2017-09-18 15:45:47 +02:00
echo '
2018-02-20 16:46:23 +01:00
< div class = " col-md-6 " >
2017-09-18 15:45:47 +02:00
< div class = " box box-danger " >
< div class = " box-header with-border " >
2022-06-30 11:34:26 +02:00
< h3 class = " box-title " > '.tr(' I 20 articoli più venduti per il periodo ').' : '.Translator::dateToLocale($start).' - '.Translator::dateToLocale($end).' </ h3 >
2017-09-18 15:45:47 +02:00
< 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 '
2017-09-18 18:11:19 +02:00
< table class = " table table-striped " >
< tr >
2020-04-07 16:21:38 +02:00
< th > '.tr(' Articolo ').' </ th >
2022-06-30 11:34:26 +02:00
< th class = " text-right " width = " 100 " > '.tr(' N . articoli ').' < span class = " tip " title = " '.tr('Numero di articoli venduti').' " > < i class = " fa fa-question-circle-o " aria - hidden = " true " ></ i ></ span ></ th >
2022-06-30 10:34:16 +02:00
< th class = " text-right " width = " 120 " > '.tr(' Percentuale ').' < span class = " tip " title = " '.tr('Incidenza sul numero di articoli').' " > < i class = " fa fa-question-circle-o " aria - hidden = " true " ></ i ></ span ></ th >
2022-06-30 11:34:26 +02:00
< th class = " text-right " width = " 120 " > '.tr(' Totale ').' < span class = " tip " title = " '.tr('Valori iva esclusa').' " > < i class = " fa fa-question-circle-o " aria - hidden = " true " ></ i ></ span ></ th >
2017-09-18 18:11:19 +02:00
</ tr > ' ;
2017-09-18 15:45:47 +02:00
foreach ( $articoli as $articolo ) {
echo '
2017-09-18 18:11:19 +02:00
< tr >
2022-06-30 11:34:26 +02:00
< td >< div class = " shorten " > '.Modules::link(' Articoli ', $articolo[' id '], $articolo[' codice '].' - '.$articolo[' descrizione ']).' </ div ></ td >
2020-04-07 16:21:38 +02:00
< td class = " text-right " > '.Translator::numberToLocale($articolo[' qta '], ' qta ').' '.$articolo[' um '].' </ td >
2023-12-05 10:39:26 +01:00
< td class = " text-right " > '.Translator::numberToLocale($articolo[' qta '] * 100 / ($totale[0][' totale_qta '] != 0 ? $totale[0][' totale_qta '] : 1), 2).' %</ td >
2020-04-07 16:21:38 +02:00
< td class = " text-right " > '.moneyFormat($articolo[' totale '], 2).' </ td >
2017-09-18 18:11:19 +02:00
</ tr > ' ;
2017-09-18 15:45:47 +02:00
}
echo '
2017-09-18 18:11:19 +02:00
</ table > ' ;
2023-08-04 14:54:28 +02:00
echo " <br><p class='pull-right' > " . Modules :: link ( 'Articoli' , null , tr ( 'Vedi tutto...' ), null , null , false , 'tab_' . Plugins :: get ( 'Statistiche vendita' )[ 'id' ]) . '</p>' ;
2017-09-18 15:45:47 +02:00
} else {
echo '
2022-06-30 11:34:26 +02:00
< p > '.tr(' Nessun articolo venduto ').' ...</ p > ' ;
2017-09-18 15:45:47 +02:00
}
echo '
</ div >
</ div >
</ div >
</ div > ' ;
2022-01-04 22:22:16 +01:00
// Numero interventi per tipologia
2017-12-05 01:19:40 +01:00
$tipi = $dbo -> fetchArray ( 'SELECT * FROM `in_tipiintervento`' );
2017-09-18 15:45:47 +02:00
$dataset = '' ;
2017-12-05 01:19:40 +01:00
foreach ( $tipi as $tipo ) {
2022-10-11 10:28:25 +02:00
$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[' idtipointervento ']).' AND IFNULL (
sessioni . orario_fine ,
in_interventi . data_richiesta
) 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 ' );
2017-09-18 15:45:47 +02:00
2019-07-05 17:26:58 +02:00
$interventi = Stats :: monthly ( $interventi , $start , $end );
2017-09-18 15:45:47 +02:00
2024-01-15 15:30:45 +01:00
// Random color
2018-02-18 19:53:23 +01:00
$background = '#' . dechex ( rand ( 256 , 16777215 ));
2017-12-05 01:19:40 +01:00
2017-09-18 15:45:47 +02:00
$dataset .= ' {
2017-12-05 01:19:40 +01:00
label : " '. $tipo['descrizione'] .' " ,
backgroundColor : " '. $background .' " ,
2017-09-18 15:45:47 +02:00
data : [
2019-07-11 12:04:22 +02:00
'.implode(' , ', array_column($interventi, ' result ')).'
2017-09-18 15:45:47 +02:00
]
}, ' ;
}
echo '
< div class = " box box-info " >
< div class = " box-header with-border " >
2022-01-04 22:22:16 +01:00
< h3 class = " box-title " > '.tr(' Numero interventi per tipologia ').' </ h3 >
2017-09-18 15:45:47 +02:00
< 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 >
2022-01-04 22:22:16 +01:00
< canvas class = " box-body collapse in " id = " interventi_n_tipologia " height = " 100 " ></ canvas >
2017-09-18 15:45:47 +02:00
</ div > ' ;
2022-01-04 22:22:16 +01:00
// Script per il grafico del numero interventi per tipologia
2017-09-18 15:45:47 +02:00
echo '
< script >
$ ( document ) . ready ( function () {
2022-01-04 22:22:16 +01:00
new Chart ( document . getElementById ( " interventi_n_tipologia " ) . getContext ( " 2d " ), {
type : " bar " ,
data : {
labels : months ,
datasets : [
'.$dataset.'
]
},
options : {
responsive : true ,
legend : {
position : " bottom " ,
},
}
});
});
</ script > ' ;
// Ore interventi per tipologia
$dataset = '' ;
foreach ( $tipi as $tipo ) {
2022-10-11 10:28:25 +02:00
$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 [ 'idtipointervento' ]) . ' AND in_interventi.data_richiesta 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 ' );
2022-01-04 22:22:16 +01:00
$interventi = Stats :: monthly ( $interventi , $start , $end );
2024-01-15 15:30:45 +01:00
// Random color
2022-01-04 22:22:16 +01:00
$background = '#' . dechex ( rand ( 256 , 16777215 ));
$dataset .= ' {
label : " '. $tipo['descrizione'] .' " ,
backgroundColor : " '. $background .' " ,
data : [
'.implode(' , ', array_column($interventi, ' result ')).'
]
}, ' ;
}
echo '
< div class = " box box-info " >
< div class = " box-header with-border " >
< h3 class = " box-title " > '.tr(' Ore interventi per tipologia ').' </ 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_ore_tipologia " height = " 100 " ></ canvas >
</ div > ' ;
// Script per il grafico delle ore interventi per tipologia
echo '
< script >
$ ( document ) . ready ( function () {
new Chart ( document . getElementById ( " interventi_ore_tipologia " ) . getContext ( " 2d " ), {
2017-09-18 15:45:47 +02:00
type : " bar " ,
data : {
labels : months ,
datasets : [
'.$dataset.'
]
},
options : {
responsive : true ,
legend : {
position : " bottom " ,
},
}
});
});
</ script > ' ;
2020-12-17 14:42:58 +01:00
// Interventi per tecnico
2024-02-05 17:07:33 +01:00
$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(setting(' Lingua ' )) . " )
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` . `name` = 'Tecnico'
GROUP BY
`an_anagrafiche` . `idanagrafica`
ORDER BY
`ragione_sociale` ASC " );
2020-12-17 14:42:58 +01:00
$dataset = '' ;
2024-02-05 17:07:33 +01:00
$where = implode ( ',' , ( array ) json_decode ( $_SESSION [ 'superselect' ][ 'idtipiintervento' ])) != '' ? '`in_interventi_tecnici`.`idtipointervento` IN(' . implode ( ',' , ( array ) json_decode ( $_SESSION [ 'superselect' ][ 'idtipiintervento' ])) . ')' : '1=1' ;
2020-12-17 14:42:58 +01:00
foreach ( $tecnici as $tecnico ) {
2024-02-05 17:07:33 +01:00
$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`.`idstatointervento` 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' );
2021-02-18 18:48:44 +01:00
2020-12-17 14:42:58 +01:00
$sessioni = Stats :: monthly ( $sessioni , $start , $end );
2021-02-18 18:48:44 +01:00
2024-01-15 15:30:45 +01:00
// Colore tecnico
2021-06-28 15:06:30 +02:00
$background = strtoupper ( $tecnico [ 'colore' ]);
2021-02-18 18:48:44 +01:00
if ( empty ( $background ) || $background == '#FFFFFF' ) {
2024-01-15 15:30:45 +01:00
// Random color
2020-12-17 14:42:58 +01:00
$background = '#' . dechex ( rand ( 256 , 16777215 ));
}
$dataset .= ' {
label : " '. $tecnico['ragione_sociale'] .' " ,
backgroundColor : " '. $background .' " ,
data : [
'.implode(' , ', array_column($sessioni, ' result ')).'
],
}, ' ;
}
echo '
< div class = " box box-info " >
< div class = " box-header with-border " >
< h3 class = " box-title " > '.tr(' Ore di lavoro per tecnico ').' </ h3 >
2023-05-31 14:34:00 +02:00
< div class = " row " >
< div class = " col-md-3 pull-right " >
2023-08-04 14:54:28 +02:00
{[ " type " : " select " , " multiple " : " 1 " , " label " : " '.tr('Tipi attività').' " , " name " : " idtipiintervento[] " , " ajax-source " : " tipiintervento " , " value " : " '.implode(',', (array) json_decode( $_SESSION['superselect'] ['idtipiintervento'])).' " , " placeholder " : " Tutti " ]}
2023-05-31 14:34:00 +02:00
</ div >
</ div >
2020-12-17 14:42:58 +01:00
< 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 = " sessioni " height = " 100 " ></ canvas >
</ div > ' ;
// Script per il grafico ore interventi per tecnico
echo '
< script >
$ ( document ) . ready ( function () {
new Chart ( document . getElementById ( " sessioni " ) . getContext ( " 2d " ), {
2022-07-02 20:46:18 +02:00
type : " bar " ,
2020-12-17 14:42:58 +01:00
data : {
labels : months ,
datasets : [
2023-08-04 14:54:28 +02:00
'.($dataset ?: ' { label : " " , backgroundColor : " transparent " , data : [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] } ').'
2020-12-17 14:42:58 +01:00
]
},
options : {
responsive : true ,
2022-07-02 20:46:18 +02:00
indexAxis : " y " ,
2020-12-17 14:42:58 +01:00
legend : {
position : " bottom " ,
},
scales : {
2023-09-06 17:37:44 +02:00
x : {
2020-12-17 14:42:58 +01:00
ticks : {
// Include a dollar sign in the ticks
callback : function ( value , index , values ) {
var text = " " ;
2021-06-28 15:06:30 +02:00
if ( value <= 1 && value != 0 ){
2020-12-17 14:42:58 +01:00
text = " ora " ;
} else {
text = " ore " ;
}
return value + text ;
}
}
2023-09-06 17:37:44 +02:00
}
2020-12-17 14:42:58 +01:00
},
tooltips : {
callbacks : {
label : function ( tooltipItem , data ) {
var dataset = data . datasets [ tooltipItem . datasetIndex ];
var label = dataset . labels ? dataset . labels [ tooltipItem . index ] : " " ;
if ( label ) {
label += " : " ;
}
2021-06-28 15:06:30 +02:00
label += tooltipItem . xLabel ;
if ( tooltipItem . xLabel <= 1 ) {
label += " ora " ;
} else {
label += " ore " ;
}
label += " (in attività completate) " ;
2020-12-17 14:42:58 +01:00
return label ;
}
}
},
}
});
});
2021-02-18 18:48:44 +01:00
</ script > ' ;
2022-06-30 00:55:19 +02:00
$dataset = '' ;
2022-07-02 20:46:18 +02:00
2024-02-05 17:07:33 +01:00
$nuovi_clienti = $dbo -> fetchArray ( ' SELECT
COUNT ( * ) AS result ,
GROUP_CONCAT ( `an_anagrafiche` . `ragione_sociale` , " <br> " ) 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(setting(' Lingua ')).' )
WHERE
`an_tipianagrafiche_lang` . `name` = " 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` , " <br> " ) 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(setting(' Lingua ')).' )
WHERE
`an_tipianagrafiche_lang` . `name` = " 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 ' );
2022-07-02 20:46:18 +02:00
2024-01-15 15:30:45 +01:00
// Nuovi clienti per i quali ho emesso almeno una fattura di vendita
2024-02-05 17:07:33 +01:00
$clienti_acquisiti = $dbo -> fetchArray ( ' SELECT
COUNT ( * ) AS result ,
GROUP_CONCAT ( `an_anagrafiche` . `ragione_sociale` , " <br> " ) 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(setting(' Lingua ')).' )
WHERE
`an_tipianagrafiche_lang` . `name` = " 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 ' );
2022-06-30 00:55:19 +02:00
2024-01-15 15:30:45 +01:00
// Random color
2022-06-30 00:55:19 +02:00
$background = '#' . dechex ( rand ( 256 , 16777215 ));
$dataset .= ' {
2023-08-04 14:54:28 +02:00
label : " '.tr('Nuovi clienti').' " ,
2022-07-02 20:46:18 +02:00
backgroundColor : " '. $background .' " ,
data : [
'.implode(' , ', array_column($nuovi_clienti, ' result ')).'
]
}, ' ;
2024-01-15 15:30:45 +01:00
// Random color
2022-07-02 20:46:18 +02:00
$background = '#' . dechex ( rand ( 256 , 16777215 ));
$dataset .= ' {
2023-08-04 14:54:28 +02:00
label : " '.tr('Clienti acquisiti').' " ,
2022-06-30 00:55:19 +02:00
backgroundColor : " '. $background .' " ,
data : [
2022-07-02 20:46:18 +02:00
'.implode(' , ', array_column($clienti_acquisiti, ' result ')).'
2022-06-30 00:55:19 +02:00
]
}, ' ;
2024-01-15 15:30:45 +01:00
// Random color
2022-07-02 20:46:18 +02:00
$background = '#' . dechex ( rand ( 256 , 16777215 ));
$dataset .= ' {
2023-08-04 14:54:28 +02:00
label : " '.tr('Nuovi fornitori').' " ,
2022-07-02 20:46:18 +02:00
backgroundColor : " '. $background .' " ,
data : [
'.implode(' , ', array_column($nuovi_fornitori, ' result ')).'
]
}, ' ;
2022-06-30 00:55:19 +02:00
echo '
< div class = " box box-info " >
< div class = " box-header with-border " >
2022-07-02 20:46:18 +02:00
< h3 class = " box-title " > '.tr(' Nuove anagrafiche ').' </ h3 >
2022-06-30 00:55:19 +02:00
< 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 >
2022-07-02 20:46:18 +02:00
< canvas class = " box-body collapse in " id = " n_anagrafiche " height = " 100 " ></ canvas >
2022-06-30 00:55:19 +02:00
</ div > ' ;
// Script per il grafico dei nuovi clienti per mese
echo '
< script >
$ ( document ) . ready ( function () {
2022-07-02 20:46:18 +02:00
new Chart ( document . getElementById ( " n_anagrafiche " ) . getContext ( " 2d " ), {
2022-06-30 00:55:19 +02:00
type : " line " ,
data : {
labels : months ,
datasets : [
'.$dataset.'
]
},
options : {
responsive : true ,
elements : {
line : {
tension : 0
}
},
annotation : {
annotations : [{
type : " line " ,
mode : " horizontal " ,
scaleID : " y-axis-0 " ,
value : 0 ,
label : {
enabled : false ,
}
}]
},
hover : {
mode : " nearest " ,
intersect : false
},
scales : {
2023-09-06 17:37:44 +02:00
x : {
2022-06-30 00:55:19 +02:00
display : true ,
scaleLabel : {
display : true ,
labelString : " '.tr('Periodo').' "
}
2023-09-06 17:37:44 +02:00
},
y : {
2022-06-30 00:55:19 +02:00
display : true ,
scaleLabel : {
display : true ,
labelString : " '.tr('Numero').' "
},
ticks : {
callback : function ( value , index , values ) {
return value ;
}
}
2023-09-06 17:37:44 +02:00
}
2022-06-30 00:55:19 +02:00
},
}
});
});
2022-06-30 11:34:26 +02:00
</ script >
< script type = " text/javascript " >
$ ( " .shorten " ) . shorten ({
moreText : " '.tr('Mostra tutto').' " ,
lessText : " '.tr('Comprimi').' " ,
showChars : 70
});
2023-05-31 14:34:00 +02:00
$ ( " #idtipiintervento " ) . change ( function (){
let idtipi = JSON . stringify ( $ ( this ) . val ());
session_set ( " superselect,idtipiintervento " , idtipi , 0 );
location . reload ();
});
2023-08-04 14:54:28 +02:00
</ script > ' ;