dolibarr 21.0.0-alpha
index.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2014-2015 Florian HENRY <florian.henry@open-concept.pro>
3 * Copyright (C) 2015-2021 Laurent Destailleur <ldestailleur@users.sourceforge.net>
4 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
26// Load Dolibarr environment
27require '../../main.inc.php';
28require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
29require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
30require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
31require_once DOL_DOCUMENT_ROOT.'/projet/class/projectstats.class.php';
32
35
36$search_opp_status = GETPOST("search_opp_status", 'alpha');
37
38$userid = GETPOSTINT('userid');
39$socid = GETPOSTINT('socid');
40// Security check
41if ($user->socid > 0) {
42 $action = '';
43 $socid = $user->socid;
44}
45$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
46$year = GETPOSTINT('year') > 0 ? GETPOSTINT('year') : $nowyear;
47$startyear = $year - (!getDolGlobalString('MAIN_STATS_GRAPHS_SHOW_N_YEARS') ? 2 : max(1, min(10, getDolGlobalString('MAIN_STATS_GRAPHS_SHOW_N_YEARS'))));
48$endyear = $year;
49
50// Load translation files required by the page
51$langs->loadLangs(array('companies', 'projects'));
52
53// Security check
54if (!$user->hasRight('projet', 'lire')) {
56}
57
58
59/*
60 * View
61 */
62
63$form = new Form($db);
64$formproject = new FormProjets($db);
65
66$includeuserlist = array();
67
68llxHeader('', $langs->trans('Projects'), '', '', 0, 0, '', '', '', 'mod-project page-stats');
69
70$title = $langs->trans("ProjectsStatistics");
71$dir = $conf->project->dir_output.'/temp';
72
73print load_fiche_titre($title, '', 'project');
74
75dol_mkdir($dir);
76
77
78$stats_project = new ProjectStats($db);
79if (!empty($userid) && $userid != -1) {
80 $stats_project->userid = $userid;
81}
82if (!empty($socid) && $socid != -1) {
83 $stats_project->socid = $socid;
84}
85if (!empty($year)) {
86 $stats_project->year = $year;
87}
88
89if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
90 if ($search_opp_status) {
91 $stats_project->opp_status = $search_opp_status;
92 }
93}
94
95
96// Build graphic number of object
97// $data = array(array('Lib',val1,val2,val3),...)
98$data = $stats_project->getNbByMonthWithPrevYear($endyear, $startyear);
99//var_dump($data);
100
101$filenamenb = $conf->project->dir_output."/stats/projectnbprevyear-".$year.".png";
102$fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=projectstats&amp;file=projectnbprevyear-'.$year.'.png';
103
104$px1 = new DolGraph();
105$mesg = $px1->isGraphKo();
106if (!$mesg) {
107 $px1->SetData($data);
108 $i = $startyear;
109 $legend = array();
110 while ($i <= $endyear) {
111 $legend[] = $i;
112 $i++;
113 }
114 $px1->SetLegend($legend);
115 $px1->SetMaxValue($px1->GetCeilMaxValue());
116 $px1->SetWidth($WIDTH);
117 $px1->SetHeight($HEIGHT);
118 $px1->SetYLabel($langs->trans("ProjectNbProject"));
119 $px1->SetShading(3);
120 $px1->SetHorizTickIncrement(1);
121 $px1->mode = 'depth';
122 $px1->SetTitle($langs->trans("ProjectNbProjectByMonth"));
123
124 $px1->draw($filenamenb, $fileurlnb);
125}
126
127
128if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
129 // Build graphic amount of object
130 $data = $stats_project->getAmountByMonthWithPrevYear($endyear, $startyear);
131 //var_dump($data);
132 // $data = array(array('Lib',val1,val2,val3),...)
133
134 $filenamenb = $conf->project->dir_output."/stats/projectamountprevyear-".$year.".png";
135 $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=projectstats&amp;file=projectamountprevyear-'.$year.'.png';
136
137 $px2 = new DolGraph();
138 $mesg = $px2->isGraphKo();
139 if (!$mesg) {
140 $i = $startyear;
141 $legend = array();
142 while ($i <= $endyear) {
143 $legend[] = $i;
144 $i++;
145 }
146
147 $px2->SetData($data);
148 $px2->SetLegend($legend);
149 $px2->SetMaxValue($px2->GetCeilMaxValue());
150 $px2->SetMinValue(min(0, $px2->GetFloorMinValue()));
151 $px2->SetWidth($WIDTH);
152 $px2->SetHeight($HEIGHT);
153 $px2->SetYLabel($langs->trans("ProjectOppAmountOfProjectsByMonth"));
154 $px2->SetShading(3);
155 $px2->SetHorizTickIncrement(1);
156 $px2->SetType(array('bars', 'bars'));
157 $px2->mode = 'depth';
158 $px2->SetTitle($langs->trans("ProjectOppAmountOfProjectsByMonth"));
159
160 $px2->draw($filenamenb, $fileurlnb);
161 }
162}
163
164if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
165 // Build graphic with transformation rate
166 $data = $stats_project->getWeightedAmountByMonthWithPrevYear($endyear, $startyear, 0, 0);
167 //var_dump($data);
168 // $data = array(array('Lib',val1,val2,val3),...)
169
170 $filenamenb = $conf->project->dir_output."/stats/projecttransrateprevyear-".$year.".png";
171 $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=projectstats&amp;file=projecttransrateprevyear-'.$year.'.png';
172
173 $px3 = new DolGraph();
174 $mesg = $px3->isGraphKo();
175 if (!$mesg) {
176 $px3->SetData($data);
177 $i = $startyear;
178 $legend = array();
179 while ($i <= $endyear) {
180 $legend[] = $i;
181 $i++;
182 }
183 $px3->SetLegend($legend);
184 $px3->SetMaxValue($px3->GetCeilMaxValue());
185 $px3->SetMinValue(min(0, $px3->GetFloorMinValue()));
186 $px3->SetWidth($WIDTH);
187 $px3->SetHeight($HEIGHT);
188 $px3->SetYLabel($langs->trans("ProjectWeightedOppAmountOfProjectsByMonth"));
189 $px3->SetShading(3);
190 $px3->SetHorizTickIncrement(1);
191 $px3->mode = 'depth';
192 $px3->SetTitle($langs->trans("ProjectWeightedOppAmountOfProjectsByMonth"));
193
194 $px3->draw($filenamenb, $fileurlnb);
195 }
196}
197
198
199// Show array
200$stats_project->year = 0;
201$data_all_year = $stats_project->getAllByYear();
202
203if (!empty($year)) {
204 $stats_project->year = $year;
205}
206$arrayyears = array();
207foreach ($data_all_year as $val) {
208 $arrayyears[$val['year']] = $val['year'];
209}
210if (!count($arrayyears)) {
211 $arrayyears[$nowyear] = $nowyear;
212}
213
214
215$h = 0;
216$head = array();
217$head[$h][0] = DOL_URL_ROOT.'/projet/stats/index.php';
218$head[$h][1] = $langs->trans("ByMonthYear");
219$head[$h][2] = 'byyear';
220$h++;
221
222complete_head_from_modules($conf, $langs, null, $head, $h, 'project_stats');
223
224print dol_get_fiche_head($head, 'byyear', '', -1, '');
225
226
227print '<div class="fichecenter"><div class="fichethirdleft">';
228
229print '<form name="stats" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
230print '<input type="hidden" name="token" value="'.newToken().'">';
231
232print '<table class="noborder centpercent">';
233print '<tr class="liste_titre"><td class="liste_titre" colspan="2">'.$langs->trans("Filter").'</td></tr>';
234// Company
235print '<tr><td>'.$langs->trans("ThirdParty").'</td><td>';
236print img_picto('', 'company', 'class="pictofixedwidth"');
237print $form->select_company($socid, 'socid', '', 1, 0, 0, array(), 0, 'widthcentpercentminusx maxwidth300', '');
238print '</td></tr>';
239// Opportunity status
240if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
241 print '<tr><td>'.$langs->trans("OpportunityStatusShort").'</td><td>';
242 print $formproject->selectOpportunityStatus('search_opp_status', $search_opp_status, 1, 0, 1, 0, 'maxwidth300', 1, 1);
243 print '</td></tr>';
244}
245
246// User
247/*print '<tr><td>'.$langs->trans("ProjectCommercial").'</td><td>';
248print $form->select_dolusers($userid, 'userid', 1, array(),0,$includeuserlist);
249print '</td></tr>';*/
250// Year
251print '<tr><td>'.$langs->trans("Year").' <span class="opacitymedium">('.$langs->trans("DateCreation").')</span></td><td>';
252if (!in_array($year, $arrayyears)) {
253 $arrayyears[$year] = $year;
254}
255if (!in_array($nowyear, $arrayyears)) {
256 $arrayyears[$nowyear] = $nowyear;
257}
258arsort($arrayyears);
259print $form->selectarray('year', $arrayyears, $year, 0, 0, 0, '', 0, 0, 0, '', 'width75');
260print '</td></tr>';
261print '<tr><td class="center" colspan="2"><input type="submit" name="submit" class="button small" value="'.$langs->trans("Refresh").'"></td></tr>';
262print '</table>';
263
264print '</form>';
265
266print '<br><br>';
267
268print '<div class="div-table-responsive-no-min">';
269print '<table class="noborder centpercent">';
270print '<tr class="liste_titre" height="24">';
271print '<td class="center">'.$langs->trans("Year").'</td>';
272print '<td class="right">'.$langs->trans("NbOfProjects").'</td>';
273if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
274 print '<td class="right">'.$langs->trans("OpportunityAmountShort").'</td>';
275 print '<td class="right">'.$langs->trans("OpportunityAmountAverageShort").'</td>';
276 print '<td class="right">'.$langs->trans("OpportunityAmountWeigthedShort").'</td>';
277}
278print '</tr>';
279
280$oldyear = 0;
281foreach ($data_all_year as $val) {
282 $year = $val['year'];
283 while ($year && $oldyear > (int) $year + 1) { // If we have empty year
284 $oldyear--;
285
286 print '<tr class="oddeven" height="24">';
287 print '<td class="center"><a href="'.$_SERVER["PHP_SELF"].'?year='.$oldyear.($socid > 0 ? '&socid='.$socid : '').($userid > 0 ? '&userid='.$userid : '').'">'.$oldyear.'</a></td>';
288 print '<td class="right">0</td>';
289 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
290 print '<td class="right amount nowraponall">0</td>';
291 print '<td class="right amount nowraponall">0</td>';
292 print '<td class="right amount nowraponall">0</td>';
293 }
294 print '</tr>';
295 }
296
297 print '<tr class="oddeven" height="24">';
298 print '<td class="center"><a href="'.$_SERVER["PHP_SELF"].'?year='.$year.($socid > 0 ? '&socid='.$socid : '').($userid > 0 ? '&userid='.$userid : '').'">'.$year.'</a></td>';
299 print '<td class="right">'.$val['nb'].'</td>';
300 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
301 print '<td class="right amount nowraponall">'.($val['total'] ? price(price2num($val['total'], 'MT'), 1) : '0').'</td>';
302 print '<td class="right amount nowraponall">'.($val['avg'] ? price(price2num($val['avg'], 'MT'), 1) : '0').'</td>';
303 print '<td class="right amount nowraponall">'.(isset($val['weighted']) ? price(price2num($val['weighted'], 'MT'), 1) : '0').'</td>';
304 }
305 print '</tr>';
306 $oldyear = $year;
307}
308
309print '</table>';
310print '</div>';
311
312print '</div><div class="fichetwothirdright">';
313
314$stringtoshow = '<table class="border centpercent"><tr class="pair nohover"><td class="center">';
315if ($mesg) {
316 print $mesg;
317} else {
318 $stringtoshow .= $px1->show();
319 $stringtoshow .= "<br>\n";
320 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
321 //$stringtoshow .= $px->show();
322 //$stringtoshow .= "<br>\n";
323 $stringtoshow .= $px2->show();
324 $stringtoshow .= "<br>\n";
325 $stringtoshow .= $px3->show();
326 }
327}
328$stringtoshow .= '</td></tr></table>';
329
330print $stringtoshow;
331
332print '</div></div>';
333
334print '<div class="clearboth"></div>';
335
336print dol_get_fiche_end();
337
338// End of page
339llxFooter();
340$db->close();
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:70
Class to build graphs.
static getDefaultGraphSizeForStats($direction, $defaultsize='')
getDefaultGraphSizeForStats
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class to manage statistics on projects.
llxFooter()
Footer empty.
Definition document.php:107
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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 a Dolibarr global constant string value.
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.