31require_once DOL_DOCUMENT_ROOT .
'/core/class/commonobjectline.class.php';
32require_once DOL_DOCUMENT_ROOT .
'/hrm/class/skillrank.class.php';
43 public $module =
'hrm';
48 public $element =
'evaluationdet';
53 public $table_element =
'hrm_evaluationdet';
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;
120 public $fk_user_creat;
121 public $fk_user_modif;
123 public $fk_evaluation;
125 public $required_rank;
172 global $conf, $langs;
176 $this->ismultientitymanaged = 0;
177 $this->isextrafieldmanaged = 1;
180 $this->fields[
'rowid'][
'visible'] = 0;
182 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
183 $this->fields[
'entity'][
'enabled'] = 0;
193 foreach ($this->fields as $key => $val) {
194 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
195 unset($this->fields[$key]);
200 if (is_object($langs)) {
201 foreach ($this->fields as $key => $val) {
202 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
203 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
204 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
222 return $resultcreate;
234 global $langs, $extrafields;
244 $result =
$object->fetchCommon($fromid);
245 if ($result > 0 && !empty(
$object->table_element_line)) {
259 if (property_exists(
$object,
'ref')) {
260 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"Copy_Of_".$object->ref : $this->fields[
'ref'][
'default'];
262 if (property_exists(
$object,
'label')) {
263 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".
$object->label : $this->fields[
'label'][
'default'];
265 if (property_exists(
$object,
'status')) {
266 $object->status = self::STATUS_DRAFT;
268 if (property_exists(
$object,
'date_creation')) {
271 if (property_exists(
$object,
'date_modification')) {
272 $object->date_modification =
null;
276 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
277 $extrafields->fetch_name_optionals_label($this->table_element);
278 foreach (
$object->array_options as $key => $option) {
279 $shortkey = preg_replace(
'/options_/',
'', $key);
280 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
282 unset(
$object->array_options[$key]);
288 $object->context[
'createfromclone'] =
'createfromclone';
289 $result =
$object->createCommon($user);
304 if (property_exists($this,
'fk_soc') && $this->fk_soc ==
$object->socid) {
311 unset(
$object->context[
'createfromclone']);
318 $this->db->rollback();
330 public function fetch($id, $ref =
null)
333 if ($result > 0 && !empty($this->table_element_line)) {
346 $this->lines = array();
365 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
375 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
376 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
377 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
379 $sql .=
' WHERE 1 = 1';
386 $this->errors[] = $errormessage;
387 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
391 if (!empty($sortfield)) {
392 $sql .= $this->db->order($sortfield, $sortorder);
394 if (!empty($limit)) {
395 $sql .=
' '.$this->db->plimit($limit, $offset);
398 $resql = $this->db->query($sql);
400 $num = $this->db->num_rows($resql);
402 while ($i < ($limit ? min($limit, $num) : $num)) {
403 $obj = $this->db->fetch_object($resql);
405 $record =
new self($this->db);
406 $record->setVarsFromFetchObj($obj);
408 $records[$record->id] = $record;
412 $this->db->free($resql);
416 $this->errors[] =
'Error '.$this->db->lasterror();
417 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
442 public function delete(
User $user, $notrigger = 0)
444 if ($this->fk_rank) {
446 $skillRank->fetch($this->fk_rank);
447 $skillRank->delete($user, $notrigger);
464 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
481 global $conf, $langs;
483 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
488 if ($this->
status == self::STATUS_VALIDATED) {
489 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
506 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
511 $this->newref = $num;
515 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
516 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
517 $sql .=
" status = ".self::STATUS_VALIDATED;
518 if (!empty($this->fields[
'date_validation'])) {
519 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
521 if (!empty($this->fields[
'fk_user_valid'])) {
522 $sql .=
", fk_user_valid = ".((int) $user->id);
524 $sql .=
" WHERE rowid = ".((int) $this->
id);
526 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
527 $resql = $this->db->query($sql);
530 $this->error = $this->db->lasterror();
534 if (!$error && !$notrigger) {
536 $result = $this->
call_trigger(
'HRM_EVALUATIONLINE_VALIDATE', $user);
545 $this->oldref = $this->ref;
548 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
550 $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).
"'";
551 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'evaluationline/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
552 $resql = $this->db->query($sql);
555 $this->error = $this->db->lasterror();
557 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'evaluationline/".$this->db->escape($this->newref).
"'";
558 $sql .=
" WHERE filepath = 'evaluationline/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
559 $resql = $this->db->query($sql);
562 $this->error = $this->db->lasterror();
568 $dirsource = $conf->hrm->dir_output.
'/evaluationline/'.$oldref;
569 $dirdest = $conf->hrm->dir_output.
'/evaluationline/'.$newref;
570 if (!$error && file_exists($dirsource)) {
571 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
573 if (@rename($dirsource, $dirdest)) {
576 $listoffiles =
dol_dir_list($conf->hrm->dir_output.
'/evaluationline/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
577 foreach ($listoffiles as $fileentry) {
578 $dirsource = $fileentry[
'name'];
579 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
580 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
581 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
582 @rename($dirsource, $dirdest);
592 $this->
status = self::STATUS_VALIDATED;
599 $this->db->rollback();
615 if ($this->
status <= self::STATUS_DRAFT) {
626 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'EVALUATIONLINE_UNVALIDATE');
636 public function cancel($user, $notrigger = 0)
639 if ($this->
status != self::STATUS_VALIDATED) {
650 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'EVALUATIONLINE_CANCEL');
660 public function reopen($user, $notrigger = 0)
663 if ($this->
status != self::STATUS_CANCELED) {
674 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'EVALUATIONLINE_REOPEN');
687 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
689 global $conf, $langs, $hookmanager;
691 if (!empty($conf->dol_no_mouse_hover)) {
697 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"Evaluationdet").
'</u>';
698 if (isset($this->
status)) {
699 $label .=
' '.$this->getLibStatut(5);
702 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
704 $url =
dol_buildpath(
'/hrm/evaluationdet_card.php', 1).
'?id='.$this->id;
706 if ($option !=
'nolink') {
708 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
709 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
710 $add_save_lastsearch_values = 1;
712 if ($add_save_lastsearch_values) {
713 $url .=
'&save_lastsearch_values=1';
718 if (empty($notooltip)) {
720 $label = $langs->trans(
"ShowEvaluationdet");
721 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
723 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
724 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
726 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
729 if ($option ==
'nolink') {
730 $linkstart =
'<span';
732 $linkstart =
'<a href="'.$url.
'"';
734 $linkstart .= $linkclose.
'>';
735 if ($option ==
'nolink') {
736 $linkend =
'</span>';
741 $result .= $linkstart;
743 if (empty($this->showphoto_on_popup)) {
745 $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);
749 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
751 list($class, $module) = explode(
'@', $this->picto);
754 $filename = $filearray[0][
'name'];
755 if (!empty($filename)) {
756 $pospoint = strpos($filearray[0][
'name'],
'.');
758 $pathtophoto = $class.
'/'.$this->
ref.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
760 $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>';
762 $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>';
767 $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);
772 if ($withpicto != 2) {
773 $result .= $this->ref;
779 global $action, $hookmanager;
780 $hookmanager->initHooks(array(
'evaluationlinedao'));
781 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
782 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
784 $result = $hookmanager->resPrint;
786 $result .= $hookmanager->resPrint;
814 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
817 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
818 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
819 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
820 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
821 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
822 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
825 $statusType =
'status'.$status;
827 if ($status == self::STATUS_CANCELED) {
828 $statusType =
'status6';
831 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
842 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
843 $sql .=
' fk_user_creat, fk_user_modif';
844 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
845 $sql .=
' WHERE t.rowid = '.((int) $id);
846 $result = $this->db->query($sql);
848 if ($this->db->num_rows($result)) {
849 $obj = $this->db->fetch_object($result);
851 $this->
id = $obj->rowid;
853 $this->user_creation_id = $obj->fk_user_creat;
854 $this->user_modification_id = $obj->fk_user_modif;
855 $this->date_creation = $this->db->jdate($obj->datec);
856 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
859 $this->db->free($result);
887 $this->lines = array();
890 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0,
'(fk_evaluationdet:=:'.((
int) $this->
id).
')');
892 if (is_numeric($result)) {
896 $this->lines = $result;
908 global $langs, $conf;
912 $conf->global->hrm_EVALUATIONLINE_ADDON =
'mod_evaluationdet_standard';
922 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
923 foreach ($dirmodels as $reldir) {
927 $mybool = ((bool) @include_once $dir.$file) || $mybool;
930 if ($mybool ===
false) {
935 if (class_exists($classname)) {
936 $obj =
new $classname();
937 $numref = $obj->getNextValue($this);
939 if ($numref !=
'' && $numref !=
'-1') {
942 $this->error = $obj->error;
947 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
951 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
967 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
969 global $conf, $langs;
972 $includedocgeneration = 0;
977 $modele =
'standard_evaluationdet';
979 if (!empty($this->model_pdf)) {
980 $modele = $this->model_pdf;
986 $modelpath =
"core/modules/hrm/doc/";
988 if ($includedocgeneration && !empty($modele)) {
989 $result = $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
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...
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.
Class for EvaluationLine.
update(User $user, $notrigger=0)
Update object into database.
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 optionally the picto)
createFromClone(User $user, $fromid)
Clone an object into another one.
fetch($id, $ref=null)
Load object in memory from the database.
info($id)
Load the info information in the object.
create(User $user, $notrigger=0)
Create object into database.
__construct(DoliDB $db)
Constructor.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
setDraft($user, $notrigger=0)
Set draft status.
deleteLine(User $user, $idline, $notrigger=0)
Delete a line of object in database.
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.
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.
Class to manage Dolibarr users.
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_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.