dolibarr 21.0.0-alpha
index.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2013 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2015 Alexandre Spangaro <aspangaro@open-dsi.fr>
6 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28// Load Dolibarr environment
29require '../../main.inc.php';
30require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php';
31require_once DOL_DOCUMENT_ROOT.'/don/class/donstats.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
34if (isModEnabled('category')) {
35 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
36}
39
40// Load translation files required by the page
41$langs->loadLangs(array("donations"));
42
43$userid = GETPOSTINT('userid');
44$socid = GETPOSTINT('socid');
45// Security check
46if ($user->socid > 0) {
47 $action = '';
48 $socid = $user->socid;
49}
50
51$status = GETPOSTINT('status');
52$nowyear = (int) dol_print_date(dol_now('gmt'), "%Y", 'gmt');
53$typent_id = GETPOSTINT('typent_id');
54$year = GETPOSTINT('year') > 0 ? GETPOSTINT('year') : $nowyear;
55$startyear = $year - (!getDolGlobalString('MAIN_STATS_GRAPHS_SHOW_N_YEARS') ? 2 : max(1, min(10, getDolGlobalInt('MAIN_STATS_GRAPHS_SHOW_N_YEARS'))));
56$endyear = $year;
57$mode = GETPOST("mode") ? GETPOST("mode") : 'customer';
58$custcats = GETPOST('custcats', 'array');
59
60// Security check
61$result = restrictedArea($user, 'don');
62
63/*
64 * View
65 */
66$form = new Form($db);
67$formcompany = new FormCompany($db);
68
69llxHeader('', '', '', '', 0, 0, '', '', '', 'mod-don page-stats_index');
70
71$dir = $conf->don->dir_temp;
72
73print load_fiche_titre($langs->trans("DonationsStatistics"), '', 'donation');
74
75dol_mkdir($dir);
76
77$stats = new DonationStats($db, $socid, '', ($userid > 0 ? $userid : 0), ($typent_id > 0 ? $typent_id : 0), ($status > 0 ? $status : 4));
78
79if (is_array($custcats) && !empty($custcats)) {
80 $stats->from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_societe as cat ON (d.fk_soc = cat.fk_soc)';
81 $stats->where .= ' AND cat.fk_categorie IN ('.$db->sanitize(implode(',', $custcats)).')';
82}
83
84// Build graphic number of object
85$data = $stats->getNbByMonthWithPrevYear($endyear, $startyear);
86
87$filenamenb = $dir."/salariesnbinyear-".$year.".png";
88$fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=donationStats&amp;file=donationinyear-'.$year.'.png';
89
90$px1 = new DolGraph();
91$mesg = $px1->isGraphKo();
92if (!$mesg) {
93 $px1->SetData($data);
94 $i = $startyear;
95 $legend = array();
96 while ($i <= $endyear) {
97 $legend[] = $i;
98 $i++;
99 }
100 $px1->SetLegend($legend);
101 $px1->SetMaxValue($px1->GetCeilMaxValue());
102 $px1->SetMinValue(min(0, $px1->GetFloorMinValue()));
103 $px1->SetWidth($WIDTH);
104 $px1->SetHeight($HEIGHT);
105 $px1->SetYLabel($langs->trans("NbOfDonations"));
106 $px1->SetShading(3);
107 $px1->SetHorizTickIncrement(1);
108 $px1->mode = 'depth';
109 $px1->SetTitle($langs->trans("NumberByMonth"));
110
111 $px1->draw($filenamenb, $fileurlnb);
112}
113
114$data = $stats->getAmountByMonthWithPrevYear($endyear, $startyear);
115
116$filenameamount = $dir."/donationamount-".$year.".png";
117$fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=donationStats&amp;file=donationamoutinyear-'.$year.'.png';
118
119$px2 = new DolGraph();
120$mesg = $px2->isGraphKo();
121if (!$mesg) {
122 $px2->SetData($data);
123 $i = $startyear;
124 $legend = array();
125 while ($i <= $endyear) {
126 $legend[] = $i;
127 $i++;
128 }
129 $px2->SetLegend($legend);
130 $px2->SetMaxValue($px2->GetCeilMaxValue());
131 $px2->SetMinValue(min(0, $px2->GetFloorMinValue()));
132 $px2->SetWidth($WIDTH);
133 $px2->SetHeight($HEIGHT);
134 $px2->SetYLabel($langs->trans("Amount"));
135 $px2->SetShading(3);
136 $px2->SetHorizTickIncrement(1);
137 $px2->mode = 'depth';
138 $px2->SetTitle($langs->trans("AmountTotal"));
139
140 $px2->draw($filenameamount, $fileurlamount);
141}
142
143$data = $stats->getAverageByMonthWithPrevYear($endyear, $startyear);
144
145$filename_avg = $dir."/donationaverage-".$year.".png";
146$fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=donationStats&file=donationaverageinyear-'.$year.'.png';
147
148$px3 = new DolGraph();
149$mesg = $px3->isGraphKo();
150if (!$mesg) {
151 $px3->SetData($data);
152 $i = $startyear;
153 $legend = array();
154 while ($i <= $endyear) {
155 $legend[] = $i;
156 $i++;
157 }
158 $px3->SetLegend($legend);
159 $px3->SetYLabel($langs->trans("AmountAverage"));
160 $px3->SetMaxValue($px3->GetCeilMaxValue());
161 $px3->SetMinValue($px3->GetFloorMinValue());
162 $px3->SetWidth($WIDTH);
163 $px3->SetHeight($HEIGHT);
164 $px3->SetShading(3);
165 $px3->SetHorizTickIncrement(1);
166 $px3->mode = 'depth';
167 $px3->SetTitle($langs->trans("AmountAverage"));
168
169 $px3->draw($filename_avg, $fileurl_avg);
170}
171
172// Show array
173$data = $stats->getAllByYear();
174$arrayyears = array();
175foreach ($data as $val) {
176 if (!empty($val['year'])) {
177 $arrayyears[$val['year']] = $val['year'];
178 }
179}
180if (!count($arrayyears)) {
181 $arrayyears[$nowyear] = $nowyear;
182}
183
184$h = 0;
185$head = array();
186$head[$h][0] = DOL_URL_ROOT.'/don/stats/index.php';
187$head[$h][1] = $langs->trans("ByMonthYear");
188$head[$h][2] = 'byyear';
189$h++;
190
191$type = 'donation_stats';
192
193complete_head_from_modules($conf, $langs, null, $head, $h, $type);
194
195print dol_get_fiche_head($head, 'byyear', '', -1);
196
197
198print '<div class="fichecenter"><div class="fichethirdleft">';
199
200// Show filter box
201print '<form name="stats" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
202print '<input type="hidden" name="token" value="'.newToken().'">';
203
204print '<table class="noborder centpercent">';
205print '<tr class="liste_titre"><td class="liste_titre" colspan="2">'.$langs->trans("Filter").'</td></tr>';
206
207// Company
208if (empty(!$conf->global->DONATION_USE_THIRDPARTIES)) {
209 print '<tr><td>'.$langs->trans("ThirdParty").'</td><td>';
210 print img_picto('', 'company', 'class="pictofixedwidth"');
211 print $form->select_company($socid, 'socid', '', 1, 0, 0, array(), 0, 'widthcentpercentminusx maxwidth300', '');
212 print '</td></tr>';
213}
214
215// ThirdParty Type
216print '<tr><td>'.$langs->trans("ThirdPartyType").'</td><td>';
217$sortparam_typent = (empty($conf->global->SOCIETE_SORT_ON_TYPEENT) ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT);
218print $form->selectarray("typent_id", $formcompany->typent_array(0), $typent_id, 1, 0, 0, '', 0, 0, 0, $sortparam_typent, '', 1);
219if ($user->admin) {
220 print ' '.info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
221}
222print '</td></tr>';
223
224// Category
225if (isModEnabled('category')) {
226 $cat_type = Categorie::TYPE_CUSTOMER;
227 $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("Customer"));
228 print '<tr><td>'.$cat_label.'</td><td>';
229 $cate_arbo = $form->select_all_categories($cat_type, '', 'parent', 0, 0, 1);
230 print img_picto('', 'category', 'class="pictofixedwidth"');
231 print $form->multiselectarray('custcats', $cate_arbo, GETPOST('custcats', 'array'), 0, 0, 'widthcentpercentminusx maxwidth300');
232 print '</td></tr>';
233}
234
235// User
236print '<tr><td>'.$langs->trans("CreatedBy").'</td><td>';
237print img_picto('', 'user', 'class="pictofixedwidth"');
238print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300');
239print '</td></tr>';
240
241// Status
242print '<tr><td>'.$langs->trans("Status").'</td><td>';
243$liststatus = array(
244 '2' => $langs->trans("DonationStatusPaid"),
245 '0' => $langs->trans("DonationStatusPromiseNotValidated"),
246 '1' => $langs->trans("DonationStatusPromiseValidated"),
247 '3' => $langs->trans("Canceled")
248);
249print $form->selectarray('status', $liststatus, 4, 1);
250
251// Year
252print '<tr><td>'.$langs->trans("Year").'</td><td>';
253arsort($arrayyears);
254print $form->selectarray('year', $arrayyears, $year, 0, 0, 0, '', 0, 0, 0, '', 'width75');
255
256print '</td></tr>';
257print '<tr><td class="center" colspan="2"><input type="submit" name="submit" class="button small" value="'.$langs->trans("Refresh").'"></td></tr>';
258print '</table>';
259print '</form>';
260print '<br><br>';
261
262print '<div class="div-table-responsive-no-min">';
263print '<table class="noborder centpercent">';
264print '<tr class="liste_titre" height="24">';
265print '<td class="center">'.$langs->trans("Year").'</td>';
266print '<td class="right">'.$langs->trans("NbOfDonations").'</td>';
267print '<td class="right">%</td>';
268print '<td class="right">'.$langs->trans("AmountTotal").'</td>';
269print '<td class="right">%</td>';
270print '<td class="right">'.$langs->trans("AmountAverage").'</td>';
271print '<td class="right">%</td>';
272print '</tr>';
273
274$oldyear = 0;
275foreach ($data as $val) {
276 $year = $val['year'];
277 while (!empty($year) && $oldyear > (int) $year + 1) {
278 $oldyear--;
279 print '<tr class="oddeven" height="24">';
280 print '<td class="center"><a href="'.$_SERVER["PHP_SELF"].'?year='.$oldyear.'">'.$oldyear.'</a></td>';
281
282 print '<td class="right">0</td>';
283 print '<td class="right"></td>';
284 print '<td class="right amount">0</td>';
285 print '<td class="right"></td>';
286 print '<td class="right amount">0</td>';
287 print '<td class="right"></td>';
288 print '</tr>';
289 }
290
291 $greennb = (empty($val['nb_diff']) || $val['nb_diff'] >= 0);
292 $greentotal = (empty($val['total_diff']) || $val['total_diff'] >= 0);
293 $greenavg = (empty($val['avg_diff']) || $val['avg_diff'] >= 0);
294
295 print '<tr class="oddeven" height="24">';
296 print '<td align="center"><a href="'.$_SERVER["PHP_SELF"].'?year='.$year.'&amp;mode='.$mode.($socid > 0 ? '&socid='.$socid : '').($userid > 0 ? '&userid='.$userid : '').'">'.$year.'</a></td>';
297 print '<td class="right">'.$val['nb'].'</td>';
298 print '<td class="right opacitylow" style="'.($greennb ? 'color: green;' : 'color: red;').'">'.(!empty($val['nb_diff']) && $val['nb_diff'] < 0 ? '' : '+').round(!empty($val['nb_diff']) ? $val['nb_diff'] : 0).'%</td>';
299 print '<td class="right"><span class="amount">'.price(price2num($val['total'], 'MT'), 1).'</span></td>';
300 print '<td class="right opacitylow" style="'.($greentotal ? 'color: green;' : 'color: red;').'">'.(!empty($val['total_diff']) && $val['total_diff'] < 0 ? '' : '+').round(!empty($val['total_diff']) ? $val['total_diff'] : 0).'%</td>';
301 print '<td class="right"><span class="amount">'.price(price2num($val['avg'], 'MT'), 1).'</span></td>';
302 print '<td class="right opacitylow" style="'.($greenavg ? 'color: green;' : 'color: red;').'">'.(!empty($val['avg_diff']) && $val['avg_diff'] < 0 ? '' : '+').round(!empty($val['avg_diff']) ? $val['avg_diff'] : 0).'%</td>';
303 print '</tr>';
304 $oldyear = $year;
305}
306
307print '</table>';
308print '</div>';
309
310print '</div><div class="fichetwothirdright">';
311
312// Show graphs
313print '<table class="border centpercent"><tr class="pair nohover"><td class="center">';
314if ($mesg) {
315 print $mesg;
316} else {
317 print $px1->show();
318 print "<br>\n";
319 print $px2->show();
320 print "<br>\n";
321 print $px3->show();
322}
323print '</td></tr></table>';
324
325print '</div></div>';
326print '<div class="clearboth"></div>';
327
328print dol_get_fiche_end();
329
330llxFooter();
331$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 donations statistics.
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.
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.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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)
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.