dolibarr 20.0.0
evaluationdet.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
4 * Copyright (C) 2021 Greg Rastklan <greg.rastklan@atm-consulting.fr>
5 * Copyright (C) 2021 Jean-Pascal BOUDET <jean-pascal.boudet@atm-consulting.fr>
6 * Copyright (C) 2021 Grégory BLEMAND <gregory.blemand@atm-consulting.fr>
7 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
8 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
30// Put here all includes required by your class file
31require_once DOL_DOCUMENT_ROOT . '/core/class/commonobjectline.class.php';
32require_once DOL_DOCUMENT_ROOT . '/hrm/class/skillrank.class.php';
33
34
39{
43 public $module = 'hrm';
44
48 public $element = 'evaluationdet';
49
53 public $table_element = 'hrm_evaluationdet';
54
58 public $parent_element = 'hrm_evaluation';
59
63 public $fk_parent_attribute = 'fk_evaluation';
64
68 public $picto = 'evaluationdet@hrm';
69
70
71 const STATUS_DRAFT = 0;
72 const STATUS_VALIDATED = 1;
73 const STATUS_CANCELED = 9;
74
75
102 // BEGIN MODULEBUILDER PROPERTIES
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,),
117 );
118 public $rowid;
119 public $date_creation;
120 public $fk_user_creat;
121 public $fk_user_modif;
122 public $fk_skill;
123 public $fk_evaluation;
124 public $fk_rank;
125 public $required_rank;
126 public $import_key;
127 // END MODULEBUILDER PROPERTIES
128
129
130 // If this object has a subtable with lines
131
132 // /**
133 // * @var string Name of subtable line
134 // */
135 // public $table_element_line = 'hrm_evaluationline';
136
137 // /**
138 // * @var string Field with ID of parent key if this object has a parent
139 // */
140 // public $fk_element = 'fk_evaluationdet';
141
142 // /**
143 // * @var string Name of subtable class that manage subtable lines
144 // */
145 // public $class_element_line = 'EvaluationLine';
146
147 // /**
148 // * @var array List of child tables. To test if we can delete object.
149 // */
150 // protected $childtables = array();
151
152 // /**
153 // * @var array List of child tables. To know object to delete on cascade.
154 // * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will
155 // * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object
156 // */
157 // protected $childtablesoncascade = array('hrm_evaluationdetdet');
158
159 // /**
160 // * @var EvaluationLine[] Array of subtable lines
161 // */
162 // public $lines = array();
163
164
170 public function __construct(DoliDB $db)
171 {
172 global $conf, $langs;
173
174 $this->db = $db;
175
176 $this->ismultientitymanaged = 0;
177 $this->isextrafieldmanaged = 1;
178
179 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') && isset($this->fields['rowid'])) {
180 $this->fields['rowid']['visible'] = 0;
181 }
182 if (!isModEnabled('multicompany') && isset($this->fields['entity'])) {
183 $this->fields['entity']['enabled'] = 0;
184 }
185
186 // Example to show how to set values of fields definition dynamically
187 /*if ($user->rights->hrm->evaluationdet->read) {
188 $this->fields['myfield']['visible'] = 1;
189 $this->fields['myfield']['noteditable'] = 0;
190 }*/
191
192 // Unset fields that are disabled
193 foreach ($this->fields as $key => $val) {
194 if (isset($val['enabled']) && empty($val['enabled'])) {
195 unset($this->fields[$key]);
196 }
197 }
198
199 // Translate some data of arrayofkeyval
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);
205 }
206 }
207 }
208 }
209 }
210
218 public function create(User $user, $notrigger = 0)
219 {
220 $resultcreate = $this->createCommon($user, $notrigger);
221
222 return $resultcreate;
223 }
224
232 public function createFromClone(User $user, $fromid)
233 {
234 global $langs, $extrafields;
235 $error = 0;
236
237 dol_syslog(__METHOD__, LOG_DEBUG);
238
239 $object = new self($this->db);
240
241 $this->db->begin();
242
243 // Load source object
244 $result = $object->fetchCommon($fromid);
245 if ($result > 0 && !empty($object->table_element_line)) {
246 $object->fetchLines();
247 }
248
249 // get lines so they will be clone
250 //foreach($this->lines as $line)
251 // $line->fetch_optionals();
252
253 // Reset some properties
254 unset($object->id);
255 unset($object->fk_user_creat);
256 unset($object->import_key);
257
258 // Clear fields
259 if (property_exists($object, 'ref')) {
260 $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
261 }
262 if (property_exists($object, 'label')) {
263 $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
264 }
265 if (property_exists($object, 'status')) {
266 $object->status = self::STATUS_DRAFT;
267 }
268 if (property_exists($object, 'date_creation')) {
269 $object->date_creation = dol_now();
270 }
271 if (property_exists($object, 'date_modification')) {
272 $object->date_modification = null;
273 }
274 // ...
275 // Clear extrafields that are unique
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])) {
281 //var_dump($key); var_dump($clonedObj->array_options[$key]); exit;
282 unset($object->array_options[$key]);
283 }
284 }
285 }
286
287 // Create clone
288 $object->context['createfromclone'] = 'createfromclone';
289 $result = $object->createCommon($user);
290 if ($result < 0) {
291 $error++;
293 }
294
295 if (!$error) {
296 // copy internal contacts
297 if ($this->copy_linked_contact($object, 'internal') < 0) {
298 $error++;
299 }
300 }
301
302 if (!$error) {
303 // copy external contacts if same company
304 if (property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
305 if ($this->copy_linked_contact($object, 'external') < 0) {
306 $error++;
307 }
308 }
309 }
310
311 unset($object->context['createfromclone']);
312
313 // End
314 if (!$error) {
315 $this->db->commit();
316 return $object;
317 } else {
318 $this->db->rollback();
319 return -1;
320 }
321 }
322
330 public function fetch($id, $ref = null)
331 {
332 $result = $this->fetchCommon($id, $ref);
333 if ($result > 0 && !empty($this->table_element_line)) {
334 $this->fetchLines();
335 }
336 return $result;
337 }
338
344 public function fetchLines()
345 {
346 $this->lines = array();
347
348 $result = $this->fetchLinesCommon();
349 return $result;
350 }
351
352
365 public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, $filter = '', $filtermode = 'AND')
366 {
367 global $conf;
368
369 dol_syslog(__METHOD__, LOG_DEBUG);
370
371 $records = array();
372
373 $sql = 'SELECT ';
374 $sql .= $this->getFieldList('t');
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).')';
378 } else {
379 $sql .= ' WHERE 1 = 1';
380 }
381
382 // Manage filter
383 $errormessage = '';
384 $sql .= forgeSQLFromUniversalSearchCriteria($filter, $errormessage);
385 if ($errormessage) {
386 $this->errors[] = $errormessage;
387 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
388 return -1;
389 }
390
391 if (!empty($sortfield)) {
392 $sql .= $this->db->order($sortfield, $sortorder);
393 }
394 if (!empty($limit)) {
395 $sql .= ' '.$this->db->plimit($limit, $offset);
396 }
397
398 $resql = $this->db->query($sql);
399 if ($resql) {
400 $num = $this->db->num_rows($resql);
401 $i = 0;
402 while ($i < ($limit ? min($limit, $num) : $num)) {
403 $obj = $this->db->fetch_object($resql);
404
405 $record = new self($this->db);
406 $record->setVarsFromFetchObj($obj);
407
408 $records[$record->id] = $record;
409
410 $i++;
411 }
412 $this->db->free($resql);
413
414 return $records;
415 } else {
416 $this->errors[] = 'Error '.$this->db->lasterror();
417 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
418
419 return -1;
420 }
421 }
422
430 public function update(User $user, $notrigger = 0)
431 {
432 return $this->updateCommon($user, $notrigger);
433 }
434
442 public function delete(User $user, $notrigger = 0)
443 {
444 if ($this->fk_rank) {
445 $skillRank = new SkillRank($this->db);
446 $skillRank->fetch($this->fk_rank);
447 $skillRank->delete($user, $notrigger);
448 }
449 return $this->deleteCommon($user, $notrigger);
450 //return $this->deleteCommon($user, $notrigger, 1);
451 }
452
461 public function deleteLine(User $user, $idline, $notrigger = 0)
462 {
463 if ($this->status < 0) {
464 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
465 return -2;
466 }
467
468 return $this->deleteLineCommon($user, $idline, $notrigger);
469 }
470
471
479 public function validate($user, $notrigger = 0)
480 {
481 global $conf, $langs;
482
483 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
484
485 $error = 0;
486
487 // Protection
488 if ($this->status == self::STATUS_VALIDATED) {
489 dol_syslog(get_class($this)."::validate action abandoned: already validated", LOG_WARNING);
490 return 0;
491 }
492
493 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->evaluationdet->write))
494 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->evaluationdet->evaluationdet_advance->validate))))
495 {
496 $this->error='NotEnoughPermissions';
497 dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
498 return -1;
499 }*/
500
501 $now = dol_now();
502
503 $this->db->begin();
504
505 // Define new ref
506 if (!$error && (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
507 $num = $this->getNextNumRef();
508 } else {
509 $num = $this->ref;
510 }
511 $this->newref = $num;
512
513 if (!empty($num)) {
514 // Validate
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)."'";
520 }
521 if (!empty($this->fields['fk_user_valid'])) {
522 $sql .= ", fk_user_valid = ".((int) $user->id);
523 }
524 $sql .= " WHERE rowid = ".((int) $this->id);
525
526 dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
527 $resql = $this->db->query($sql);
528 if (!$resql) {
529 dol_print_error($this->db);
530 $this->error = $this->db->lasterror();
531 $error++;
532 }
533
534 if (!$error && !$notrigger) {
535 // Call trigger
536 $result = $this->call_trigger('HRM_EVALUATIONLINE_VALIDATE', $user);
537 if ($result < 0) {
538 $error++;
539 }
540 // End call triggers
541 }
542 }
543
544 if (!$error) {
545 $this->oldref = $this->ref;
546
547 // Rename directory if dir was a temporary ref
548 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
549 // Now we rename also files into index
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);
553 if (!$resql) {
554 $error++;
555 $this->error = $this->db->lasterror();
556 }
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);
560 if (!$resql) {
561 $error++;
562 $this->error = $this->db->lasterror();
563 }
564
565 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
566 $oldref = dol_sanitizeFileName($this->ref);
567 $newref = dol_sanitizeFileName($num);
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);
572
573 if (@rename($dirsource, $dirdest)) {
574 dol_syslog("Rename ok");
575 // Rename docs starting with $oldref with $newref
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);
583 }
584 }
585 }
586 }
587 }
588
589 // Set new ref and current status
590 if (!$error) {
591 $this->ref = $num;
592 $this->status = self::STATUS_VALIDATED;
593 }
594
595 if (!$error) {
596 $this->db->commit();
597 return 1;
598 } else {
599 $this->db->rollback();
600 return -1;
601 }
602 }
603
604
612 public function setDraft($user, $notrigger = 0)
613 {
614 // Protection
615 if ($this->status <= self::STATUS_DRAFT) {
616 return 0;
617 }
618
619 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
620 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
621 {
622 $this->error='Permission denied';
623 return -1;
624 }*/
625
626 return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'EVALUATIONLINE_UNVALIDATE');
627 }
628
636 public function cancel($user, $notrigger = 0)
637 {
638 // Protection
639 if ($this->status != self::STATUS_VALIDATED) {
640 return 0;
641 }
642
643 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
644 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
645 {
646 $this->error='Permission denied';
647 return -1;
648 }*/
649
650 return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'EVALUATIONLINE_CANCEL');
651 }
652
660 public function reopen($user, $notrigger = 0)
661 {
662 // Protection
663 if ($this->status != self::STATUS_CANCELED) {
664 return 0;
665 }
666
667 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
668 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
669 {
670 $this->error='Permission denied';
671 return -1;
672 }*/
673
674 return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'EVALUATIONLINE_REOPEN');
675 }
676
687 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
688 {
689 global $conf, $langs, $hookmanager;
690
691 if (!empty($conf->dol_no_mouse_hover)) {
692 $notooltip = 1; // Force disable tooltips
693 }
694
695 $result = '';
696
697 $label = img_picto('', $this->picto).' <u>'.$langs->trans("Evaluationdet").'</u>';
698 if (isset($this->status)) {
699 $label .= ' '.$this->getLibStatut(5);
700 }
701 $label .= '<br>';
702 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
703
704 $url = dol_buildpath('/hrm/evaluationdet_card.php', 1).'?id='.$this->id;
705
706 if ($option != 'nolink') {
707 // Add param to save lastsearch_values or not
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;
711 }
712 if ($add_save_lastsearch_values) {
713 $url .= '&save_lastsearch_values=1';
714 }
715 }
716
717 $linkclose = '';
718 if (empty($notooltip)) {
719 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
720 $label = $langs->trans("ShowEvaluationdet");
721 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
722 }
723 $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
724 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
725 } else {
726 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
727 }
728
729 if ($option == 'nolink') {
730 $linkstart = '<span';
731 } else {
732 $linkstart = '<a href="'.$url.'"';
733 }
734 $linkstart .= $linkclose.'>';
735 if ($option == 'nolink') {
736 $linkend = '</span>';
737 } else {
738 $linkend = '</a>';
739 }
740
741 $result .= $linkstart;
742
743 if (empty($this->showphoto_on_popup)) {
744 if ($withpicto) {
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);
746 }
747 } else {
748 if ($withpicto) {
749 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
750
751 list($class, $module) = explode('@', $this->picto);
752 $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
753 $filearray = dol_dir_list($upload_dir, "files");
754 $filename = $filearray[0]['name'];
755 if (!empty($filename)) {
756 $pospoint = strpos($filearray[0]['name'], '.');
757
758 $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
759 if (!getDolGlobalString(strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS')) {
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>';
761 } else {
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>';
763 }
764
765 $result .= '</div>';
766 } else {
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);
768 }
769 }
770 }
771
772 if ($withpicto != 2) {
773 $result .= $this->ref;
774 }
775
776 $result .= $linkend;
777 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
778
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); // Note that $action and $object may have been modified by some hooks
783 if ($reshook > 0) {
784 $result = $hookmanager->resPrint;
785 } else {
786 $result .= $hookmanager->resPrint;
787 }
788
789 return $result;
790 }
791
798 public function getLibStatut($mode = 0)
799 {
800 return $this->LibStatut($this->status, $mode);
801 }
802
803 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
811 public function LibStatut($status, $mode = 0)
812 {
813 // phpcs:enable
814 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
815 global $langs;
816 //$langs->load("hrm");
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');
823 }
824
825 $statusType = 'status'.$status;
826 //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
827 if ($status == self::STATUS_CANCELED) {
828 $statusType = 'status6';
829 }
830
831 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
832 }
833
840 public function info($id)
841 {
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);
847 if ($result) {
848 if ($this->db->num_rows($result)) {
849 $obj = $this->db->fetch_object($result);
850
851 $this->id = $obj->rowid;
852
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);
857 }
858
859 $this->db->free($result);
860 } else {
861 dol_print_error($this->db);
862 }
863 }
864
871 public function initAsSpecimen()
872 {
873 // Set here init that are not commonf fields
874 // $this->property1 = ...
875 // $this->property2 = ...
876
877 return $this->initAsSpecimenCommon();
878 }
879
885 public function getLinesArray()
886 {
887 $this->lines = array();
888
889 $objectline = new EvaluationLine($this->db);
890 $result = $objectline->fetchAll('ASC', 'position', 0, 0, '(fk_evaluationdet:=:'.((int) $this->id).')');
891
892 if (is_numeric($result)) {
893 $this->setErrorsFromObject($objectline);
894 return $result;
895 } else {
896 $this->lines = $result;
897 return $this->lines;
898 }
899 }
900
906 public function getNextNumRef()
907 {
908 global $langs, $conf;
909 $langs->load("hrm");
910
911 if (!getDolGlobalString('hrm_EVALUATIONLINE_ADDON')) {
912 $conf->global->hrm_EVALUATIONLINE_ADDON = 'mod_evaluationdet_standard';
913 }
914
915 if (getDolGlobalString('hrm_EVALUATIONLINE_ADDON')) {
916 $mybool = false;
917
918 $file = getDolGlobalString('hrm_EVALUATIONLINE_ADDON') . ".php";
919 $classname = getDolGlobalString('hrm_EVALUATIONLINE_ADDON');
920
921 // Include file with class
922 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
923 foreach ($dirmodels as $reldir) {
924 $dir = dol_buildpath($reldir."core/modules/hrm/");
925
926 // Load file with numbering class (if found)
927 $mybool = ((bool) @include_once $dir.$file) || $mybool;
928 }
929
930 if ($mybool === false) {
931 dol_print_error(null, "Failed to include file ".$file);
932 return '';
933 }
934
935 if (class_exists($classname)) {
936 $obj = new $classname();
937 $numref = $obj->getNextValue($this);
938
939 if ($numref != '' && $numref != '-1') {
940 return $numref;
941 } else {
942 $this->error = $obj->error;
943 //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
944 return "";
945 }
946 } else {
947 print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
948 return "";
949 }
950 } else {
951 print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
952 return "";
953 }
954 }
955
967 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
968 {
969 global $conf, $langs;
970
971 $result = 0;
972 $includedocgeneration = 0;
973
974 $langs->load("hrm");
975
976 if (!dol_strlen($modele)) {
977 $modele = 'standard_evaluationdet';
978
979 if (!empty($this->model_pdf)) {
980 $modele = $this->model_pdf;
981 } elseif (getDolGlobalString('EVALUATIONLINE_ADDON_PDF')) {
982 $modele = getDolGlobalString('EVALUATIONLINE_ADDON_PDF');
983 }
984 }
985
986 $modelpath = "core/modules/hrm/doc/";
987
988 if ($includedocgeneration && !empty($modele)) {
989 $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
990 }
991
992 return $result;
993 }
994}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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...
Definition security.php:636
$object ref
Definition info.php:79
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 for SkillRank.
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.
Definition files.lib.php:63
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.