dolibarr  16.0.5
doc_generic_supplier_proposal_odt.modules.php
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 Frédéric France <frederic.france@netlogic.fr>
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 * or see https://www.gnu.org/
20 */
21 
28 require_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_proposal/modules_supplier_proposal.php';
29 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
30 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php';
34 
35 
40 {
45  public $emetteur;
46 
51  public $phpmin = array(5, 6);
52 
57  public $version = 'dolibarr';
58 
59 
65  public function __construct($db)
66  {
67  global $conf, $langs, $mysoc;
68 
69  // Load translation files required by the page
70  $langs->loadLangs(array("main", "companies"));
71 
72  $this->db = $db;
73  $this->name = "ODT templates";
74  $this->description = $langs->trans("DocumentModelOdt");
75  $this->scandir = 'SUPPLIER_PROPOSAL_ADDON_PDF_ODT_PATH'; // Name of constant that is used to save list of directories to scan
76 
77  // Page size for A4 format
78  $this->type = 'odt';
79  $this->page_largeur = 0;
80  $this->page_hauteur = 0;
81  $this->format = array($this->page_largeur, $this->page_hauteur);
82  $this->marge_gauche = 0;
83  $this->marge_droite = 0;
84  $this->marge_haute = 0;
85  $this->marge_basse = 0;
86 
87  $this->option_logo = 1; // Display logo
88  $this->option_tva = 0; // Manage the vat option PROPALE_TVAOPTION
89  $this->option_modereg = 0; // Display payment mode
90  $this->option_condreg = 0; // Display payment terms
91  $this->option_multilang = 1; // Available in several languages
92  $this->option_escompte = 0; // Displays if there has been a discount
93  $this->option_credit_note = 0; // Support credit notes
94  $this->option_freetext = 1; // Support add of a personalised text
95  $this->option_draft_watermark = 0; // Support add of a watermark on drafts
96 
97  // Recupere emetteur
98  $this->emetteur = $mysoc;
99  if (!$this->emetteur->country_code) {
100  $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default if not defined
101  }
102  }
103 
104 
111  public function info($langs)
112  {
113  global $conf, $langs;
114 
115  // Load translation files required by the page
116  $langs->loadLangs(array('companies', 'errors'));
117 
118  $form = new Form($this->db);
119 
120  $texte = $this->description.".<br>\n";
121  $texte .= '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
122  $texte .= '<input type="hidden" name="token" value="'.newToken().'">';
123  $texte .= '<input type="hidden" name="page_y" value="">';
124  $texte .= '<input type="hidden" name="action" value="setModuleOptions">';
125  $texte .= '<input type="hidden" name="param1" value="SUPPLIER_PROPOSAL_ADDON_PDF_ODT_PATH">';
126  if ($conf->global->MAIN_SUPPLIER_PROPOSAL_CHOOSE_ODT_DOCUMENT > 0) {
127  $texte .= '<input type="hidden" name="param2" value="SUPPLIER_PROPOSAL_ADDON_PDF_ODT_DEFAULT">';
128  $texte .= '<input type="hidden" name="param3" value="SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL">';
129  $texte .= '<input type="hidden" name="param4" value="SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED">';
130  }
131  $texte .= '<table class="nobordernopadding" width="100%">';
132 
133  // List of directories area
134  $texte .= '<tr><td>';
135  $texttitle = $langs->trans("ListOfDirectories");
136  $listofdir = explode(',', preg_replace('/[\r\n]+/', ',', trim($conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_PATH)));
137  $listoffiles = array();
138  foreach ($listofdir as $key => $tmpdir) {
139  $tmpdir = trim($tmpdir);
140  $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
141  if (!$tmpdir) {
142  unset($listofdir[$key]);
143  continue;
144  }
145  if (!is_dir($tmpdir)) {
146  $texttitle .= img_warning($langs->trans("ErrorDirNotFound", $tmpdir), 0);
147  } else {
148  $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.(ods|odt)');
149  if (count($tmpfiles)) {
150  $listoffiles = array_merge($listoffiles, $tmpfiles);
151  }
152  }
153  }
154  $texthelp = $langs->trans("ListOfDirectoriesForModelGenODT");
155  // Add list of substitution keys
156  $texthelp .= '<br>'.$langs->trans("FollowingSubstitutionKeysCanBeUsed").'<br>';
157  $texthelp .= $langs->transnoentitiesnoconv("FullListOnOnlineDocumentation"); // This contains an url, we don't modify it
158 
159  $texte .= $form->textwithpicto($texttitle, $texthelp, 1, 'help', '', 1);
160  $texte .= '<div><div style="display: inline-block; min-width: 100px; vertical-align: middle;">';
161  $texte .= '<textarea class="flat" cols="60" name="value1">';
162  $texte .= $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_PATH;
163  $texte .= '</textarea>';
164  $texte .= '</div><div style="display: inline-block; vertical-align: middle;">';
165  $texte .= '<input type="submit" class="button small reposition" name="modify" value="'.$langs->trans("Modify").'">';
166  $texte .= '<br></div></div>';
167 
168  // Scan directories
169  $nbofiles = count($listoffiles);
170  if (!empty($conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_PATH)) {
171  $texte .= $langs->trans("NumberOfModelFilesFound").': <b>';
172  //$texte.=$nbofiles?'<a id="a_'.get_class($this).'" href="#">':'';
173  $texte .= count($listoffiles);
174  //$texte.=$nbofiles?'</a>':'';
175  $texte .= '</b>';
176  }
177 
178  if ($nbofiles) {
179  $texte .= '<div id="div_'.get_class($this).'" class="hiddenx">';
180  // Show list of found files
181  foreach ($listoffiles as $file) {
182  $texte .= '- '.$file['name'].' <a href="'.DOL_URL_ROOT.'/document.php?modulepart=doctemplates&file=supplier_proposal/'.urlencode(basename($file['name'])).'">'.img_picto('', 'listlight').'</a><br>';
183  }
184  $texte .= '</div>';
185 
186  if ($conf->global->MAIN_SUPPLIER_PROPOSAL_CHOOSE_ODT_DOCUMENT > 0) {
187  // Model for creation
189  $texte .= '<table width="50%;">';
190  $texte .= '<tr>';
191  $texte .= '<td width="60%;">'.$langs->trans("DefaultModelSupplierProposalCreate").'</td>';
192  $texte .= '<td colspan="">';
193  $texte .= $form->selectarray('value2', $list, $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_DEFAULT);
194  $texte .= "</td></tr>";
195 
196  $texte .= '<tr>';
197  $texte .= '<td width="60%;">'.$langs->trans("DefaultModelSupplierProposalToBill").'</td>';
198  $texte .= '<td colspan="">';
199  $texte .= $form->selectarray('value3', $list, $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL);
200  $texte .= "</td></tr>";
201  $texte .= '<tr>';
202 
203  $texte .= '<td width="60%;">'.$langs->trans("DefaultModelSupplierProposalClosed").'</td>';
204  $texte .= '<td colspan="">';
205  $texte .= $form->selectarray('value4', $list, $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED);
206  $texte .= "</td></tr>";
207  $texte .= '</table>';
208  }
209  }
210 
211  $texte .= '</td>';
212 
213  $texte .= '<td rowspan="2" class="tdtop hideonsmartphone">';
214  $texte .= '<span class="opacitymedium">';
215  $texte .= $langs->trans("ExampleOfDirectoriesForModelGen");
216  $texte .= '</span>';
217  $texte .= '</td>';
218  $texte .= '</tr>';
219 
220  $texte .= '</table>';
221  $texte .= '</form>';
222 
223  return $texte;
224  }
225 
226  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
238  public function write_file($object, $outputlangs, $srctemplatepath, $hidedetails = 0, $hidedesc = 0, $hideref = 0)
239  {
240  // phpcs:enable
241  global $user, $langs, $conf, $mysoc, $hookmanager;
242 
243  if (empty($srctemplatepath)) {
244  dol_syslog("doc_generic_odt::write_file parameter srctemplatepath empty", LOG_WARNING);
245  return -1;
246  }
247 
248  // Add odtgeneration hook
249  if (!is_object($hookmanager)) {
250  include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
251  $hookmanager = new HookManager($this->db);
252  }
253  $hookmanager->initHooks(array('odtgeneration'));
254  global $action;
255 
256  if (!is_object($outputlangs)) {
257  $outputlangs = $langs;
258  }
259  $sav_charset_output = $outputlangs->charset_output;
260  $outputlangs->charset_output = 'UTF-8';
261 
262  // Load translation files required by the page
263  $outputlangs->loadLangs(array("main", "companies", "bills", "dict"));
264 
265  if ($conf->supplier_proposal->dir_output) {
266  // If $object is id instead of object
267  if (!is_object($object)) {
268  $id = $object;
269  $object = new SupplierProposal($this->db);
270  $result = $object->fetch($id);
271  if ($result < 0) {
272  dol_print_error($this->db, $object->error);
273  return -1;
274  }
275  }
276 
277  $object->fetch_thirdparty();
278 
279  $dir = $conf->supplier_proposal->dir_output;
280  $objectref = dol_sanitizeFileName($object->ref);
281  if (!preg_match('/specimen/i', $objectref)) {
282  $dir .= "/".$objectref;
283  }
284  $file = $dir."/".$objectref.".odt";
285 
286  if (!file_exists($dir)) {
287  if (dol_mkdir($dir) < 0) {
288  $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
289  return -1;
290  }
291  }
292 
293  if (file_exists($dir)) {
294  //print "srctemplatepath=".$srctemplatepath; // Src filename
295  $newfile = basename($srctemplatepath);
296  $newfiletmp = preg_replace('/\.od(t|s)/i', '', $newfile);
297  $newfiletmp = preg_replace('/template_/i', '', $newfiletmp);
298  $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp);
299 
300  $newfiletmp = $objectref.'_'.$newfiletmp;
301 
302  // Get extension (ods or odt)
303  $newfileformat = substr($newfile, strrpos($newfile, '.') + 1);
304  if (!empty($conf->global->MAIN_DOC_USE_TIMING)) {
305  $format = $conf->global->MAIN_DOC_USE_TIMING;
306  if ($format == '1') {
307  $format = '%Y%m%d%H%M%S';
308  }
309  $filename = $newfiletmp.'-'.dol_print_date(dol_now(), $format).'.'.$newfileformat;
310  } else {
311  $filename = $newfiletmp.'.'.$newfileformat;
312  }
313  $file = $dir.'/'.$filename;
314  //print "newdir=".$dir;
315  //print "newfile=".$newfile;
316  //print "file=".$file;
317  //print "conf->propal->dir_temp=".$conf->propal->dir_temp;
318 
319  dol_mkdir($conf->supplier_proposal->dir_temp);
320  if (!is_writable($conf->supplier_proposal->dir_temp)) {
321  $this->error = "Failed to write in temp directory ".$conf->supplier_proposal->dir_temp;
322  dol_syslog('Error in write_file: '.$this->error, LOG_ERR);
323  return -1;
324  }
325 
326  // If BILLING contact defined on invoice, we use it
327  $usecontact = false;
328  $arrayidcontact = $object->getIdContact('external', 'BILLING');
329  if (count($arrayidcontact) > 0) {
330  $usecontact = true;
331  $result = $object->fetch_contact($arrayidcontact[0]);
332  }
333 
334  // Recipient name
335  $contactobject = null;
336  if (!empty($usecontact)) {
337  // We can use the company of contact instead of thirdparty company
338  if ($object->contact->socid != $object->thirdparty->id && (!isset($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT) || !empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT))) {
339  $object->contact->fetch_thirdparty();
340  $socobject = $object->contact->thirdparty;
341  $contactobject = $object->contact;
342  } else {
343  $socobject = $object->thirdparty;
344  // if we have a CUSTOMER contact and we dont use it as thirdparty recipient we store the contact object for later use
345  $contactobject = $object->contact;
346  }
347  } else {
348  $socobject = $object->thirdparty;
349  }
350 
351  // Make substitution
352  $substitutionarray = array(
353  '__FROM_NAME__' => $this->emetteur->name,
354  '__FROM_EMAIL__' => $this->emetteur->email,
355  '__TOTAL_TTC__' => $object->total_ttc,
356  '__TOTAL_HT__' => $object->total_ht,
357  '__TOTAL_VAT__' => $object->total_tva
358  );
359  complete_substitutions_array($substitutionarray, $langs, $object);
360  // Call the ODTSubstitution hook
361  $parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$substitutionarray);
362  $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
363 
364  // Line of free text
365  $newfreetext = '';
366  $paramfreetext = 'SUPPLIER_PROPOSAL_FREE_TEXT';
367  if (!empty($conf->global->$paramfreetext)) {
368  $newfreetext = make_substitutions($conf->global->$paramfreetext, $substitutionarray);
369  }
370 
371  // Open and load template
372  require_once ODTPHP_PATH.'odf.php';
373  try {
374  $odfHandler = new odf(
375  $srctemplatepath,
376  array(
377  'PATH_TO_TMP' => $conf->supplier_proposal->dir_temp,
378  'ZIP_PROXY' => 'PclZipProxy', // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy.
379  'DELIMITER_LEFT' => '{',
380  'DELIMITER_RIGHT' => '}'
381  )
382  );
383  } catch (Exception $e) {
384  $this->error = $e->getMessage();
385  dol_syslog($e->getMessage(), LOG_INFO);
386  return -1;
387  }
388  // After construction $odfHandler->contentXml contains content and
389  // [!-- BEGIN row.lines --]*[!-- END row.lines --] has been replaced by
390  // [!-- BEGIN lines --]*[!-- END lines --]
391  //print html_entity_decode($odfHandler->__toString());
392  //print exit;
393 
394 
395  // Make substitutions into odt of freetext
396  try {
397  $odfHandler->setVars('free_text', $newfreetext, true, 'UTF-8');
398  } catch (OdfException $e) {
399  dol_syslog($e->getMessage(), LOG_INFO);
400  }
401 
402  // Define substitution array
403  $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
404  $array_objet = $this->get_substitutionarray_object($object, $outputlangs);
405  $array_user = $this->get_substitutionarray_user($user, $outputlangs);
406  $array_soc = $this->get_substitutionarray_mysoc($mysoc, $outputlangs);
407  $array_thirdparty = $this->get_substitutionarray_thirdparty($socobject, $outputlangs);
408  $array_other = $this->get_substitutionarray_other($outputlangs);
409 
410  $array_thirdparty_contact = array();
411  if ($usecontact && is_object($contactobject)) {
412  $array_thirdparty_contact = $this->get_substitutionarray_contact($contactobject, $outputlangs, 'contact');
413  }
414 
415  $tmparray = array_merge($substitutionarray, $array_user, $array_soc, $array_thirdparty, $array_objet, $array_other, $array_thirdparty_contact);
416  complete_substitutions_array($tmparray, $outputlangs, $object);
417 
418  // Call the ODTSubstitution hook
419  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
420  $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
421 
422  foreach ($tmparray as $key => $value) {
423  try {
424  if (preg_match('/logo$/', $key)) { // Image
425  if (file_exists($value)) {
426  $odfHandler->setImage($key, $value);
427  } else {
428  $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
429  }
430  } else // Text
431  {
432  $odfHandler->setVars($key, $value, true, 'UTF-8');
433  }
434  } catch (OdfException $e) {
435  dol_syslog($e->getMessage(), LOG_INFO);
436  }
437  }
438  // Replace tags of lines
439  try {
440  $foundtagforlines = 1;
441  try {
442  $listlines = $odfHandler->setSegment('lines');
443  } catch (OdfException $e) {
444  // We may arrive here if tags for lines not present into template
445  $foundtagforlines = 0;
446  dol_syslog($e->getMessage(), LOG_INFO);
447  }
448  if ($foundtagforlines) {
449  $linenumber = 0;
450  foreach ($object->lines as $line) {
451  $linenumber++;
452  $tmparray = $this->get_substitutionarray_lines($line, $outputlangs, $linenumber);
453  complete_substitutions_array($tmparray, $outputlangs, $object, $line, "completesubstitutionarray_lines");
454  // Call the ODTSubstitutionLine hook
455  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray, 'line'=>$line);
456  $reshook = $hookmanager->executeHooks('ODTSubstitutionLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
457  foreach ($tmparray as $key => $val) {
458  try {
459  $listlines->setVars($key, $val, true, 'UTF-8');
460  } catch (OdfException $e) {
461  dol_syslog($e->getMessage(), LOG_INFO);
462  } catch (SegmentException $e) {
463  dol_syslog($e->getMessage(), LOG_INFO);
464  }
465  }
466  $listlines->merge();
467  }
468  $odfHandler->mergeSegment($listlines);
469  }
470  } catch (OdfException $e) {
471  $this->error = $e->getMessage();
472  dol_syslog($this->error, LOG_WARNING);
473  return -1;
474  }
475 
476  // Replace labels translated
477  $tmparray = $outputlangs->get_translations_for_substitutions();
478  foreach ($tmparray as $key => $value) {
479  try {
480  $odfHandler->setVars($key, $value, true, 'UTF-8');
481  } catch (OdfException $e) {
482  dol_syslog($e->getMessage(), LOG_INFO);
483  }
484  }
485 
486  // Call the beforeODTSave hook
487  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
488  $reshook = $hookmanager->executeHooks('beforeODTSave', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
489 
490  // Write new file
491  if (!empty($conf->global->MAIN_ODT_AS_PDF)) {
492  try {
493  $odfHandler->exportAsAttachedPDF($file);
494  } catch (Exception $e) {
495  $this->error = $e->getMessage();
496  dol_syslog($e->getMessage(), LOG_INFO);
497  return -1;
498  }
499  } else {
500  try {
501  $odfHandler->saveToDisk($file);
502  } catch (Exception $e) {
503  $this->error = $e->getMessage();
504  dol_syslog($e->getMessage(), LOG_INFO);
505  return -1;
506  }
507  }
508  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
509  $reshook = $hookmanager->executeHooks('afterODTCreation', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
510 
511  if (!empty($conf->global->MAIN_UMASK)) {
512  @chmod($file, octdec($conf->global->MAIN_UMASK));
513  }
514 
515  $odfHandler = null; // Destroy object
516 
517  $this->result = array('fullpath'=>$file);
518 
519  return 1; // Success
520  } else {
521  $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
522  return -1;
523  }
524  }
525 
526  return -1;
527  }
528 }
make_substitutions
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
Definition: functions.lib.php:7839
db
$conf db
API class for accounts.
Definition: inc.php:41
dol_sanitizeFileName
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
Definition: functions.lib.php:1226
description
print *****$script_file(".$version.") pid cd cd cd description as description
Definition: email_expire_services_to_customers.php:83
dol_print_error
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
Definition: functions.lib.php:4844
CommonDocGenerator\get_substitutionarray_user
get_substitutionarray_user($user, $outputlangs)
Define array with couple substitution key => substitution value.
Definition: commondocgenerator.class.php:108
img_warning
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
Definition: functions.lib.php:4521
$form
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:142
dol_dir_list
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0)
Scan a directory and return a list of files/directories.
Definition: files.lib.php:60
name
$conf db name
Definition: repair.php:122
dol_print_date
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
Definition: functions.lib.php:2514
CommonDocGenerator\get_substitutionarray_contact
get_substitutionarray_contact($object, $outputlangs, $array_key='object')
Define array with couple substitution key => substitution value.
Definition: commondocgenerator.class.php:321
img_picto
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
Definition: functions.lib.php:3880
Exception
CommonDocGenerator\get_substitutionarray_thirdparty
get_substitutionarray_thirdparty($object, $outputlangs, $array_key='company')
Define array with couple substitution key => substitution value For example {company_name},...
Definition: commondocgenerator.class.php:256
CommonDocGenerator\get_substitutionarray_object
get_substitutionarray_object($object, $outputlangs, $array_key='object')
Define array with couple substitution key => substitution value.
Definition: commondocgenerator.class.php:421
getCommonSubstitutionArray
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null)
Return array of possible common substitutions.
Definition: functions.lib.php:7275
dol_syslog
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
Definition: functions.lib.php:1603
CommonDocGenerator\get_substitutionarray_mysoc
get_substitutionarray_mysoc($mysoc, $outputlangs)
Define array with couple substitution key => substitution value.
Definition: commondocgenerator.class.php:197
ModelePDFSupplierProposal\liste_modeles
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Definition: modules_supplier_proposal.php:53
Form
Class to manage generation of HTML components Only common components must be here.
Definition: html.form.class.php:52
doc_generic_supplier_proposal_odt\write_file
write_file($object, $outputlangs, $srctemplatepath, $hidedetails=0, $hidedesc=0, $hideref=0)
Function to build a document on disk using the generic odt module.
Definition: doc_generic_supplier_proposal_odt.modules.php:238
dol_now
dol_now($mode='auto')
Return date for now.
Definition: functions.lib.php:2845
CommonDocGenerator\get_substitutionarray_lines
get_substitutionarray_lines($line, $outputlangs, $linenumber=0)
Define array with couple substitution key => substitution value.
Definition: commondocgenerator.class.php:602
doc_generic_supplier_proposal_odt\__construct
__construct($db)
Constructor.
Definition: doc_generic_supplier_proposal_odt.modules.php:65
dol_mkdir
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
Definition: functions.lib.php:6603
SupplierProposal
Class to manage price ask supplier.
Definition: supplier_proposal.class.php:50
ModelePDFSupplierProposal
Classe mere des modeles de propale.
Definition: modules_supplier_proposal.php:37
type
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition: repair.php:119
HookManager
Class to manage hooks.
Definition: hookmanager.class.php:30
doc_generic_supplier_proposal_odt
Class to build documents using ODF templates generator.
Definition: doc_generic_supplier_proposal_odt.modules.php:39
complete_substitutions_array
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...
Definition: functions.lib.php:7961
CommonDocGenerator\get_substitutionarray_other
get_substitutionarray_other($outputlangs)
Define array with couple substitution key => substitution value.
Definition: commondocgenerator.class.php:379
doc_generic_supplier_proposal_odt\info
info($langs)
Return description of a module.
Definition: doc_generic_supplier_proposal_odt.modules.php:111