dolibarr 22.0.5
skillrank.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/commonobject.class.php';
32require_once DOL_DOCUMENT_ROOT . '/hrm/lib/hrm_skillrank.lib.php';
33
38{
42 public $module = 'hrm';
43
47 public $element = 'skillrank';
48
52 public $table_element = 'hrm_skillrank';
53
57 public $picto = 'skillrank@hrm';
58
59
60 const STATUS_DRAFT = 0;
61 const STATUS_VALIDATED = 1;
62 const STATUS_CANCELED = 9;
63
64 const SKILLRANK_TYPE_JOB = "job";
65 const SKILLRANK_TYPE_USER = "user";
66 const SKILLRANK_TYPE_EVALDET = "evaluationdet";
67
94 // BEGIN MODULEBUILDER PROPERTIES
98 public $fields = array(
99 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'visible' => 0, 'noteditable' => 1, 'index' => 1, 'css' => 'left', 'comment' => "Id"),
100 'fk_skill' => array('type' => 'integer:Skill:hrm/class/skill.class.php:1', 'label' => 'Skill', 'enabled' => 1, 'position' => 3, 'notnull' => 1, 'visible' => 1, 'index' => 1,),
101 'rankorder' => array('type' => 'integer', 'label' => 'Rank', 'enabled' => 1, 'position' => 4, 'notnull' => 1, 'visible' => 1, 'default' => '0'),
102 'fk_object' => array('type' => 'integer', 'label' => 'object', 'enabled' => 1, 'position' => 5, 'notnull' => 1, 'visible' => 0,),
103 'date_creation' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'position' => 500, 'notnull' => 1, 'visible' => -2,),
104 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'position' => 501, 'notnull' => 0, 'visible' => -2,),
105 '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',),
106 'fk_user_modif' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserModif', 'enabled' => 1, 'position' => 511, 'notnull' => -1, 'visible' => -2,),
107 'objecttype' => array('type' => 'varchar(128)', 'label' => 'objecttype', 'enabled' => 1, 'position' => 6, 'notnull' => 1, 'visible' => 0,),
108 );
112 public $rowid;
116 public $fk_skill;
120 public $rank;
124 public $fk_object;
128 public $fk_user_creat;
132 public $fk_user_modif;
136 public $objecttype;
137 // END MODULEBUILDER PROPERTIES
141 public $rankorder;
142
143
144 // If this object has a subtable with lines
145
146 // /**
147 // * @var string Name of subtable line
148 // */
149 // public $table_element_line = 'hrm_skillrankline';
150
151 // /**
152 // * @var string Field with ID of parent key if this object has a parent
153 // */
154 // public $fk_element = 'fk_skillrank';
155
156 // /**
157 // * @var string Name of subtable class that manage subtable lines
158 // */
159 // public $class_element_line = 'SkillRankline';
160
161 // /**
162 // * @var array List of child tables. To test if we can delete object.
163 // */
164 // protected $childtables = array();
165
166 // /**
167 // * @var array List of child tables. To know object to delete on cascade.
168 // * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will
169 // * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object
170 // */
171 // protected $childtablesoncascade = array('hrm_skillrankdet');
172
173 // /**
174 // * @var SkillRankLine[] Array of subtable lines
175 // */
176 // public $lines = array();
177
178
179
185 public function __construct(DoliDB $db)
186 {
187 global $conf, $langs;
188
189 $this->db = $db;
190
191 $this->ismultientitymanaged = 0;
192 $this->isextrafieldmanaged = 0;
193
194 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') && isset($this->fields['rowid'])) {
195 $this->fields['rowid']['visible'] = 0;
196 }
197 if (!isModEnabled('multicompany') && isset($this->fields['entity'])) {
198 $this->fields['entity']['enabled'] = 0;
199 }
200
201 // Example to show how to set values of fields definition dynamically
202 /*if ($user->rights->hrm->skillrank->read) {
203 $this->fields['myfield']['visible'] = 1;
204 $this->fields['myfield']['noteditable'] = 0;
205 }*/
206
207 // Unset fields that are disabled
208 foreach ($this->fields as $key => $val) {
209 if (isset($val['enabled']) && empty($val['enabled'])) {
210 unset($this->fields[$key]);
211 }
212 }
213
214 // Translate some data of arrayofkeyval
215 if (is_object($langs)) {
216 foreach ($this->fields as $key => $val) {
217 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
218 foreach ($val['arrayofkeyval'] as $key2 => $val2) {
219 $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
220 }
221 }
222 }
223 }
224 }
225
233 public function create(User $user, $notrigger = 0)
234 {
235 global $langs;
236
237 $filter = '(fk_object:=:'.((int) $this->fk_object).") AND (objecttype:=:'".$this->db->escape($this->objecttype)."') AND (fk_skill:=:".((int) $this->fk_skill).")";
238
239 $alreadyLinked = $this->fetchAll('ASC', 'rowid', 0, 0, $filter);
240 if (!empty($alreadyLinked)) {
241 $this->error = $langs->trans('ErrSkillAlreadyAdded');
242 return -1;
243 }
244
245 $resultcreate = $this->createCommon($user, $notrigger);
246
247 return $resultcreate;
248 }
249
258 public function createFromClone(User $user, $fromid, $fk_object = 0)
259 {
260 global $langs, $extrafields;
261 $error = 0;
262
263 dol_syslog(__METHOD__, LOG_DEBUG);
264
265 $object = new self($this->db);
266
267 $this->db->begin();
268
269 // Load source object
270 $result = $object->fetchCommon($fromid);
271 if ($result > 0 && !empty($object->table_element_line)) {
272 $object->fetchLines();
273 }
274
275 // get lines so they will be clone
276 //foreach($this->lines as $line)
277 // $line->fetch_optionals();
278
279 // Reset some properties
280 unset($object->id);
281 unset($object->fk_user_creat);
282 unset($object->user_creation_id);
283 unset($object->import_key);
284 if (!empty($fk_object) && $fk_object > 0) {
285 unset($object->fk_object);
286 }
287
288
289 // Clear fields
290 if (property_exists($object, 'ref')) {
291 $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
292 }
293 if (property_exists($object, 'status')) {
294 $object->status = self::STATUS_DRAFT;
295 }
296 if (property_exists($object, 'date_creation')) {
297 $object->date_creation = dol_now();
298 }
299 if (property_exists($object, 'date_modification')) {
300 $object->date_modification = null;
301 }
302 if (!empty($fk_object) && $fk_object > 0) {
303 if (property_exists($object, 'fk_object')) {
304 $object->fk_object = ($fk_object = 0 ? $this->fk_object : $fk_object);
305 }
306 }
307 // ...
308 // Clear extrafields that are unique
309 if (is_array($object->array_options) && count($object->array_options) > 0) {
310 $extrafields->fetch_name_optionals_label($this->table_element);
311 foreach ($object->array_options as $key => $option) {
312 $shortkey = preg_replace('/options_/', '', $key);
313 if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
314 //var_dump($key); var_dump($clonedObj->array_options[$key]); exit;
315 unset($object->array_options[$key]);
316 }
317 }
318 }
319
320 // Create clone
321 $object->context['createfromclone'] = 'createfromclone';
322 $result = $object->createCommon($user);
323 if ($result < 0) {
324 $error++;
326 }
327
328 if (!$error) {
329 // copy internal contacts
330 if ($this->copy_linked_contact($object, 'internal') < 0) {
331 $error++;
332 }
333 }
334
335 if (!$error) {
336 // copy external contacts if same company
337 if (property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
338 if ($this->copy_linked_contact($object, 'external') < 0) {
339 $error++;
340 }
341 }
342 }
343
344 unset($object->context['createfromclone']);
345
346 // End
347 if (!$error) {
348 $this->db->commit();
349 return $object;
350 } else {
351 $this->db->rollback();
352 return -1;
353 }
354 }
355
363 public function fetch($id, $ref = null)
364 {
365 $result = $this->fetchCommon($id, $ref);
366 if ($result > 0 && !empty($this->table_element_line)) {
367 $this->fetchLines();
368 }
369 return $result;
370 }
371
377 public function fetchLines()
378 {
379 $this->lines = array();
380
381 $result = $this->fetchLinesCommon();
382 return $result;
383 }
384
393 public function cloneFromCurrentSkill($currentSkill, $fk_user)
394 {
395 global $user;
396
397 $this->fk_skill = $currentSkill->fk_skill;
398 $this->rankorder = $currentSkill->rankorder;
399 $this->fk_object = $fk_user;
400 $this->date_creation = dol_now();
401 $this->fk_user_creat = $user->id;
402 $this->fk_user_modif = $user->id;
403 $this->objecttype = self::SKILLRANK_TYPE_USER;
404 $result = $this->create($user);
405
406 return $result;
407 }
408
421 public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, $filter = '', $filtermode = 'AND')
422 {
423 dol_syslog(__METHOD__, LOG_DEBUG);
424
425 $records = array();
426
427 $sql = 'SELECT ';
428 $sql .= $this->getFieldList('t');
429 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
430 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
431 $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')';
432 } else {
433 $sql .= ' WHERE 1 = 1';
434 }
435
436 // Manage filter
437 $errormessage = '';
438 $sql .= forgeSQLFromUniversalSearchCriteria($filter, $errormessage);
439 if ($errormessage) {
440 $this->errors[] = $errormessage;
441 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
442 return -1;
443 }
444
445 if (!empty($sortfield)) {
446 $sql .= $this->db->order($sortfield, $sortorder);
447 }
448 if (!empty($limit)) {
449 $sql .= ' '.$this->db->plimit($limit, $offset);
450 }
451
452 $resql = $this->db->query($sql);
453 if ($resql) {
454 $num = $this->db->num_rows($resql);
455 $i = 0;
456 while ($i < ($limit ? min($limit, $num) : $num)) {
457 $obj = $this->db->fetch_object($resql);
458
459 $record = new self($this->db);
460 $record->setVarsFromFetchObj($obj);
461
462 $records[$record->id] = $record;
463
464 $i++;
465 }
466 $this->db->free($resql);
467
468 return $records;
469 } else {
470 $this->errors[] = 'Error '.$this->db->lasterror();
471 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
472
473 return -1;
474 }
475 }
476
484 public function update(User $user, $notrigger = 0)
485 {
486 return $this->updateCommon($user, $notrigger);
487 }
488
496 public function delete(User $user, $notrigger = 0)
497 {
498 return $this->deleteCommon($user, $notrigger);
499 //return $this->deleteCommon($user, $notrigger, 1);
500 }
501
510 public function deleteLine(User $user, $idline, $notrigger = 0)
511 {
512 if ($this->status < 0) {
513 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
514 return -2;
515 }
516
517 return $this->deleteLineCommon($user, $idline, $notrigger);
518 }
519
520
528 public function validate($user, $notrigger = 0)
529 {
530 global $conf, $langs;
531
532 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
533
534 $error = 0;
535
536 // Protection
537 if ($this->status == self::STATUS_VALIDATED) {
538 dol_syslog(get_class($this)."::validate action abandoned: already validated", LOG_WARNING);
539 return 0;
540 }
541
542 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->skillrank->write))
543 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->skillrank->skillrank_advance->validate))))
544 {
545 $this->error='NotEnoughPermissions';
546 dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
547 return -1;
548 }*/
549
550 $now = dol_now();
551
552 $this->db->begin();
553
554 // Define new ref
555 if (!$error && (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
556 $num = $this->getNextNumRef();
557 } else {
558 $num = $this->ref;
559 }
560 $this->newref = $num;
561
562 if (!empty($num)) {
563 // Validate
564 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
565 $sql .= " SET ref = '".$this->db->escape($num)."',";
566 $sql .= " status = ".self::STATUS_VALIDATED;
567 if (!empty($this->fields['date_validation'])) {
568 $sql .= ", date_validation = '".$this->db->idate($now)."'";
569 }
570 if (!empty($this->fields['fk_user_valid'])) {
571 $sql .= ", fk_user_valid = ".((int) $user->id);
572 }
573 $sql .= " WHERE rowid = ".((int) $this->id);
574
575 dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
576 $resql = $this->db->query($sql);
577 if (!$resql) {
578 dol_print_error($this->db);
579 $this->error = $this->db->lasterror();
580 $error++;
581 }
582
583 if (!$error && !$notrigger) {
584 // Call trigger
585 $result = $this->call_trigger('HRM_SKILLRANK_VALIDATE', $user);
586 if ($result < 0) {
587 $error++;
588 }
589 // End call triggers
590 }
591 }
592
593 if (!$error) {
594 $this->oldref = $this->ref;
595
596 // Rename directory if dir was a temporary ref
597 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
598 // Now we rename also files into index
599 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'skillrank/".$this->db->escape($this->newref)."'";
600 $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'skillrank/".$this->db->escape($this->ref)."' and entity = ".((int) $conf->entity);
601 $resql = $this->db->query($sql);
602 if (!$resql) {
603 $error++;
604 $this->error = $this->db->lasterror();
605 }
606 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'skillrank/".$this->db->escape($this->newref)."'";
607 $sql .= " WHERE filepath = 'skillrank/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
608 $resql = $this->db->query($sql);
609 if (!$resql) {
610 $error++;
611 $this->error = $this->db->lasterror();
612 }
613
614 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
615 $oldref = dol_sanitizeFileName($this->ref);
616 $newref = dol_sanitizeFileName($num);
617 $dirsource = $conf->hrm->dir_output.'/skillrank/'.$oldref;
618 $dirdest = $conf->hrm->dir_output.'/skillrank/'.$newref;
619 if (!$error && file_exists($dirsource)) {
620 dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
621
622 if (@rename($dirsource, $dirdest)) {
623 dol_syslog("Rename ok");
624 // Rename docs starting with $oldref with $newref
625 $listoffiles = dol_dir_list($conf->hrm->dir_output.'/skillrank/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
626 foreach ($listoffiles as $fileentry) {
627 $dirsource = $fileentry['name'];
628 $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
629 $dirsource = $fileentry['path'].'/'.$dirsource;
630 $dirdest = $fileentry['path'].'/'.$dirdest;
631 @rename($dirsource, $dirdest);
632 }
633 }
634 }
635 }
636 }
637
638 // Set new ref and current status
639 if (!$error) {
640 $this->ref = $num;
641 $this->status = self::STATUS_VALIDATED;
642 }
643
644 if (!$error) {
645 $this->db->commit();
646 return 1;
647 } else {
648 $this->db->rollback();
649 return -1;
650 }
651 }
652
653
661 public function setDraft($user, $notrigger = 0)
662 {
663 // Protection
664 if ($this->status <= self::STATUS_DRAFT) {
665 return 0;
666 }
667
668 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
669 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
670 {
671 $this->error='Permission denied';
672 return -1;
673 }*/
674
675 return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'SKILLRANK_UNVALIDATE');
676 }
677
685 public function cancel($user, $notrigger = 0)
686 {
687 // Protection
688 if ($this->status != self::STATUS_VALIDATED) {
689 return 0;
690 }
691
692 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
693 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
694 {
695 $this->error='Permission denied';
696 return -1;
697 }*/
698
699 return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'SKILLRANK_CANCEL');
700 }
701
709 public function reopen($user, $notrigger = 0)
710 {
711 // Protection
712 if ($this->status != self::STATUS_CANCELED) {
713 return 0;
714 }
715
716 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
717 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
718 {
719 $this->error='Permission denied';
720 return -1;
721 }*/
722
723 return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'SKILLRANK_REOPEN');
724 }
725
736 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
737 {
738 global $conf, $langs, $hookmanager;
739
740 if (!empty($conf->dol_no_mouse_hover)) {
741 $notooltip = 1; // Force disable tooltips
742 }
743
744 $result = '';
745
746 $label = img_picto('', $this->picto).' <u>'.$langs->trans("SkillRank").'</u>';
747 if (isset($this->status)) {
748 $label .= ' '.$this->getLibStatut(5);
749 }
750 $label .= '<br>';
751 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
752
753 $url = dol_buildpath('/hrm/skillrank_card.php', 1).'?id='.$this->id;
754
755 if ($option != 'nolink') {
756 // Add param to save lastsearch_values or not
757 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
758 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
759 $add_save_lastsearch_values = 1;
760 }
761 if ($add_save_lastsearch_values) {
762 $url .= '&save_lastsearch_values=1';
763 }
764 }
765
766 $linkclose = '';
767 if (empty($notooltip)) {
768 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
769 $label = $langs->trans("ShowSkillRank");
770 $linkclose .= ' alt="'.dolPrintHTMLForAttribute($label).'"';
771 }
772 $linkclose .= ' title="'.dolPrintHTMLForAttribute($label).'"';
773 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
774 } else {
775 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
776 }
777
778 if ($option == 'nolink') {
779 $linkstart = '<span';
780 } else {
781 $linkstart = '<a href="'.$url.'"';
782 }
783 $linkstart .= $linkclose.'>';
784 if ($option == 'nolink') {
785 $linkend = '</span>';
786 } else {
787 $linkend = '</a>';
788 }
789
790 $result .= $linkstart;
791
792 if (empty($this->showphoto_on_popup)) {
793 if ($withpicto) {
794 $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);
795 }
796 } else {
797 if ($withpicto) {
798 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
799
800 list($class, $module) = explode('@', $this->picto);
801 $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
802 $filearray = dol_dir_list($upload_dir, "files");
803 $filename = $filearray[0]['name'];
804 if (!empty($filename)) {
805 $pospoint = strpos($filearray[0]['name'], '.');
806
807 $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
808 if (!getDolGlobalString(strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS')) {
809 $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>';
810 } else {
811 $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>';
812 }
813
814 $result .= '</div>';
815 } else {
816 $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);
817 }
818 }
819 }
820
821 if ($withpicto != 2) {
822 $result .= $this->ref;
823 }
824
825 $result .= $linkend;
826 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
827
828 global $action, $hookmanager;
829 $hookmanager->initHooks(array('skillrankdao'));
830 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
831 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
832 if ($reshook > 0) {
833 $result = $hookmanager->resPrint;
834 } else {
835 $result .= $hookmanager->resPrint;
836 }
837
838 return $result;
839 }
840
847 public function getLibStatut($mode = 0)
848 {
849 return $this->LibStatut($this->status, $mode);
850 }
851
852 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
860 public function LibStatut($status, $mode = 0)
861 {
862 // phpcs:enable
863 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
864 global $langs;
865 //$langs->load("hrm");
866 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
867 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
868 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
869 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
870 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
871 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
872 }
873
874 $statusType = 'status'.$status;
875 //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
876 if ($status == self::STATUS_CANCELED) {
877 $statusType = 'status6';
878 }
879
880 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
881 }
882
889 public function info($id)
890 {
891 $sql = 'SELECT rowid, date_creation as datec, tms as datem,';
892 $sql .= ' fk_user_creat, fk_user_modif';
893 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
894 $sql .= ' WHERE t.rowid = '.((int) $id);
895 $result = $this->db->query($sql);
896 if ($result) {
897 if ($this->db->num_rows($result)) {
898 $obj = $this->db->fetch_object($result);
899
900 $this->id = $obj->rowid;
901
902 $this->user_creation_id = $obj->fk_user_creat;
903 $this->user_modification_id = $obj->fk_user_modif;
904 $this->date_creation = $this->db->jdate($obj->datec);
905 $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
906 }
907
908 $this->db->free($result);
909 } else {
910 dol_print_error($this->db);
911 }
912 }
913
920 public function initAsSpecimen()
921 {
922 // Set here init that are not commonf fields
923 // $this->property1 = ...
924 // $this->property2 = ...
925
926 return $this->initAsSpecimenCommon();
927 }
928
934 public function getLinesArray()
935 {
936 $this->lines = array();
937
938 /*
939 $objectline = new SkillRankLine($this->db);
940 $result = $objectline->fetchAll('ASC', 'position', 0, 0, '(fk_skillrank:=:'.((int) $this->id).')');
941
942 if (is_numeric($result)) {
943 $this->error = $objectline->error;
944 $this->errors = $objectline->errors;
945 return $result;
946 } else {
947 $this->lines = $result;
948 return $this->lines;
949 }
950 */
951
952 return $this->lines;
953 }
954
960 public function getNextNumRef()
961 {
962 global $langs, $conf;
963 $langs->load("hrm");
964
965 if (!getDolGlobalString('hrm_SKILLRANK_ADDON')) {
966 $conf->global->hrm_SKILLRANK_ADDON = 'mod_skillrank_standard';
967 }
968
969 if (getDolGlobalString('hrm_SKILLRANK_ADDON')) {
970 $mybool = false;
971
972 $file = getDolGlobalString('hrm_SKILLRANK_ADDON') . ".php";
973 $classname = getDolGlobalString('hrm_SKILLRANK_ADDON');
974
975 // Include file with class
976 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
977 foreach ($dirmodels as $reldir) {
978 $dir = dol_buildpath($reldir."core/modules/hrm/");
979
980 // Load file with numbering class (if found)
981 $mybool = ((bool) @include_once $dir.$file) || $mybool;
982 }
983
984 if (!$mybool) {
985 dol_print_error(null, "Failed to include file ".$file);
986 return '';
987 }
988
989 if (class_exists($classname)) {
990 $obj = new $classname();
991 '@phan-var-force ModeleNumRefEvaluation $obj';
992 $numref = $obj->getNextValue($this);
993
994 if ($numref != '' && $numref != '-1') {
995 return $numref;
996 } else {
997 $this->error = $obj->error;
998 //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
999 return "";
1000 }
1001 } else {
1002 print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
1003 return "";
1004 }
1005 } else {
1006 print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
1007 return "";
1008 }
1009 }
1010
1022 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
1023 {
1024 global $conf, $langs;
1025
1026 $result = 0;
1027 $includedocgeneration = 0;
1028
1029 $langs->load("hrm");
1030
1031 if (!dol_strlen($modele)) {
1032 $modele = 'standard_skillrank';
1033
1034 if (!empty($this->model_pdf)) {
1035 $modele = $this->model_pdf;
1036 } elseif (getDolGlobalString('SKILLRANK_ADDON_PDF')) {
1037 $modele = getDolGlobalString('SKILLRANK_ADDON_PDF');
1038 }
1039 }
1040
1041 $modelpath = "core/modules/hrm/doc/";
1042
1043 if ($includedocgeneration && !empty($modele)) {
1044 $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1045 }
1046
1047 return $result;
1048 }
1049}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:67
$object ref
Definition info.php:90
Parent class of all other business classes (invoices, contracts, proposals, orders,...
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.
Class to manage Dolibarr database access.
Class for SkillRank.
reopen($user, $notrigger=0)
Set back to validated status.
__construct(DoliDB $db)
Constructor.
deleteLine(User $user, $idline, $notrigger=0)
Delete a line of object in database.
LibStatut($status, $mode=0)
Return the status.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
setDraft($user, $notrigger=0)
Set draft status.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionally the picto)
fetchLines()
Load object lines in memory from the database.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
fetch($id, $ref=null)
Load object in memory from the database.
cloneFromCurrentSkill($currentSkill, $fk_user)
Clone skillrank Object linked to job with user id The skillrank table is a join table that is marked ...
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
createFromClone(User $user, $fromid, $fk_object=0)
Clone an object into another one.
create(User $user, $notrigger=0)
Create object into database.
update(User $user, $notrigger=0)
Update object into database.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
info($id)
Load the info information in the object.
validate($user, $notrigger=0)
Validate object.
getLibStatut($mode=0)
Return the label of the status.
cancel($user, $notrigger=0)
Set cancel status.
getLinesArray()
Create an array of lines.
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Definition index.php:171
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_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
dol_now($mode='auto')
Return date for now.
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79