dolibarr  19.0.0-dev
doc_generic_recruitmentjobposition_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) 2014 Marcos García <marcosgdf@gmail.com>
5  * Copyright (C) 2016 Charlie Benke <charlie@patas-monkey.com>
6  * Copyright (C) 2018-2021 Philippe Grand <philippe.grand@atoo-net.com>
7  * Copyright (C) 2018-2022 Frédéric France <frederic.france@netlogic.fr>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <https://www.gnu.org/licenses/>.
21  * or see https://www.gnu.org/
22  */
23 
30 require_once DOL_DOCUMENT_ROOT.'/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php';
31 require_once DOL_DOCUMENT_ROOT.'/recruitment/class/recruitmentjobposition.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
34 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
35 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
36 require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php';
37 
38 
43 {
48  public $emetteur;
49 
54  public $phpmin = array(7, 0);
55 
59  public $version = 'dolibarr';
60 
61 
67  public function __construct($db)
68  {
69  global $conf, $langs, $mysoc;
70 
71  // Load translation files required by the page
72  $langs->loadLangs(array("main", "companies"));
73 
74  $this->db = $db;
75  $this->name = "ODT templates";
76  $this->description = $langs->trans("DocumentModelOdt");
77  $this->scandir = 'RECRUITMENT_RECRUITMENTJOBPOSITION_ADDON_PDF_ODT_PATH'; // Name of constant that is used to save list of directories to scan
78 
79  // Page size for A4 format
80  $this->type = 'odt';
81  $this->page_largeur = 0;
82  $this->page_hauteur = 0;
83  $this->format = array($this->page_largeur, $this->page_hauteur);
84  $this->marge_gauche = 0;
85  $this->marge_droite = 0;
86  $this->marge_haute = 0;
87  $this->marge_basse = 0;
88 
89  $this->option_logo = 1; // Display logo
90  $this->option_tva = 0; // Manage the vat option COMMANDE_TVAOPTION
91  $this->option_modereg = 0; // Display payment mode
92  $this->option_condreg = 0; // Display payment terms
93  $this->option_multilang = 1; // Available in several languages
94  $this->option_escompte = 0; // Displays if there has been a discount
95  $this->option_credit_note = 0; // Support credit notes
96  $this->option_freetext = 1; // Support add of a personalised text
97  $this->option_draft_watermark = 0; // Support add of a watermark on drafts
98 
99  // Get source company
100  $this->emetteur = $mysoc;
101  if (!$this->emetteur->country_code) {
102  $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default if not defined
103  }
104  }
105 
106 
113  public function info($langs)
114  {
115  global $conf, $langs;
116 
117  // Load translation files required by the page
118  $langs->loadLangs(array("errors", "companies"));
119 
120  $form = new Form($this->db);
121 
122  $texte = $this->description.".<br>\n";
123  $texte .= '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
124  $texte .= '<input type="hidden" name="token" value="'.newToken().'">';
125  $texte .= '<input type="hidden" name="page_y" value="">';
126  $texte .= '<input type="hidden" name="action" value="setModuleOptions">';
127  $texte .= '<input type="hidden" name="param1" value="RECRUITMENT_RECRUITMENTJOBPOSITION_ADDON_PDF_ODT_PATH">';
128  $texte .= '<table class="nobordernopadding centpercent">';
129 
130  // List of directories area
131  $texte .= '<tr><td>';
132  $texttitle = $langs->trans("ListOfDirectories");
133  $listofdir = explode(',', preg_replace('/[\r\n]+/', ',', trim(getDolGlobalString('RECRUITMENT_RECRUITMENTJOBPOSITION_ADDON_PDF_ODT_PATH'))));
134  $listoffiles = array();
135  foreach ($listofdir as $key => $tmpdir) {
136  $tmpdir = trim($tmpdir);
137  $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
138  if (!$tmpdir) {
139  unset($listofdir[$key]); continue;
140  }
141  if (!is_dir($tmpdir)) {
142  $texttitle .= img_warning($langs->trans("ErrorDirNotFound", $tmpdir), 0);
143  } else {
144  $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.(ods|odt)');
145  if (count($tmpfiles)) {
146  $listoffiles = array_merge($listoffiles, $tmpfiles);
147  }
148  }
149  }
150  $texthelp = $langs->trans("ListOfDirectoriesForModelGenODT");
151  // Add list of substitution keys
152  $texthelp .= '<br>'.$langs->trans("FollowingSubstitutionKeysCanBeUsed").'<br>';
153  $texthelp .= $langs->transnoentitiesnoconv("FullListOnOnlineDocumentation"); // This contains an url, we don't modify it
154 
155  $texte .= $form->textwithpicto($texttitle, $texthelp, 1, 'help', '', 1);
156  $texte .= '<div><div style="display: inline-block; min-width: 100px; vertical-align: middle;">';
157  $texte .= '<textarea class="flat" cols="60" name="value1">';
158  $texte .= getDolGlobalString('RECRUITMENT_RECRUITMENTJOBPOSITION_ADDON_PDF_ODT_PATH');
159  $texte .= '</textarea>';
160  $texte .= '</div><div style="display: inline-block; vertical-align: middle;">';
161  $texte .= '<input type="submit" class="button small reposition" name="modify" value="'.$langs->trans("Modify").'">';
162  $texte .= '<br></div></div>';
163 
164  // Scan directories
165  $nbofiles = count($listoffiles);
166  if (!empty($conf->global->RECRUITMENT_RECRUITMENTJOBPOSITION_ADDON_PDF_ODT_PATH)) {
167  $texte .= $langs->trans("NumberOfModelFilesFound").': <b>';
168  //$texte.=$nbofiles?'<a id="a_'.get_class($this).'" href="#">':'';
169  $texte .= count($listoffiles);
170  //$texte.=$nbofiles?'</a>':'';
171  $texte .= '</b>';
172  }
173 
174  if ($nbofiles) {
175  $texte .= '<div id="div_'.get_class($this).'" class="hidden">';
176  foreach ($listoffiles as $file) {
177  $texte .= '- '.$file['name'];
178  //$texte .= ' <a href="'.DOL_URL_ROOT.'/document.php?modulepart=doctemplates&file=recruitementjobposition/'.urlencode(basename($file['name'])).'">'.img_picto('', 'listlight').'</a>';
179  //$texte .= ' &nbsp; <a class="reposition" href="'.$_SERVER["PHP_SELF"].'?modulepart=doctemplates&keyforuploaddir=RECRUITMENT_RECRUITMENTJOBPOSITION_ADDON_PDF_ODT_PATH&action=deletefile&token='.newToken().'&file='.urlencode(basename($file['name'])).'">'.img_picto('', 'delete').'</a>';
180  $texte .= '<br>';
181  }
182  $texte .= '</div>';
183  }
184 
185  $texte .= '</td>';
186 
187  $texte .= '<td rowspan="2" class="tdtop hideonsmartphone">';
188  $texte .= '<span class="opacitymedium">';
189  $texte .= $langs->trans("ExampleOfDirectoriesForModelGen");
190  $texte .= '</span>';
191  $texte .= '</td>';
192  $texte .= '</tr>';
193 
194  $texte .= '</table>';
195  $texte .= '</form>';
196 
197  return $texte;
198  }
199 
200  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
212  public function write_file($object, $outputlangs, $srctemplatepath, $hidedetails = 0, $hidedesc = 0, $hideref = 0)
213  {
214  // phpcs:enable
215  global $user, $langs, $conf, $mysoc, $hookmanager;
216  global $action;
217 
218  if (empty($srctemplatepath)) {
219  dol_syslog("doc_generic_odt::write_file parameter srctemplatepath empty", LOG_WARNING);
220  return -1;
221  }
222 
223  // Add odtgeneration hook
224  $hookmanager->initHooks(array('odtgeneration'));
225 
226  if (!is_object($outputlangs)) {
227  $outputlangs = $langs;
228  }
229  $sav_charset_output = $outputlangs->charset_output;
230  $outputlangs->charset_output = 'UTF-8';
231 
232  $outputlangs->loadLangs(array("main", "dict", "companies", "bills"));
233 
234  if ($conf->recruitment->dir_output) {
235  // If $object is id instead of object
236  if (!is_object($object)) {
237  $id = $object;
238  $object = new RecruitmentJobPosition($this->db);
239  $result = $object->fetch($id);
240  if ($result < 0) {
241  dol_print_error($this->db, $object->error);
242  return -1;
243  }
244  }
245 
246  $dir = $conf->recruitment->multidir_output[isset($object->entity) ? $object->entity : 1].'/recruitmentjobposition/';
247  $objectref = dol_sanitizeFileName($object->ref);
248  if (!preg_match('/specimen/i', $objectref)) {
249  $dir .= "/".$objectref;
250  }
251  $file = $dir."/".$objectref.".odt";
252 
253  if (!file_exists($dir)) {
254  if (dol_mkdir($dir) < 0) {
255  $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
256  return -1;
257  }
258  }
259 
260  if (file_exists($dir)) {
261  //print "srctemplatepath=".$srctemplatepath; // Src filename
262  $newfile = basename($srctemplatepath);
263  $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile);
264  $newfiletmp = preg_replace('/template_/i', '', $newfiletmp);
265  $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp);
266  $newfiletmp = $objectref.'_'.$newfiletmp;
267  //$file=$dir.'/'.$newfiletmp.'.'.dol_print_date(dol_now(),'%Y%m%d%H%M%S').'.odt';
268  // Get extension (ods or odt)
269  $newfileformat = substr($newfile, strrpos($newfile, '.') + 1);
270  if (getDolGlobalInt('MAIN_DOC_USE_TIMING')) {
271  $format = getDolGlobalInt('MAIN_DOC_USE_TIMING');
272  if ($format == '1') {
273  $format = '%Y%m%d%H%M%S';
274  }
275  $filename = $newfiletmp.'-'.dol_print_date(dol_now(), $format).'.'.$newfileformat;
276  } else {
277  $filename = $newfiletmp.'.'.$newfileformat;
278  }
279  $file = $dir.'/'.$filename;
280  //print "newdir=".$dir;
281  //print "newfile=".$newfile;
282  //print "file=".$file;
283  //print "conf->societe->dir_temp=".$conf->societe->dir_temp;
284 
285  dol_mkdir($conf->recruitment->dir_temp);
286  if (!is_writable($conf->recruitment->dir_temp)) {
287  $this->error = $langs->transnoentities("ErrorFailedToWriteInTempDirectory", $conf->recruitment->dir_temp);
288  dol_syslog('Error in write_file: ' . $this->error, LOG_ERR);
289  return -1;
290  }
291 
292  // If CUSTOMER contact defined on order, we use it
293  $usecontact = false;
294  $arrayidcontact = $object->getIdContact('external', 'CUSTOMER');
295  if (count($arrayidcontact) > 0) {
296  $usecontact = true;
297  $result = $object->fetch_contact($arrayidcontact[0]);
298  }
299 
300  // Recipient name
301  $contactobject = null;
302  if (!empty($usecontact)) {
303  // We can use the company of contact instead of thirdparty company
304  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))) {
305  $object->contact->fetch_thirdparty();
306  $socobject = $object->contact->thirdparty;
307  $contactobject = $object->contact;
308  } else {
309  $socobject = $object->thirdparty;
310  // if we have a CUSTOMER contact and we dont use it as thirdparty recipient we store the contact object for later use
311  $contactobject = $object->contact;
312  }
313  } else {
314  $socobject = $object->thirdparty;
315  }
316 
317  // Make substitution
318  $substitutionarray = array(
319  '__FROM_NAME__' => $this->emetteur->name,
320  '__FROM_EMAIL__' => $this->emetteur->email,
321  '__TOTAL_TTC__' => $object->total_ttc,
322  '__TOTAL_HT__' => $object->total_ht,
323  '__TOTAL_VAT__' => $object->total_tva
324  );
325  complete_substitutions_array($substitutionarray, $langs, $object);
326  // Call the ODTSubstitution hook
327  $parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$substitutionarray);
328  $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
329 
330  // Line of free text
331  $newfreetext = '';
332  $paramfreetext = 'ORDER_FREE_TEXT';
333  if (!empty($conf->global->$paramfreetext)) {
334  $newfreetext = make_substitutions($conf->global->$paramfreetext, $substitutionarray);
335  }
336 
337  // Open and load template
338  require_once ODTPHP_PATH.'odf.php';
339  try {
340  $odfHandler = new Odf(
341  $srctemplatepath,
342  array(
343  'PATH_TO_TMP' => $conf->recruitment->dir_temp,
344  'ZIP_PROXY' => 'PclZipProxy', // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy.
345  'DELIMITER_LEFT' => '{',
346  'DELIMITER_RIGHT' => '}'
347  )
348  );
349  } catch (Exception $e) {
350  $this->error = $e->getMessage();
351  dol_syslog($e->getMessage(), LOG_INFO);
352  return -1;
353  }
354  // After construction $odfHandler->contentXml contains content and
355  // [!-- BEGIN row.lines --]*[!-- END row.lines --] has been replaced by
356  // [!-- BEGIN lines --]*[!-- END lines --]
357  //print html_entity_decode($odfHandler->__toString());
358  //print exit;
359 
360 
361  // Make substitutions into odt of freetext
362  try {
363  $odfHandler->setVars('free_text', $newfreetext, true, 'UTF-8');
364  } catch (OdfException $e) {
365  dol_syslog($e->getMessage(), LOG_INFO);
366  }
367 
368  // Define substitution array
369  $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
370  $array_object_from_properties = $this->get_substitutionarray_each_var_object($object, $outputlangs);
371  $array_objet = $this->get_substitutionarray_object($object, $outputlangs);
372  $array_user = $this->get_substitutionarray_user($user, $outputlangs);
373  $array_soc = $this->get_substitutionarray_mysoc($mysoc, $outputlangs);
374  $array_thirdparty = $this->get_substitutionarray_thirdparty($socobject, $outputlangs);
375  $array_other = $this->get_substitutionarray_other($outputlangs);
376  // retrieve contact information for use in object as contact_xxx tags
377  $array_thirdparty_contact = array();
378  if ($usecontact && is_object($contactobject)) {
379  $array_thirdparty_contact = $this->get_substitutionarray_contact($contactobject, $outputlangs, 'contact');
380  }
381 
382  $tmparray = array_merge($substitutionarray, $array_object_from_properties, $array_user, $array_soc, $array_thirdparty, $array_objet, $array_other, $array_thirdparty_contact);
383  complete_substitutions_array($tmparray, $outputlangs, $object);
384 
385  // Call the ODTSubstitution hook
386  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
387  $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
388 
389  foreach ($tmparray as $key => $value) {
390  try {
391  if (preg_match('/logo$/', $key)) {
392  // Image
393  if (file_exists($value)) {
394  $odfHandler->setImage($key, $value);
395  } else {
396  $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
397  }
398  } else {
399  // Text
400  $odfHandler->setVars($key, $value, true, 'UTF-8');
401  }
402  } catch (OdfException $e) {
403  dol_syslog($e->getMessage(), LOG_INFO);
404  }
405  }
406  // Replace tags of lines
407  try {
408  $foundtagforlines = 1;
409  try {
410  $listlines = $odfHandler->setSegment('lines');
411  } catch (OdfException $e) {
412  // We may arrive here if tags for lines not present into template
413  $foundtagforlines = 0;
414  dol_syslog($e->getMessage(), LOG_INFO);
415  }
416  if ($foundtagforlines) {
417  $linenumber = 0;
418  foreach ($object->lines as $line) {
419  $linenumber++;
420  $tmparray = $this->get_substitutionarray_lines($line, $outputlangs, $linenumber);
421  complete_substitutions_array($tmparray, $outputlangs, $object, $line, "completesubstitutionarray_lines");
422  // Call the ODTSubstitutionLine hook
423  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray, 'line'=>$line);
424  $reshook = $hookmanager->executeHooks('ODTSubstitutionLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
425  foreach ($tmparray as $key => $val) {
426  try {
427  $listlines->setVars($key, $val, true, 'UTF-8');
428  } catch (OdfException $e) {
429  dol_syslog($e->getMessage(), LOG_INFO);
430  } catch (SegmentException $e) {
431  dol_syslog($e->getMessage(), LOG_INFO);
432  }
433  }
434  $listlines->merge();
435  }
436  $odfHandler->mergeSegment($listlines);
437  }
438  } catch (OdfException $e) {
439  $this->error = $e->getMessage();
440  dol_syslog($this->error, LOG_WARNING);
441  return -1;
442  }
443 
444  // Replace labels translated
445  $tmparray = $outputlangs->get_translations_for_substitutions();
446  foreach ($tmparray as $key => $value) {
447  try {
448  $odfHandler->setVars($key, $value, true, 'UTF-8');
449  } catch (OdfException $e) {
450  dol_syslog($e->getMessage(), LOG_INFO);
451  }
452  }
453 
454  // Call the beforeODTSave hook
455 
456  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
457  $reshook = $hookmanager->executeHooks('beforeODTSave', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
458 
459  // Write new file
460  if (!empty($conf->global->MAIN_ODT_AS_PDF)) {
461  try {
462  $odfHandler->exportAsAttachedPDF($file);
463  } catch (Exception $e) {
464  $this->error = $e->getMessage();
465  dol_syslog($e->getMessage(), LOG_INFO);
466  return -1;
467  }
468  } else {
469  try {
470  $odfHandler->saveToDisk($file);
471  } catch (Exception $e) {
472  $this->error = $e->getMessage();
473  dol_syslog($e->getMessage(), LOG_INFO);
474  return -1;
475  }
476  }
477 
478  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
479  $reshook = $hookmanager->executeHooks('afterODTCreation', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
480 
481  dolChmod($file);
482 
483  $odfHandler = null; // Destroy object
484 
485  $this->result = array('fullpath'=>$file);
486 
487  return 1; // Success
488  } else {
489  $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
490  return -1;
491  }
492  }
493 
494  return -1;
495  }
496 }
get_substitutionarray_each_var_object(&$object, $outputlangs, $recursive=1)
Define array with couple substitution key => substitution value.
get_substitutionarray_object($object, $outputlangs, $array_key='object')
Define array with couple substitution key => substitution value Note that vars into substitutions arr...
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 generation of HTML components Only common components must be here.
Parent class for documents models.
Class for RecruitmentJobPosition.
Class to build documents using ODF templates generator.
write_file($object, $outputlangs, $srctemplatepath, $hidedetails=0, $hidedesc=0, $hideref=0)
Function to build a document on disk using the generic odt module.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
print *****$script_file(".$version.") pid cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_dir_list($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:62
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
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.
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
getDolGlobalString($key, $default='')
Return 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:120
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition: repair.php:123