dolibarr  20.0.0-beta
printsheet.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2003 Jean-Louis Bergamo <jlb@j1b.org>
4  * Copyright (C) 2006-2017 Laurent Destailleur <eldy@users.sourceforge.net>
5  * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <https://www.gnu.org/licenses/>.
19  */
20 
27 // Do not use GETPOST, the function does not exists yet.
28 if (!empty($_POST['mode']) && $_POST['mode'] === 'label') { // Page is called to build a PDF and output, we must not renew the token.
29  if (!defined('NOTOKENRENEWAL')) {
30  define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
31  }
32 }
33 
34 // Load Dolibarr environment
35 require '../main.inc.php';
36 require_once DOL_DOCUMENT_ROOT.'/core/lib/format_cards.lib.php';
37 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
38 require_once DOL_DOCUMENT_ROOT.'/core/modules/printsheet/modules_labels.php';
39 require_once DOL_DOCUMENT_ROOT.'/core/class/genericobject.class.php';
40 
41 // Load translation files required by the page
42 $langs->loadLangs(array('admin', 'members', 'errors'));
43 
44 // Choice of print year or current year.
45 $now = dol_now();
46 $year = dol_print_date($now, '%Y');
47 $month = dol_print_date($now, '%m');
48 $day = dol_print_date($now, '%d');
49 $forbarcode = GETPOST('forbarcode', 'alphanohtml');
50 $fk_barcode_type = GETPOSTINT('fk_barcode_type');
51 $mode = GETPOST('mode', 'aZ09');
52 $modellabel = GETPOST("modellabel", 'aZ09'); // Doc template to use
53 $numberofsticker = GETPOSTINT('numberofsticker');
54 
55 $mesg = '';
56 
57 $action = GETPOST('action', 'aZ09');
58 
59 $producttmp = new Product($db);
60 $thirdpartytmp = new Societe($db);
61 
62 // Security check (enable the most restrictive one)
63 //if ($user->socid > 0) accessforbidden();
64 //if ($user->socid > 0) $socid = $user->socid;
65 if (!isModEnabled('barcode')) {
66  accessforbidden('Module not enabled');
67 }
68 if (!$user->hasRight('barcode', 'read')) {
70 }
71 restrictedArea($user, 'barcode');
72 
73 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
74 $hookmanager->initHooks(array('printsheettools'));
75 
76 $parameters = array();
77 
78 // Note that $action and $object may have been modified by some
79 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
80 if ($reshook < 0) {
81  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
82 }
83 
84 /*
85  * Actions
86  */
87 
88 if (empty($reshook)) {
89  if (GETPOST('submitproduct') && GETPOST('submitproduct')) {
90  $action = ''; // We reset because we don't want to build doc
91  if (GETPOSTINT('productid') > 0) {
92  $result = $producttmp->fetch(GETPOSTINT('productid'));
93  if ($result < 0) {
94  setEventMessage($producttmp->error, 'errors');
95  }
96  $forbarcode = $producttmp->barcode;
97  $fk_barcode_type = $producttmp->barcode_type;
98 
99  if (empty($fk_barcode_type) && getDolGlobalString('PRODUIT_DEFAULT_BARCODE_TYPE')) {
100  $fk_barcode_type = getDolGlobalString('PRODUIT_DEFAULT_BARCODE_TYPE');
101  }
102 
103  if (empty($forbarcode) || empty($fk_barcode_type)) {
104  setEventMessages($langs->trans("DefinitionOfBarCodeForProductNotComplete", $producttmp->getNomUrl()), null, 'warnings');
105  }
106  }
107  }
108  if (GETPOST('submitthirdparty') && GETPOST('submitthirdparty')) {
109  $action = ''; // We reset because we don't want to build doc
110  if (GETPOSTINT('socid') > 0) {
111  $thirdpartytmp->fetch(GETPOSTINT('socid'));
112  $forbarcode = $thirdpartytmp->barcode;
113  $fk_barcode_type = $thirdpartytmp->barcode_type_code;
114 
115  if (empty($fk_barcode_type) && getDolGlobalString('GENBARCODE_BARCODETYPE_THIRDPARTY')) {
116  $fk_barcode_type = getDolGlobalString('GENBARCODE_BARCODETYPE_THIRDPARTY');
117  }
118 
119  if (empty($forbarcode) || empty($fk_barcode_type)) {
120  setEventMessages($langs->trans("DefinitionOfBarCodeForThirdpartyNotComplete", $thirdpartytmp->getNomUrl()), null, 'warnings');
121  }
122  }
123  }
124 
125  if ($action == 'builddoc') {
126  $result = 0;
127  $error = 0;
128 
129  if (empty($forbarcode)) { // barcode value
130  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("BarcodeValue")), null, 'errors');
131  $error++;
132  }
133  $MAXLENGTH = 51200; // Limit set to 50Ko
134  if (dol_strlen($forbarcode) > $MAXLENGTH) { // barcode value
135  setEventMessages($langs->trans("ErrorFieldTooLong", $langs->transnoentitiesnoconv("BarcodeValue")).' ('.$langs->trans("RequireXStringMax", $MAXLENGTH).')', null, 'errors');
136  $error++;
137  }
138  if (empty($fk_barcode_type)) { // barcode type = barcode encoding
139  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("BarcodeType")), null, 'errors');
140  $error++;
141  }
142 
143  if (!$error) {
144  // Get encoder (barcode_type_coder) from barcode type id (barcode_type)
145  $stdobject = new GenericObject($db);
146  $stdobject->barcode_type = $fk_barcode_type;
147  $result = $stdobject->fetch_barcode();
148  if ($result <= 0) {
149  $error++;
150  setEventMessages('Failed to get bar code type information '.$stdobject->error, $stdobject->errors, 'errors');
151  }
152  }
153 
154  if (!$error) {
155  $code = $forbarcode;
156  $generator = $stdobject->barcode_type_coder; // coder (loaded by fetch_barcode). Engine.
157  $encoding = strtoupper($stdobject->barcode_type_code); // code (loaded by fetch_barcode). Example 'ean', 'isbn', ...
158 
159  $diroutput = $conf->barcode->dir_temp;
160  dol_mkdir($diroutput);
161 
162  // Generate barcode
163  $dirbarcode = array_merge(array("/core/modules/barcode/doc/"), $conf->modules_parts['barcode']);
164 
165  foreach ($dirbarcode as $reldir) {
166  $dir = dol_buildpath($reldir, 0);
167  $newdir = dol_osencode($dir);
168 
169  // Check if directory exists (we do not use dol_is_dir to avoid loading files.lib.php)
170  if (!is_dir($newdir)) {
171  continue;
172  }
173 
174  $result = @include_once $newdir.$generator.'.modules.php';
175  if ($result) {
176  break;
177  }
178  }
179 
180  // Load barcode class for generating barcode image
181  $classname = "mod".ucfirst($generator);
182  $module = new $classname($db);
183  '@phan-var-force ModeleBarCode $module';
184  if ($generator != 'tcpdfbarcode') {
185  // May be phpbarcode
186  $template = 'standardlabel';
187  $is2d = false;
188  if ($module->encodingIsSupported($encoding)) {
189  $barcodeimage = $conf->barcode->dir_temp.'/barcode_'.$code.'_'.$encoding.'.png';
190  dol_delete_file($barcodeimage);
191  // File is created with full name $barcodeimage = $conf->barcode->dir_temp.'/barcode_'.$code.'_'.$encoding.'.png';
192  $result = $module->writeBarCode($code, $encoding, 'Y', 4, 1);
193  if ($result <= 0 || !dol_is_file($barcodeimage)) {
194  $error++;
195  setEventMessages('Failed to generate image file of barcode for code='.$code.' encoding='.$encoding.' file='.basename($barcodeimage), null, 'errors');
196  setEventMessages($module->error, null, 'errors');
197  }
198  } else {
199  $error++;
200  setEventMessages("Error, encoding ".$encoding." is not supported by encoder ".$generator.'. You must choose another barcode type or install a barcode generation engine that support '.$encoding, null, 'errors');
201  }
202  } else {
203  $template = 'tcpdflabel';
204  $encoding = $module->getTcpdfEncodingType($encoding); //convert to TCPDF compatible encoding types
205  $is2d = $module->is2d;
206  }
207  }
208 
209  if (!$error) {
210  // List of values to scan for a replacement
211  $substitutionarray = array(
212  '%LOGIN%' => $user->login,
213  '%COMPANY%' => $mysoc->name,
214  '%ADDRESS%' => $mysoc->address,
215  '%ZIP%' => $mysoc->zip,
216  '%TOWN%' => $mysoc->town,
217  '%COUNTRY%' => $mysoc->country,
218  '%COUNTRY_CODE%' => $mysoc->country_code,
219  '%EMAIL%' => $mysoc->email,
220  '%YEAR%' => $year,
221  '%MONTH%' => $month,
222  '%DAY%' => $day,
223  '%DOL_MAIN_URL_ROOT%' => DOL_MAIN_URL_ROOT,
224  '%SERVER%' => "http://".$_SERVER["SERVER_NAME"]."/",
225  );
226  complete_substitutions_array($substitutionarray, $langs);
227 
228  $arrayofrecords = array();
229  // For labels
230  if ($mode == 'label') {
231  $txtforsticker = "%PHOTO%"; // Photo will be barcode image, %BARCODE% possible when using TCPDF generator
232  $textleft = make_substitutions(getDolGlobalString('BARCODE_LABEL_LEFT_TEXT', $txtforsticker), $substitutionarray);
233  $textheader = make_substitutions(getDolGlobalString('BARCODE_LABEL_HEADER_TEXT'), $substitutionarray);
234  $textfooter = make_substitutions(getDolGlobalString('BARCODE_LABEL_FOOTER_TEXT'), $substitutionarray);
235  $textright = make_substitutions(getDolGlobalString('BARCODE_LABEL_RIGHT_TEXT'), $substitutionarray);
236  $forceimgscalewidth = getDolGlobalString('BARCODE_FORCEIMGSCALEWIDTH', 1);
237  $forceimgscaleheight = getDolGlobalString('BARCODE_FORCEIMGSCALEHEIGHT', 1);
238 
239  $MAXSTICKERS = 1000;
240  if ($numberofsticker <= $MAXSTICKERS) {
241  for ($i = 0; $i < $numberofsticker; $i++) {
242  $arrayofrecords[] = array(
243  'textleft' => $textleft,
244  'textheader' => $textheader,
245  'textfooter' => $textfooter,
246  'textright' => $textright,
247  'code' => $code,
248  'encoding' => $encoding,
249  'is2d' => $is2d,
250  'photo' => !empty($barcodeimage) ? $barcodeimage : '' // Photo must be a file that exists with format supported by TCPDF
251  );
252  }
253  } else {
254  $mesg = $langs->trans("ErrorQuantityIsLimitedTo", $MAXSTICKERS);
255  $error++;
256  }
257  }
258 
259  // Build and output PDF
260  if (!$error && $mode == 'label') {
261  if (!count($arrayofrecords)) {
262  $mesg = $langs->trans("ErrorRecordNotFound");
263  }
264  if (empty($modellabel) || $modellabel == '-1') {
265  $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DescADHERENT_ETIQUETTE_TYPE"));
266  }
267 
268  $outfile = $langs->trans("BarCode").'_sheets_'.dol_print_date(dol_now(), 'dayhourlog').'.pdf';
269 
270  if (!$mesg) {
271  $outputlangs = $langs;
272 
273  $previousConf = getDolGlobalInt('TCPDF_THROW_ERRORS_INSTEAD_OF_DIE');
274  $conf->global->TCPDF_THROW_ERRORS_INSTEAD_OF_DIE = 1;
275 
276  // This generates and send PDF to output
277  // TODO Move
278  try {
279  $result = doc_label_pdf_create($db, $arrayofrecords, $modellabel, $outputlangs, $diroutput, $template, dol_sanitizeFileName($outfile));
280  } catch (Exception $e) {
281  $mesg = $langs->trans('ErrorGeneratingBarcode');
282  }
283 
284  $conf->global->TCPDF_THROW_ERRORS_INSTEAD_OF_DIE = $previousConf;
285  }
286  }
287 
288  if ($result <= 0 || $mesg || $error) {
289  if (empty($mesg)) {
290  $mesg = 'Error '.$result;
291  }
292 
293  setEventMessages($mesg, null, 'errors');
294  } else {
295  $db->close();
296  exit;
297  }
298  }
299  }
300 }
301 
302 
303 /*
304  * View
305  */
306 
307 $form = new Form($db);
308 
309 llxHeader('', $langs->trans("BarCodePrintsheet"));
310 
311 print load_fiche_titre($langs->trans("BarCodePrintsheet"), '', 'barcode');
312 print '<br>';
313 
314 print '<span class="opacitymedium">'.$langs->trans("PageToGenerateBarCodeSheets", $langs->transnoentitiesnoconv("BuildPageToPrint")).'</span><br>';
315 print '<br>';
316 
317 //print img_picto('','puce').' '.$langs->trans("PrintsheetForOneBarCode").'<br>';
318 //print '<br>';
319 
320 print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">'; // The target is for brothers that open the file instead of downloading it
321 print '<input type="hidden" name="mode" value="label">';
322 print '<input type="hidden" name="action" value="builddoc">';
323 print '<input type="hidden" name="token" value="'.currentToken().'">'; // The page will not renew the token but force download of a file, so we must use here currentToken
324 
325 print '<div class="tagtable">';
326 
327 // Sheet format
328 print ' <div class="tagtr">';
329 print ' <div class="tagtd">';
330 print $langs->trans("DescADHERENT_ETIQUETTE_TYPE").' &nbsp; ';
331 print '</div><div class="tagtd maxwidthonsmartphone" style="overflow: hidden; white-space: nowrap;">';
332 // List of possible labels (defined into $_Avery_Labels variable set into core/lib/format_cards.lib.php)
333 $arrayoflabels = array();
334 foreach (array_keys($_Avery_Labels) as $codecards) {
335  $labeltoshow = $_Avery_Labels[$codecards]['name'];
336  //$labeltoshow.=' ('.$_Avery_Labels[$row['code']]['paper-size'].')';
337  $arrayoflabels[$codecards] = $labeltoshow;
338 }
339 asort($arrayoflabels);
340 print $form->selectarray('modellabel', $arrayoflabels, (GETPOST('modellabel') ? GETPOST('modellabel') : getDolGlobalString('ADHERENT_ETIQUETTE_TYPE')), 1, 0, 0, '', 0, 0, 0, '', '', 1);
341 print '</div></div>';
342 
343 // Number of stickers to print
344 print ' <div class="tagtr">';
345 print ' <div class="tagtd">';
346 print $langs->trans("NumberOfStickers").' &nbsp; ';
347 print '</div><div class="tagtd maxwidthonsmartphone" style="overflow: hidden; white-space: nowrap;">';
348 print '<input size="4" type="text" name="numberofsticker" value="'.(GETPOST('numberofsticker') ? GETPOSTINT('numberofsticker') : 10).'">';
349 print '</div></div>';
350 
351 print '</div>';
352 
353 
354 print '<br>';
355 
356 
357 // Add javascript to make choice dynamic
358 print '<script type="text/javascript">
359 jQuery(document).ready(function() {
360  function init_selectors()
361  {
362  if (jQuery("#fillmanually:checked").val() == "fillmanually")
363  {
364  jQuery("#submitproduct").prop("disabled", true);
365  jQuery("#submitthirdparty").prop("disabled", true);
366  jQuery("#search_productid").prop("disabled", true);
367  jQuery("#socid").prop("disabled", true);
368  jQuery(".showforproductselector").hide();
369  jQuery(".showforthirdpartyselector").hide();
370  }
371  if (jQuery("#fillfromproduct:checked").val() == "fillfromproduct")
372  {
373  jQuery("#submitproduct").removeAttr("disabled");
374  jQuery("#submitthirdparty").prop("disabled", true);
375  jQuery("#search_productid").removeAttr("disabled");
376  jQuery("#socid").prop("disabled", true);
377  jQuery(".showforproductselector").show();
378  jQuery(".showforthirdpartyselector").hide();
379  }
380  if (jQuery("#fillfromthirdparty:checked").val() == "fillfromthirdparty")
381  {
382  jQuery("#submitproduct").prop("disabled", true);
383  jQuery("#submitthirdparty").removeAttr("disabled");
384  jQuery("#search_productid").prop("disabled", true);
385  jQuery("#socid").removeAttr("disabled");
386  jQuery(".showforproductselector").hide();
387  jQuery(".showforthirdpartyselector").show();
388  }
389  }
390  init_selectors();
391  jQuery(".radiobarcodeselect").click(function() {
392  init_selectors();
393  });
394 
395  function init_gendoc_button()
396  {
397  if (jQuery("#select_fk_barcode_type").val() > 0 && jQuery("#forbarcode").val())
398  {
399  jQuery("#submitformbarcodegen").removeAttr("disabled");
400  }
401  else
402  {
403  jQuery("#submitformbarcodegen").prop("disabled", true);
404  }
405  }
406  init_gendoc_button();
407  jQuery("#select_fk_barcode_type").change(function() {
408  init_gendoc_button();
409  });
410  jQuery("#forbarcode").keyup(function() {
411  init_gendoc_button()
412  });
413 });
414 </script>';
415 
416 // Checkbox to select from free text
417 print '<input id="fillmanually" type="radio" '.((!GETPOST("selectorforbarcode") || GETPOST("selectorforbarcode") == 'fillmanually') ? 'checked ' : '').'name="selectorforbarcode" value="fillmanually" class="radiobarcodeselect"><label for="fillmanually"> '.$langs->trans("FillBarCodeTypeAndValueManually").'</label>';
418 print '<br>';
419 
420 if ($user->hasRight('produit', 'lire') || $user->hasRight('service', 'lire')) {
421  print '<input id="fillfromproduct" type="radio" '.((GETPOST("selectorforbarcode") == 'fillfromproduct') ? 'checked ' : '').'name="selectorforbarcode" value="fillfromproduct" class="radiobarcodeselect"><label for="fillfromproduct"> '.$langs->trans("FillBarCodeTypeAndValueFromProduct").'</label>';
422  print '<br>';
423  print '<div class="showforproductselector">';
424  $form->select_produits(GETPOSTINT('productid'), 'productid', '', '', 0, -1, 2, '', 0, array(), 0, '1', 0, 'minwidth400imp', 1);
425  print ' &nbsp; <input type="submit" class="button small" id="submitproduct" name="submitproduct" value="'.(dol_escape_htmltag($langs->trans("GetBarCode"))).'">';
426  print '</div>';
427 }
428 
429 if ($user->hasRight('societe', 'lire')) {
430  print '<input id="fillfromthirdparty" type="radio" '.((GETPOST("selectorforbarcode") == 'fillfromthirdparty') ? 'checked ' : '').'name="selectorforbarcode" value="fillfromthirdparty" class="radiobarcodeselect"><label for="fillfromthirdparty"> '.$langs->trans("FillBarCodeTypeAndValueFromThirdParty").'</label>';
431  print '<br>';
432  print '<div class="showforthirdpartyselector">';
433  print $form->select_company(GETPOSTINT('socid'), 'socid', '', 'SelectThirdParty', 0, 0, array(), 0, 'minwidth300');
434  print ' &nbsp; <input type="submit" id="submitthirdparty" name="submitthirdparty" class="button showforthirdpartyselector small" value="'.(dol_escape_htmltag($langs->trans("GetBarCode"))).'">';
435  print '</div>';
436 }
437 
438 print '<br>';
439 
440 if ($producttmp->id > 0) {
441  print $langs->trans("BarCodeDataForProduct", '').' '.$producttmp->getNomUrl(1).'<br>';
442 }
443 if ($thirdpartytmp->id > 0) {
444  print $langs->trans("BarCodeDataForThirdparty", '').' '.$thirdpartytmp->getNomUrl(1).'<br>';
445 }
446 
447 print '<div class="tagtable">';
448 
449 // Barcode type
450 print ' <div class="tagtr">';
451 print ' <div class="tagtd" style="overflow: hidden; white-space: nowrap; max-width: 300px;">';
452 print $langs->trans("BarcodeType").' &nbsp; ';
453 print '</div><div class="tagtd" style="overflow: hidden; white-space: nowrap; max-width: 300px;">';
454 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formbarcode.class.php';
455 $formbarcode = new FormBarCode($db);
456 print $formbarcode->selectBarcodeType($fk_barcode_type, 'fk_barcode_type', 1);
457 print '</div></div>';
458 
459 // Barcode value
460 print ' <div class="tagtr">';
461 print ' <div class="tagtd" style="overflow: hidden; white-space: nowrap; max-width: 300px;">';
462 print $langs->trans("BarcodeValue").' &nbsp; ';
463 print '</div><div class="tagtd" style="overflow: hidden; white-space: nowrap; max-width: 300px;">';
464 print '<input size="16" type="text" name="forbarcode" id="forbarcode" value="'.$forbarcode.'">';
465 print '</div></div>';
466 
467 /*
468 $barcodestickersmask=GETPOST('barcodestickersmask');
469 print '<br>'.$langs->trans("BarcodeStickersMask").':<br>';
470 print '<textarea cols="40" type="text" name="barcodestickersmask" value="'.GETPOST('barcodestickersmask').'">'.$barcodestickersmask.'</textarea>';
471 print '<br>';
472 */
473 
474 print '</div>';
475 
476 print '<br><input type="submit" class="button" id="submitformbarcodegen" '.((GETPOST("selectorforbarcode") && GETPOST("selectorforbarcode")) ? '' : 'disabled ').'value="'.$langs->trans("BuildPageToPrint").'">';
477 
478 print '</form>';
479 print '<br>';
480 
481 // End of page
482 llxFooter();
483 $db->close();
if($user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition: card.php:58
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:55
llxFooter()
Empty footer.
Definition: wrapper.php:69
Class to manage barcode HTML.
Class to manage generation of HTML components Only common components must be here.
Class of a generic business object.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
Definition: files.lib.php:1458
dol_is_file($pathoffile)
Return if path is a file.
Definition: files.lib.php:519
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
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).
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return 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)
doc_label_pdf_create($db, $arrayofrecords, $modele, $outputlangs, $outputdir='', $template='standardlabel', $filename='tmp_address_sheet.pdf')
Create a document onto disk according to template module.
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.