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,),
113 public $fk_user_creat;
114 public $fk_user_modif;
128 public $fk_element =
'fk_job';
138 protected $childtables = array(
139 'hrm_evaluation' => [
'name' =>
'Evaluation'],
140 'hrm_job_user' => [
'name' =>
'Job'],
148 protected $childtablesoncascade = array(
"@SkillRank:hrm/class/skillrank.class.php:fk_object:(objecttype:=:'job')");
164 global $conf, $langs;
168 $this->ismultientitymanaged = 0;
169 $this->isextrafieldmanaged = 1;
172 $this->fields[
'rowid'][
'visible'] = 0;
174 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
175 $this->fields[
'entity'][
'enabled'] = 0;
185 foreach ($this->fields as $key => $val) {
186 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
187 unset($this->fields[$key]);
192 if (is_object($langs)) {
193 foreach ($this->fields as $key => $val) {
194 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
195 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
196 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
216 return $resultcreate;
228 global $langs, $extrafields;
238 $result =
$object->fetchCommon($fromid);
239 if ($result > 0 && !empty(
$object->table_element_line)) {
253 if (property_exists(
$object,
'ref')) {
254 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"Copy_Of_".$object->ref : $this->fields[
'ref'][
'default'];
256 if (property_exists(
$object,
'label')) {
258 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".
$object->label : $this->fields[
'label'][
'default'];
260 if (property_exists(
$object,
'status')) {
261 $object->status = self::STATUS_DRAFT;
263 if (property_exists(
$object,
'date_creation')) {
266 if (property_exists(
$object,
'date_modification')) {
267 $object->date_modification =
null;
271 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
272 $extrafields->fetch_name_optionals_label($this->table_element);
273 foreach (
$object->array_options as $key => $option) {
274 $shortkey = preg_replace(
'/options_/',
'', $key);
275 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
277 unset(
$object->array_options[$key]);
283 $object->context[
'createfromclone'] =
'createfromclone';
284 $result =
$object->createCommon($user);
299 if (property_exists($this,
'fk_soc') && $this->fk_soc ==
$object->socid) {
306 unset(
$object->context[
'createfromclone']);
313 $this->db->rollback();
325 public function fetch($id, $ref =
null)
328 if ($result > 0 && !empty($this->table_element_line)) {
341 $this->lines = array();
360 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
368 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
369 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
370 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
372 $sql .=
' WHERE 1 = 1';
379 $this->errors[] = $errormessage;
380 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
384 if (!empty($sortfield)) {
385 $sql .= $this->db->order($sortfield, $sortorder);
387 if (!empty($limit)) {
388 $sql .=
' '.$this->db->plimit($limit, $offset);
391 $resql = $this->db->query($sql);
393 $num = $this->db->num_rows($resql);
395 while ($i < ($limit ? min($limit, $num) : $num)) {
396 $obj = $this->db->fetch_object($resql);
398 $record =
new self($this->db);
399 $record->setVarsFromFetchObj($obj);
401 $records[$record->id] = $record;
405 $this->db->free($resql);
409 $this->errors[] =
'Error '.$this->db->lasterror();
410 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
435 public function delete(
User $user, $notrigger = 0)
452 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
469 global $conf, $langs;
471 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
476 if ($this->
status == self::STATUS_VALIDATED) {
477 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
494 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
499 $this->newref = $num;
503 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
504 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
505 $sql .=
" status = ".self::STATUS_VALIDATED;
506 if (!empty($this->fields[
'date_validation'])) {
507 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
509 if (!empty($this->fields[
'fk_user_valid'])) {
510 $sql .=
", fk_user_valid = ".((int) $user->id);
512 $sql .=
" WHERE rowid = ".((int) $this->
id);
514 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
515 $resql = $this->db->query($sql);
518 $this->error = $this->db->lasterror();
522 if (!$error && !$notrigger) {
524 $result = $this->
call_trigger(
'HRM_JOB_VALIDATE', $user);
533 $this->oldref = $this->ref;
536 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
538 $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).
"'";
539 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'job/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
540 $resql = $this->db->query($sql);
543 $this->error = $this->db->lasterror();
545 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'job/".$this->db->escape($this->newref).
"'";
546 $sql .=
" WHERE filepath = 'job/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
547 $resql = $this->db->query($sql);
550 $this->error = $this->db->lasterror();
556 $dirsource = $conf->hrm->dir_output.
'/job/'.$oldref;
557 $dirdest = $conf->hrm->dir_output.
'/job/'.$newref;
558 if (!$error && file_exists($dirsource)) {
559 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
561 if (@rename($dirsource, $dirdest)) {
564 $listoffiles =
dol_dir_list($conf->hrm->dir_output.
'/job/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
565 foreach ($listoffiles as $fileentry) {
566 $dirsource = $fileentry[
'name'];
567 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
568 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
569 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
570 @rename($dirsource, $dirdest);
580 $this->
status = self::STATUS_VALIDATED;
587 $this->db->rollback();
606 $lastpos = array_shift($Tab);
623 $TPosition = $position->getForUser($userid);
624 foreach ($TPosition as $UPosition) {
625 $TReturn[$UPosition->Job->rowid] = $UPosition->Job->ref;
640 if ($this->
status <= self::STATUS_DRAFT) {
651 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'JOB_UNVALIDATE');
661 public function cancel($user, $notrigger = 0)
664 if ($this->
status != self::STATUS_VALIDATED) {
675 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'JOB_CANCEL');
685 public function reopen($user, $notrigger = 0)
688 if ($this->
status != self::STATUS_CANCELED) {
699 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'JOB_REOPEN');
712 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
714 global $conf, $langs, $hookmanager;
716 if (!empty($conf->dol_no_mouse_hover)) {
722 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"JobProfile").
'</u>';
723 if (isset($this->
status)) {
724 $label .=
' '.$this->getLibStatut(5);
727 $label .=
'<b>'.$langs->trans(
'Label').
':</b> '.$this->label;
729 $url =
dol_buildpath(
'/hrm/job_card.php', 1).
'?id='.$this->id;
731 if ($option !=
'nolink') {
733 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
734 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
735 $add_save_lastsearch_values = 1;
737 if ($add_save_lastsearch_values) {
738 $url .=
'&save_lastsearch_values=1';
743 if (empty($notooltip)) {
745 $label = $langs->trans(
"ShowJob");
746 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
748 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
749 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
751 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
754 if ($option ==
'nolink') {
755 $linkstart =
'<span';
757 $linkstart =
'<a href="'.$url.
'"';
759 $linkstart .= $linkclose.
'>';
760 if ($option ==
'nolink') {
761 $linkend =
'</span>';
766 $result .= $linkstart;
768 if (empty($this->showphoto_on_popup)) {
770 $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);
774 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
776 list($class, $module) = explode(
'@', $this->picto);
777 $upload_dir = $conf->$module->multidir_output[$conf->entity].
"/$class/".
dol_sanitizeFileName($this->label);
779 $filename = $filearray[0][
'name'];
780 if (!empty($filename)) {
781 $pospoint = strpos($filearray[0][
'name'],
'.');
783 $pathtophoto = $class.
'/'.$this->label.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
785 $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>';
787 $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>';
792 $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 if ($withpicto != 2) {
798 $result .= $this->label;
804 global $action, $hookmanager;
805 $hookmanager->initHooks(array(
'jobdao'));
806 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
807 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
809 $result = $hookmanager->resPrint;
811 $result .= $hookmanager->resPrint;
871 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
872 $sql .=
' fk_user_creat, fk_user_modif';
873 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
874 $sql .=
' WHERE t.rowid = '.((int) $id);
875 $result = $this->db->query($sql);
877 if ($this->db->num_rows($result)) {
878 $obj = $this->db->fetch_object($result);
880 $this->
id = $obj->rowid;
882 $this->user_creation_id = $obj->fk_user_creat;
883 $this->user_modification_id = $obj->fk_user_modif;
884 $this->date_creation = $this->db->jdate($obj->datec);
885 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
888 $this->db->free($result);
916 $this->lines = array();
918 $objectline =
new JobLine($this->db);
919 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0,
'(fk_job:=:'.((
int) $this->
id).
')');
921 if (is_numeric($result)) {
925 $this->lines = $result;
937 global $langs, $conf;
941 $conf->global->hrm_JOB_ADDON =
'mod_job_standard';
951 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
952 foreach ($dirmodels as $reldir) {
956 $mybool = ((bool) @include_once $dir.$file) || $mybool;
964 if (class_exists($classname)) {
965 $obj =
new $classname();
966 $numref = $obj->getNextValue($this);
968 if ($numref !=
'' && $numref !=
'-1') {
971 $this->error = $obj->error;
976 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
980 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
996 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
998 global $conf, $langs;
1001 $includedocgeneration = 0;
1003 $langs->load(
"hrm");
1006 $modele =
'standard_job';
1008 if (!empty($this->model_pdf)) {
1009 $modele = $this->model_pdf;
1015 $modelpath =
"core/modules/hrm/doc/";
1017 if ($includedocgeneration && !empty($modele)) {
1018 $result = $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1033 global $selected, $langs;
1035 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
1037 $return =
'<div class="box-flex-item box-flex-grow-zero">';
1038 $return .=
'<div class="info-box info-box-sm">';
1039 $return .=
'<span class="info-box-icon bg-infobox-action">';
1041 $return .=
'</span>';
1042 $return .=
'<div class="info-box-content">';
1043 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl(0) : $this->ref).
'</span>';
1044 if ($selected >= 0) {
1045 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1051 if (property_exists($this,
'description') && !(empty($this->
description))) {
1053 $return .=
'<br><span class="info-box-label ">'.(strlen($this->
description) > 30 ?
dol_substr($this->
description, 0, 25).
'...' : $this->description).
'</span>';
1055 $return .=
'</div>';
1056 $return .=
'</div>';
1057 $return .=
'</div>';
1071 $skillranks = array();
1072 $sql =
"SELECT rowid";
1073 $sql .=
" FROM ".MAIN_DB_PREFIX.
"hrm_skillrank";
1074 $sql .=
" WHERE fk_object = ".((int) $id);
1076 $resql = $this->db->query($sql);
1078 $num = $this->db->num_rows($resql);
1081 $obj = $this->db->fetch_object($resql);
1082 $skillranks[] = $obj;
1085 $this->db->free($resql);
1094require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
1113 $this->isextrafieldmanaged = 0;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
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 $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.