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,),
125 public $fk_user_creat;
129 public $fk_user_modif;
137 public $fk_evaluation;
145 public $required_rank;
195 global $conf, $langs;
199 $this->ismultientitymanaged = 0;
200 $this->isextrafieldmanaged = 1;
203 $this->fields[
'rowid'][
'visible'] = 0;
205 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
206 $this->fields[
'entity'][
'enabled'] = 0;
216 foreach ($this->fields as $key => $val) {
217 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
218 unset($this->fields[$key]);
223 if (is_object($langs)) {
224 foreach ($this->fields as $key => $val) {
225 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
226 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
227 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
245 return $resultcreate;
257 global $langs, $extrafields;
267 $result =
$object->fetchCommon($fromid);
268 if ($result > 0 && !empty(
$object->table_element_line)) {
282 if (property_exists(
$object,
'ref')) {
283 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"Copy_Of_".$object->ref : $this->fields[
'ref'][
'default'];
285 if (property_exists(
$object,
'label')) {
286 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".
$object->label : $this->fields[
'label'][
'default'];
288 if (property_exists(
$object,
'status')) {
289 $object->status = self::STATUS_DRAFT;
291 if (property_exists(
$object,
'date_creation')) {
294 if (property_exists(
$object,
'date_modification')) {
295 $object->date_modification =
null;
299 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
300 $extrafields->fetch_name_optionals_label($this->table_element);
301 foreach (
$object->array_options as $key => $option) {
302 $shortkey = preg_replace(
'/options_/',
'', $key);
303 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
305 unset(
$object->array_options[$key]);
311 $object->context[
'createfromclone'] =
'createfromclone';
312 $result =
$object->createCommon($user);
327 if (property_exists($this,
'fk_soc') && $this->fk_soc ==
$object->socid) {
334 unset(
$object->context[
'createfromclone']);
341 $this->db->rollback();
353 public function fetch($id, $ref =
null)
356 if ($result > 0 && !empty($this->table_element_line)) {
369 $this->lines = array();
388 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
398 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
399 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
400 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
402 $sql .=
' WHERE 1 = 1';
409 $this->errors[] = $errormessage;
410 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
414 if (!empty($sortfield)) {
415 $sql .= $this->db->order($sortfield, $sortorder);
417 if (!empty($limit)) {
418 $sql .=
' '.$this->db->plimit($limit, $offset);
421 $resql = $this->db->query($sql);
423 $num = $this->db->num_rows($resql);
425 while ($i < ($limit ? min($limit, $num) : $num)) {
426 $obj = $this->db->fetch_object($resql);
428 $record =
new self($this->db);
429 $record->setVarsFromFetchObj($obj);
431 $records[$record->id] = $record;
435 $this->db->free($resql);
439 $this->errors[] =
'Error '.$this->db->lasterror();
440 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
465 public function delete(
User $user, $notrigger = 0)
467 if ($this->fk_rank) {
469 $skillRank->fetch($this->fk_rank);
470 $skillRank->delete($user, $notrigger);
487 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
504 global $conf, $langs;
506 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
511 if ($this->
status == self::STATUS_VALIDATED) {
512 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
529 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
534 $this->newref = $num;
538 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
539 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
540 $sql .=
" status = ".self::STATUS_VALIDATED;
541 if (!empty($this->fields[
'date_validation'])) {
542 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
544 if (!empty($this->fields[
'fk_user_valid'])) {
545 $sql .=
", fk_user_valid = ".((int) $user->id);
547 $sql .=
" WHERE rowid = ".((int) $this->
id);
549 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
550 $resql = $this->db->query($sql);
553 $this->error = $this->db->lasterror();
557 if (!$error && !$notrigger) {
559 $result = $this->
call_trigger(
'HRM_EVALUATIONLINE_VALIDATE', $user);
568 $this->oldref = $this->ref;
571 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
573 $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).
"'";
574 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'evaluationline/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
575 $resql = $this->db->query($sql);
578 $this->error = $this->db->lasterror();
580 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'evaluationline/".$this->db->escape($this->newref).
"'";
581 $sql .=
" WHERE filepath = 'evaluationline/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
582 $resql = $this->db->query($sql);
585 $this->error = $this->db->lasterror();
591 $dirsource = $conf->hrm->dir_output.
'/evaluationline/'.$oldref;
592 $dirdest = $conf->hrm->dir_output.
'/evaluationline/'.$newref;
593 if (!$error && file_exists($dirsource)) {
594 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
596 if (@rename($dirsource, $dirdest)) {
599 $listoffiles =
dol_dir_list($conf->hrm->dir_output.
'/evaluationline/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
600 foreach ($listoffiles as $fileentry) {
601 $dirsource = $fileentry[
'name'];
602 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
603 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
604 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
605 @rename($dirsource, $dirdest);
615 $this->
status = self::STATUS_VALIDATED;
622 $this->db->rollback();
638 if ($this->
status <= self::STATUS_DRAFT) {
649 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'EVALUATIONLINE_UNVALIDATE');
659 public function cancel($user, $notrigger = 0)
662 if ($this->
status != self::STATUS_VALIDATED) {
673 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'EVALUATIONLINE_CANCEL');
683 public function reopen($user, $notrigger = 0)
686 if ($this->
status != self::STATUS_CANCELED) {
697 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'EVALUATIONLINE_REOPEN');
710 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
712 global $conf, $langs, $hookmanager;
714 if (!empty($conf->dol_no_mouse_hover)) {
720 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"Evaluationdet").
'</u>';
721 if (isset($this->
status)) {
722 $label .=
' '.$this->getLibStatut(5);
725 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
727 $url =
dol_buildpath(
'/hrm/evaluationdet_card.php', 1).
'?id='.$this->id;
729 if ($option !=
'nolink') {
731 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
732 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
733 $add_save_lastsearch_values = 1;
735 if ($add_save_lastsearch_values) {
736 $url .=
'&save_lastsearch_values=1';
741 if (empty($notooltip)) {
743 $label = $langs->trans(
"ShowEvaluationdet");
744 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
746 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
747 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
749 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
752 if ($option ==
'nolink') {
753 $linkstart =
'<span';
755 $linkstart =
'<a href="'.$url.
'"';
757 $linkstart .= $linkclose.
'>';
758 if ($option ==
'nolink') {
759 $linkend =
'</span>';
764 $result .= $linkstart;
766 if (empty($this->showphoto_on_popup)) {
768 $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 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
774 list($class, $module) = explode(
'@', $this->picto);
777 $filename = $filearray[0][
'name'];
778 if (!empty($filename)) {
779 $pospoint = strpos($filearray[0][
'name'],
'.');
781 $pathtophoto = $class.
'/'.$this->
ref.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
783 $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>';
785 $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>';
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);
795 if ($withpicto != 2) {
796 $result .= $this->ref;
802 global $action, $hookmanager;
803 $hookmanager->initHooks(array(
'evaluationlinedao'));
804 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
805 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
807 $result = $hookmanager->resPrint;
809 $result .= $hookmanager->resPrint;
837 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
840 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
841 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
842 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
843 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
844 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
845 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
848 $statusType =
'status'.$status;
850 if ($status == self::STATUS_CANCELED) {
851 $statusType =
'status6';
854 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
865 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
866 $sql .=
' fk_user_creat, fk_user_modif';
867 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
868 $sql .=
' WHERE t.rowid = '.((int) $id);
869 $result = $this->db->query($sql);
871 if ($this->db->num_rows($result)) {
872 $obj = $this->db->fetch_object($result);
874 $this->
id = $obj->rowid;
876 $this->user_creation_id = $obj->fk_user_creat;
877 $this->user_modification_id = $obj->fk_user_modif;
878 $this->date_creation = $this->db->jdate($obj->datec);
879 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
882 $this->db->free($result);
910 $this->lines = array();
913 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0,
'(fk_evaluationdet:=:'.((
int) $this->
id).
')');
915 if (is_numeric($result)) {
919 $this->lines = $result;
931 global $langs, $conf;
935 $conf->global->hrm_EVALUATIONLINE_ADDON =
'mod_evaluationdet_standard';
945 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
946 foreach ($dirmodels as $reldir) {
950 $mybool = ((bool) @include_once $dir.$file) || $mybool;
958 if (class_exists($classname)) {
959 $obj =
new $classname();
960 '@phan-var-force ModeleNumRefEvaluation $obj';
961 $numref = $obj->getNextValue($this);
963 if ($numref !=
'' && $numref !=
'-1') {
966 $this->error = $obj->error;
971 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
975 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
991 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
993 global $conf, $langs;
996 $includedocgeneration = 0;
1001 $modele =
'standard_evaluationdet';
1003 if (!empty($this->model_pdf)) {
1004 $modele = $this->model_pdf;
1010 $modelpath =
"core/modules/hrm/doc/";
1012 if ($includedocgeneration && !empty($modele)) {
1013 $result = $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
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.
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...
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 a Dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.