dolibarr 23.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) 2013 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
7 * Copyright (C) 2020 Maxime DEMAREST <maxime@indelog.fr>
8 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
9 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
31// Load Dolibarr environment
32require '../../../main.inc.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
35require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
36require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
37require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facturestats.class.php';
38if (isModEnabled('category')) {
39 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
40}
41
52
53// Load translation files required by the page
54$langs->loadLangs(array('bills', 'companies', 'other'));
55
56$mode = GETPOST("mode") ? GETPOST("mode") : 'customer';
57
58$hookmanager->initHooks(array('invoicestats', 'globalcard'));
59
60if ($mode == 'customer' && !$user->hasRight('facture', 'lire')) {
62}
63if ($mode == 'supplier' && !$user->hasRight('fournisseur', 'facture', 'lire')) {
65}
66
67$object_status = GETPOST('object_status', 'intcomma');
68$typent_id = GETPOSTINT('typent_id');
69$categ_id = GETPOSTINT('categ_id');
70
71$userid = GETPOSTINT('userid');
72$socid = GETPOSTINT('socid');
73$select_categ_categ_id = GETPOST('select_categ_categ_id', 'array:int');
74$select_categ_invoice_id=GETPOST('select_categ_invoice_id', 'array:int');
75// Security check
76if ($user->socid > 0) {
77 $action = '';
78 $socid = $user->socid;
79}
80
81$parameters = array();
82$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
83if ($reshook < 0) {
84 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
85}
86
87$nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
88$year = GETPOST('year') > 0 ? GETPOSTINT('year') : $nowyear;
89$startyear = $year - (!getDolGlobalString('MAIN_STATS_GRAPHS_SHOW_N_YEARS') ? 2 : max(1, min(10, getDolGlobalString('MAIN_STATS_GRAPHS_SHOW_N_YEARS'))));
90$endyear = $year;
91
92
93/*
94 * View
95 */
96if (isModEnabled('category')) {
97 $langs->load('categories');
98}
99$form = new Form($db);
100$formcompany = new FormCompany($db);
101$formother = new FormOther($db);
102
103
104$picto = 'bill';
105$title = $langs->trans("BillsStatistics");
106$dir = $conf->facture->dir_temp;
107
108if ($mode == 'supplier') {
109 $picto = 'supplier_invoice';
110 $title = $langs->trans("BillsStatisticsSuppliers");
111 $dir = $conf->fournisseur->facture->dir_temp;
112}
113
114llxHeader('', $title);
115
116print load_fiche_titre($title, '', $picto);
117
118dol_mkdir($dir);
119
120$stats = new FactureStats($db, $socid, $mode, ($userid > 0 ? $userid : 0), ($typent_id > 0 ? $typent_id : 0), ($categ_id > 0 ? $categ_id : 0));
121if ($mode == 'customer') {
122 if ($object_status != '' && $object_status >= 0) {
123 $stats->where .= ' AND f.fk_statut IN ('.$db->sanitize($object_status).')';
124 }
125 if (is_array($select_categ_categ_id) && !empty($select_categ_categ_id)) {
126 $stats->from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_societe as cat ON (f.fk_soc = cat.fk_soc)';
127 $stats->where .= ' AND cat.fk_categorie IN ('.$db->sanitize(implode(',', $select_categ_categ_id)).')';
128 }
129 if (is_array($select_categ_invoice_id) && !empty($select_categ_invoice_id)) {
130 $stats->from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_invoice as cat ON (f.rowid = cat.fk_invoice)';
131 $stats->where .= ' AND cat.fk_categorie IN ('.$db->sanitize(implode(',', $select_categ_invoice_id)).')';
132 }
133}
134if ($mode == 'supplier') {
135 if ($object_status != '' && $object_status >= 0) {
136 $stats->where .= ' AND f.fk_statut IN ('.$db->sanitize($object_status).')';
137 }
138 if (is_array($select_categ_categ_id) && !empty($select_categ_categ_id)) {
139 $stats->from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_fournisseur as cat ON (f.fk_soc = cat.fk_soc)';
140 $stats->where .= ' AND cat.fk_categorie IN ('.$db->sanitize(implode(',', $select_categ_categ_id)).')';
141 }
142 if (is_array($select_categ_invoice_id) && !empty($select_categ_invoice_id)) {
143 $stats->from .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_supplier_invoice as cat ON (f.rowid = cat.fk_supplier_invoice)';
144 $stats->where .= ' AND cat.fk_categorie IN ('.$db->sanitize(implode(',', $select_categ_invoice_id)).')';
145 }
146}
147
148// Build graphic number of object
149// $data = array(array('Lib',val1,val2,val3),...)
150$data = $stats->getNbByMonthWithPrevYear($endyear, $startyear);
151//var_dump($data);
152
153$filenamenb = $dir."/invoicesnbinyear-".$year.".png";
154$fileurlnb = '';
155if ($mode == 'customer') {
156 $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=billstats&file=invoicesnbinyear-'.$year.'.png';
157}
158if ($mode == 'supplier') {
159 $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=billstatssupplier&file=invoicesnbinyear-'.$year.'.png';
160}
161
162$px1 = new DolGraph();
163$mesg = $px1->isGraphKo();
164if (!$mesg) {
165 $px1->SetData($data);
166 $i = $startyear;
167 $legend = array();
168 while ($i <= $endyear) {
169 $legend[] = $i;
170 $i++;
171 }
172 $px1->SetLegend($legend);
173 $px1->SetMaxValue($px1->GetCeilMaxValue());
174 $px1->SetWidth($WIDTH);
175 $px1->SetHeight($HEIGHT);
176 $px1->SetYLabel($langs->trans("NumberOfBills"));
177 $px1->SetShading(3);
178 $px1->SetHorizTickIncrement(1);
179 $px1->mode = 'depth';
180 $px1->SetTitle($langs->trans("NumberOfBillsByMonth"));
181
182 $px1->draw($filenamenb, $fileurlnb);
183}
184
185// Build graphic amount of object
186$data = $stats->getAmountByMonthWithPrevYear($endyear, $startyear);
187//var_dump($data);
188// $data = array(array('Lib',val1,val2,val3),...)
189
190$filenameamount = $dir."/invoicesamountinyear-".$year.".png";
191$fileurlamount = '';
192if ($mode == 'customer') {
193 $fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=billstats&amp;file=invoicesamountinyear-'.$year.'.png';
194}
195if ($mode == 'supplier') {
196 $fileurlamount = DOL_URL_ROOT.'/viewimage.php?modulepart=billstatssupplier&amp;file=invoicesamountinyear-'.$year.'.png';
197}
198
199$px2 = new DolGraph();
200$mesg = $px2->isGraphKo();
201if (!$mesg) {
202 $px2->SetData($data);
203 $i = $startyear;
204 $legend = array();
205 while ($i <= $endyear) {
206 $legend[] = $i;
207 $i++;
208 }
209 $px2->SetLegend($legend);
210 $px2->SetMaxValue($px2->GetCeilMaxValue());
211 $px2->SetMinValue(min(0, $px2->GetFloorMinValue()));
212 $px2->SetWidth($WIDTH);
213 $px2->SetHeight($HEIGHT);
214 $px2->SetYLabel($langs->trans("AmountOfBills"));
215 $px2->SetShading(3);
216 $px2->SetHorizTickIncrement(1);
217 $px2->mode = 'depth';
218 $px2->SetTitle($langs->trans("AmountOfBillsByMonthHT"));
219
220 $px2->draw($filenameamount, $fileurlamount);
221}
222
223
224$data = $stats->getAverageByMonthWithPrevYear($endyear, $startyear);
225
226$fileurl_avg = '';
227if (!$user->hasRight('societe', 'client', 'voir')) {
228 $filename_avg = $dir.'/ordersaverage-'.$user->id.'-'.$year.'.png';
229 if ($mode == 'customer') {
230 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstats&file=ordersaverage-'.$user->id.'-'.$year.'.png';
231 }
232 if ($mode == 'supplier') {
233 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstatssupplier&file=ordersaverage-'.$user->id.'-'.$year.'.png';
234 }
235} else {
236 $filename_avg = $dir.'/ordersaverage-'.$year.'.png';
237 if ($mode == 'customer') {
238 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstats&file=ordersaverage-'.$year.'.png';
239 }
240 if ($mode == 'supplier') {
241 $fileurl_avg = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstatssupplier&file=ordersaverage-'.$year.'.png';
242 }
243}
244
245$px3 = new DolGraph();
246$mesg = $px3->isGraphKo();
247if (!$mesg) {
248 $px3->SetData($data);
249 $i = $startyear;
250 $legend = array();
251 while ($i <= $endyear) {
252 $legend[] = $i;
253 $i++;
254 }
255 $px3->SetLegend($legend);
256 $px3->SetYLabel($langs->trans("AmountAverage"));
257 $px3->SetMaxValue($px3->GetCeilMaxValue());
258 $px3->SetMinValue((int) $px3->GetFloorMinValue());
259 $px3->SetWidth($WIDTH);
260 $px3->SetHeight($HEIGHT);
261 $px3->SetShading(3);
262 $px3->SetHorizTickIncrement(1);
263 $px3->mode = 'depth';
264 $px3->SetTitle($langs->trans("AmountAverage"));
265
266 $px3->draw($filename_avg, $fileurl_avg);
267}
268
269
270// Show array
271$data = $stats->getAllByYear();
272$arrayyears = array();
273foreach ($data as $val) {
274 $arrayyears[$val['year']] = $val['year'];
275}
276if (!count($arrayyears)) {
277 $arrayyears[$nowyear] = $nowyear;
278}
279
280
281$h = 0;
282$head = array();
283$head[$h][0] = DOL_URL_ROOT.'/compta/facture/stats/index.php?mode='.urlencode($mode);
284$head[$h][1] = $langs->trans("ByMonthYear");
285$head[$h][2] = 'byyear';
286$h++;
287
288if ($mode == 'customer') {
289 $type = 'invoice_stats';
290}
291if ($mode == 'supplier') {
292 $type = 'supplier_invoice_stats';
293}
294
295complete_head_from_modules($conf, $langs, null, $head, $h, $type);
296
297print dol_get_fiche_head($head, 'byyear', '', -1);
298
299print '<div class="fichecenter"><div class="fichethirdleft">';
300
301
302// Show filter box
303print '<form name="stats" method="POST" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
304print '<input type="hidden" name="token" value="'.newToken().'">';
305print '<input type="hidden" name="mode" value="'.$mode.'">';
306
307print '<table class="noborder centpercent">';
308print '<tr class="liste_titre"><td class="liste_titre" colspan="2">'.$langs->trans("Filter").'</td></tr>';
309// Company
310print '<tr><td>'.$langs->trans("ThirdParty").'</td><td>';
311$filter = '';
312if ($mode == 'customer') {
313 $filter = '(s.client:IN:1,2,3)';
314}
315if ($mode == 'supplier') {
316 $filter = '(s.fournisseur:=:1)';
317}
318print img_picto('', 'company', 'class="pictofixedwidth"');
319print $form->select_company($socid, 'socid', $filter, 1, 0, 0, array(), 0, 'widthcentpercentminusx maxwidth300');
320print '</td></tr>';
321
322// ThirdParty Type
323print '<tr><td>'.$langs->trans("ThirdPartyType").'</td><td>';
324$sortparam_typent = getDolGlobalString('SOCIETE_SORT_ON_TYPEENT', 'ASC'); // NONE means we keep sort of original array, so we sort on position. ASC, means next function will sort on label.
325print $form->selectarray("typent_id", $formcompany->typent_array(0), $typent_id, 1, 0, 0, '', 0, 0, 0, $sortparam_typent, '', 1);
326if ($user->admin) {
327 print ' '.info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
328}
329print '</td></tr>';
330
331// Category
332if (isModEnabled('category')) {
333 $cat_type = '';
334 $cat_label = '';
335 if ($mode == 'customer') {
336 $cat_type = Categorie::TYPE_CUSTOMER;
337 $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("Customer"));
338 }
339 if ($mode == 'supplier') {
340 $cat_type = Categorie::TYPE_SUPPLIER;
341 $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("Supplier"));
342 }
343 print '<tr><td>'.$cat_label.'</td><td>';
344 $cate_arbo = $form->select_all_categories($cat_type, '', 'parent', 0, 0, 1);
345 print img_picto('', 'category', 'class="pictofixedwidth"');
346 print $form->multiselectarray('select_categ_categ_id', $cate_arbo, GETPOST('select_categ_categ_id', 'array'), 0, 0, 'widthcentpercentminusx maxwidth300');
347 //print $formother->select_categories($cat_type, $categ_id, 'categ_id', true);
348 print '</td></tr>';
349}
350
351
352// Category facture
353if (isModEnabled('category')) {
354 $cat_type = '';
355 $cat_label = '';
356 if ($mode == 'customer') {
357 $cat_type = Categorie::TYPE_INVOICE;
358 $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("BillsCustomers"));
359 }
360 if ($mode == 'supplier') {
361 $cat_type = Categorie::TYPE_SUPPLIER_INVOICE;
362 $cat_label = $langs->trans("Category").' '.lcfirst($langs->trans("BillsSuppliers"));
363 }
364 print '<tr><td>'.$cat_label.'</td><td>';
365 $cate_arbo = $form->select_all_categories($cat_type, '', 'parent', 0, 0, 1);
366 print img_picto('', 'category', 'class="pictofixedwidth"');
367 print $form->multiselectarray('select_categ_invoice_id', $cate_arbo, GETPOST('select_categ_invoice_id', 'array'), 0, 0, 'widthcentpercentminusx maxwidth300');
368 //print $formother->select_categories($cat_type, $categ_id, 'categ_id', true);
369 print '</td></tr>';
370}
371
372
373// User
374print '<tr><td>'.$langs->trans("CreatedBy").'</td><td>';
375print img_picto('', 'user', 'class="pictofixedwidth"');
376print $form->select_dolusers($userid ? $userid : -1, 'userid', 1, null, 0, '', '', '0', 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300');
377print '</td></tr>';
378// Status
379print '<tr><td>'.$langs->trans("Status").'</td><td>';
380if ($mode == 'customer') {
381 $liststatus = array('0' => $langs->trans("BillStatusDraft"), '1' => $langs->trans("BillStatusNotPaid"), '2' => $langs->trans("BillStatusPaid"), '1,2' => $langs->trans("BillStatusNotPaid").' / '.$langs->trans("BillStatusPaid"), '3' => $langs->trans("BillStatusCanceled"));
382 print $form->selectarray('object_status', $liststatus, $object_status, 1);
383}
384if ($mode == 'supplier') {
385 $liststatus = array('0' => $langs->trans("BillStatusDraft"), '1' => $langs->trans("BillStatusNotPaid"), '2' => $langs->trans("BillStatusPaid"));
386 print $form->selectarray('object_status', $liststatus, $object_status, 1);
387}
388print '</td></tr>';
389// Year
390print '<tr><td>'.$langs->trans("Year").'</td><td>';
391if (!in_array($year, $arrayyears)) {
392 $arrayyears[$year] = $year;
393}
394if (!in_array($nowyear, $arrayyears)) {
395 $arrayyears[$nowyear] = $nowyear;
396}
397arsort($arrayyears);
398print img_picto('', 'calendar', 'class="pictofixedwidth"');
399print $form->selectarray('year', $arrayyears, $year, 0, 0, 0, '', 0, 0, 0, '', 'width75');
400print '</td></tr>';
401print '<tr><td class="center" colspan="2"><input type="submit" name="submit" class="button small" value="'.$langs->trans("Refresh").'"></td></tr>';
402print '</table>';
403print '</form>';
404print '<br><br>';
405
406print '<div class="div-table-responsive-no-min">';
407print '<table class="noborder centpercent">';
408print '<tr class="liste_titre" height="24">';
409print '<td class="center">'.$langs->trans("Year").'</td>';
410print '<td class="right">'.$langs->trans("NumberOfBills").'</td>';
411print '<td class="right">%</td>';
412print '<td class="right">'.$langs->trans("AmountTotal").'</td>';
413print '<td class="right">%</td>';
414print '<td class="right">'.$langs->trans("AmountAverage").'</td>';
415print '<td class="right">%</td>';
416print '</tr>';
417
418$oldyear = 0;
419foreach ($data as $val) {
420 $year = (int) $val['year'];
421 while ($year && $oldyear > $year + 1) { // If we have empty year
422 $oldyear--;
423
424 print '<tr class="oddeven" height="24">';
425 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>';
426 print '<td class="right">0</td>';
427 print '<td class="right"></td>';
428 print '<td class="right amount">0</td>';
429 print '<td class="right"></td>';
430 print '<td class="right amount">0</td>';
431 print '<td class="right"></td>';
432 print '</tr>';
433 }
434
435 if ($mode == 'supplier') {
436 $greennb = (empty($val['nb_diff']) || $val['nb_diff'] <= 0);
437 $greentotal = (empty($val['total_diff']) || $val['total_diff'] <= 0);
438 $greenavg = (empty($val['avg_diff']) || $val['avg_diff'] <= 0);
439 } else {
440 $greennb = (empty($val['nb_diff']) || $val['nb_diff'] >= 0);
441 $greentotal = (empty($val['total_diff']) || $val['total_diff'] >= 0);
442 $greenavg = (empty($val['avg_diff']) || $val['avg_diff'] >= 0);
443 }
444
445 print '<tr class="oddeven" height="24">';
446 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>';
447 print '<td class="right">'.$val['nb'].'</td>';
448 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>';
449 print '<td class="right"><span class="amount">'.price(price2num($val['total'], 'MT'), 1).'</span></td>';
450 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>';
451 print '<td class="right"><span class="amount">'.price(price2num($val['avg'], 'MT'), 1).'</span></td>';
452 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>';
453 print '</tr>';
454 $oldyear = $year;
455}
456
457print '</table>';
458print '</div>';
459
460print '</div><div class="fichetwothirdright">';
461
462
463// Show graphs
464print '<table class="border centpercent"><tr class="pair nohover"><td align="center">';
465if ($mesg) {
466 print $mesg;
467} else {
468 print $px1->show();
469 print "<br>\n";
470 print $px2->show();
471 print "<br>\n";
472 print $px3->show();
473}
474print '</td></tr></table>';
475
476
477print '</div></div>';
478print '<div class="clearboth"></div>';
479
480
481print dol_get_fiche_end();
482
483// End of page
484llxFooter();
485$db->close();
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
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:73
Class to build graphs.
static getDefaultGraphSizeForStats($direction, $defaultsize='')
getDefaultGraphSizeForStats
Class to manage stats for invoices (customer and supplier)
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.
Class permettant la generation de composants html autre Only common components are here.
dol_now($mode='gmt')
Return date for now.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
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, $morecssdiv='')
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
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.
isModEnabled($module)
Is Dolibarr module enabled.
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.