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 $fk_user_creat;
120 public $fk_user_modif;
122 public $fk_evaluation;
124 public $required_rank;
171 global $conf, $langs;
175 $this->ismultientitymanaged = 0;
176 $this->isextrafieldmanaged = 1;
179 $this->fields[
'rowid'][
'visible'] = 0;
181 if (!isModEnabled(
'multicompany') && isset($this->fields[
'entity'])) {
182 $this->fields[
'entity'][
'enabled'] = 0;
192 foreach ($this->fields as $key => $val) {
193 if (isset($val[
'enabled']) && empty($val[
'enabled'])) {
194 unset($this->fields[$key]);
199 if (is_object($langs)) {
200 foreach ($this->fields as $key => $val) {
201 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
202 foreach ($val[
'arrayofkeyval'] as $key2 => $val2) {
203 $this->fields[$key][
'arrayofkeyval'][$key2] = $langs->trans($val2);
221 return $resultcreate;
233 global $langs, $extrafields;
243 $result =
$object->fetchCommon($fromid);
244 if ($result > 0 && !empty(
$object->table_element_line)) {
258 if (property_exists(
$object,
'ref')) {
259 $object->ref = empty($this->fields[
'ref'][
'default']) ?
"Copy_Of_".$object->ref : $this->fields[
'ref'][
'default'];
261 if (property_exists(
$object,
'label')) {
262 $object->label = empty($this->fields[
'label'][
'default']) ? $langs->trans(
"CopyOf").
" ".
$object->label : $this->fields[
'label'][
'default'];
264 if (property_exists(
$object,
'status')) {
265 $object->status = self::STATUS_DRAFT;
267 if (property_exists(
$object,
'date_creation')) {
270 if (property_exists(
$object,
'date_modification')) {
271 $object->date_modification =
null;
275 if (is_array(
$object->array_options) && count(
$object->array_options) > 0) {
276 $extrafields->fetch_name_optionals_label($this->table_element);
277 foreach (
$object->array_options as $key => $option) {
278 $shortkey = preg_replace(
'/options_/',
'', $key);
279 if (!empty($extrafields->attributes[$this->table_element][
'unique'][$shortkey])) {
281 unset(
$object->array_options[$key]);
287 $object->context[
'createfromclone'] =
'createfromclone';
288 $result =
$object->createCommon($user);
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();
364 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND')
374 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
375 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
376 $sql .=
' WHERE t.entity IN ('.getEntity($this->element).
')';
378 $sql .=
' WHERE 1 = 1';
385 $this->errors[] = $errormessage;
386 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
390 if (!empty($sortfield)) {
391 $sql .= $this->db->order($sortfield, $sortorder);
393 if (!empty($limit)) {
394 $sql .=
' '.$this->db->plimit($limit, $offset);
397 $resql = $this->db->query($sql);
399 $num = $this->db->num_rows($resql);
401 while ($i < ($limit ? min($limit, $num) : $num)) {
402 $obj = $this->db->fetch_object($resql);
404 $record =
new self($this->db);
405 $record->setVarsFromFetchObj($obj);
407 $records[$record->id] = $record;
411 $this->db->free($resql);
415 $this->errors[] =
'Error '.$this->db->lasterror();
416 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
441 public function delete(
User $user, $notrigger = 0)
443 if ($this->fk_rank) {
445 $skillRank->fetch($this->fk_rank);
446 $skillRank->delete($user, $notrigger);
463 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
480 global $conf, $langs;
482 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
487 if ($this->
status == self::STATUS_VALIDATED) {
488 dol_syslog(get_class($this).
"::validate action abandoned: already validated", LOG_WARNING);
505 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
510 $this->newref = $num;
514 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
515 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
516 $sql .=
" status = ".self::STATUS_VALIDATED;
517 if (!empty($this->fields[
'date_validation'])) {
518 $sql .=
", date_validation = '".$this->db->idate($now).
"'";
520 if (!empty($this->fields[
'fk_user_valid'])) {
521 $sql .=
", fk_user_valid = ".((int) $user->id);
523 $sql .=
" WHERE rowid = ".((int) $this->
id);
525 dol_syslog(get_class($this).
"::validate()", LOG_DEBUG);
526 $resql = $this->db->query($sql);
529 $this->error = $this->db->lasterror();
533 if (!$error && !$notrigger) {
535 $result = $this->
call_trigger(
'HRM_EVALUATIONLINE_VALIDATE', $user);
544 $this->oldref = $this->ref;
547 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
549 $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).
"'";
550 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'evaluationline/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
551 $resql = $this->db->query($sql);
554 $this->error = $this->db->lasterror();
556 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'evaluationline/".$this->db->escape($this->newref).
"'";
557 $sql .=
" WHERE filepath = 'evaluationline/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
558 $resql = $this->db->query($sql);
561 $this->error = $this->db->lasterror();
567 $dirsource = $conf->hrm->dir_output.
'/evaluationline/'.$oldref;
568 $dirdest = $conf->hrm->dir_output.
'/evaluationline/'.$newref;
569 if (!$error && file_exists($dirsource)) {
570 dol_syslog(get_class($this).
"::validate() rename dir ".$dirsource.
" into ".$dirdest);
572 if (@rename($dirsource, $dirdest)) {
575 $listoffiles =
dol_dir_list($conf->hrm->dir_output.
'/evaluationline/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
576 foreach ($listoffiles as $fileentry) {
577 $dirsource = $fileentry[
'name'];
578 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
579 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
580 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
581 @rename($dirsource, $dirdest);
591 $this->
status = self::STATUS_VALIDATED;
598 $this->db->rollback();
614 if ($this->
status <= self::STATUS_DRAFT) {
625 return $this->
setStatusCommon($user, self::STATUS_DRAFT, $notrigger,
'EVALUATIONLINE_UNVALIDATE');
635 public function cancel($user, $notrigger = 0)
638 if ($this->
status != self::STATUS_VALIDATED) {
649 return $this->
setStatusCommon($user, self::STATUS_CANCELED, $notrigger,
'EVALUATIONLINE_CANCEL');
659 public function reopen($user, $notrigger = 0)
662 if ($this->
status != self::STATUS_CANCELED) {
673 return $this->
setStatusCommon($user, self::STATUS_VALIDATED, $notrigger,
'EVALUATIONLINE_REOPEN');
686 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
688 global $conf, $langs, $hookmanager;
690 if (!empty($conf->dol_no_mouse_hover)) {
696 $label =
img_picto(
'', $this->picto).
' <u>'.$langs->trans(
"Evaluationdet").
'</u>';
697 if (isset($this->
status)) {
698 $label .=
' '.$this->getLibStatut(5);
701 $label .=
'<b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
703 $url =
dol_buildpath(
'/hrm/evaluationdet_card.php', 1).
'?id='.$this->id;
705 if ($option !=
'nolink') {
707 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
708 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
709 $add_save_lastsearch_values = 1;
711 if ($add_save_lastsearch_values) {
712 $url .=
'&save_lastsearch_values=1';
717 if (empty($notooltip)) {
719 $label = $langs->trans(
"ShowEvaluationdet");
720 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
722 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
723 $linkclose .=
' class="classfortooltip'.($morecss ?
' '.$morecss :
'').
'"';
725 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
728 if ($option ==
'nolink') {
729 $linkstart =
'<span';
731 $linkstart =
'<a href="'.$url.
'"';
733 $linkstart .= $linkclose.
'>';
734 if ($option ==
'nolink') {
735 $linkend =
'</span>';
740 $result .= $linkstart;
742 if (empty($this->showphoto_on_popup)) {
744 $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);
748 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
750 list($class, $module) = explode(
'@', $this->picto);
753 $filename = $filearray[0][
'name'];
754 if (!empty($filename)) {
755 $pospoint = strpos($filearray[0][
'name'],
'.');
757 $pathtophoto = $class.
'/'.$this->
ref.
'/thumbs/'.substr($filename, 0, $pospoint).
'_mini'.substr($filename, $pospoint);
759 $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>';
761 $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>';
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);
771 if ($withpicto != 2) {
772 $result .= $this->ref;
778 global $action, $hookmanager;
779 $hookmanager->initHooks(array(
'evaluationlinedao'));
780 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
781 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
783 $result = $hookmanager->resPrint;
785 $result .= $hookmanager->resPrint;
813 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
816 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
817 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
818 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
819 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
820 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
'Enabled');
821 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Disabled');
824 $statusType =
'status'.$status;
826 if ($status == self::STATUS_CANCELED) {
827 $statusType =
'status6';
830 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
841 $sql =
'SELECT rowid, date_creation as datec, tms as datem,';
842 $sql .=
' fk_user_creat, fk_user_modif';
843 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as t';
844 $sql .=
' WHERE t.rowid = '.((int) $id);
845 $result = $this->db->query($sql);
847 if ($this->db->num_rows($result)) {
848 $obj = $this->db->fetch_object($result);
850 $this->
id = $obj->rowid;
852 $this->user_creation_id = $obj->fk_user_creat;
853 $this->user_modification_id = $obj->fk_user_modif;
854 $this->date_creation = $this->db->jdate($obj->datec);
855 $this->date_modification = empty($obj->datem) ?
'' : $this->db->jdate($obj->datem);
858 $this->db->free($result);
886 $this->lines = array();
889 $result = $objectline->fetchAll(
'ASC',
'position', 0, 0,
'(fk_evaluationdet:=:'.((
int) $this->
id).
')');
891 if (is_numeric($result)) {
895 $this->lines = $result;
907 global $langs, $conf;
911 $conf->global->hrm_EVALUATIONLINE_ADDON =
'mod_evaluationdet_standard';
921 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
922 foreach ($dirmodels as $reldir) {
926 $mybool = ((bool) @include_once $dir.$file) || $mybool;
929 if ($mybool ===
false) {
934 if (class_exists($classname)) {
935 $obj =
new $classname();
936 $numref = $obj->getNextValue($this);
938 if ($numref !=
'' && $numref !=
'-1') {
941 $this->error = $obj->error;
946 print $langs->trans(
"Error").
" ".$langs->trans(
"ClassNotFound").
' '.$classname;
950 print $langs->trans(
"ErrorNumberingModuleNotSetup", $this->element);
966 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
968 global $conf, $langs;
971 $includedocgeneration = 0;
976 $modele =
'standard_evaluationdet';
978 if (!empty($this->model_pdf)) {
979 $modele = $this->model_pdf;
985 $modelpath =
"core/modules/hrm/doc/";
987 if ($includedocgeneration && !empty($modele)) {
988 $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.