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')) {
257 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".
$object->label : $this->fields[
'label'][
'default'];
259 if (property_exists(
$object,
'status')) {
260 $object->status = self::STATUS_DRAFT;
262 if (property_exists(
$object,
'date_creation')) {
265 if (property_exists(
$object,
'date_modification')) {
266 $object->date_modification =
null;
270 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
271 $extrafields->fetch_name_optionals_label($this->table_element);
272 foreach (
$object->array_options as $key => $option) {
273 $shortkey = preg_replace(
'/options_/',
'', $key);
274 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
276 unset(
$object->array_options[$key]);
282 $object->context[
'createfromclone'] =
'createfromclone';
283 $result =
$object->createCommon($user);
298 if (property_exists($this,
'fk_soc') && $this->fk_soc ==
$object->socid) {
305 unset(
$object->context[
'createfromclone']);
312 $this->db->rollback();
324 public function fetch($id, $ref =
null)
327 if ($result > 0 && !empty($this->table_element_line)) {
340 $this->lines = array();
359 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
367 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
368 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
369 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
371 $sql .=
' WHERE 1 = 1';
378 $this->errors[] = $errormessage;
379 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
383 if (!empty($sortfield)) {
384 $sql .= $this->db->order($sortfield, $sortorder);
386 if (!empty($limit)) {
387 $sql .=
' '.$this->db->plimit($limit, $offset);
390 $resql = $this->db->query($sql);
392 $num = $this->db->num_rows($resql);
394 while ($i < ($limit ? min($limit, $num) : $num)) {
395 $obj = $this->db->fetch_object($resql);
397 $record =
new self($this->db);
398 $record->setVarsFromFetchObj($obj);
400 $records[$record->id] = $record;
404 $this->db->free($resql);
408 $this->errors[] =
'Error '.$this->db->lasterror();
409 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
434 public function delete(
User $user, $notrigger = 0)
451 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
468 global $conf, $langs;
470 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
475 if ($this->
status == self::STATUS_VALIDATED) {
476 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
493 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
498 $this->newref = $num;
502 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
503 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
504 $sql .=
" status = ".self::STATUS_VALIDATED;
505 if (!empty($this->fields[
'date_validation'])) {
506 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
508 if (!empty($this->fields[
'fk_user_valid'])) {
509 $sql .=
", fk_user_valid = ".((int) $user->id);
511 $sql .=
" WHERE rowid = ".((int) $this->
id);
513 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
514 $resql = $this->db->query($sql);
517 $this->error = $this->db->lasterror();
521 if (!$error && !$notrigger) {
523 $result = $this->
call_trigger(
'HRM_JOB_VALIDATE', $user);
532 $this->oldref = $this->ref;
535 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
537 $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).
"'";
538 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'job/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
539 $resql = $this->db->query($sql);
542 $this->error = $this->db->lasterror();
544 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'job/".$this->db->escape($this->newref).
"'";
545 $sql .=
" WHERE filepath = 'job/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
546 $resql = $this->db->query($sql);
549 $this->error = $this->db->lasterror();
555 $dirsource = $conf->hrm->dir_output.
'/job/'.$oldref;
556 $dirdest = $conf->hrm->dir_output.
'/job/'.$newref;
557 if (!$error && file_exists($dirsource)) {
558 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
560 if (@rename($dirsource, $dirdest)) {
563 $listoffiles =
dol_dir_list($conf->hrm->dir_output.
'/job/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
564 foreach ($listoffiles as $fileentry) {
565 $dirsource = $fileentry[
'name'];
566 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
567 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
568 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
569 @rename($dirsource, $dirdest);
579 $this->
status = self::STATUS_VALIDATED;
586 $this->db->rollback();
605 $lastpos = array_shift($Tab);
622 $TPosition = $position->getForUser($userid);
623 foreach ($TPosition as $UPosition) {
624 $TReturn[$UPosition->Job->rowid] = $UPosition->Job->ref;
639 if ($this->
status <= self::STATUS_DRAFT) {
650 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'JOB_UNVALIDATE');
660 public function cancel($user, $notrigger = 0)
663 if ($this->
status != self::STATUS_VALIDATED) {
674 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'JOB_CANCEL');
684 public function reopen($user, $notrigger = 0)
687 if ($this->
status != self::STATUS_CANCELED) {
698 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'JOB_REOPEN');
711 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
713 global $conf, $langs, $hookmanager;
715 if (!empty($conf->dol_no_mouse_hover)) {
721 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"JobProfile").
'</u>';
722 if (isset($this->
status)) {
723 $label .=
' '.$this->getLibStatut(5);
726 $label .=
'<b>'.$langs->trans(
'Label').
':</b> '.$this->label;
728 $url =
dol_buildpath(
'/hrm/job_card.php', 1).
'?id='.$this->id;
730 if ($option !=
'nolink') {
732 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
733 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
734 $add_save_lastsearch_values = 1;
736 if ($add_save_lastsearch_values) {
737 $url .=
'&save_lastsearch_values=1';
742 if (empty($notooltip)) {
744 $label = $langs->trans(
"ShowJob");
745 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
747 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
748 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
750 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
753 if ($option ==
'nolink') {
754 $linkstart =
'<span';
756 $linkstart =
'<a href="'.$url.
'"';
758 $linkstart .= $linkclose.
'>';
759 if ($option ==
'nolink') {
760 $linkend =
'</span>';
765 $result .= $linkstart;
767 if (empty($this->showphoto_on_popup)) {
769 $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);
773 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
775 list($class, $module) = explode(
'@', $this->picto);
776 $upload_dir = $conf->$module->multidir_output[$conf->entity].
"/$class/".
dol_sanitizeFileName($this->label);
778 $filename = $filearray[0][
'name'];
779 if (!empty($filename)) {
780 $pospoint = strpos($filearray[0][
'name'],
'.');
782 $pathtophoto = $class.
'/'.$this->label.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
784 $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>';
786 $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>';
791 $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);
796 if ($withpicto != 2) {
797 $result .= $this->label;
803 global $action, $hookmanager;
804 $hookmanager->initHooks(array(
'jobdao'));
805 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
806 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
808 $result = $hookmanager->resPrint;
810 $result .= $hookmanager->resPrint;
870 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
871 $sql .=
' fk_user_creat, fk_user_modif';
872 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
873 $sql .=
' WHERE t.rowid = '.((int) $id);
874 $result = $this->db->query($sql);
876 if ($this->db->num_rows($result)) {
877 $obj = $this->db->fetch_object($result);
879 $this->
id = $obj->rowid;
881 $this->user_creation_id = $obj->fk_user_creat;
882 $this->user_modification_id = $obj->fk_user_modif;
883 $this->date_creation = $this->db->jdate($obj->datec);
884 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
887 $this->db->free($result);
915 $this->lines = array();
917 $objectline =
new JobLine($this->db);
918 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0,
'(fk_job:=:'.((
int) $this->
id).
')');
920 if (is_numeric($result)) {
924 $this->lines = $result;
936 global $langs, $conf;
940 $conf->global->hrm_JOB_ADDON =
'mod_job_standard';
950 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
951 foreach ($dirmodels as $reldir) {
955 $mybool = ((bool) @include_once $dir.$file) || $mybool;
958 if ($mybool ===
false) {
963 if (class_exists($classname)) {
964 $obj =
new $classname();
965 $numref = $obj->getNextValue($this);
967 if ($numref !=
'' && $numref !=
'-1') {
970 $this->error = $obj->error;
975 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
979 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
995 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
997 global $conf, $langs;
1000 $includedocgeneration = 0;
1002 $langs->load(
"hrm");
1005 $modele =
'standard_job';
1007 if (!empty($this->model_pdf)) {
1008 $modele = $this->model_pdf;
1014 $modelpath =
"core/modules/hrm/doc/";
1016 if ($includedocgeneration && !empty($modele)) {
1017 $result = $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1032 global $selected, $langs;
1034 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
1036 $return =
'<div class="box-flex-item box-flex-grow-zero">';
1037 $return .=
'<div class="info-box info-box-sm">';
1038 $return .=
'<span class="info-box-icon bg-infobox-action">';
1040 $return .=
'</span>';
1041 $return .=
'<div class="info-box-content">';
1042 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl(0) : $this->ref).
'</span>';
1043 if ($selected >= 0) {
1044 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1050 if (property_exists($this,
'description') && !(empty($this->
description))) {
1052 $return .=
'<br><span class="info-box-label ">'.(strlen($this->
description) > 30 ?
dol_substr($this->
description, 0, 25).
'...' : $this->description).
'</span>';
1054 $return .=
'</div>';
1055 $return .=
'</div>';
1056 $return .=
'</div>';
1070 $skillranks = array();
1071 $sql =
"SELECT rowid";
1072 $sql .=
" FROM ".MAIN_DB_PREFIX.
"hrm_skillrank";
1073 $sql .=
" WHERE fk_object = ".((int) $id);
1075 $resql = $this->db->query($sql);
1077 $num = $this->db->num_rows($resql);
1080 $obj = $this->db->fetch_object($resql);
1081 $skillranks[] = $obj;
1084 $this->db->free($resql);
1093require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
1112 $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 clicable 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 dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.