dolibarr 19.0.3
index.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2003-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (c) 2004-2012 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2012 Marcos García <marcosgdf@gmail.com>
5 * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
27// Load Dolibarr environment
28require '../../main.inc.php';
29require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
30require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereportstats.class.php';
31
32// Load translation files required by the page
33$langs->loadLangs(array('trips', 'companies'));
34
37
38$mode = GETPOSTISSET("mode") ? GETPOST("mode", 'aZ09') : 'customer';
39$object_status = GETPOST('object_status', 'intcomma');
40
41$userid = GETPOST('userid', 'int');
42$socid = GETPOST('socid', 'int'); if ($socid < 0) {
43 $socid = 0;
44}
45$id = GETPOST('id', 'int');
46
47// Security check
48if ($user->socid > 0) {
49 $action = '';
50 $socid = $user->socid;
51}
52if ($user->socid) {
53 $socid = $user->socid;
54}
55$result = restrictedArea($user, 'expensereport', $id, '');
56
57$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
58$year = GETPOST('year') > 0 ? GETPOST('year', 'int') : $nowyear;
59$startyear = $year - (!getDolGlobalString('MAIN_STATS_GRAPHS_SHOW_N_YEARS') ? 2 : max(1, min(10, getDolGlobalString('MAIN_STATS_GRAPHS_SHOW_N_YEARS'))));
60$endyear = $year;
61
62
63
64/*
65 * View
66 */
67
68$form = new Form($db);
69$tmpexpensereport = new ExpenseReport($db);
70
71$title = $langs->trans("TripsAndExpensesStatistics");
72$dir = $conf->expensereport->dir_temp;
73
74llxHeader('', $title);
75
76print load_fiche_titre($title, '', 'trip');
77
78dol_mkdir($dir);
79
80$stats = new ExpenseReportStats($db, $socid, $userid);
81if ($object_status != '' && $object_status >= -1) {
82 $stats->where .= ' AND e.fk_statut IN ('.$db->sanitize($db->escape($object_status)).')';
83}
84
85// Build graphic number of object
86// $data = array(array('Lib',val1,val2,val3),...)
87//print "$endyear, $startyear";
88$data = $stats->getNbByMonthWithPrevYear($endyear, $startyear);
89//var_dump($data);
90
91$filenamenb = $dir."/tripsexpensesnbinyear-".$year.".png";
92$fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=tripsexpensesstats&amp;file=tripsexpensesnbinyear-'.$year.'.png';
93
94$px1 = new DolGraph();
95$mesg = $px1->isGraphKo();
96if (!$mesg) {
97 $px1->SetData($data);
98 $i = $startyear;
99 $legend = array();
100 while ($i <= $endyear) {
101 $legend[] = $i;
102 $i++;
103 }
104 $px1->SetLegend($legend);
105 $px1->SetMaxValue($px1->GetCeilMaxValue());
106 $px1->SetWidth($WIDTH);
107 $px1->SetHeight($HEIGHT);
108 $px1->SetYLabel($langs->trans("Number"));
109 $px1->SetShading(3);
110 $px1->SetHorizTickIncrement(1);
111 $px1->mode = 'depth';
112 $px1->SetTitle($langs->trans("NumberByMonth"));
113
114 $px1->draw($filenamenb, $fileurlnb);
115}
116
117// Build graphic amount of object
118$data = $stats->getAmountByMonthWithPrevYear($endyear, $startyear);
119//var_dump($data);
120// $data = array(array('Lib',val1,val2,val3),...)
121
122$filenameamount = $dir."/tripsexpensesamountinyear-".$year.".png";
123$fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=tripsexpensesstats&amp;file=tripsexpensesamountinyear-'.$year.'.png';
124
125$px2 = new DolGraph();
126$mesg = $px2->isGraphKo();
127if (!$mesg) {
128 $px2->SetData($data);
129 $i = $startyear;
130 $legend = array();
131 while ($i <= $endyear) {
132 $legend[] = $i;
133 $i++;
134 }
135 $px2->SetLegend($legend);
136 $px2->SetMaxValue($px2->GetCeilMaxValue());
137 $px2->SetMinValue(min(0, $px2->GetFloorMinValue()));
138 $px2->SetWidth($WIDTH);
139 $px2->SetHeight($HEIGHT);
140 $px2->SetYLabel($langs->trans("Amount"));
141 $px2->SetShading(3);
142 $px2->SetHorizTickIncrement(1);
143 $px2->mode = 'depth';
144 $px2->SetTitle($langs->trans("AmountTotal"));
145
146 $px2->draw($filenameamount, $fileurlamount);
147}
148
149
150$data = $stats->getAverageByMonthWithPrevYear($endyear, $startyear);
151
152if (!$user->hasRight('societe', 'client', 'voir') || $user->socid) {
153 $filename_avg = $dir.'/ordersaverage-'.$user->id.'-'.$year.'.png';
154 if ($mode == 'customer') {
155 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstats&file=ordersaverage-'.$user->id.'-'.$year.'.png';
156 }
157 if ($mode == 'supplier') {
158 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstatssupplier&file=ordersaverage-'.$user->id.'-'.$year.'.png';
159 }
160} else {
161 $filename_avg = $dir.'/ordersaverage-'.$year.'.png';
162 if ($mode == 'customer') {
163 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstats&file=ordersaverage-'.$year.'.png';
164 }
165 if ($mode == 'supplier') {
166 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstatssupplier&file=ordersaverage-'.$year.'.png';
167 }
168}
169
170$px3 = new DolGraph();
171$mesg = $px3->isGraphKo();
172if (!$mesg) {
173 $px3->SetData($data);
174 $i = $startyear;
175 $legend = array();
176 while ($i <= $endyear) {
177 $legend[] = $i;
178 $i++;
179 }
180 $px3->SetLegend($legend);
181 $px3->SetYLabel($langs->trans("AmountAverage"));
182 $px3->SetMaxValue($px3->GetCeilMaxValue());
183 $px3->SetMinValue($px3->GetFloorMinValue());
184 $px3->SetWidth($WIDTH);
185 $px3->SetHeight($HEIGHT);
186 $px3->SetShading(3);
187 $px3->SetHorizTickIncrement(1);
188 $px3->mode = 'depth';
189 $px3->SetTitle($langs->trans("AmountAverage"));
190
191 $px3->draw($filename_avg, $fileurl_avg);
192}
193
194
195// Show array
196$data = $stats->getAllByYear();
197$arrayyears = array();
198foreach ($data as $val) {
199 $arrayyears[$val['year']] = $val['year'];
200}
201if (!count($arrayyears)) {
202 $arrayyears[$nowyear] = $nowyear;
203}
204
205
206$h = 0;
207$head = array();
208$head[$h][0] = DOL_URL_ROOT.'/expensereport/stats/index.php';
209$head[$h][1] = $langs->trans("ByMonthYear");
210$head[$h][2] = 'byyear';
211$h++;
212
213complete_head_from_modules($conf, $langs, null, $head, $h, 'trip_stats');
214
215print dol_get_fiche_head($head, 'byyear', $langs->trans("Statistics"), -1);
216
217
218print '<div class="fichecenter"><div class="fichethirdleft">';
219
220
221// Show filter box
222print '<form name="stats" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
223print '<input type="hidden" name="token" value="'.newToken().'">';
224print '<input type="hidden" name="mode" value="'.$mode.'">';
225
226print '<table class="noborder centpercent">';
227print '<tr class="liste_titre"><td class="liste_titre" colspan="2">'.$langs->trans("Filter").'</td></tr>';
228// Company
229/*
230print '<tr><td>'.$langs->trans("ThirdParty").'</td><td>';
231print $form->select_company($socid,'socid','',1,1,0,array(),0,'widthcentpercentminusx maxwidth300','');
232print '</td></tr>';
233*/
234// User
235print '<tr><td>'.$langs->trans("User").'</td><td>';
236$include = '';
237if (!$user->hasRight('expensereport', 'readall') && !$user->hasRight('expensereport', 'lire_tous')) {
238 $include = 'hierarchy';
239}
240print img_picto('', 'user', 'class="pictofixedwidth"');
241print $form->select_dolusers($userid, 'userid', 1, '', 0, $include, '', 0, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300');
242print '</td></tr>';
243// Status
244print '<tr><td class="left">'.$langs->trans("Status").'</td><td class="left">';
245$liststatus = $tmpexpensereport->labelStatus;
246print $form->selectarray('object_status', $liststatus, GETPOST('object_status', 'intcomma'), -4, 0, 0, '', 1);
247print '</td></tr>';
248// Year
249print '<tr><td>';
250print $form->textwithpicto($langs->trans("Year"), $langs->trans("DateValidation"));
251print '</td><td>';
252if (!in_array($year, $arrayyears)) {
253 $arrayyears[$year] = $year;
254}
255arsort($arrayyears);
256print $form->selectarray('year', $arrayyears, $year, 0, 0, 0, '', 0, 0, 0, '', 'width75');
257print '</td></tr>';
258print '<tr><td class="center" colspan="2"><input type="submit" name="submit" class="button small" value="'.$langs->trans("Refresh").'"></td></tr>';
259print '</table>';
260print '</form>';
261print '<br><br>';
262
263print '<div class="div-table-responsive-no-min">';
264print '<table class="noborder centpercent">';
265print '<tr class="liste_titre" height="24">';
266print '<td class="center">'.$langs->trans("Year").'</td>';
267print '<td class="right">'.$langs->trans("Number").'</td>';
268print '<td class="right">'.$langs->trans("AmountTotal").'</td>';
269print '<td class="right">'.$langs->trans("AmountAverage").'</td>';
270print '</tr>';
271
272$oldyear = 0;
273foreach ($data as $val) {
274 $year = $val['year'];
275 while ($year && $oldyear > $year + 1) { // If we have empty year
276 $oldyear--;
277
278 print '<tr class="oddeven" height="24">';
279 print '<td class="center"><a href="'.$_SERVER["PHP_SELF"].'?year='.$oldyear.'&amp;mode='.$mode.'">'.$oldyear.'</a></td>';
280 print '<td class="right">0</td>';
281 print '<td class="right amount nowraponall">0</td>';
282 print '<td class="right amount nowraponall">0</td>';
283 print '</tr>';
284 }
285
286
287 print '<tr class="oddeven" height="24">';
288 print '<td class="center"><a href="'.$_SERVER["PHP_SELF"].'?year='.$year.'&amp;mode='.$mode.'">'.$year.'</a></td>';
289 print '<td class="right">'.$val['nb'].'</td>';
290 print '<td class="right amount nowraponall">'.price(price2num($val['total'], 'MT'), 1).'</td>';
291 print '<td class="right amount nowraponall">'.price(price2num($val['avg'], 'MT'), 1).'</td>';
292 print '</tr>';
293 $oldyear = $year;
294}
295
296print '</table>';
297print '</div>';
298
299print '</div><div class="fichetwothirdright">';
300
301
302// Show graphs
303print '<table class="border centpercent"><tr class="pair nohover"><td class="center">';
304if ($mesg) {
305 print $mesg;
306} else {
307 print $px1->show();
308 print "<br>\n";
309 print $px2->show();
310 print "<br>\n";
311 print $px3->show();
312}
313print '</td></tr></table>';
314
315
316print '</div></div>';
317print '<div class="clearboth"></div>';
318
319
320print dol_get_fiche_end();
321
322// End of page
323llxFooter();
324$db->close();
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to build graphs.
static getDefaultGraphSizeForStats($direction, $defaultsize='')
getDefaultGraphSizeForStats
Class to manage Trips and Expenses.
Classe permettant la gestion des stats des expensereports et notes de frais.
Class to manage generation of HTML components Only common components must be here.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
complete_head_from_modules($conf, $langs, $object, &$head, &$h, $type, $mode='add', $filterorigmodule='')
Complete or removed entries into a head array (used to build tabs).
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.