dolibarr 19.0.3
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 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28// Put here all includes required by your class file
29require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
30require_once DOL_DOCUMENT_ROOT . '/hrm/class/skillrank.class.php';
31//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
32//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
33
38{
42 public $module = 'hrm';
43
47 public $element = 'evaluationdet';
48
52 public $table_element = 'hrm_evaluationdet';
53
58 public $ismultientitymanaged = 0;
59
63 public $isextrafieldmanaged = 1;
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 $tms;
121 public $fk_user_creat;
122 public $fk_user_modif;
123 public $fk_skill;
124 public $fk_evaluation;
125 public $fk_rank;
126 public $required_rank;
127 public $import_key;
128 // END MODULEBUILDER PROPERTIES
129
130
131 // If this object has a subtable with lines
132
133 // /**
134 // * @var string Name of subtable line
135 // */
136 // public $table_element_line = 'hrm_evaluationline';
137
138 // /**
139 // * @var string Field with ID of parent key if this object has a parent
140 // */
141 // public $fk_element = 'fk_evaluationdet';
142
143 // /**
144 // * @var string Name of subtable class that manage subtable lines
145 // */
146 // public $class_element_line = 'EvaluationLine';
147
148 // /**
149 // * @var array List of child tables. To test if we can delete object.
150 // */
151 // protected $childtables = array();
152
153 // /**
154 // * @var array List of child tables. To know object to delete on cascade.
155 // * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will
156 // * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object
157 // */
158 // protected $childtablesoncascade = array('hrm_evaluationdetdet');
159
160 // /**
161 // * @var EvaluationLine[] Array of subtable lines
162 // */
163 // public $lines = array();
164
165
171 public function __construct(DoliDB $db)
172 {
173 global $conf, $langs;
174
175 $this->db = $db;
176
177 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') && isset($this->fields['rowid'])) {
178 $this->fields['rowid']['visible'] = 0;
179 }
180 if (!isModEnabled('multicompany') && isset($this->fields['entity'])) {
181 $this->fields['entity']['enabled'] = 0;
182 }
183
184 // Example to show how to set values of fields definition dynamically
185 /*if ($user->rights->hrm->evaluationdet->read) {
186 $this->fields['myfield']['visible'] = 1;
187 $this->fields['myfield']['noteditable'] = 0;
188 }*/
189
190 // Unset fields that are disabled
191 foreach ($this->fields as $key => $val) {
192 if (isset($val['enabled']) && empty($val['enabled'])) {
193 unset($this->fields[$key]);
194 }
195 }
196
197 // Translate some data of arrayofkeyval
198 if (is_object($langs)) {
199 foreach ($this->fields as $key => $val) {
200 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
201 foreach ($val['arrayofkeyval'] as $key2 => $val2) {
202 $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
203 }
204 }
205 }
206 }
207 }
208
216 public function create(User $user, $notrigger = false)
217 {
218 $resultcreate = $this->createCommon($user, $notrigger);
219
220 return $resultcreate;
221 }
222
230 public function createFromClone(User $user, $fromid)
231 {
232 global $langs, $extrafields;
233 $error = 0;
234
235 dol_syslog(__METHOD__, LOG_DEBUG);
236
237 $object = new self($this->db);
238
239 $this->db->begin();
240
241 // Load source object
242 $result = $object->fetchCommon($fromid);
243 if ($result > 0 && !empty($object->table_element_line)) {
244 $object->fetchLines();
245 }
246
247 // get lines so they will be clone
248 //foreach($this->lines as $line)
249 // $line->fetch_optionals();
250
251 // Reset some properties
252 unset($object->id);
253 unset($object->fk_user_creat);
254 unset($object->import_key);
255
256 // Clear fields
257 if (property_exists($object, 'ref')) {
258 $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
259 }
260 if (property_exists($object, 'label')) {
261 $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
262 }
263 if (property_exists($object, 'status')) {
264 $object->status = self::STATUS_DRAFT;
265 }
266 if (property_exists($object, 'date_creation')) {
267 $object->date_creation = dol_now();
268 }
269 if (property_exists($object, 'date_modification')) {
270 $object->date_modification = null;
271 }
272 // ...
273 // Clear extrafields that are unique
274 if (is_array($object->array_options) && count($object->array_options) > 0) {
275 $extrafields->fetch_name_optionals_label($this->table_element);
276 foreach ($object->array_options as $key => $option) {
277 $shortkey = preg_replace('/options_/', '', $key);
278 if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
279 //var_dump($key); var_dump($clonedObj->array_options[$key]); exit;
280 unset($object->array_options[$key]);
281 }
282 }
283 }
284
285 // Create clone
286 $object->context['createfromclone'] = 'createfromclone';
287 $result = $object->createCommon($user);
288 if ($result < 0) {
289 $error++;
290 $this->error = $object->error;
291 $this->errors = $object->errors;
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
363 public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND')
364 {
365 global $conf;
366
367 dol_syslog(__METHOD__, LOG_DEBUG);
368
369 $records = array();
370
371 $sql = 'SELECT ';
372 $sql .= $this->getFieldList('t');
373 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
374 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
375 $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')';
376 } else {
377 $sql .= ' WHERE 1 = 1';
378 }
379 // Manage filter
380 $sqlwhere = array();
381 if (count($filter) > 0) {
382 foreach ($filter as $key => $value) {
383 if ($key == 't.rowid') {
384 $sqlwhere[] = $key.'='.$value;
385 } elseif ($key == 'customsql') {
386 $sqlwhere[] = $value;
387 } elseif (array_key_exists($key, $this->fields) && in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) {
388 $sqlwhere[] = $key.' = \''.$this->db->idate($value).'\'';
389 } elseif (strpos($value, '%') === false) {
390 $sqlwhere[] = $key.' IN ('.$this->db->sanitize($this->db->escape($value)).')';
391 } else {
392 $sqlwhere[] = $key.' LIKE \'%'.$this->db->escape($value).'%\'';
393 }
394 }
395 }
396 if (count($sqlwhere) > 0) {
397 $sql .= " AND (".implode(" ".$filtermode." ", $sqlwhere).")";
398 }
399
400 if (!empty($sortfield)) {
401 $sql .= $this->db->order($sortfield, $sortorder);
402 }
403 if (!empty($limit)) {
404 $sql .= ' '.$this->db->plimit($limit, $offset);
405 }
406
407 $resql = $this->db->query($sql);
408 if ($resql) {
409 $num = $this->db->num_rows($resql);
410 $i = 0;
411 while ($i < ($limit ? min($limit, $num) : $num)) {
412 $obj = $this->db->fetch_object($resql);
413
414 $record = new self($this->db);
415 $record->setVarsFromFetchObj($obj);
416
417 $records[$record->id] = $record;
418
419 $i++;
420 }
421 $this->db->free($resql);
422
423 return $records;
424 } else {
425 $this->errors[] = 'Error '.$this->db->lasterror();
426 dol_syslog(__METHOD__.' '.join(',', $this->errors), LOG_ERR);
427
428 return -1;
429 }
430 }
431
439 public function update(User $user, $notrigger = false)
440 {
441 return $this->updateCommon($user, $notrigger);
442 }
443
451 public function delete(User $user, $notrigger = false)
452 {
453 if ($this->fk_rank) {
454 $skillRank = new SkillRank($this->db);
455 $skillRank->fetch($this->fk_rank);
456 $skillRank->delete($user, $notrigger);
457 }
458 return $this->deleteCommon($user, $notrigger);
459 //return $this->deleteCommon($user, $notrigger, 1);
460 }
461
470 public function deleteLine(User $user, $idline, $notrigger = false)
471 {
472 if ($this->status < 0) {
473 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
474 return -2;
475 }
476
477 return $this->deleteLineCommon($user, $idline, $notrigger);
478 }
479
480
488 public function validate($user, $notrigger = 0)
489 {
490 global $conf, $langs;
491
492 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
493
494 $error = 0;
495
496 // Protection
497 if ($this->status == self::STATUS_VALIDATED) {
498 dol_syslog(get_class($this)."::validate action abandonned: already validated", LOG_WARNING);
499 return 0;
500 }
501
502 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->evaluationdet->write))
503 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->evaluationdet->evaluationdet_advance->validate))))
504 {
505 $this->error='NotEnoughPermissions';
506 dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
507 return -1;
508 }*/
509
510 $now = dol_now();
511
512 $this->db->begin();
513
514 // Define new ref
515 if (!$error && (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
516 $num = $this->getNextNumRef();
517 } else {
518 $num = $this->ref;
519 }
520 $this->newref = $num;
521
522 if (!empty($num)) {
523 // Validate
524 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
525 $sql .= " SET ref = '".$this->db->escape($num)."',";
526 $sql .= " status = ".self::STATUS_VALIDATED;
527 if (!empty($this->fields['date_validation'])) {
528 $sql .= ", date_validation = '".$this->db->idate($now)."'";
529 }
530 if (!empty($this->fields['fk_user_valid'])) {
531 $sql .= ", fk_user_valid = ".((int) $user->id);
532 }
533 $sql .= " WHERE rowid = ".((int) $this->id);
534
535 dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
536 $resql = $this->db->query($sql);
537 if (!$resql) {
538 dol_print_error($this->db);
539 $this->error = $this->db->lasterror();
540 $error++;
541 }
542
543 if (!$error && !$notrigger) {
544 // Call trigger
545 $result = $this->call_trigger('HRM_EVALUATIONLINE_VALIDATE', $user);
546 if ($result < 0) {
547 $error++;
548 }
549 // End call triggers
550 }
551 }
552
553 if (!$error) {
554 $this->oldref = $this->ref;
555
556 // Rename directory if dir was a temporary ref
557 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
558 // Now we rename also files into index
559 $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)."'";
560 $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'evaluationline/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
561 $resql = $this->db->query($sql);
562 if (!$resql) {
563 $error++;
564 $this->error = $this->db->lasterror();
565 }
566 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'evaluationline/".$this->db->escape($this->newref)."'";
567 $sql .= " WHERE filepath = 'evaluationline/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
568 $resql = $this->db->query($sql);
569 if (!$resql) {
570 $error++;
571 $this->error = $this->db->lasterror();
572 }
573
574 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
575 $oldref = dol_sanitizeFileName($this->ref);
576 $newref = dol_sanitizeFileName($num);
577 $dirsource = $conf->hrm->dir_output.'/evaluationline/'.$oldref;
578 $dirdest = $conf->hrm->dir_output.'/evaluationline/'.$newref;
579 if (!$error && file_exists($dirsource)) {
580 dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
581
582 if (@rename($dirsource, $dirdest)) {
583 dol_syslog("Rename ok");
584 // Rename docs starting with $oldref with $newref
585 $listoffiles = dol_dir_list($conf->hrm->dir_output.'/evaluationline/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
586 foreach ($listoffiles as $fileentry) {
587 $dirsource = $fileentry['name'];
588 $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
589 $dirsource = $fileentry['path'].'/'.$dirsource;
590 $dirdest = $fileentry['path'].'/'.$dirdest;
591 @rename($dirsource, $dirdest);
592 }
593 }
594 }
595 }
596 }
597
598 // Set new ref and current status
599 if (!$error) {
600 $this->ref = $num;
601 $this->status = self::STATUS_VALIDATED;
602 }
603
604 if (!$error) {
605 $this->db->commit();
606 return 1;
607 } else {
608 $this->db->rollback();
609 return -1;
610 }
611 }
612
613
621 public function setDraft($user, $notrigger = 0)
622 {
623 // Protection
624 if ($this->status <= self::STATUS_DRAFT) {
625 return 0;
626 }
627
628 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
629 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
630 {
631 $this->error='Permission denied';
632 return -1;
633 }*/
634
635 return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'EVALUATIONLINE_UNVALIDATE');
636 }
637
645 public function cancel($user, $notrigger = 0)
646 {
647 // Protection
648 if ($this->status != self::STATUS_VALIDATED) {
649 return 0;
650 }
651
652 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
653 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
654 {
655 $this->error='Permission denied';
656 return -1;
657 }*/
658
659 return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'EVALUATIONLINE_CANCEL');
660 }
661
669 public function reopen($user, $notrigger = 0)
670 {
671 // Protection
672 if ($this->status != self::STATUS_CANCELED) {
673 return 0;
674 }
675
676 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
677 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
678 {
679 $this->error='Permission denied';
680 return -1;
681 }*/
682
683 return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'EVALUATIONLINE_REOPEN');
684 }
685
696 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
697 {
698 global $conf, $langs, $hookmanager;
699
700 if (!empty($conf->dol_no_mouse_hover)) {
701 $notooltip = 1; // Force disable tooltips
702 }
703
704 $result = '';
705
706 $label = img_picto('', $this->picto).' <u>'.$langs->trans("Evaluationdet").'</u>';
707 if (isset($this->status)) {
708 $label .= ' '.$this->getLibStatut(5);
709 }
710 $label .= '<br>';
711 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
712
713 $url = dol_buildpath('/hrm/evaluationdet_card.php', 1).'?id='.$this->id;
714
715 if ($option != 'nolink') {
716 // Add param to save lastsearch_values or not
717 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
718 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
719 $add_save_lastsearch_values = 1;
720 }
721 if ($add_save_lastsearch_values) {
722 $url .= '&save_lastsearch_values=1';
723 }
724 }
725
726 $linkclose = '';
727 if (empty($notooltip)) {
728 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
729 $label = $langs->trans("ShowEvaluationdet");
730 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
731 }
732 $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
733 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
734 } else {
735 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
736 }
737
738 if ($option == 'nolink') {
739 $linkstart = '<span';
740 } else {
741 $linkstart = '<a href="'.$url.'"';
742 }
743 $linkstart .= $linkclose.'>';
744 if ($option == 'nolink') {
745 $linkend = '</span>';
746 } else {
747 $linkend = '</a>';
748 }
749
750 $result .= $linkstart;
751
752 if (empty($this->showphoto_on_popup)) {
753 if ($withpicto) {
754 $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);
755 }
756 } else {
757 if ($withpicto) {
758 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
759
760 list($class, $module) = explode('@', $this->picto);
761 $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
762 $filearray = dol_dir_list($upload_dir, "files");
763 $filename = $filearray[0]['name'];
764 if (!empty($filename)) {
765 $pospoint = strpos($filearray[0]['name'], '.');
766
767 $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
768 if (!getDolGlobalString(strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS')) {
769 $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>';
770 } else {
771 $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>';
772 }
773
774 $result .= '</div>';
775 } else {
776 $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);
777 }
778 }
779 }
780
781 if ($withpicto != 2) {
782 $result .= $this->ref;
783 }
784
785 $result .= $linkend;
786 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
787
788 global $action, $hookmanager;
789 $hookmanager->initHooks(array('evaluationlinedao'));
790 $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
791 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
792 if ($reshook > 0) {
793 $result = $hookmanager->resPrint;
794 } else {
795 $result .= $hookmanager->resPrint;
796 }
797
798 return $result;
799 }
800
807 public function getLibStatut($mode = 0)
808 {
809 return $this->LibStatut($this->status, $mode);
810 }
811
812 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
820 public function LibStatut($status, $mode = 0)
821 {
822 // phpcs:enable
823 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
824 global $langs;
825 //$langs->load("hrm");
826 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
827 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
828 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
829 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
830 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
831 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
832 }
833
834 $statusType = 'status'.$status;
835 //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
836 if ($status == self::STATUS_CANCELED) {
837 $statusType = 'status6';
838 }
839
840 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
841 }
842
849 public function info($id)
850 {
851 $sql = 'SELECT rowid, date_creation as datec, tms as datem,';
852 $sql .= ' fk_user_creat, fk_user_modif';
853 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
854 $sql .= ' WHERE t.rowid = '.((int) $id);
855 $result = $this->db->query($sql);
856 if ($result) {
857 if ($this->db->num_rows($result)) {
858 $obj = $this->db->fetch_object($result);
859
860 $this->id = $obj->rowid;
861
862 $this->user_creation_id = $obj->fk_user_creat;
863 $this->user_modification_id = $obj->fk_user_modif;
864 $this->date_creation = $this->db->jdate($obj->datec);
865 $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
866 }
867
868 $this->db->free($result);
869 } else {
870 dol_print_error($this->db);
871 }
872 }
873
880 public function initAsSpecimen()
881 {
882 // Set here init that are not commonf fields
883 // $this->property1 = ...
884 // $this->property2 = ...
885
886 $this->initAsSpecimenCommon();
887 }
888
894 public function getLinesArray()
895 {
896 $this->lines = array();
897
898 $objectline = new EvaluationLine($this->db);
899 $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_evaluationdet = '.$this->id));
900
901 if (is_numeric($result)) {
902 $this->error = $objectline->error;
903 $this->errors = $objectline->errors;
904 return $result;
905 } else {
906 $this->lines = $result;
907 return $this->lines;
908 }
909 }
910
916 public function getNextNumRef()
917 {
918 global $langs, $conf;
919 $langs->load("hrm");
920
921 if (!getDolGlobalString('hrm_EVALUATIONLINE_ADDON')) {
922 $conf->global->hrm_EVALUATIONLINE_ADDON = 'mod_evaluationdet_standard';
923 }
924
925 if (getDolGlobalString('hrm_EVALUATIONLINE_ADDON')) {
926 $mybool = false;
927
928 $file = getDolGlobalString('hrm_EVALUATIONLINE_ADDON') . ".php";
929 $classname = $conf->global->hrm_EVALUATIONLINE_ADDON;
930
931 // Include file with class
932 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
933 foreach ($dirmodels as $reldir) {
934 $dir = dol_buildpath($reldir."core/modules/hrm/");
935
936 // Load file with numbering class (if found)
937 $mybool |= @include_once $dir.$file;
938 }
939
940 if ($mybool === false) {
941 dol_print_error('', "Failed to include file ".$file);
942 return '';
943 }
944
945 if (class_exists($classname)) {
946 $obj = new $classname();
947 $numref = $obj->getNextValue($this);
948
949 if ($numref != '' && $numref != '-1') {
950 return $numref;
951 } else {
952 $this->error = $obj->error;
953 //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
954 return "";
955 }
956 } else {
957 print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
958 return "";
959 }
960 } else {
961 print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
962 return "";
963 }
964 }
965
977 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
978 {
979 global $conf, $langs;
980
981 $result = 0;
982 $includedocgeneration = 0;
983
984 $langs->load("hrm");
985
986 if (!dol_strlen($modele)) {
987 $modele = 'standard_evaluationdet';
988
989 if (!empty($this->model_pdf)) {
990 $modele = $this->model_pdf;
991 } elseif (getDolGlobalString('EVALUATIONLINE_ADDON_PDF')) {
992 $modele = $conf->global->EVALUATIONLINE_ADDON_PDF;
993 }
994 }
995
996 $modelpath = "core/modules/hrm/doc/";
997
998 if ($includedocgeneration && !empty($modele)) {
999 $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1000 }
1001
1002 return $result;
1003 }
1004
1012 public function doScheduledJob()
1013 {
1014 global $conf, $langs;
1015
1016 //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
1017
1018 $error = 0;
1019 $this->output = '';
1020 $this->error = '';
1021
1022 dol_syslog(__METHOD__, LOG_DEBUG);
1023
1024 $now = dol_now();
1025
1026 $this->db->begin();
1027
1028 // ...
1029
1030 $this->db->commit();
1031
1032 return $error;
1033 }
1034}
1035
1036
1037require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Definition security.php:604
$object ref
Definition info.php:79
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
deleteLineCommon(User $user, $idline, $notrigger=false)
Delete a line of object in database.
createCommon(User $user, $notrigger=false)
Create object into database.
deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
Delete object in database.
getFieldList($alias='', $excludefields=array())
Function to concat keys of fields.
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.
updateCommon(User $user, $notrigger=false)
Update object into database.
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.
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.
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 optionaly the picto)
createFromClone(User $user, $fromid)
Clone an object into another one.
create(User $user, $notrigger=false)
Create object into database.
fetch($id, $ref=null)
Load object in memory from the database.
deleteLine(User $user, $idline, $notrigger=false)
Delete a line of object in database.
update(User $user, $notrigger=false)
Update object into database.
info($id)
Load the info information in the object.
__construct(DoliDB $db)
Constructor.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
setDraft($user, $notrigger=0)
Set draft status.
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.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter=array(), $filtermode='AND')
Load list of objects in memory from the database.
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.
doScheduledJob()
Action executed by scheduler CAN BE A CRON TASK.
Class for SkillRank.
Class to manage Dolibarr users.
dol_dir_list($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:62
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dol_now($mode='auto')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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.
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.