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