29require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
30require_once DOL_DOCUMENT_ROOT .
'/hrm/class/skillrank.class.php';
42 public $module =
'hrm';
47 public $element =
'evaluationdet';
52 public $table_element =
'hrm_evaluationdet';
58 public $ismultientitymanaged = 0;
63 public $isextrafieldmanaged = 1;
68 public $picto =
'evaluationdet@hrm';
71 const STATUS_DRAFT = 0;
72 const STATUS_VALIDATED = 1;
73 const STATUS_CANCELED = 9;
106 public $fields=array(
107 'rowid' => array(
'type'=>
'integer',
'label'=>
'TechnicalID',
'enabled'=>
'1',
'position'=>1,
'notnull'=>1,
'visible'=>0,
'noteditable'=>
'1',
'index'=>1,
'css'=>
'left',
'comment'=>
"Id"),
108 'date_creation' => array(
'type'=>
'datetime',
'label'=>
'DateCreation',
'enabled'=>
'1',
'position'=>500,
'notnull'=>1,
'visible'=>-2,),
109 'tms' => array(
'type'=>
'timestamp',
'label'=>
'DateModification',
'enabled'=>
'1',
'position'=>501,
'notnull'=>0,
'visible'=>-2,),
110 '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',),
111 'fk_user_modif' => array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserModif',
'enabled'=>
'1',
'position'=>511,
'notnull'=>-1,
'visible'=>-2,),
112 'fk_skill' => array(
'type'=>
'integer:Skill:hrm/class/skill.class.php:1',
'label'=>
'Skill',
'enabled'=>
'1',
'position'=>3,
'notnull'=>1,
'visible'=>1,
'index'=>1,),
113 'fk_evaluation' => array(
'type'=>
'integer:Evaluation:hrm/class/evaluation.class.php:1',
'label'=>
'Evaluation',
'enabled'=>
'1',
'position'=>3,
'notnull'=>1,
'visible'=>1,
'index'=>1,),
114 'rankorder' => array(
'type'=>
'integer',
'label'=>
'Rank',
'enabled'=>
'1',
'position'=>4,
'notnull'=>1,
'visible'=>1,),
115 'required_rank' => array(
'type'=>
'integer',
'label'=>
'requiredRank',
'enabled'=>
'1',
'position'=>5,
'notnull'=>1,
'visible'=>1,),
116 'import_key' => array(
'type'=>
'varchar(14)',
'label'=>
'ImportId',
'enabled'=>
'1',
'position'=>1000,
'notnull'=>-1,
'visible'=>-2,),
119 public $date_creation;
121 public $fk_user_creat;
122 public $fk_user_modif;
124 public $fk_evaluation;
126 public $required_rank;
173 global $conf, $langs;
178 $this->fields[
'rowid'][
'visible'] = 0;
180 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
181 $this->fields[
'entity'][
'enabled'] = 0;
191 foreach ($this->fields as $key => $val) {
192 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
193 unset($this->fields[$key]);
198 if (is_object($langs)) {
199 foreach ($this->fields as $key => $val) {
200 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
201 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
202 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
220 return $resultcreate;
232 global $langs, $extrafields;
237 $object =
new self($this->db);
242 $result = $object->fetchCommon($fromid);
243 if ($result > 0 && !empty($object->table_element_line)) {
244 $object->fetchLines();
253 unset($object->fk_user_creat);
254 unset($object->import_key);
257 if (property_exists($object,
'ref')) {
258 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"Copy_Of_".$object->ref : $this->fields[
'ref'][
'default'];
260 if (property_exists($object,
'label')) {
261 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".$object->label : $this->fields[
'label'][
'default'];
263 if (property_exists($object,
'status')) {
264 $object->status = self::STATUS_DRAFT;
266 if (property_exists($object,
'date_creation')) {
267 $object->date_creation =
dol_now();
269 if (property_exists($object,
'date_modification')) {
270 $object->date_modification =
null;
274 if (is_array($object->array_options) && count($object->array_options) > 0) {
275 $extrafields->fetch_name_optionals_label($this->table_element);
276 foreach ($object->array_options as $key => $option) {
277 $shortkey = preg_replace(
'/options_/',
'', $key);
278 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
280 unset($object->array_options[$key]);
286 $object->context[
'createfromclone'] =
'createfromclone';
287 $result = $object->createCommon($user);
290 $this->error = $object->error;
291 $this->errors = $object->errors;
303 if (property_exists($this,
'fk_soc') && $this->fk_soc == $object->socid) {
310 unset($object->context[
'createfromclone']);
317 $this->db->rollback();
329 public function fetch($id, $ref =
null)
332 if ($result > 0 && !empty($this->table_element_line)) {
345 $this->lines = array();
363 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, array $filter = array(), $filtermode =
'AND')
373 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
374 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
375 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
377 $sql .=
' WHERE 1 = 1';
381 if (count($filter) > 0) {
382 foreach ($filter as $key => $value) {
383 if ($key ==
't.rowid') {
384 $sqlwhere[] = $key.
'='.$value;
385 } elseif ($key ==
'customsql') {
386 $sqlwhere[] = $value;
387 } elseif (array_key_exists($key, $this->fields) && in_array($this->fields[$key][
'type'], array(
'date',
'datetime',
'timestamp'))) {
388 $sqlwhere[] = $key.
' = \''.$this->db->idate($value).
'\'';
389 } elseif (strpos($value,
'%') ===
false) {
390 $sqlwhere[] = $key.
' IN ('.$this->db->sanitize($this->db->escape($value)).
')';
392 $sqlwhere[] = $key.
' LIKE \'%'.$this->db->escape($value).
'%\'';
396 if (count($sqlwhere) > 0) {
397 $sql .=
" AND (".implode(
" ".$filtermode.
" ", $sqlwhere).
")";
400 if (!empty($sortfield)) {
401 $sql .= $this->db->order($sortfield, $sortorder);
403 if (!empty($limit)) {
404 $sql .=
' '.$this->db->plimit($limit, $offset);
407 $resql = $this->db->query($sql);
409 $num = $this->db->num_rows($resql);
411 while ($i < ($limit ? min($limit, $num) : $num)) {
412 $obj = $this->db->fetch_object($resql);
414 $record =
new self($this->db);
415 $record->setVarsFromFetchObj($obj);
417 $records[$record->id] = $record;
421 $this->db->free($resql);
425 $this->errors[] =
'Error '.$this->db->lasterror();
426 dol_syslog(__METHOD__.
' '.join(
',', $this->errors), LOG_ERR);
451 public function delete(
User $user, $notrigger =
false)
453 if ($this->fk_rank) {
455 $skillRank->fetch($this->fk_rank);
456 $skillRank->delete($user, $notrigger);
473 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
490 global $conf, $langs;
492 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
497 if ($this->
status == self::STATUS_VALIDATED) {
498 dol_syslog(get_class($this).
"::validate action abandonned: already validated", LOG_WARNING);
515 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
520 $this->newref = $num;
524 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
525 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
526 $sql .=
" status = ".self::STATUS_VALIDATED;
527 if (!empty($this->fields[
'date_validation'])) {
528 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
530 if (!empty($this->fields[
'fk_user_valid'])) {
531 $sql .=
", fk_user_valid = ".((int) $user->id);
533 $sql .=
" WHERE rowid = ".((int) $this->
id);
535 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
536 $resql = $this->db->query($sql);
539 $this->error = $this->db->lasterror();
543 if (!$error && !$notrigger) {
545 $result = $this->
call_trigger(
'HRM_EVALUATIONLINE_VALIDATE', $user);
554 $this->oldref = $this->ref;
557 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
559 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'evaluationline/".$this->db->escape($this->newref).
"'";
560 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'evaluationline/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
561 $resql = $this->db->query($sql);
564 $this->error = $this->db->lasterror();
566 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'evaluationline/".$this->db->escape($this->newref).
"'";
567 $sql .=
" WHERE filepath = 'evaluationline/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
568 $resql = $this->db->query($sql);
571 $this->error = $this->db->lasterror();
577 $dirsource = $conf->hrm->dir_output.
'/evaluationline/'.$oldref;
578 $dirdest = $conf->hrm->dir_output.
'/evaluationline/'.$newref;
579 if (!$error && file_exists($dirsource)) {
580 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
582 if (@rename($dirsource, $dirdest)) {
585 $listoffiles =
dol_dir_list($conf->hrm->dir_output.
'/evaluationline/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
586 foreach ($listoffiles as $fileentry) {
587 $dirsource = $fileentry[
'name'];
588 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
589 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
590 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
591 @rename($dirsource, $dirdest);
601 $this->
status = self::STATUS_VALIDATED;
608 $this->db->rollback();
624 if ($this->
status <= self::STATUS_DRAFT) {
635 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'EVALUATIONLINE_UNVALIDATE');
645 public function cancel($user, $notrigger = 0)
648 if ($this->
status != self::STATUS_VALIDATED) {
659 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'EVALUATIONLINE_CANCEL');
669 public function reopen($user, $notrigger = 0)
672 if ($this->
status != self::STATUS_CANCELED) {
683 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'EVALUATIONLINE_REOPEN');
696 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
698 global $conf, $langs, $hookmanager;
700 if (!empty($conf->dol_no_mouse_hover)) {
706 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"Evaluationdet").
'</u>';
707 if (isset($this->
status)) {
708 $label .=
' '.$this->getLibStatut(5);
711 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
713 $url =
dol_buildpath(
'/hrm/evaluationdet_card.php', 1).
'?id='.$this->id;
715 if ($option !=
'nolink') {
717 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
718 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
719 $add_save_lastsearch_values = 1;
721 if ($add_save_lastsearch_values) {
722 $url .=
'&save_lastsearch_values=1';
727 if (empty($notooltip)) {
729 $label = $langs->trans(
"ShowEvaluationdet");
730 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
732 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
733 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
735 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
738 if ($option ==
'nolink') {
739 $linkstart =
'<span';
741 $linkstart =
'<a href="'.$url.
'"';
743 $linkstart .= $linkclose.
'>';
744 if ($option ==
'nolink') {
745 $linkend =
'</span>';
750 $result .= $linkstart;
752 if (empty($this->showphoto_on_popup)) {
754 $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);
758 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
760 list($class, $module) = explode(
'@', $this->picto);
763 $filename = $filearray[0][
'name'];
764 if (!empty($filename)) {
765 $pospoint = strpos($filearray[0][
'name'],
'.');
767 $pathtophoto = $class.
'/'.$this->
ref.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
769 $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>';
771 $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>';
776 $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);
781 if ($withpicto != 2) {
782 $result .= $this->ref;
788 global $action, $hookmanager;
789 $hookmanager->initHooks(array(
'evaluationlinedao'));
790 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
791 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
793 $result = $hookmanager->resPrint;
795 $result .= $hookmanager->resPrint;
823 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
826 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
827 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
828 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
829 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
830 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
831 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
834 $statusType =
'status'.$status;
836 if ($status == self::STATUS_CANCELED) {
837 $statusType =
'status6';
840 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
851 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
852 $sql .=
' fk_user_creat, fk_user_modif';
853 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
854 $sql .=
' WHERE t.rowid = '.((int) $id);
855 $result = $this->db->query($sql);
857 if ($this->db->num_rows($result)) {
858 $obj = $this->db->fetch_object($result);
860 $this->
id = $obj->rowid;
862 $this->user_creation_id = $obj->fk_user_creat;
863 $this->user_modification_id = $obj->fk_user_modif;
864 $this->date_creation = $this->db->jdate($obj->datec);
865 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
868 $this->db->free($result);
896 $this->lines = array();
899 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0, array(
'customsql'=>
'fk_evaluationdet = '.$this->
id));
901 if (is_numeric($result)) {
902 $this->error = $objectline->error;
903 $this->errors = $objectline->errors;
906 $this->lines = $result;
918 global $langs, $conf;
922 $conf->global->hrm_EVALUATIONLINE_ADDON =
'mod_evaluationdet_standard';
929 $classname = $conf->global->hrm_EVALUATIONLINE_ADDON;
932 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
933 foreach ($dirmodels as $reldir) {
937 $mybool |= @include_once $dir.$file;
940 if ($mybool ===
false) {
945 if (class_exists($classname)) {
946 $obj =
new $classname();
947 $numref = $obj->getNextValue($this);
949 if ($numref !=
'' && $numref !=
'-1') {
952 $this->error = $obj->error;
957 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
961 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
977 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
979 global $conf, $langs;
982 $includedocgeneration = 0;
987 $modele =
'standard_evaluationdet';
989 if (!empty($this->model_pdf)) {
990 $modele = $this->model_pdf;
992 $modele = $conf->global->EVALUATIONLINE_ADDON_PDF;
996 $modelpath =
"core/modules/hrm/doc/";
998 if ($includedocgeneration && !empty($modele)) {
999 $result = $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1014 global $conf, $langs;
1030 $this->db->commit();
1037require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
deleteLineCommon(User $user, $idline, $notrigger=false)
Delete a line of object in database.
createCommon(User $user, $notrigger=false)
Create object into database.
deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
Delete object in database.
getFieldList($alias='', $excludefields=array())
Function to concat keys of fields.
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.
updateCommon(User $user, $notrigger=false)
Update object into database.
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.
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.
Class for EvaluationLine.
getLibStatut($mode=0)
Return the label of the status.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionaly the picto)
createFromClone(User $user, $fromid)
Clone an object into another one.
create(User $user, $notrigger=false)
Create object into database.
fetch($id, $ref=null)
Load object in memory from the database.
deleteLine(User $user, $idline, $notrigger=false)
Delete a line of object in database.
update(User $user, $notrigger=false)
Update object into database.
info($id)
Load the info information in the object.
__construct(DoliDB $db)
Constructor.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
setDraft($user, $notrigger=0)
Set draft status.
getLinesArray()
Create an array of lines.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter=array(), $filtermode='AND')
Load list of objects in memory from the database.
cancel($user, $notrigger=0)
Set cancel status.
LibStatut($status, $mode=0)
Return the status.
validate($user, $notrigger=0)
Validate object.
reopen($user, $notrigger=0)
Set back to validated status.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
fetchLines()
Load object lines in memory from the database.
doScheduledJob()
Action executed by scheduler CAN BE A CRON TASK.
Class to manage Dolibarr users.
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.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dol_now($mode='auto')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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.
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.