dolibarr 23.0.3
report.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2002 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2020 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2010 Regis Houssin <regis.houssin@capnetworks.com>
5 * Copyright (C) 2012 Vinícius Nogueira <viniciusvgn@gmail.com>
6 * Copyright (C) 2014 Florian Henry <florian.henry@open-cooncept.pro>
7 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
8 * Copyright (C) 2016 Juanjo Menent <jmenent@2byte.es>
9 * Copyright (C) 2017 Alexandre Spangaro <aspangaro@open-dsi.fr>
10 * Copyright (C) 2018 Andreu Bisquerra <jove@bisquerra.com>
11 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
12 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program. If not, see <https://www.gnu.org/licenses/>.
26 */
27
34if (!defined('NOREQUIREMENU')) {
35 define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
36}
37if (!defined('NOBROWSERNOTIF')) {
38 define('NOBROWSERNOTIF', '1'); // Disable browser notification
39}
40
41// Load Dolibarr environment
42require '../../main.inc.php';
51require_once DOL_DOCUMENT_ROOT.'/compta/cashcontrol/class/cashcontrol.class.php';
52require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
53require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
54require_once DOL_DOCUMENT_ROOT.'/compta/cashcontrol/class/cashcontrol.class.php';
55require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
56require_once DOL_DOCUMENT_ROOT.'/blockedlog/lib/blockedlog.lib.php';
57
58$langs->loadLangs(array("bills", "banks", "cashdesk", "blockedlog"));
59
60$id = GETPOSTINT('id');
61$summaryonly = GETPOSTINT('summaryonly'); // May be used for ticket Z
62
63$object = new CashControl($db);
64$object->fetch($id);
65
66//$limit = GETPOST('limit')?GETPOST('limit', 'int'):$conf->liste_limit;
67$sortorder = 'ASC';
68$sortfield = 'b.datev,b.dateo,b.rowid';
69
70$arrayfields = array(
71 'b.rowid' => array('label' => $langs->trans("Ref"), 'checked' => 1),
72 'b.dateo' => array('label' => $langs->trans("DateOperationShort"), 'checked' => 1),
73 'b.num_chq' => array('label' => $langs->trans("Number"), 'checked' => 1),
74 'ba.ref' => array('label' => $langs->trans("BankAccount"), 'checked' => 1),
75 'cp.code' => array('label' => $langs->trans("PaymentMode"), 'checked' => 1),
76 'b.debit' => array('label' => $langs->trans("Debit"), 'checked' => 1, 'position' => 600),
77 'b.credit' => array('label' => $langs->trans("Credit"), 'checked' => 1, 'position' => 605),
78);
79
80$syear = $object->year_close;
81$smonth = $object->month_close;
82$sday = $object->day_close;
83
84$posmodule = $object->posmodule;
85$terminalid = $object->posnumber;
86
87// Security check
88if ($user->socid > 0) { // Protection if external user
89 //$socid = $user->socid;
91}
92if (!$user->hasRight('cashdesk', 'run') && !$user->hasRight('takepos', 'run')) {
94}
95
96
97/*
98 * View
99 */
100
101$title = $langs->trans("CashControl");
102$param = '';
103
104$conf->dol_hide_topmenu = 1;
105$conf->dol_hide_leftmenu = 1;
106
107llxHeader('', $title, '', '', 0, 0, array(), array(), $param);
108
109print '<!-- Begin div id-container --><div id="id-container" class="id-container center">';
110
111$dates = $datee = 0;
112
113if ($syear && !$smonth) {
114 $dates = dol_get_first_day($syear, 1); $datee = dol_get_last_day($syear, 12);
115} elseif ($syear && $smonth && !$sday) {
116 $dates = dol_get_first_day($syear, $smonth); $datee = dol_get_last_day($syear, $smonth);
117} elseif ($syear && $smonth && $sday) {
118 $dates = dol_mktime(0, 0, 0, $smonth, $sday, $syear); $datee = dol_mktime(23, 59, 59, $smonth, $sday, $syear);
119} else {
120 dol_print_error(null, 'Year not defined');
121}
122$datefilter = 'p.datep';
123$modulesourcefilter = 'f.module_source';
124$amountfield = 'pf.amount';
125$joinleft = 'LEFT ';
126if (isALNERunningVersion() && $mysoc->country_code == 'FR') {
127 $datefilter = 'bl.date_creation'; // By using this as a filter, it is like the LEFT JOIN is an INNER JOIN
128 $modulesourcefilter = 'bl.module_source';
129 $amountfield = 'bl.amounts';
130 $joinleft = '';
131}
132
133// NOTE: This request must use similar fields and filters to the one into cashcontrol_card to count and sum amount
134$sql = "SELECT p.rowid, p.datep as datep, cp.code,";
135$sql .= " f.rowid as facid, f.ref, f.datef as datef, ".$db->sanitize($amountfield)." as amount,";
136$sql .= " b.fk_account as bankid,";
137$sql .= " bl.signature";
138$sql .= " FROM ".MAIN_DB_PREFIX."paiement_facture as pf, ".MAIN_DB_PREFIX."facture as f,";
139$sql .= " ".MAIN_DB_PREFIX."paiement as p";
140//$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."blockedlog as bl ON bl.ref_object = p.ref AND bl.entity = ".((int) $conf->entity).",";
141$sql .= " ".$db->sanitize($joinleft)." JOIN ".MAIN_DB_PREFIX."blockedlog as bl ON bl.action = 'PAYMENT_CUSTOMER_CREATE'";
142$sql .= " AND bl.element = 'payment' AND bl.fk_object = p.rowid AND bl.entity = ".((int) $conf->entity);
143$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank as b ON p.fk_bank = b.rowid,";
144$sql .= " ".MAIN_DB_PREFIX."c_paiement as cp";
145$sql .= " WHERE pf.fk_facture = f.rowid AND p.rowid = pf.fk_paiement AND cp.id = p.fk_paiement";
146$sql .= " AND ".$db->sanitize($modulesourcefilter)." = '".$db->escape($posmodule)."'";
147$sql .= " AND f.pos_source = '".$db->escape($terminalid)."'";
148$sql .= " AND p.entity = ".((int) $conf->entity); // Never share entities for features related to accountancy
149$sql .= " AND ".$db->sanitize($datefilter)." BETWEEN '".$db->idate($dates)."' AND '".$db->idate($datee)."'";
150$sql .= " ORDER BY ".$db->sanitize($datefilter)." ASC, rowid ASC"; // Required so later we can use the parameter $previoushash of checkSignature()
151
152$resql = $db->query($sql);
153if ($resql) {
154 $num = $db->num_rows($resql);
155 $i = 0;
156
157 print "<!-- title of cash control -->\n";
158 print '<!-- We will use this request to find payments: '.dolPrintHTML($sql).' -->';
159 print '<center>';
160 print '<h2>';
161
162 $nameterminal = getDolGlobalString("TAKEPOS_TERMINAL_NAME_".$object->posnumber);
163 print $langs->trans("CashControl")." #".$object->id.(($nameterminal != "TAKEPOS_TERMINAL_NAME_".$object->posnumber) ? '<br>'.$nameterminal : '');
164 if ($object->status == $object::STATUS_DRAFT) {
165 print '<br><span class="opacitymedium small">('.$langs->trans("Draft")." - ".$langs->trans("TheoricalView").")</span>";
166 }
167 print "</h2>";
168 print $mysoc->name;
169 print '<br>'.$langs->trans("DateCreationShort").": ".dol_print_date($object->date_creation, 'dayhour');
170 $userauthor = $object->fk_user_valid;
171 if (empty($userauthor)) {
172 $userauthor = $object->fk_user_creat;
173 }
174
175 $uservalid = new User($db);
176 if ($userauthor > 0) {
177 $uservalid->fetch($userauthor);
178 print '<br>'.$langs->trans("Author").': '.$uservalid->getFullName($langs);
179 }
180 print '<br>'.$langs->trans("Period").': '.$object->year_close.($object->month_close ? '-'.sprintf("%02d", $object->month_close) : '').($object->day_close ? '-'.sprintf("%02d", $object->day_close) : '');
181 print '</center>';
182
183 $invoicetmp = new Facture($db);
184
185 if (!$summaryonly) {
186 print "<div style='text-align: right'><h2>";
187 print $langs->trans("InitialBankBalance").' - '.$langs->trans("Cash").' : <div class="inline-block amount width100">'.price($object->opening).'</div>';
188 print "</h2></div>";
189 } else {
190 print '<br>';
191 }
192
193 $param = '';
194
195 if (!$summaryonly) {
196 print '<div class="div-table-responsive">';
197 print '<table class="tagtable liste">'."\n";
198
199 // Fields title
200 print '<tr class="liste_titre">';
201 print_liste_field_titre($arrayfields['b.rowid']['label'], $_SERVER['PHP_SELF'], 'b.rowid', '', $param, '', $sortfield, $sortorder);
202 print_liste_field_titre($arrayfields['b.dateo']['label'], $_SERVER['PHP_SELF'], 'b.dateo', '', $param, '"', $sortfield, $sortorder, 'center ');
203 print_liste_field_titre($arrayfields['ba.ref']['label'], $_SERVER['PHP_SELF'], 'ba.ref', '', $param, '', $sortfield, $sortorder, '');
204 print_liste_field_titre($arrayfields['cp.code']['label'], $_SERVER['PHP_SELF'], 'cp.code', '', $param, '', $sortfield, $sortorder, 'right ');
205 print_liste_field_titre($arrayfields['b.debit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, '', $sortfield, $sortorder, 'right ');
206 print_liste_field_titre($arrayfields['b.credit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, '', $sortfield, $sortorder, 'right ');
207 print "</tr>\n";
208 }
209
210 // Loop on each record
211 $cash = $bank = $cheque = $other = 0;
212
213 $totalqty = 0;
214 $totalvat = 0;
215 $totalvatperrate = array();
216 $totalhtperrate = array();
217 $totallocaltax1 = 0;
218 $totallocaltax2 = 0;
219 $cachebankaccount = array();
220 $cacheinvoiceid = array();
221 $transactionspertype = array();
222 $amountpertype = array();
223
224 $totalarray = array('nbfield' => 0, 'pos' => array(), 'val' => array('totaldebfield' => 0, 'totalcredfield' => 0));
225 while ($i < $num) {
226 $objp = $db->fetch_object($resql);
227
228 // Load bankaccount
229 if (empty($cachebankaccount[$objp->bankid])) {
230 $bankaccounttmp = new Account($db);
231 $bankaccounttmp->fetch($objp->bankid);
232 $cachebankaccount[$objp->bankid] = $bankaccounttmp;
233 $bankaccount = $bankaccounttmp;
234 } else {
235 $bankaccount = $cachebankaccount[$objp->bankid];
236 }
237
238 $invoicetmp->fetch($objp->facid);
239
240 if (empty($cacheinvoiceid[$objp->facid])) {
241 $cacheinvoiceid[$objp->facid] = $objp->facid; // First time this invoice is found into list of invoice x payments
242 foreach ($invoicetmp->lines as $line) {
243 $totalqty += $line->qty;
244 $totalvat += $line->total_tva;
245 if ($line->tva_tx) {
246 if (empty($totalvatperrate[$line->tva_tx])) {
247 $totalvatperrate[$line->tva_tx] = 0;
248 $totalhtperrate[$line->tva_tx] = 0;
249 }
250 $totalvatperrate[$line->tva_tx] += $line->total_tva;
251 $totalhtperrate[$line->tva_tx] += $line->total_ht;
252 }
253 $totallocaltax1 += $line->total_localtax1;
254 $totallocaltax2 += $line->total_localtax2;
255 }
256 }
257
258 if ($object->posmodule == "takepos") {
259 $var1 = 'CASHDESK_ID_BANKACCOUNT_CASH'.$object->posnumber;
260 } else {
261 $var1 = 'CASHDESK_ID_BANKACCOUNT_CASH';
262 }
263
264 if ($objp->code == 'CHQ') {
265 $cheque += $objp->amount;
266 if (empty($transactionspertype[$objp->code])) {
267 $transactionspertype[$objp->code] = 0;
268 }
269 $transactionspertype[$objp->code] += 1;
270 } elseif ($objp->code == 'CB') {
271 $bank += $objp->amount;
272 if (empty($transactionspertype[$objp->code])) {
273 $transactionspertype[$objp->code] = 0;
274 }
275 $transactionspertype[$objp->code] += 1;
276 } else {
277 if (getDolGlobalString($var1) == $bankaccount->id) {
278 $cash += $objp->amount;
279 // } elseif (getDolGlobalString($var2) == $bankaccount->id) $bank+=$objp->amount;
280 //elseif (getDolGlobalString($var3) == $bankaccount->id) $cheque+=$objp->amount;
281 if (empty($transactionspertype['CASH'])) {
282 $transactionspertype['CASH'] = 0;
283 }
284 $transactionspertype['CASH'] += 1;
285 } else {
286 $other += $objp->amount;
287 if (empty($transactionspertype['OTHER'])) {
288 $transactionspertype['OTHER'] = 0;
289 }
290 $transactionspertype['OTHER'] += 1;
291 }
292 }
293
294 if (empty($amountpertype[$objp->code])) {
295 $amountpertype[$objp->code] = 0;
296 }
297
298 if ($objp->amount < 0) {
299 $amountpertype[$objp->code] += $objp->amount;
300 }
301 if ($objp->amount > 0) {
302 $amountpertype[$objp->code] -= $objp->amount;
303 }
304
305 if (!$summaryonly) {
306 print '<tr class="oddeven">';
307
308 // Ref
309 print '<td class="nowrap left smallheight">';
310 print $invoicetmp->getNomUrl(1);
311 print '<br><span class="small opacitymedium" title="'.$langs->trans("FingerprintInBlockedLog").': '.$objp->signature.'">'.dol_trunc($objp->signature, 16).'</span>';
312 print '</td>';
313 if (!$i) {
314 $totalarray['nbfield']++;
315 }
316
317 // Date ope
318 print '<td class="nowrap center">';
319 print '<span id="dateoperation_'.$objp->facid.'">'.dol_print_date($db->jdate($objp->datep), "day")."</span>";
320 print "</td>\n";
321 if (!$i) {
322 $totalarray['nbfield']++;
323 }
324
325 // Bank account
326 print '<td class="nowrap left">';
327 print $bankaccount->getNomUrl(1);
328 print "</td>\n";
329 if (!$i) {
330 $totalarray['nbfield']++;
331 }
332
333 // Type
334 print '<td class="right">';
335 print $objp->code;
336 print "</td>\n";
337 if (!$i) {
338 $totalarray['nbfield']++;
339 }
340
341 // Debit
342 print '<td class="right">';
343 if ($objp->amount < 0) {
344 print '<span class="amount">'.price($objp->amount * -1).'</span>';
345 $totalarray['val']['totaldebfield'] += $objp->amount;
346 }
347 print "</td>\n";
348 if (!$i) {
349 $totalarray['nbfield']++;
350 }
351 if (!$i) {
352 $totalarray['pos'][$totalarray['nbfield']] = 'totaldebfield';
353 }
354
355 // Credit
356 print '<td class="right">';
357 if ($objp->amount > 0) {
358 print '<span class="amount">'.price($objp->amount).'</span>';
359 $totalarray['val']['totalcredfield'] += $objp->amount;
360 }
361 print "</td>\n";
362 if (!$i) {
363 $totalarray['nbfield']++;
364 }
365 if (!$i) {
366 $totalarray['pos'][$totalarray['nbfield']] = 'totalcredfield';
367 }
368
369 print "</tr>";
370 }
371
372 $i++;
373 }
374
375 if (!$summaryonly) {
376 // Show total line
377 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
378
379 print "</table>";
380 print "</div>";
381 }
382
383 //$cash = $amountpertype['LIQ'] + $object->opening;
384 $newcash = price2num($cash + (float) $object->opening, 'MT');
385
386 print '<div style="text-align: right">';
387 print '<h2>';
388
389 print $langs->trans("Cash").(!empty($transactionspertype['CASH']) ? ' ('.$transactionspertype['CASH'].' '.$langs->trans("Articles").')' : '').' : ';
390 if (!$summaryonly) {
391 print '<div class="inline-block amount width100">'.($cash >= 0 ? '+' : '').price($cash).'</div>';
392 print '<div class="inline-block amount width100">'.price($newcash).'</div>';
393 } else {
394 print '<div class="inline-block amount width100"></div>';
395 print '<div class="inline-block amount width100">'.price($cash).'</div>';
396 }
397 if (!$summaryonly && $object->status == $object::STATUS_CLOSED && price2num($newcash) != price2num((float) $object->cash_declared)) {
398 print ' <div class="inline-block amountremaintopay fontsizeunset small"><> '.$langs->trans("Declared").': '.price($object->cash_declared).'</div>';
399 }
400 print "<br>";
401
402 //print '<br>';
403 print $langs->trans("PaymentTypeCHQ").(!empty($transactionspertype['CHQ']) ? ' ('.$transactionspertype['CHQ'].' '.$langs->trans("Articles").')' : '').' : ';
404 print '<div class="inline-block amount width100"></div>';
405 print '<div class="inline-block amount width100">'.price($cheque).'</div>';
406 if (!$summaryonly && $object->status == $object::STATUS_CLOSED && price2num($cheque) != price2num((float) $object->cheque_declared)) {
407 print ' <div class="inline-block amountremaintopay fontsizeunset small"><> '.$langs->trans("Declared").' : '.price($object->cheque_declared).'</div>';
408 }
409 print "<br>";
410
411 //print '<br>';
412 print $langs->trans("PaymentTypeCB").(!empty($transactionspertype['CB']) ? ' ('.$transactionspertype['CB'].' '.$langs->trans("Articles").')' : '').' : ';
413 print '<div class="inline-block amount width100"></div>';
414 print '<div class="inline-block amount width100">'.price($bank).'</div>';
415 if (!$summaryonly && $object->status == $object::STATUS_CLOSED && price2num($bank) != price2num((float) $object->card_declared)) {
416 print ' <div class="inline-block amountremaintopay fontsizeunset small"><> '.$langs->trans("Declared").': '.price($object->card_declared).'</div>';
417 }
418 print "<br>";
419
420 // print '<br>';
421 if ($other) {
422 print ''.$langs->trans("Other").(!empty($transactionspertype['OTHER']) ? ' ('.$transactionspertype['OTHER'].' '.$langs->trans("Articles").')' : '').' : ';
423 print '<div class="inline-block amount width100"></div>';
424 print '<div class="inline-block amount width100">'.price($other)."</div>";
425 print '<br>';
426 }
427
428 print "<br>";
429
430 print $langs->trans("Total").' ('.$totalqty.' '.$langs->trans("Articles").') : <div class="inline-block amount width100"></div><div class="inline-block amount width100">'.price((float) $cash + (float) $cheque + (float) $bank + (float) $other).'</div>';
431
432 print '<br>'.$langs->trans("TotalVAT").' : <div class="inline-block amount width100"></div><div class="inline-block amount width100">'.price($totalvat).'</div>';
433
434 if ($mysoc->useLocalTax(1)) {
435 print '<br>'.$langs->trans("TotalLT1").' : <div class="inline-block amount width100"></div><div class="inline-block amount width100">'.price($totallocaltax1).'</div>';
436 }
437 if ($mysoc->useLocalTax(1)) {
438 print '<br>'.$langs->trans("TotalLT2").' : <div class="inline-block amount width100"></div><div class="inline-block amount width100">'.price($totallocaltax2).'</div>';
439 }
440
441 if (!empty($totalvatperrate) && is_array($totalvatperrate)) {
442 print '<br><br><div class="small inline-block width100">'.$langs->trans("TotalHT").'</div><div class="small inline-block width100">'.$langs->trans("TotalVAT").'</div>';
443 if (getDolGlobalInt('TAKEPOS_CASHCONTROL_REPORT_SHOW_TOTAL_INCLUDING_TAXES_COLUMN', 0) != 0) {
444 print '<div class="small inline-block width100">'.$langs->trans("TotalTTC").'</div>';
445 }
446 foreach ($totalvatperrate as $keyrate => $valuerate) {
447 print '<br><div class="small">'.$langs->trans("VATRate").' '.vatrate($keyrate, true).' : <div class="inline-block amount width100">'.price($totalhtperrate[$keyrate] ?? 0).'</div><div class="inline-block amount width100">'.price($valuerate).'</div>';
448 if (getDolGlobalInt('TAKEPOS_CASHCONTROL_REPORT_SHOW_TOTAL_INCLUDING_TAXES_COLUMN', 0) != 0) {
449 print '<div class="inline-block amount width100">'.price(($totalhtperrate[$keyrate] ?? 0) + $valuerate).'</div>';
450 }
451 print '</div>';
452 }
453 }
454
455 print '</h2>';
456 print '</div>';
457
458 print '</form>';
459
460 $db->free($resql);
461} else {
462 dol_print_error($db);
463}
464
465print '</div>';
466
467llxFooter();
468
469$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition export.php:1216
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
isALNERunningVersion($blockedlogtestalreadydone=0)
Return if the application is executed with the LNE requirements on.
Class to manage bank accounts.
Class to manage cash fence.
Class to manage invoices.
Class to manage Dolibarr users.
global $mysoc
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
Definition date.lib.php:603
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:622
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.