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)) {
279 unset(
$object->user_creation_id);
283 if (property_exists(
$object,
'ref')) {
284 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"Copy_Of_".$object->ref : $this->fields[
'ref'][
'default'];
286 if (property_exists(
$object,
'status')) {
287 $object->status = self::STATUS_DRAFT;
289 if (property_exists(
$object,
'date_creation')) {
292 if (property_exists(
$object,
'date_modification')) {
293 $object->date_modification =
null;
297 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
298 $extrafields->fetch_name_optionals_label($this->table_element);
299 foreach (
$object->array_options as $key => $option) {
300 $shortkey = preg_replace(
'/options_/',
'', $key);
301 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
303 unset(
$object->array_options[$key]);
309 $object->context[
'createfromclone'] =
'createfromclone';
310 $result =
$object->createCommon($user);
325 if (property_exists($this,
'fk_soc') && $this->fk_soc ==
$object->socid) {
332 unset(
$object->context[
'createfromclone']);
339 $this->db->rollback();
351 public function fetch($id, $ref =
null)
354 if ($result > 0 && !empty($this->table_element_line)) {
367 $this->lines = array();
386 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
396 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
397 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
398 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
400 $sql .=
' WHERE 1 = 1';
407 $this->errors[] = $errormessage;
408 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
412 if (!empty($sortfield)) {
413 $sql .= $this->db->order($sortfield, $sortorder);
415 if (!empty($limit)) {
416 $sql .=
' '.$this->db->plimit($limit, $offset);
419 $resql = $this->db->query($sql);
421 $num = $this->db->num_rows($resql);
423 while ($i < ($limit ? min($limit, $num) : $num)) {
424 $obj = $this->db->fetch_object($resql);
426 $record =
new self($this->db);
427 $record->setVarsFromFetchObj($obj);
429 $records[$record->id] = $record;
433 $this->db->free($resql);
437 $this->errors[] =
'Error '.$this->db->lasterror();
438 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
463 public function delete(
User $user, $notrigger = 0)
465 if ($this->fk_rank) {
467 $skillRank->fetch($this->fk_rank);
468 $skillRank->delete($user, $notrigger);
485 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
502 global
$conf, $langs;
504 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
509 if ($this->
status == self::STATUS_VALIDATED) {
510 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
527 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
532 $this->newref = $num;
536 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
537 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
538 $sql .=
" status = ".self::STATUS_VALIDATED;
539 if (!empty($this->fields[
'date_validation'])) {
540 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
542 if (!empty($this->fields[
'fk_user_valid'])) {
543 $sql .=
", fk_user_valid = ".((int) $user->id);
545 $sql .=
" WHERE rowid = ".((int) $this->
id);
547 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
548 $resql = $this->db->query($sql);
551 $this->error = $this->db->lasterror();
555 if (!$error && !$notrigger) {
557 $result = $this->
call_trigger(
'HRM_EVALUATIONLINE_VALIDATE', $user);
566 $this->oldref = $this->ref;
569 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
571 $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).
"'";
572 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'evaluationline/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
573 $resql = $this->db->query($sql);
576 $this->error = $this->db->lasterror();
578 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'evaluationline/".$this->db->escape($this->newref).
"'";
579 $sql .=
" WHERE filepath = 'evaluationline/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
580 $resql = $this->db->query($sql);
583 $this->error = $this->db->lasterror();
589 $dirsource =
$conf->hrm->dir_output.
'/evaluationline/'.$oldref;
590 $dirdest =
$conf->hrm->dir_output.
'/evaluationline/'.$newref;
591 if (!$error && file_exists($dirsource)) {
592 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
594 if (@rename($dirsource, $dirdest)) {
597 $listoffiles =
dol_dir_list(
$conf->hrm->dir_output.
'/evaluationline/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
598 foreach ($listoffiles as $fileentry) {
599 $dirsource = $fileentry[
'name'];
600 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
601 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
602 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
603 @rename($dirsource, $dirdest);
613 $this->
status = self::STATUS_VALIDATED;
620 $this->db->rollback();
636 if ($this->
status <= self::STATUS_DRAFT) {
647 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'EVALUATIONLINE_UNVALIDATE');
657 public function cancel($user, $notrigger = 0)
660 if ($this->
status != self::STATUS_VALIDATED) {
671 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'EVALUATIONLINE_CANCEL');
681 public function reopen($user, $notrigger = 0)
684 if ($this->
status != self::STATUS_CANCELED) {
695 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'EVALUATIONLINE_REOPEN');
708 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
710 global
$conf, $langs, $hookmanager;
712 if (!empty(
$conf->dol_no_mouse_hover)) {
718 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"Evaluationdet").
'</u>';
719 if (isset($this->
status)) {
720 $label .=
' '.$this->getLibStatut(5);
723 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
725 $url =
dol_buildpath(
'/hrm/evaluationdet_card.php', 1).
'?id='.$this->id;
727 if ($option !=
'nolink') {
729 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
730 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
731 $add_save_lastsearch_values = 1;
733 if ($add_save_lastsearch_values) {
734 $url .=
'&save_lastsearch_values=1';
739 if (empty($notooltip)) {
741 $label = $langs->trans(
"ShowEvaluationdet");
742 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
744 $linkclose .=
' title="'.dolPrintHTMLForAttribute($label).
'"';
745 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
747 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
750 if ($option ==
'nolink') {
751 $linkstart =
'<span';
753 $linkstart =
'<a href="'.$url.
'"';
755 $linkstart .= $linkclose.
'>';
756 if ($option ==
'nolink') {
757 $linkend =
'</span>';
762 $result .= $linkstart;
764 if (empty($this->showphoto_on_popup)) {
766 $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);
770 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
772 list($class, $module) = explode(
'@', $this->picto);
775 $filename = $filearray[0][
'name'];
776 if (!empty($filename)) {
777 $pospoint = strpos($filearray[0][
'name'],
'.');
779 $pathtophoto = $class.
'/'.$this->
ref.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
781 $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>';
783 $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>';
788 $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);
793 if ($withpicto != 2) {
794 $result .= $this->ref;
800 global $action, $hookmanager;
801 $hookmanager->initHooks(array(
'evaluationlinedao'));
802 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
803 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
805 $result = $hookmanager->resPrint;
807 $result .= $hookmanager->resPrint;
835 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
838 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
839 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
840 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
841 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
842 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
843 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
846 $statusType =
'status'.$status;
848 if ($status == self::STATUS_CANCELED) {
849 $statusType =
'status6';
852 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
863 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
864 $sql .=
' fk_user_creat, fk_user_modif';
865 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
866 $sql .=
' WHERE t.rowid = '.((int) $id);
867 $result = $this->db->query($sql);
869 if ($this->db->num_rows($result)) {
870 $obj = $this->db->fetch_object($result);
872 $this->
id = $obj->rowid;
874 $this->user_creation_id = $obj->fk_user_creat;
875 $this->user_modification_id = $obj->fk_user_modif;
876 $this->date_creation = $this->db->jdate($obj->datec);
877 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
880 $this->db->free($result);
908 $this->lines = array();
911 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0,
'(fk_evaluationdet:=:'.((
int) $this->
id).
')');
913 if (is_numeric($result)) {
917 $this->lines = $result;
929 global $langs,
$conf;
933 $conf->global->hrm_EVALUATIONLINE_ADDON =
'mod_evaluationdet_standard';
943 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
944 foreach ($dirmodels as $reldir) {
948 $mybool = ((bool) @include_once $dir.$file) || $mybool;
956 if (class_exists($classname)) {
957 $obj =
new $classname();
958 '@phan-var-force ModeleNumRefEvaluation $obj';
959 $numref = $obj->getNextValue($this);
961 if ($numref !=
'' && $numref !=
'-1') {
964 $this->error = $obj->error;
969 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
973 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
989 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
991 global
$conf, $langs;
994 $includedocgeneration = 0;
999 $modele =
'standard_evaluationdet';
1001 if (!empty($this->model_pdf)) {
1002 $modele = $this->model_pdf;
1008 $modelpath =
"core/modules/hrm/doc/";
1010 if ($includedocgeneration && !empty($modele)) {
1011 $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_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (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.
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
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.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...