1<?php 2/* Copyright (C) 2019 Laurent Destailleur <eldy@users.sourceforge.net> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <https://www.gnu.org/licenses/>. 16 */ 17 18/** 19 * \file htdocs/ticket/stats/index.php 20 * \ingroup ticket 21 * \brief Page with tickets statistics 22 */ 23 24require '../../main.inc.php'; 25require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php'; 26require_once DOL_DOCUMENT_ROOT.'/ticket/class/ticketstats.class.php'; 27require_once DOL_DOCUMENT_ROOT.'/ticket/class/ticket.class.php'; 28require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php'; 29 30$WIDTH = DolGraph::getDefaultGraphSizeForStats('width'); 31$HEIGHT = DolGraph::getDefaultGraphSizeForStats('height'); 32 33if (!$user->rights->ticket->read) { 34 accessforbidden(); 35} 36 37$object_status = GETPOST('object_status', 'intcomma'); 38 39$userid = GETPOST('userid', 'int'); 40$socid = GETPOST('socid', 'int'); 41// Security check 42if ($user->socid > 0) { 43 $action = ''; 44 $socid = $user->socid; 45} 46 47$nowyear = strftime("%Y", dol_now()); 48$year = GETPOST('year') > 0 ? GETPOST('year', 'int') : $nowyear; 49$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS))); 50$endyear = $year; 51 52// Load translation files required by the page 53$langs->loadLangs(array('orders', 'companies', 'other', 'tickets')); 54 55 56/* 57 * View 58 */ 59 60$form = new Form($db); 61$object = new Ticket($db); 62 63$title = $langs->trans("Statistics"); 64$dir = $conf->ticket->dir_temp; 65 66llxHeader('', $title); 67 68print load_fiche_titre($title, '', 'ticket'); 69 70dol_mkdir($dir); 71 72$stats = new TicketStats($db, $socid, ($userid > 0 ? $userid : 0)); 73if ($object_status != '' && $object_status >= -1) { 74 $stats->where .= ' AND fk_statut IN ('.$db->sanitize($db->escape($object_status)).')'; 75} 76 77 78// Build graphic number of object 79$data = $stats->getNbByMonthWithPrevYear($endyear, $startyear); 80 81//var_dump($data); 82// $data = array(array('Lib',val1,val2,val3),...) 83 84 85if (!$user->rights->societe->client->voir || $user->socid) { 86 $filenamenb = $dir.'/ticketsnbinyear-'.$user->id.'-'.$year.'.png'; 87 $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=ticketstats&file=ticketsnbinyear-'.$user->id.'-'.$year.'.png'; 88} else { 89 $filenamenb = $dir.'/ticketsnbinyear-'.$year.'.png'; 90 $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=ticketstats&file=ticketsnbinyear-'.$year.'.png'; 91} 92 93$px1 = new DolGraph(); 94$mesg = $px1->isGraphKo(); 95if (!$mesg) { 96 $px1->SetData($data); 97 $i = $startyear; $legend = array(); 98 while ($i <= $endyear) { 99 $legend[] = $i; 100 $i++; 101 } 102 $px1->SetLegend($legend); 103 $px1->SetMaxValue($px1->GetCeilMaxValue()); 104 $px1->SetMinValue(min(0, $px1->GetFloorMinValue())); 105 $px1->SetWidth($WIDTH); 106 $px1->SetHeight($HEIGHT); 107 $px1->SetYLabel($langs->trans("NbOfTicket")); 108 $px1->SetShading(3); 109 $px1->SetHorizTickIncrement(1); 110 $px1->mode = 'depth'; 111 $px1->SetTitle($langs->trans("NumberOfTicketsByMonth")); 112 113 $px1->draw($filenamenb, $fileurlnb); 114} 115 116// Build graphic amount of object 117$data = $stats->getAmountByMonthWithPrevYear($endyear, $startyear); 118//var_dump($data); 119// $data = array(array('Lib',val1,val2,val3),...) 120 121if (!$user->rights->societe->client->voir || $user->socid) { 122 $filenameamount = $dir.'/ticketsamountinyear-'.$user->id.'-'.$year.'.png'; 123 $fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=ticketstats&file=ticketsamountinyear-'.$user->id.'-'.$year.'.png'; 124} else { 125 $filenameamount = $dir.'/ticketsamountinyear-'.$year.'.png'; 126 $fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=ticketstats&file=ticketsamountinyear-'.$year.'.png'; 127} 128 129$px2 = new DolGraph(); 130$mesg = $px2->isGraphKo(); 131if (!$mesg) { 132 $px2->SetData($data); 133 $i = $startyear; $legend = array(); 134 while ($i <= $endyear) { 135 $legend[] = $i; 136 $i++; 137 } 138 $px2->SetLegend($legend); 139 $px2->SetMaxValue($px2->GetCeilMaxValue()); 140 $px2->SetMinValue(min(0, $px2->GetFloorMinValue())); 141 $px2->SetWidth($WIDTH); 142 $px2->SetHeight($HEIGHT); 143 $px2->SetYLabel($langs->trans("AmountOfTickets")); 144 $px2->SetShading(3); 145 $px2->SetHorizTickIncrement(1); 146 $px2->mode = 'depth'; 147 $px2->SetTitle($langs->trans("AmountOfTicketsByMonthHT")); 148 149 $px2->draw($filenameamount, $fileurlamount); 150} 151 152 153$data = $stats->getAverageByMonthWithPrevYear($endyear, $startyear); 154 155if (!$user->rights->societe->client->voir || $user->socid) { 156 $filename_avg = $dir.'/ticketsaverage-'.$user->id.'-'.$year.'.png'; 157 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=ticketstats&file=ticketsaverage-'.$user->id.'-'.$year.'.png'; 158} else { 159 $filename_avg = $dir.'/ticketsaverage-'.$year.'.png'; 160 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=ticketstats&file=ticketsaverage-'.$year.'.png'; 161} 162 163$px3 = new DolGraph(); 164$mesg = $px3->isGraphKo(); 165if (!$mesg) { 166 $px3->SetData($data); 167 $i = $startyear; $legend = array(); 168 while ($i <= $endyear) { 169 $legend[] = $i; 170 $i++; 171 } 172 $px3->SetLegend($legend); 173 $px3->SetYLabel($langs->trans("AmountAverage")); 174 $px3->SetMaxValue($px3->GetCeilMaxValue()); 175 $px3->SetMinValue($px3->GetFloorMinValue()); 176 $px3->SetWidth($WIDTH); 177 $px3->SetHeight($HEIGHT); 178 $px3->SetShading(3); 179 $px3->SetHorizTickIncrement(1); 180 $px3->mode = 'depth'; 181 $px3->SetTitle($langs->trans("AmountAverage")); 182 183 $px3->draw($filename_avg, $fileurl_avg); 184} 185 186 187 188// Show array 189$data = $stats->getAllByYear(); 190$arrayyears = array(); 191foreach ($data as $val) { 192 if (!empty($val['year'])) { 193 $arrayyears[$val['year']] = $val['year']; 194 } 195} 196if (!count($arrayyears)) { 197 $arrayyears[$nowyear] = $nowyear; 198} 199 200$h = 0; 201$head = array(); 202$head[$h][0] = DOL_URL_ROOT.'/ticket/stats/index.php'; 203$head[$h][1] = $langs->trans("ByMonthYear"); 204$head[$h][2] = 'byyear'; 205$h++; 206 207$type = 'ticket_stats'; 208 209complete_head_from_modules($conf, $langs, null, $head, $h, $type); 210 211print dol_get_fiche_head($head, 'byyear', $langs->trans("Statistics"), -1); 212 213 214print '<div class="fichecenter"><div class="fichethirdleft">'; 215 216 217// Show filter box 218print '<form name="stats" method="POST" action="'.$_SERVER["PHP_SELF"].'">'; 219print '<input type="hidden" name="token" value="'.newToken().'">'; 220 221print '<table class="noborder centpercent">'; 222print '<tr class="liste_titre"><td class="liste_titre" colspan="2">'.$langs->trans("Filter").'</td></tr>'; 223// Company 224print '<tr><td class="left">'.$langs->trans("ThirdParty").'</td><td class="left">'; 225print img_picto('', 'company', 'class="pictofixedwidth"'); 226print $form->select_company($socid, 'socid', '', 1, 0, 0, array(), 0, 'widthcentpercentminusx maxwidth300', ''); 227print '</td></tr>'; 228// User 229print '<tr><td class="left">'.$langs->trans("CreatedBy").'</td><td class="left">'; 230print img_picto('', 'user', 'class="pictofixedwidth"'); 231print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300'); 232// Status 233print '<tr><td class="left">'.$langs->trans("Status").'</td><td class="left">'; 234$liststatus = $object->fields['fk_statut']['arrayofkeyval']; 235print $form->selectarray('object_status', $liststatus, GETPOST('object_status', 'intcomma'), -4, 0, 0, '', 1); 236print '</td></tr>'; 237// Year 238print '<tr><td class="left">'.$langs->trans("Year").'</td><td class="left">'; 239if (!in_array($year, $arrayyears)) { 240 $arrayyears[$year] = $year; 241} 242if (!in_array($nowyear, $arrayyears)) { 243 $arrayyears[$nowyear] = $nowyear; 244} 245arsort($arrayyears); 246print $form->selectarray('year', $arrayyears, $year, 0); 247print '</td></tr>'; 248print '<tr><td class="center" colspan="2"><input type="submit" name="submit" class="button small" value="'.$langs->trans("Refresh").'"></td></tr>'; 249print '</table>'; 250print '</form>'; 251print '<br><br>'; 252 253 254print '<div class="div-table-responsive-no-min">'; 255print '<table class="noborder centpercent">'; 256print '<tr class="liste_titre" height="24">'; 257print '<td class="center">'.$langs->trans("Year").'</td>'; 258print '<td class="right">'.$langs->trans("NbOfTickets").'</td>'; 259print '<td class="right">%</td>'; 260//print '<td class="right">'.$langs->trans("AmountTotal").'</td>'; 261//print '<td class="right">%</td>'; 262//print '<td class="right">'.$langs->trans("AmountAverage").'</td>'; 263//print '<td class="right">%</td>'; 264print '</tr>'; 265 266$oldyear = 0; 267foreach ($data as $val) { 268 $year = $val['year']; 269 while (!empty($year) && $oldyear > $year + 1) { // If we have empty year 270 $oldyear--; 271 272 print '<tr class="oddeven" height="24">'; 273 print '<td class="center"><a href="'.$_SERVER["PHP_SELF"].'?year='.$oldyear.($socid > 0 ? '&socid='.$socid : '').($userid > 0 ? '&userid='.$userid : '').'">'.$oldyear.'</a></td>'; 274 print '<td class="right">0</td>'; 275 print '<td class="right"></td>'; 276 //print '<td class="right">0</td>'; 277 //print '<td class="right"></td>'; 278 //print '<td class="right">0</td>'; 279 //print '<td class="right"></td>'; 280 print '</tr>'; 281 } 282 283 284 print '<tr class="oddeven" height="24">'; 285 print '<td class="center"><a href="'.$_SERVER["PHP_SELF"].'?year='.$year.($socid > 0 ? '&socid='.$socid : '').($userid > 0 ? '&userid='.$userid : '').'">'.$year.'</a></td>'; 286 print '<td class="right">'.$val['nb'].'</td>'; 287 print '<td class="right" style="'.(($val['nb_diff'] >= 0) ? 'color: green;' : 'color: red;').'">'.round($val['nb_diff']).'</td>'; 288 //print '<td class="right">'.price(price2num($val['total'], 'MT'), 1).'</td>'; 289 //print '<td class="right" style="'.(($val['total_diff'] >= 0) ? 'color: green;':'color: red;').'">'.round($val['total_diff']).'</td>'; 290 //print '<td class="right">'.price(price2num($val['avg'], 'MT'), 1).'</td>'; 291 //print '<td class="right" style="'.(($val['avg_diff'] >= 0) ? 'color: green;':'color: red;').'">'.round($val['avg_diff']).'</td>'; 292 print '</tr>'; 293 $oldyear = $year; 294} 295 296print '</table>'; 297print '</div>'; 298 299 300print '</div><div class="fichetwothirdright"><div class="ficheaddleft">'; 301 302 303// Show graphs 304print '<table class="border centpercent"><tr class="pair nohover"><td class="center">'; 305if ($mesg) { 306 print $mesg; 307} else { 308 print $px1->show(); 309 print "<br>\n"; 310 //print $px2->show(); 311 //print "<br>\n"; 312 //print $px3->show(); 313} 314print '</td></tr></table>'; 315 316 317print '</div></div></div>'; 318print '<div style="clear:both"></div>'; 319 320print dol_get_fiche_end(); 321 322// End of page 323llxFooter(); 324$db->close(); 325