dolibarr 18.0.6
index.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2011 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2012 Marcos García <marcosgdf@gmail.com>
6 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
7 * Copyright (C) 2020 Maxime DEMAREST <maxime@indelog.fr>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
29// Load Dolibarr environment
30require '../../../main.inc.php';
31require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propalestats.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
33require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/class/html.formpropal.class.php';
35require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
36require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
37
40
41$mode = GETPOSTISSET("mode") ? GETPOST("mode", 'aZ09') : 'customer';
42
43$object_status = GETPOST('object_status', 'intcomma');
44$typent_id = GETPOST('typent_id', 'int');
45$categ_id = GETPOST('categ_id', 'categ_id');
46
47$userid = GETPOST('userid', 'int');
48$socid = GETPOST('socid', 'int');
49// Security check
50if ($user->socid > 0) {
51 $action = '';
52 $socid = $user->socid;
53}
54
55$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
56$year = GETPOST('year') > 0 ? GETPOST('year', 'int') : $nowyear;
57$startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS)));
58$endyear = $year;
59
60// Load translation files required by the page
61$langs->loadLangs(array('orders', 'companies', 'other', 'suppliers', 'supplier_proposal'));
62
63if ($mode == 'customer' && !$user->rights->propal->lire) {
65}
66if ($mode == 'supplier' && !$user->rights->supplier_proposal->lire) {
68}
69
70
71/*
72 * View
73 */
74
75$form = new Form($db);
76$formpropal = new FormPropal($db);
77$formcompany = new FormCompany($db);
78$formother = new FormOther($db);
79
80$langs->loadLangs(array('propal', 'other', 'companies'));
81
82if ($mode == 'customer') {
83 $picto = 'propal';
84 $title = $langs->trans("ProposalsStatistics");
85 $dir = $conf->propal->dir_temp;
86 $cat_type = Categorie::TYPE_CUSTOMER;
87 $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("Customer"));
88}
89if ($mode == 'supplier') {
90 $picto = 'supplier_proposal';
91 $title = $langs->trans("ProposalsStatisticsSuppliers");
92 $dir = $conf->supplier_proposal->dir_temp;
93 $cat_type = Categorie::TYPE_SUPPLIER;
94 $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("Supplier"));
95}
96
97llxHeader('', $title);
98
99print load_fiche_titre($title, '', $picto);
100
101
102dol_mkdir($dir);
103
104
105$stats = new PropaleStats($db, $socid, ($userid > 0 ? $userid : 0), $mode, ($typent_id > 0 ? $typent_id : 0), ($categ_id > 0 ? $categ_id : 0));
106if ($object_status != '' && $object_status >= 0) {
107 $stats->where .= ' AND p.fk_statut IN ('.$db->sanitize($object_status).')';
108}
109
110// Build graphic number of object
111$data = $stats->getNbByMonthWithPrevYear($endyear, $startyear);
112// $data = array(array('Lib',val1,val2,val3),...)
113
114
115if (empty($user->rights->societe->client->voir) || $user->socid) {
116 $filenamenb = $dir.'/proposalsnbinyear-'.$user->id.'-'.$year.'.png';
117 $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=propalstats&file=proposalsnbinyear-'.$user->id.'-'.$year.'.png';
118} else {
119 $filenamenb = $dir.'/proposalsnbinyear-'.$year.'.png';
120 $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=propalstats&file=proposalsnbinyear-'.$year.'.png';
121}
122
123$px1 = new DolGraph();
124$mesg = $px1->isGraphKo();
125if (!$mesg) {
126 $px1->SetData($data);
127 $i = $startyear;
128 $legend = array();
129 while ($i <= $endyear) {
130 $legend[] = $i;
131 $i++;
132 }
133 $px1->SetLegend($legend);
134 $px1->SetMaxValue($px1->GetCeilMaxValue());
135 $px1->SetMinValue(min(0, $px1->GetFloorMinValue()));
136 $px1->SetWidth($WIDTH);
137 $px1->SetHeight($HEIGHT);
138 $px1->SetYLabel($langs->trans("NbOfProposals"));
139 $px1->SetShading(3);
140 $px1->SetHorizTickIncrement(1);
141 $px1->mode = 'depth';
142 $px1->SetTitle($langs->trans("NumberOfProposalsByMonth"));
143
144 $px1->draw($filenamenb, $fileurlnb);
145}
146
147// Build graphic amount of object
148$data = $stats->getAmountByMonthWithPrevYear($endyear, $startyear, 0);
149// $data = array(array('Lib',val1,val2,val3),...)
150
151if (empty($user->rights->societe->client->voir) || $user->socid) {
152 $filenameamount = $dir.'/proposalsamountinyear-'.$user->id.'-'.$year.'.png';
153 $fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=propalstats&file=proposalsamountinyear-'.$user->id.'-'.$year.'.png';
154} else {
155 $filenameamount = $dir.'/proposalsamountinyear-'.$year.'.png';
156 $fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=propalstats&file=proposalsamountinyear-'.$year.'.png';
157}
158
159$px2 = new DolGraph();
160$mesg = $px2->isGraphKo();
161if (!$mesg) {
162 $px2->SetData($data);
163 $i = $startyear;
164 $legend = array();
165 while ($i <= $endyear) {
166 $legend[] = $i;
167 $i++;
168 }
169 $px2->SetLegend($legend);
170 $px2->SetMaxValue($px2->GetCeilMaxValue());
171 $px2->SetMinValue(min(0, $px2->GetFloorMinValue()));
172 $px2->SetWidth($WIDTH);
173 $px2->SetHeight($HEIGHT);
174 $px2->SetYLabel($langs->trans("AmountOfProposals"));
175 $px2->SetShading(3);
176 $px2->SetHorizTickIncrement(1);
177 $px2->mode = 'depth';
178 $px2->SetTitle($langs->trans("AmountOfProposalsByMonthHT"));
179
180 $px2->draw($filenameamount, $fileurlamount);
181}
182
183$data = $stats->getAverageByMonthWithPrevYear($endyear, $startyear);
184
185$fileurl_avg = '';
186if (empty($user->rights->societe->client->voir) || $user->socid) {
187 $filename_avg = $dir.'/ordersaverage-'.$user->id.'-'.$year.'.png';
188 if ($mode == 'customer') {
189 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstats&file=ordersaverage-'.$user->id.'-'.$year.'.png';
190 }
191 if ($mode == 'supplier') {
192 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstatssupplier&file=ordersaverage-'.$user->id.'-'.$year.'.png';
193 }
194} else {
195 $filename_avg = $dir.'/ordersaverage-'.$year.'.png';
196 if ($mode == 'customer') {
197 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstats&file=ordersaverage-'.$year.'.png';
198 }
199 if ($mode == 'supplier') {
200 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstatssupplier&file=ordersaverage-'.$year.'.png';
201 }
202}
203
204$px3 = new DolGraph();
205$mesg = $px3->isGraphKo();
206if (!$mesg) {
207 $px3->SetData($data);
208 $i = $startyear;
209 $legend = array();
210 while ($i <= $endyear) {
211 $legend[] = $i;
212 $i++;
213 }
214 $px3->SetLegend($legend);
215 $px3->SetYLabel($langs->trans("AmountAverage"));
216 $px3->SetMaxValue($px3->GetCeilMaxValue());
217 $px3->SetMinValue($px3->GetFloorMinValue());
218 $px3->SetWidth($WIDTH);
219 $px3->SetHeight($HEIGHT);
220 $px3->SetShading(3);
221 $px3->SetHorizTickIncrement(1);
222 $px3->mode = 'depth';
223 $px3->SetTitle($langs->trans("AmountAverage"));
224
225 $px3->draw($filename_avg, $fileurl_avg);
226}
227
228
229// Show array
230$data = $stats->getAllByYear();
231$arrayyears = array();
232foreach ($data as $val) {
233 if (!empty($val['year'])) {
234 $arrayyears[$val['year']] = $val['year'];
235 }
236}
237if (!count($arrayyears)) {
238 $arrayyears[$nowyear] = $nowyear;
239}
240
241
242$h = 0;
243$head = array();
244$head[$h][0] = DOL_URL_ROOT.'/comm/propal/stats/index.php';
245$head[$h][1] = $langs->trans("ByMonthYear");
246$head[$h][2] = 'byyear';
247$h++;
248
249complete_head_from_modules($conf, $langs, null, $head, $h, 'propal_stats');
250
251print dol_get_fiche_head($head, 'byyear', $langs->trans("Statistics"), -1);
252
253
254print '<div class="fichecenter"><div class="fichethirdleft">';
255
256
257// Show filter box
258print '<form name="stats" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
259print '<input type="hidden" name="token" value="'.newToken().'">';
260print '<input type="hidden" name="mode" value="'.$mode.'">';
261
262print '<table class="noborder centpercent">';
263print '<tr class="liste_titre"><td class="liste_titre" colspan="2">'.$langs->trans("Filter").'</td></tr>';
264// Company
265print '<tr><td class="left">'.$langs->trans("ThirdParty").'</td><td class="left">';
266print img_picto('', 'company', 'class="pictofixedwidth"');
267$filter = '(s.client:IN:1,2,3)';
268print $form->select_company($socid, 'socid', $filter, 1, 0, 0, array(), 0, 'widthcentpercentminusx maxwidth300', '');
269print '</td></tr>';
270// ThirdParty Type
271print '<tr><td>'.$langs->trans("ThirdPartyType").'</td><td>';
272$sortparam_typent = (empty($conf->global->SOCIETE_SORT_ON_TYPEENT) ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT); // NONE means we keep sort of original array, so we sort on position. ASC, means next function will sort on label.
273print $form->selectarray("typent_id", $formcompany->typent_array(0), $typent_id, 1, 0, 0, '', 0, 0, 0, $sortparam_typent, '', 1);
274if ($user->admin) {
275 print ' '.info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
276}
277print '</td></tr>';
278// Category
279print '<tr><td>'.$cat_label.'</td><td>';
280print img_picto('', 'category', 'class="pictofixedwidth"');
281print $formother->select_categories($cat_type, $categ_id, 'categ_id', 0, 1, 'widthcentpercentminusx maxwidth300');
282print '</td></tr>';
283// User
284print '<tr><td>'.$langs->trans("CreatedBy").'</td><td>';
285print img_picto('', 'user', 'class="pictofixedwidth"');
286print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300');
287print '</td></tr>';
288// Status
289print '<tr><td>'.$langs->trans("Status").'</td><td>';
290$formpropal->selectProposalStatus(($object_status != '' ? $object_status : -1), 0, 0, 1, $mode, 'object_status');
291print '</td></tr>';
292// Year
293print '<tr><td>'.$langs->trans("Year").'</td><td>';
294if (!in_array($year, $arrayyears)) {
295 $arrayyears[$year] = $year;
296}
297if (!in_array($nowyear, $arrayyears)) {
298 $arrayyears[$nowyear] = $nowyear;
299}
300arsort($arrayyears);
301print $form->selectarray('year', $arrayyears, $year, 0, 0, 0, '', 0, 0, 0, '', 'width75');
302print '</td></tr>';
303print '<tr><td align="center" colspan="2"><input type="submit" name="submit" class="button small" value="'.$langs->trans("Refresh").'"></td></tr>';
304print '</table>';
305print '</form>';
306print '<br><br>';
307
308print '<div class="div-table-responsive-no-min">';
309print '<table class="noborder centpercent">';
310print '<tr class="liste_titre" height="24">';
311print '<td class="center">'.$langs->trans("Year").'</td>';
312print '<td class="right">'.$langs->trans("NbOfProposals").'</td>';
313print '<td class="right">%</td>';
314print '<td class="right">'.$langs->trans("AmountTotal").'</td>';
315print '<td class="right">%</td>';
316print '<td class="right">'.$langs->trans("AmountAverage").'</td>';
317print '<td class="right">%</td>';
318print '</tr>';
319
320$oldyear = 0;
321foreach ($data as $val) {
322 $year = $val['year'];
323 while (!empty($year) && $oldyear > $year + 1) { // If we have empty year
324 $oldyear--;
325
326 print '<tr class="oddeven" height="24">';
327 print '<td align="center"><a href="'.$_SERVER["PHP_SELF"].'?year='.$oldyear.'&amp;mode='.$mode.($socid > 0 ? '&socid='.$socid : '').($userid > 0 ? '&userid='.$userid : '').'">'.$oldyear.'</a></td>';
328 print '<td class="right">0</td>';
329 print '<td class="right"></td>';
330 print '<td class="right">0</td>';
331 print '<td class="right"></td>';
332 print '<td class="right">0</td>';
333 print '<td class="right"></td>';
334 print '</tr>';
335 }
336 print '<tr class="oddeven" height="24">';
337 print '<td align="center"><a href="'.$_SERVER["PHP_SELF"].'?year='.$year.($socid > 0 ? '&socid='.$socid : '').($userid > 0 ? '&userid='.$userid : '').'">'.$year.'</a></td>';
338 print '<td class="right">'.$val['nb'].'</td>';
339 print '<td class="right opacitylow" style="'.((!isset($val['nb_diff']) || $val['nb_diff'] >= 0) ? 'color: green;' : 'color: red;').'">'.(isset($val['nb_diff']) ? round($val['nb_diff']): "0").'%</td>';
340 print '<td class="right">'.price(price2num($val['total'], 'MT'), 1).'</td>';
341 print '<td class="right opacitylow" style="'.((!isset($val['total_diff']) || $val['total_diff'] >= 0) ? 'color: green;' : 'color: red;').'">'.(isset($val['total_diff']) ? round($val['total_diff']) : "0").'%</td>';
342 print '<td class="right">'.price(price2num($val['avg'], 'MT'), 1).'</td>';
343 print '<td class="right opacitylow" style="'.((!isset($val['avg_diff']) || $val['avg_diff'] >= 0) ? 'color: green;' : 'color: red;').'">'.(isset($val['avg_diff']) ? round($val['avg_diff']) : "0").'%</td>';
344 print '</tr>';
345 $oldyear = $year;
346}
347
348print '</table>';
349print '</div>';
350
351print '</div><div class="fichetwothirdright">';
352
353
354// Show graphs
355print '<table class="border centpercent"><tr class="pair nohover"><td align="center">';
356if ($mesg) {
357 print $mesg;
358} else {
359 print $px1->show();
360 print "<br>\n";
361 print $px2->show();
362 print "<br>\n";
363 print $px3->show();
364}
365print '</td></tr></table>';
366
367
368print '</div></div>';
369print '<div class="clearboth"></div>';
370
371
372print dol_get_fiche_end();
373
374// End of page
375llxFooter();
376$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:56
llxFooter()
Empty footer.
Definition wrapper.php:70
Class to build graphs.
static getDefaultGraphSizeForStats($direction, $defaultsize='')
getDefaultGraphSizeForStats
Class to build HTML component for third parties management Only common components are here.
Class to manage generation of HTML components Only common components must be here.
Classe permettant la generation de composants html autre Only common components are here.
Class to manage generation of HTML components for proposal management.
Class to manage proposals statistics.
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).
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.