31require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
42 public $module =
'hrm';
47 public $element =
'job';
52 public $table_element =
'hrm_job';
57 public $picto =
'technic';
60 const STATUS_DRAFT = 0;
61 const STATUS_VALIDATED = 1;
62 const STATUS_CANCELED = 9;
95 public $fields = array(
96 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'position' => 1,
'notnull' => 1,
'visible' => 0,
'noteditable' => 1,
'index' => 1,
'css' =>
'left',
'comment' =>
"Id"),
97 'label' => array(
'type' =>
'varchar(128)',
'label' =>
'Label',
'enabled' => 1,
'position' => 20,
'notnull' => 1,
'visible' => 1,
'index' => 1,
'searchall' => 1,
'showoncombobox' => 1,
'comment' =>
"Label of object"),
98 'description' => array(
'type' =>
'text',
'label' =>
'Description',
'enabled' => 1,
'position' => 21,
'notnull' => 0,
'visible' => 1,),
99 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'position' => 500,
'notnull' => 1,
'visible' => -2,),
100 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'position' => 501,
'notnull' => 0,
'visible' => -2,),
101 'deplacement' => array(
'type' =>
'select',
'required' => 1,
'label' =>
'NeedBusinessTravels',
'enabled' => 1,
'position' => 90,
'notnull' => 1,
'visible' => 1,
'arrayofkeyval' => array(0 =>
"No", 1 =>
"Yes"),
'default' =>
'0'),
102 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'position' => 70,
'notnull' => 0,
'visible' => 0,),
103 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'position' => 71,
'notnull' => 0,
'visible' => 0,),
104 'fk_user_creat' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserAuthor',
'enabled' => 1,
'position' => 510,
'notnull' => 1,
'visible' => -2,
'foreignkey' =>
'user.rowid',),
105 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'position' => 511,
'notnull' => -1,
'visible' => -2,),
130 public $fk_user_creat;
134 public $fk_user_modif;
148 public $fk_element =
'fk_job';
158 protected $childtables = array(
159 'hrm_evaluation' => [
'name' =>
'Evaluation'],
160 'hrm_job_user' => [
'name' =>
'Job'],
168 protected $childtablesoncascade = array(
"@SkillRank:hrm/class/skillrank.class.php:fk_object:(objecttype:=:'job')");
184 global
$conf, $langs;
188 $this->ismultientitymanaged = 0;
189 $this->isextrafieldmanaged = 1;
192 $this->fields[
'rowid'][
'visible'] = 0;
194 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
195 $this->fields[
'entity'][
'enabled'] = 0;
205 foreach ($this->fields as $key => $val) {
206 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
207 unset($this->fields[$key]);
212 if (is_object($langs)) {
213 foreach ($this->fields as $key => $val) {
214 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
215 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
216 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
236 return $resultcreate;
248 global $langs, $extrafields;
258 $result =
$object->fetchCommon($fromid);
259 if ($result > 0 && !empty(
$object->table_element_line)) {
273 if (property_exists(
$object,
'ref')) {
274 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"Copy_Of_".$object->ref : $this->fields[
'ref'][
'default'];
276 if (property_exists(
$object,
'label')) {
278 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".
$object->label : $this->fields[
'label'][
'default'];
280 if (property_exists(
$object,
'status')) {
281 $object->status = self::STATUS_DRAFT;
283 if (property_exists(
$object,
'date_creation')) {
286 if (property_exists(
$object,
'date_modification')) {
287 $object->date_modification =
null;
291 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
292 $extrafields->fetch_name_optionals_label($this->table_element);
293 foreach (
$object->array_options as $key => $option) {
294 $shortkey = preg_replace(
'/options_/',
'', $key);
295 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
297 unset(
$object->array_options[$key]);
303 $object->context[
'createfromclone'] =
'createfromclone';
304 $result =
$object->createCommon($user);
319 if (property_exists($this,
'fk_soc') && $this->fk_soc ==
$object->socid) {
326 unset(
$object->context[
'createfromclone']);
333 $this->db->rollback();
345 public function fetch($id, $ref =
null)
348 if ($result > 0 && !empty($this->table_element_line)) {
361 $this->lines = array();
380 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
388 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
389 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
390 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
392 $sql .=
' WHERE 1 = 1';
399 $this->errors[] = $errormessage;
400 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
404 if (!empty($sortfield)) {
405 $sql .= $this->db->order($sortfield, $sortorder);
407 if (!empty($limit)) {
408 $sql .=
' '.$this->db->plimit($limit, $offset);
411 $resql = $this->db->query($sql);
413 $num = $this->db->num_rows($resql);
415 while ($i < ($limit ? min($limit, $num) : $num)) {
416 $obj = $this->db->fetch_object($resql);
418 $record =
new self($this->db);
419 $record->setVarsFromFetchObj($obj);
421 $records[$record->id] = $record;
425 $this->db->free($resql);
429 $this->errors[] =
'Error '.$this->db->lasterror();
430 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
455 public function delete(
User $user, $notrigger = 0)
472 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
489 global
$conf, $langs;
491 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
496 if ($this->
status == self::STATUS_VALIDATED) {
497 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
514 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
519 $this->newref = $num;
523 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
524 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
525 $sql .=
" status = ".self::STATUS_VALIDATED;
526 if (!empty($this->fields[
'date_validation'])) {
527 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
529 if (!empty($this->fields[
'fk_user_valid'])) {
530 $sql .=
", fk_user_valid = ".((int) $user->id);
532 $sql .=
" WHERE rowid = ".((int) $this->
id);
534 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
535 $resql = $this->db->query($sql);
538 $this->error = $this->db->lasterror();
542 if (!$error && !$notrigger) {
544 $result = $this->
call_trigger(
'HRM_JOB_VALIDATE', $user);
553 $this->oldref = $this->ref;
556 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
558 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'job/".$this->db->escape($this->newref).
"'";
559 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'job/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
560 $resql = $this->db->query($sql);
563 $this->error = $this->db->lasterror();
565 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'job/".$this->db->escape($this->newref).
"'";
566 $sql .=
" WHERE filepath = 'job/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
567 $resql = $this->db->query($sql);
570 $this->error = $this->db->lasterror();
576 $dirsource =
$conf->hrm->dir_output.
'/job/'.$oldref;
577 $dirdest =
$conf->hrm->dir_output.
'/job/'.$newref;
578 if (!$error && file_exists($dirsource)) {
579 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
581 if (@rename($dirsource, $dirdest)) {
584 $listoffiles =
dol_dir_list(
$conf->hrm->dir_output.
'/job/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
585 foreach ($listoffiles as $fileentry) {
586 $dirsource = $fileentry[
'name'];
587 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
588 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
589 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
590 @rename($dirsource, $dirdest);
600 $this->
status = self::STATUS_VALIDATED;
607 $this->db->rollback();
626 $lastpos = array_shift($Tab);
643 $TPosition = $position->getForUser($userid);
644 foreach ($TPosition as $UPosition) {
645 $tmpjob =
new Job($db);
646 if ($tmpjob->fetch($UPosition->fk_job) > 0) {
647 $TReturn[$tmpjob->id] = $tmpjob->label;
663 if ($this->
status <= self::STATUS_DRAFT) {
674 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'JOB_UNVALIDATE');
684 public function cancel($user, $notrigger = 0)
687 if ($this->
status != self::STATUS_VALIDATED) {
698 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'JOB_CANCEL');
708 public function reopen($user, $notrigger = 0)
711 if ($this->
status != self::STATUS_CANCELED) {
722 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'JOB_REOPEN');
735 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
737 global
$conf, $langs, $hookmanager;
739 if (!empty(
$conf->dol_no_mouse_hover)) {
745 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"JobProfile").
'</u>';
746 if (isset($this->
status)) {
747 $label .=
' '.$this->getLibStatut(5);
750 $label .=
'<b>'.$langs->trans(
'Label').
':</b> '.$this->label;
752 $url =
dol_buildpath(
'/hrm/job_card.php', 1).
'?id='.$this->id;
754 if ($option !=
'nolink') {
756 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
757 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
758 $add_save_lastsearch_values = 1;
760 if ($add_save_lastsearch_values) {
761 $url .=
'&save_lastsearch_values=1';
766 if (empty($notooltip)) {
768 $label = $langs->trans(
"ShowJob");
769 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
771 $linkclose .=
' title="'.dolPrintHTMLForAttribute($label).
'"';
772 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
774 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
777 if ($option ==
'nolink') {
778 $linkstart =
'<span';
780 $linkstart =
'<a href="'.$url.
'"';
782 $linkstart .= $linkclose.
'>';
783 if ($option ==
'nolink') {
784 $linkend =
'</span>';
789 $result .= $linkstart;
791 if (empty($this->showphoto_on_popup)) {
793 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
797 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
799 list($class, $module) = explode(
'@', $this->picto);
802 $filename = $filearray[0][
'name'];
803 if (!empty($filename)) {
804 $pospoint = strpos($filearray[0][
'name'],
'.');
806 $pathtophoto = $class.
'/'.$this->label.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
808 $result .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref"><img class="photo'.$module.
'" alt="No photo" border="0" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$module.
'&entity='.
$conf->entity.
'&file='.urlencode($pathtophoto).
'"></div></div>';
810 $result .=
'<div class="floatleft inline-block valignmiddle divphotoref"><img class="photouserphoto userphoto" alt="No photo" border="0" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$module.
'&entity='.
$conf->entity.
'&file='.urlencode($pathtophoto).
'"></div>';
815 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
820 if ($withpicto != 2) {
821 $result .= $this->label;
827 global $action, $hookmanager;
828 $hookmanager->initHooks(array(
'jobdao'));
829 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
830 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
832 $result = $hookmanager->resPrint;
834 $result .= $hookmanager->resPrint;
894 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
895 $sql .=
' fk_user_creat, fk_user_modif';
896 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
897 $sql .=
' WHERE t.rowid = '.((int) $id);
898 $result = $this->db->query($sql);
900 if ($this->db->num_rows($result)) {
901 $obj = $this->db->fetch_object($result);
903 $this->
id = $obj->rowid;
905 $this->user_creation_id = $obj->fk_user_creat;
906 $this->user_modification_id = $obj->fk_user_modif;
907 $this->date_creation = $this->db->jdate($obj->datec);
908 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
911 $this->db->free($result);
939 $this->lines = array();
941 $objectline =
new JobLine($this->db);
942 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0,
'(fk_job:=:'.((
int) $this->
id).
')');
944 if (is_numeric($result)) {
948 $this->lines = $result;
960 global $langs,
$conf;
964 $conf->global->hrm_JOB_ADDON =
'mod_job_standard';
974 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
975 foreach ($dirmodels as $reldir) {
979 $mybool = ((bool) @include_once $dir.$file) || $mybool;
987 if (class_exists($classname)) {
988 $obj =
new $classname();
989 '@phan-var-force ModeleNumRefEvaluation $obj';
990 $numref = $obj->getNextValue($this);
992 if ($numref !=
'' && $numref !=
'-1') {
995 $this->error = $obj->error;
1000 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
1004 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
1020 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
1022 global
$conf, $langs;
1025 $includedocgeneration = 0;
1027 $langs->load(
"hrm");
1030 $modele =
'standard_job';
1032 if (!empty($this->model_pdf)) {
1033 $modele = $this->model_pdf;
1039 $modelpath =
"core/modules/hrm/doc/";
1041 if ($includedocgeneration && !empty($modele)) {
1042 $result = $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1057 global $selected, $langs;
1059 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
1061 $return =
'<div class="box-flex-item box-flex-grow-zero">';
1062 $return .=
'<div class="info-box info-box-sm">';
1063 $return .=
'<span class="info-box-icon bg-infobox-action">';
1065 $return .=
'</span>';
1066 $return .=
'<div class="info-box-content">';
1067 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl(0) : $this->ref).
'</span>';
1068 if ($selected >= 0) {
1069 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1075 if (property_exists($this,
'description') && !(empty($this->
description))) {
1077 $return .=
'<br><span class="info-box-label ">'.(strlen($this->
description) > 30 ?
dol_substr($this->
description, 0, 25).
'...' : $this->description).
'</span>';
1079 $return .=
'</div>';
1080 $return .=
'</div>';
1081 $return .=
'</div>';
1095 $skillranks = array();
1096 $sql =
"SELECT rowid";
1097 $sql .=
" FROM ".MAIN_DB_PREFIX.
"hrm_skillrank";
1098 $sql .=
" WHERE fk_object = ".((int) $id);
1100 $resql = $this->db->query($sql);
1102 $num = $this->db->num_rows($resql);
1105 $obj = $this->db->fetch_object($resql);
1106 $skillranks[] = $obj;
1109 $this->db->free($resql);
1118require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
1137 $this->isextrafieldmanaged = 0;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Parent class of all other business classes (invoices, contracts, proposals, orders,...
deleteLineCommon(User $user, $idline, $notrigger=0)
Delete a line of object in database.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
setErrorsFromObject($object)
setErrorsFromObject
createCommon(User $user, $notrigger=0)
Create object in the database.
getFieldList($alias='', $excludefields=array())
Function to concat keys of fields.
updateCommon(User $user, $notrigger=0)
Update object into database.
setStatusCommon($user, $status, $notrigger=0, $triggercode='')
Set to a status.
initAsSpecimenCommon()
Initialise object with example values Id must be 0 if object instance is a specimen.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
fetchLinesCommon($morewhere='', $noextrafields=0)
Load object in memory from the database.
fetchCommon($id, $ref=null, $morewhere='', $noextrafields=0)
Load object in memory from the database.
deleteCommon(User $user, $notrigger=0, $forcechilddeletion=0)
Delete object in database.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage Dolibarr database access.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
getLastJobForUser($fk_user)
Get the last job occupied by a user.
fetchLines()
Load object lines in memory from the database.
cancel($user, $notrigger=0)
Set cancel status.
__construct(DoliDB $db)
Constructor.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
setDraft($user, $notrigger=0)
Set draft status.
update(User $user, $notrigger=0)
Update object into database.
validate($user, $notrigger=0)
Validate object.
getLibStatut($mode=0)
Return the label of the status.
getLinesArray()
Create an array of lines.
fetch($id, $ref=null)
Load object in memory from the database.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
LibStatut($status, $mode=0)
Return the status.
deleteLine(User $user, $idline, $notrigger=0)
Delete a line of object in database.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionally the picto)
createFromClone(User $user, $fromid)
Clone an object into another one.
reopen($user, $notrigger=0)
Set back to validated status.
getSkillRankForJob($id)
function for get required skills associate to job object
create(User $user, $notrigger=0)
Create object into database.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
getForUser($userid)
Get array of jobs occupied by a user.
getKanbanView($option='', $arraydata=null)
Return clickable link of object (with eventually picto)
info($id)
Load the info information in the object.
__construct(DoliDB $db)
Constructor.
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
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.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
dol_now($mode='auto')
Return date for now.
dol_substr($string, $start, $length=null, $stringencoding='', $trunconbytes=0)
Make a substring.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
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.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...