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 $TReturn[$UPosition->Job->rowid] = $UPosition->Job->ref;
660 if ($this->
status <= self::STATUS_DRAFT) {
671 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'JOB_UNVALIDATE');
681 public function cancel($user, $notrigger = 0)
684 if ($this->
status != self::STATUS_VALIDATED) {
695 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'JOB_CANCEL');
705 public function reopen($user, $notrigger = 0)
708 if ($this->
status != self::STATUS_CANCELED) {
719 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'JOB_REOPEN');
732 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
734 global $conf, $langs, $hookmanager;
736 if (!empty($conf->dol_no_mouse_hover)) {
742 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"JobProfile").
'</u>';
743 if (isset($this->
status)) {
744 $label .=
' '.$this->getLibStatut(5);
747 $label .=
'<b>'.$langs->trans(
'Label').
':</b> '.$this->label;
749 $url =
dol_buildpath(
'/hrm/job_card.php', 1).
'?id='.$this->id;
751 if ($option !=
'nolink') {
753 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
754 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
755 $add_save_lastsearch_values = 1;
757 if ($add_save_lastsearch_values) {
758 $url .=
'&save_lastsearch_values=1';
763 if (empty($notooltip)) {
765 $label = $langs->trans(
"ShowJob");
766 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
768 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
769 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
771 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
774 if ($option ==
'nolink') {
775 $linkstart =
'<span';
777 $linkstart =
'<a href="'.$url.
'"';
779 $linkstart .= $linkclose.
'>';
780 if ($option ==
'nolink') {
781 $linkend =
'</span>';
786 $result .= $linkstart;
788 if (empty($this->showphoto_on_popup)) {
790 $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);
794 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
796 list($class, $module) = explode(
'@', $this->picto);
797 $upload_dir = $conf->$module->multidir_output[$conf->entity].
"/$class/".
dol_sanitizeFileName($this->label);
799 $filename = $filearray[0][
'name'];
800 if (!empty($filename)) {
801 $pospoint = strpos($filearray[0][
'name'],
'.');
803 $pathtophoto = $class.
'/'.$this->label.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
805 $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>';
807 $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>';
812 $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);
817 if ($withpicto != 2) {
818 $result .= $this->label;
824 global $action, $hookmanager;
825 $hookmanager->initHooks(array(
'jobdao'));
826 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
827 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
829 $result = $hookmanager->resPrint;
831 $result .= $hookmanager->resPrint;
891 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
892 $sql .=
' fk_user_creat, fk_user_modif';
893 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
894 $sql .=
' WHERE t.rowid = '.((int) $id);
895 $result = $this->db->query($sql);
897 if ($this->db->num_rows($result)) {
898 $obj = $this->db->fetch_object($result);
900 $this->
id = $obj->rowid;
902 $this->user_creation_id = $obj->fk_user_creat;
903 $this->user_modification_id = $obj->fk_user_modif;
904 $this->date_creation = $this->db->jdate($obj->datec);
905 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
908 $this->db->free($result);
936 $this->lines = array();
938 $objectline =
new JobLine($this->db);
939 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0,
'(fk_job:=:'.((
int) $this->
id).
')');
941 if (is_numeric($result)) {
945 $this->lines = $result;
957 global $langs, $conf;
961 $conf->global->hrm_JOB_ADDON =
'mod_job_standard';
971 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
972 foreach ($dirmodels as $reldir) {
976 $mybool = ((bool) @include_once $dir.$file) || $mybool;
984 if (class_exists($classname)) {
985 $obj =
new $classname();
986 '@phan-var-force ModeleNumRefEvaluation $obj';
987 $numref = $obj->getNextValue($this);
989 if ($numref !=
'' && $numref !=
'-1') {
992 $this->error = $obj->error;
997 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
1001 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
1017 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
1019 global $conf, $langs;
1022 $includedocgeneration = 0;
1024 $langs->load(
"hrm");
1027 $modele =
'standard_job';
1029 if (!empty($this->model_pdf)) {
1030 $modele = $this->model_pdf;
1036 $modelpath =
"core/modules/hrm/doc/";
1038 if ($includedocgeneration && !empty($modele)) {
1039 $result = $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1054 global $selected, $langs;
1056 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
1058 $return =
'<div class="box-flex-item box-flex-grow-zero">';
1059 $return .=
'<div class="info-box info-box-sm">';
1060 $return .=
'<span class="info-box-icon bg-infobox-action">';
1062 $return .=
'</span>';
1063 $return .=
'<div class="info-box-content">';
1064 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl(0) : $this->ref).
'</span>';
1065 if ($selected >= 0) {
1066 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1072 if (property_exists($this,
'description') && !(empty($this->
description))) {
1074 $return .=
'<br><span class="info-box-label ">'.(strlen($this->
description) > 30 ?
dol_substr($this->
description, 0, 25).
'...' : $this->description).
'</span>';
1076 $return .=
'</div>';
1077 $return .=
'</div>';
1078 $return .=
'</div>';
1092 $skillranks = array();
1093 $sql =
"SELECT rowid";
1094 $sql .=
" FROM ".MAIN_DB_PREFIX.
"hrm_skillrank";
1095 $sql .=
" WHERE fk_object = ".((int) $id);
1097 $resql = $this->db->query($sql);
1099 $num = $this->db->num_rows($resql);
1102 $obj = $this->db->fetch_object($resql);
1103 $skillranks[] = $obj;
1106 $this->db->free($resql);
1115require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
1134 $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 occupied position for 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 occupied positions for 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_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (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_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...
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.