dolibarr 21.0.0-alpha
doc_generic_proposal_odt.modules.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2010-2012 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2012 Juanjo Menent <jmenent@2byte.es>
4 * Copyright (C) 2016 Charlie Benke <charlie@patas-monkey.com>
5 * Copyright (C) 2018-2024 Frédéric France <frederic.france@free.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* or see https://www.gnu.org/
21*/
22
29require_once DOL_DOCUMENT_ROOT.'/core/modules/propale/modules_propale.php';
30require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
31require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
32require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/signature.lib.php';
36
37
42{
46 public $version = 'dolibarr';
47
48
54 public function __construct($db)
55 {
56 global $langs, $mysoc;
57
58 // Load translation files required by the page
59 $langs->loadLangs(array("main", "companies"));
60
61 $this->db = $db;
62 $this->name = "ODT templates";
63 $this->description = $langs->trans("DocumentModelOdt");
64 $this->update_main_doc_field = 1; // Save the name of generated file as the main doc when generating a doc with this template
65 $this->scandir = 'PROPALE_ADDON_PDF_ODT_PATH'; // Name of constant that is used to save list of directories to scan
66
67 // Page size for A4 format
68 $this->type = 'odt';
69 $this->page_largeur = 0;
70 $this->page_hauteur = 0;
71 $this->format = array($this->page_largeur, $this->page_hauteur);
72 $this->marge_gauche = 0;
73 $this->marge_droite = 0;
74 $this->marge_haute = 0;
75 $this->marge_basse = 0;
76
77 $this->option_logo = 1; // Display logo
78 $this->option_tva = 0; // Manage the vat option PROPALE_TVAOPTION
79 $this->option_modereg = 0; // Display payment mode
80 $this->option_condreg = 0; // Display payment terms
81 $this->option_multilang = 1; // Available in several languages
82 $this->option_escompte = 0; // Displays if there has been a discount
83 $this->option_credit_note = 0; // Support credit notes
84 $this->option_freetext = 1; // Support add of a personalised text
85 $this->option_draft_watermark = 0; // Support add of a watermark on drafts
86
87 if ($mysoc === null) {
88 dol_syslog(get_class($this).'::__construct() Global $mysoc should not be null.'. getCallerInfoString(), LOG_ERR);
89 return;
90 }
91
92 // Get source company
93 $this->emetteur = $mysoc;
94 if (!$this->emetteur->country_code) {
95 $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default if not defined
96 }
97 }
98
99
106 public function info($langs)
107 {
108 global $langs;
109
110 // Load translation files required by the page
111 $langs->loadLangs(array("errors", "companies"));
112
113 $form = new Form($this->db);
114
115 $odtChosen = getDolGlobalInt('MAIN_PROPAL_CHOOSE_ODT_DOCUMENT') > 0;
116 $odtPath = trim(getDolGlobalString('PROPALE_ADDON_PDF_ODT_PATH'));
117
118 $texte = $this->description.".<br>\n";
119 $texte .= '<form action="'.$_SERVER["PHP_SELF"].'" method="POST" enctype="multipart/form-data">';
120 $texte .= '<input type="hidden" name="token" value="'.newToken().'">';
121 $texte .= '<input type="hidden" name="page_y" value="">';
122 $texte .= '<input type="hidden" name="action" value="setModuleOptions">';
123 $texte .= '<input type="hidden" name="param1" value="PROPALE_ADDON_PDF_ODT_PATH">';
124 if ($odtChosen) {
125 $texte .= '<input type="hidden" name="param2" value="PROPALE_ADDON_PDF_ODT_DEFAULT">';
126 $texte .= '<input type="hidden" name="param3" value="PROPALE_ADDON_PDF_ODT_TOBILL">';
127 $texte .= '<input type="hidden" name="param4" value="PROPALE_ADDON_PDF_ODT_CLOSED">';
128 }
129 $texte .= '<table class="nobordernopadding centpercent">';
130
131 // List of directories area
132 $texte .= '<tr><td>';
133 $texttitle = $langs->trans("ListOfDirectories");
134 $listofdir = explode(',', preg_replace('/[\r\n]+/', ',', $odtPath));
135 $listoffiles = array();
136 foreach ($listofdir as $key => $tmpdir) {
137 $tmpdir = trim($tmpdir);
138 $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
139 if (!$tmpdir) {
140 unset($listofdir[$key]);
141 continue;
142 }
143 if (!is_dir($tmpdir)) {
144 $texttitle .= img_warning($langs->trans("ErrorDirNotFound", $tmpdir), '');
145 } else {
146 $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.(ods|odt)');
147 if (count($tmpfiles)) {
148 $listoffiles = array_merge($listoffiles, $tmpfiles);
149 }
150 }
151 }
152 $texthelp = $langs->trans("ListOfDirectoriesForModelGenODT");
153 $texthelp .= '<br><br><span class="opacitymedium">'.$langs->trans("ExampleOfDirectoriesForModelGen").'</span>';
154 // Add list of substitution keys
155 $texthelp .= '<br>'.$langs->trans("FollowingSubstitutionKeysCanBeUsed").'<br>';
156 $texthelp .= $langs->transnoentitiesnoconv("FullListOnOnlineDocumentation"); // This contains an url, we don't modify it
157
158 $texte .= $form->textwithpicto($texttitle, $texthelp, 1, 'help', '', 1, 3, $this->name);
159 $texte .= '<div><div style="display: inline-block; min-width: 100px; vertical-align: middle;">';
160 $texte .= '<textarea class="flat" cols="60" name="value1">';
161 $texte .= $odtPath;
162 $texte .= '</textarea>';
163 $texte .= '</div><div style="display: inline-block; vertical-align: middle;">';
164 $texte .= '<input type="submit" class="button button-edit reposition smallpaddingimp" name="modify" value="'.dol_escape_htmltag($langs->trans("Modify")).'">';
165 $texte .= '<br></div></div>';
166
167 // Scan directories
168 $nbofiles = count($listoffiles);
169 if (!empty($odtPath)) {
170 $texte .= $langs->trans("NumberOfModelFilesFound").': <b>';
171 //$texte.=$nbofiles?'<a id="a_'.get_class($this).'" href="#">':'';
172 $texte .= count($listoffiles);
173 //$texte.=$nbofiles?'</a>':'';
174 $texte .= '</b>';
175 }
176
177 if ($nbofiles) {
178 $texte .= '<div id="div_'.get_class($this).'" class="hiddenx">';
179 // Show list of found files
180 foreach ($listoffiles as $file) {
181 $texte .= '- '.$file['name'];
182 $texte .= ' <a href="'.DOL_URL_ROOT.'/document.php?modulepart=doctemplates&file=proposals/'.urlencode(basename($file['name'])).'">'.img_picto('', 'listlight').'</a>';
183 $texte .= ' &nbsp; <a class="reposition" href="'.$_SERVER["PHP_SELF"].'?modulepart=doctemplates&keyforuploaddir=PROPALE_ADDON_PDF_ODT_PATH&action=deletefile&token='.newToken().'&file='.urlencode(basename($file['name'])).'">'.img_picto('', 'delete').'</a>';
184 $texte .= '<br>';
185 }
186 $texte .= '</div>';
187
188 // Set default template for different status of proposal
189 if ($odtChosen) {
190 // Model for creation
191 $list = ModelePDFPropales::liste_modeles($this->db);
192 $texte .= '<table width="50%">';
193 $texte .= '<tr>';
194 $texte .= '<td width="60%">'.$langs->trans("DefaultModelPropalCreate").'</td>';
195 $texte .= '<td colspan="">';
196 $texte .= $form->selectarray('value2', $list, getDolGlobalString('PROPALE_ADDON_PDF_ODT_DEFAULT'));
197 $texte .= "</td></tr>";
198
199 $texte .= '<tr>';
200 $texte .= '<td width="60%">'.$langs->trans("DefaultModelPropalToBill").'</td>';
201 $texte .= '<td colspan="">';
202 $texte .= $form->selectarray('value3', $list, getDolGlobalString('PROPALE_ADDON_PDF_ODT_TOBILL'));
203 $texte .= "</td></tr>";
204 $texte .= '<tr>';
205
206 $texte .= '<td width="60%">'.$langs->trans("DefaultModelPropalClosed").'</td>';
207 $texte .= '<td colspan="">';
208 $texte .= $form->selectarray('value4', $list, getDolGlobalString('PROPALE_ADDON_PDF_ODT_CLOSED'));
209 $texte .= "</td></tr>";
210 $texte .= '</table>';
211 }
212 }
213 // Add input to upload a new template file.
214 $texte .= '<div>'.$langs->trans("UploadNewTemplate");
215 $maxfilesizearray = getMaxFileSizeArray();
216 $maxmin = $maxfilesizearray['maxmin'];
217 if ($maxmin > 0) {
218 $texte .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
219 }
220 $texte .= ' <input type="file" name="uploadfile">';
221 $texte .= '<input type="hidden" value="PROPALE_ADDON_PDF_ODT_PATH" name="keyforuploaddir">';
222 $texte .= '<input type="submit" class="button smallpaddingimp reposition" value="'.dol_escape_htmltag($langs->trans("Upload")).'" name="upload">';
223 $texte .= '</div>';
224 $texte .= '</td>';
225
226 $texte .= '</tr>';
227
228 $texte .= '</table>';
229 $texte .= '</form>';
230
231 return $texte;
232 }
233
234 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
246 public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0)
247 {
248 // phpcs:enable
249 global $user, $langs, $conf, $mysoc, $hookmanager;
250
251 if (empty($srctemplatepath)) {
252 dol_syslog("doc_generic_odt::write_file parameter srctemplatepath empty", LOG_WARNING);
253 return -1;
254 }
255
256 // Add odtgeneration hook
257 if (!is_object($hookmanager)) {
258 include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
259 $hookmanager = new HookManager($this->db);
260 }
261 $hookmanager->initHooks(array('odtgeneration'));
262 global $action;
263
264 if (!is_object($outputlangs)) {
265 $outputlangs = $langs;
266 }
267 $sav_charset_output = $outputlangs->charset_output;
268 $outputlangs->charset_output = 'UTF-8';
269
270 // Load translation files required by the page
271 $outputlangs->loadLangs(array("main", "dict", "companies", "bills"));
272
273 if ($conf->propal->multidir_output[$conf->entity]) {
274 // If $object is id instead of object
275 if (!is_object($object)) {
276 $id = $object;
277 $object = new Propal($this->db);
278 $result = $object->fetch($id);
279 if ($result < 0) {
280 dol_print_error($this->db, $object->error);
281 return -1;
282 }
283 }
284
285 $object->fetch_thirdparty();
286
287 $dir = $conf->propal->multidir_output[$object->entity];
288 $objectref = dol_sanitizeFileName($object->ref);
289 if (!preg_match('/specimen/i', $objectref)) {
290 $dir .= "/".$objectref;
291 }
292 $file = $dir."/".$objectref.".odt";
293
294 if (!file_exists($dir)) {
295 if (dol_mkdir($dir) < 0) {
296 $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
297 return -1;
298 }
299 }
300
301 if (file_exists($dir)) {
302 //print "srctemplatepath=".$srctemplatepath; // Src filename
303 $newfile = basename($srctemplatepath);
304 $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile);
305 $newfiletmp = preg_replace('/template_/i', '', $newfiletmp);
306 $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp);
307
308 $newfiletmp = $objectref . '_' . $newfiletmp;
309
310 // Get extension (ods or odt)
311 $newfileformat = substr($newfile, strrpos($newfile, '.') + 1);
312 if (getDolGlobalString('MAIN_DOC_USE_TIMING')) {
313 $format = getDolGlobalString('MAIN_DOC_USE_TIMING');
314 if ($format == '1') {
315 $format = '%Y%m%d%H%M%S';
316 }
317 $filename = $newfiletmp . '-' . dol_print_date(dol_now(), $format) . '.' . $newfileformat;
318 } else {
319 $filename = $newfiletmp . '.' . $newfileformat;
320 }
321 $file = $dir . '/' . $filename;
322 //print "newdir=".$dir;
323 //print "newfile=".$newfile;
324 //print "file=".$file;
325 //print "conf->propal->dir_temp=".$conf->propal->dir_temp;
326
327 dol_mkdir($conf->propal->multidir_temp[$object->entity]);
328 if (!is_writable($conf->propal->dir_temp)) {
329 $this->error = $langs->transnoentities("ErrorFailedToWriteInTempDirectory", $conf->propal->dir_temp);
330 dol_syslog('Error in write_file: ' . $this->error, LOG_ERR);
331 return -1;
332 }
333
334 // If CUSTOMER contact defined on proposal, we use it
335 $usecontact = false;
336 $arrayidcontact = $object->getIdContact('external', 'CUSTOMER');
337 if (count($arrayidcontact) > 0) {
338 $usecontact = true;
339 $result = $object->fetch_contact($arrayidcontact[0]);
340 }
341
342 // Recipient name
343 $contactobject = null;
344 if (!empty($usecontact)) {
345 // We can use the company of contact instead of thirdparty company
346 if ($object->contact->socid != $object->thirdparty->id && (!isset($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT) || getDolGlobalString('MAIN_USE_COMPANY_NAME_OF_CONTACT'))) {
347 $object->contact->fetch_thirdparty();
348 $socobject = $object->contact->thirdparty;
349 $contactobject = $object->contact;
350 } else {
351 $socobject = $object->thirdparty;
352 // if we have a CUSTOMER contact and we don't use it as thirdparty recipient we store the contact object for later use
353 $contactobject = $object->contact;
354 }
355 } else {
356 $socobject = $object->thirdparty;
357 }
358 // Make substitution
359 $substitutionarray = array(
360 '__FROM_NAME__' => $this->emetteur->name,
361 '__FROM_EMAIL__' => $this->emetteur->email,
362 '__TOTAL_TTC__' => $object->total_ttc,
363 '__TOTAL_HT__' => $object->total_ht,
364 '__TOTAL_VAT__' => $object->total_tva
365 );
366 complete_substitutions_array($substitutionarray, $langs, $object);
367 // Call the ODTSubstitution hook
368 $parameters = array('file' => $file, 'object' => $object, 'outputlangs' => $outputlangs, 'substitutionarray' => &$substitutionarray);
369 $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
370
371 // Line of free text
372 $newfreetext = '';
373 $paramfreetext = 'PROPOSAL_FREE_TEXT';
374 if (getDolGlobalString($paramfreetext)) {
375 $newfreetext = make_substitutions(getDolGlobalString($paramfreetext), $substitutionarray);
376 }
377
378 // Open and load template
379 require_once ODTPHP_PATH.'odf.php';
380 try {
381 $odfHandler = new Odf(
382 $srctemplatepath,
383 array(
384 'PATH_TO_TMP' => $conf->propal->multidir_temp[$object->entity],
385 'ZIP_PROXY' => getDolGlobalString('MAIN_ODF_ZIP_PROXY', 'PclZipProxy'), // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy.
386 'DELIMITER_LEFT' => '{',
387 'DELIMITER_RIGHT' => '}'
388 )
389 );
390 } catch (Exception $e) {
391 $this->error = $e->getMessage();
392 dol_syslog($e->getMessage(), LOG_INFO);
393 return -1;
394 }
395 // After construction $odfHandler->contentXml contains content and
396 // [!-- BEGIN row.lines --]*[!-- END row.lines --] has been replaced by
397 // [!-- BEGIN lines --]*[!-- END lines --]
398 //print html_entity_decode($odfHandler->__toString());
399 //print exit;
400
401 $object->fetch_optionals();
402
403 // Make substitutions into odt of freetext
404 try {
405 $odfHandler->setVars('free_text', $newfreetext, true, 'UTF-8');
406 } catch (OdfException $e) {
407 dol_syslog($e->getMessage(), LOG_INFO);
408 }
409
410 // Define substitution array
411 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
412 $array_object_from_properties = $this->get_substitutionarray_each_var_object($object, $outputlangs);
413 $array_objet = $this->get_substitutionarray_object($object, $outputlangs);
414 $array_user = $this->get_substitutionarray_user($user, $outputlangs);
415 $array_soc = $this->get_substitutionarray_mysoc($mysoc, $outputlangs);
416 $array_thirdparty = $this->get_substitutionarray_thirdparty($socobject, $outputlangs);
417 $array_other = $this->get_substitutionarray_other($outputlangs);
418
419 include_once DOL_DOCUMENT_ROOT.'/societe/class/companybankaccount.class.php';
420 $companybankaccount = new CompanyBankAccount($this->db);
421 // @phan-suppress-next-line PhanPluginSuspiciousParamPosition
422 $companybankaccount->fetch(0, '', $object->thirdparty->id);
423 $array_objet['company_default_bank_iban'] = $companybankaccount->iban;
424 $array_objet['company_default_bank_bic'] = $companybankaccount->bic;
425
426 // retrieve contact information for use in object as contact_xxx tags
427 $array_thirdparty_contact = array();
428 if ($usecontact && is_object($contactobject)) {
429 $array_thirdparty_contact = $this->get_substitutionarray_contact($contactobject, $outputlangs, 'contact');
430 }
431
432 $tmparray = array_merge($substitutionarray, $array_object_from_properties, $array_user, $array_soc, $array_thirdparty, $array_objet, $array_other, $array_thirdparty_contact);
433 complete_substitutions_array($tmparray, $outputlangs, $object);
434
435 // Call the ODTSubstitution hook
436 $parameters = array('odfHandler' => &$odfHandler, 'file' => $file, 'object' => $object, 'outputlangs' => $outputlangs, 'substitutionarray' => &$tmparray);
437 $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
438
439 foreach ($tmparray as $key => $value) {
440 try {
441 if (preg_match('/logo$/', $key)) { // Image
442 if (file_exists($value)) {
443 $odfHandler->setImage($key, $value);
444 } else {
445 $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
446 }
447 } else { // Text
448 $odfHandler->setVars($key, $value, true, 'UTF-8');
449 }
450 } catch (OdfException $e) {
451 dol_syslog($e->getMessage(), LOG_INFO);
452 }
453 }
454 // Replace tags of lines
455 $foundtagforlines = 1;
456 try {
457 $listlines = $odfHandler->setSegment('lines');
458 } catch (OdfExceptionSegmentNotFound $e) {
459 // We may arrive here if tags for lines not present into template
460 $foundtagforlines = 0;
461 dol_syslog($e->getMessage(), LOG_INFO);
462 }
463 if ($foundtagforlines) {
464 $linenumber = 0;
465 foreach ($object->lines as $line) {
466 $linenumber++;
467 $tmparray = $this->get_substitutionarray_lines($line, $outputlangs, $linenumber);
468 complete_substitutions_array($tmparray, $outputlangs, $object, $line, "completesubstitutionarray_lines");
469 // Call the ODTSubstitutionLine hook
470 $parameters = array('odfHandler' => &$odfHandler, 'file' => $file, 'object' => $object, 'outputlangs' => $outputlangs, 'substitutionarray' => &$tmparray, 'line' => $line);
471 $reshook = $hookmanager->executeHooks('ODTSubstitutionLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
472 foreach ($tmparray as $key => $val) {
473 try {
474 $listlines->setVars($key, $val, true, 'UTF-8');
475 } catch (SegmentException $e) {
476 dol_syslog($e->getMessage(), LOG_INFO);
477 }
478 }
479 $listlines->merge();
480 }
481 try {
482 $odfHandler->mergeSegment($listlines);
483 } catch (OdfException $e) {
484 $this->error = $e->getMessage();
485 dol_syslog($this->error, LOG_WARNING);
486 return -1;
487 }
488 }
489
490 // Replace labels translated
491 $tmparray = $outputlangs->get_translations_for_substitutions();
492 foreach ($tmparray as $key => $value) {
493 try {
494 $odfHandler->setVars($key, $value, true, 'UTF-8');
495 } catch (OdfException $e) {
496 dol_syslog($e->getMessage(), LOG_INFO);
497 }
498 }
499
500 // Call the beforeODTSave hook
501 $parameters = array('odfHandler' => &$odfHandler, 'file' => $file, 'object' => $object, 'outputlangs' => $outputlangs, 'substitutionarray' => &$tmparray);
502 $reshook = $hookmanager->executeHooks('beforeODTSave', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
503
504 // Write new file
505 if (getDolGlobalString('MAIN_ODT_AS_PDF')) {
506 try {
507 $odfHandler->exportAsAttachedPDF($file);
508 } catch (Exception $e) {
509 $this->error = $e->getMessage();
510 dol_syslog($e->getMessage(), LOG_INFO);
511 return -1;
512 }
513 } else {
514 try {
515 $odfHandler->saveToDisk($file);
516 } catch (Exception $e) {
517 $this->error = $e->getMessage();
518 dol_syslog($e->getMessage(), LOG_INFO);
519 return -1;
520 }
521 }
522 $parameters = array('odfHandler' => &$odfHandler, 'file' => $file, 'object' => $object, 'outputlangs' => $outputlangs, 'substitutionarray' => &$tmparray);
523 $reshook = $hookmanager->executeHooks('afterODTCreation', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
524
525 dolChmod($file);
526
527 $odfHandler = null; // Destroy object
528
529 $this->result = array('fullpath' => $file);
530
531 return 1; // Success
532 } else {
533 $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
534 return -1;
535 }
536 }
537
538 return -1;
539 }
540}
$id
Definition account.php:39
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
get_substitutionarray_each_var_object(&$object, $outputlangs, $recursive=1)
Define array with couple substitution key => substitution value.
get_substitutionarray_mysoc($mysoc, $outputlangs)
Define array with couple substitution key => substitution value.
get_substitutionarray_contact($object, $outputlangs, $array_key='object')
Define array with couple substitution key => substitution value.
get_substitutionarray_other($outputlangs)
Define array with couple substitution key => substitution value.
get_substitutionarray_lines($line, $outputlangs, $linenumber=0)
Define array with couple substitution key => substitution value Note that vars into substitutions arr...
get_substitutionarray_thirdparty($object, $outputlangs, $array_key='company')
Define array with couple substitution key => substitution value For example {company_name}...
get_substitutionarray_user($user, $outputlangs)
Define array with couple substitution key => substitution value.
Class to manage bank accounts description of third parties.
Class to manage generation of HTML components Only common components must be here.
Class to manage hooks.
Class mere des modeles de propale.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage proposals.
Class to build documents using ODF templates generator.
info($langs)
Return description of a module.
write_file($object, $outputlangs, $srctemplatepath='', $hidedetails=0, $hidedesc=0, $hideref=0)
Function to build a document on disk using the generic odt module.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition files.lib.php:63
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
getCallerInfoString()
Get caller info as a string that can be appended to a log message.
dolChmod($filepath, $newmask='')
Change mod of a file.
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).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:137
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition repair.php:140
getMaxFileSizeArray()
Return the max allowed for file upload.