dolibarr 21.0.0-alpha
skilldet.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';
32
37{
41 public $module = 'hrm';
42
46 public $element = 'skilldet';
47
51 public $table_element = 'hrm_skilldet';
52
56 public $parent_element = 'skill';
57
61 public $fk_parent_attribute = 'fk_skill';
62
66 public $picto = 'skilldet@hrm';
67
68
69 const STATUS_DRAFT = 0;
70 const STATUS_VALIDATED = 1;
71 const STATUS_CANCELED = 9;
72
73
100 // BEGIN MODULEBUILDER PROPERTIES
104 public $fields = array(
105 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'visible' => 0, 'noteditable' => 1, 'index' => 1, 'css' => 'left', 'comment' => "Id"),
106 'fk_skill' => array('type' => 'integer:Skill:/hrm/class/skill.class.php', 'label' => 'fk_skill', 'enabled' => 1, 'position' => 5, 'notnull' => 1, 'visible' => 0,),
107 'rankorder' => array('type' => 'integer', 'label' => 'rank', 'enabled' => 1, 'position' => 10, 'notnull' => 0, 'visible' => 2,),
108 'description' => array('type' => 'text', 'label' => 'Description', 'enabled' => 1, 'position' => 60, 'notnull' => 0, 'visible' => 1,),
109 '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',),
110 'fk_user_modif' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserModif', 'enabled' => 1, 'position' => 511, 'notnull' => -1, 'visible' => 0,),
111 );
115 public $rowid;
119 public $fk_skill;
123 public $rankorder;
127 public $description;
131 public $fk_user_creat;
135 public $fk_user_modif;
136 // END MODULEBUILDER PROPERTIES
137
138
139 // If this object has a subtable with lines
140
141 // /**
142 // * @var string Name of subtable line
143 // */
144 // public $table_element_line = 'hrm_skilldetline';
145
146 // /**
147 // * @var string Field with ID of parent key if this object has a parent
148 // */
149 // public $fk_element = 'fk_skilldet';
150
151 // /**
152 // * @var string Name of subtable class that manage subtable lines
153 // */
154 // public $class_element_line = 'Skilldetline';
155
156 // /**
157 // * @var array List of child tables. To test if we can delete object.
158 // */
159 // protected $childtables = array();
160
161 // /**
162 // * @var array List of child tables. To know object to delete on cascade.
163 // * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will
164 // * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object
165 // */
166 // protected $childtablesoncascade = array('hrm_skilldetdet');
167
168 // /**
169 // * @var SkilldetLine[] Array of subtable lines
170 // */
171 // public $lines = array();
172
173
174
180 public function __construct(DoliDB $db)
181 {
182 global $conf, $langs;
183
184 $this->db = $db;
185
186 $this->ismultientitymanaged = 0;
187 $this->isextrafieldmanaged = 1;
188
189 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') && isset($this->fields['rowid'])) {
190 $this->fields['rowid']['visible'] = 0;
191 }
192 if (!isModEnabled('multicompany') && isset($this->fields['entity'])) {
193 $this->fields['entity']['enabled'] = 0;
194 }
195
196 // Example to show how to set values of fields definition dynamically
197 /*if ($user->rights->hrm->skilldet->read) {
198 $this->fields['myfield']['visible'] = 1;
199 $this->fields['myfield']['noteditable'] = 0;
200 }*/
201
202 // Unset fields that are disabled
203 foreach ($this->fields as $key => $val) {
204 if (isset($val['enabled']) && empty($val['enabled'])) {
205 unset($this->fields[$key]);
206 }
207 }
208
209 // Translate some data of arrayofkeyval
210 if (is_object($langs)) {
211 foreach ($this->fields as $key => $val) {
212 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
213 foreach ($val['arrayofkeyval'] as $key2 => $val2) {
214 $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
215 }
216 }
217 }
218 }
219 }
220
228 public function create(User $user, $notrigger = 0)
229 {
230 $resultcreate = $this->createCommon($user, $notrigger);
231
232 //$resultvalidate = $this->validate($user, $notrigger);
233
234 return $resultcreate;
235 }
236
244 public function createFromClone(User $user, $fromid)
245 {
246 global $langs, $extrafields;
247 $error = 0;
248
249 dol_syslog(__METHOD__, LOG_DEBUG);
250
251 $object = new self($this->db);
252
253 $this->db->begin();
254
255 // Load source object
256 $result = $object->fetchCommon($fromid);
257 if ($result > 0 && !empty($object->table_element_line)) {
258 $object->fetchLines();
259 }
260
261 // get lines so they will be clone
262 //foreach($this->lines as $line)
263 // $line->fetch_optionals();
264
265 // Reset some properties
266 unset($object->id);
267 unset($object->fk_user_creat);
268 unset($object->import_key);
269
270 // Clear fields
271 if (property_exists($object, 'ref')) {
272 $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
273 }
274 if (property_exists($object, 'label')) {
275 $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
276 }
277 if (property_exists($object, 'status')) {
278 $object->status = self::STATUS_DRAFT;
279 }
280 if (property_exists($object, 'date_creation')) {
281 $object->date_creation = dol_now();
282 }
283 if (property_exists($object, 'date_modification')) {
284 $object->date_modification = null;
285 }
286 // ...
287 // Clear extrafields that are unique
288 if (is_array($object->array_options) && count($object->array_options) > 0) {
289 $extrafields->fetch_name_optionals_label($this->table_element);
290 foreach ($object->array_options as $key => $option) {
291 $shortkey = preg_replace('/options_/', '', $key);
292 if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
293 //var_dump($key); var_dump($clonedObj->array_options[$key]); exit;
294 unset($object->array_options[$key]);
295 }
296 }
297 }
298
299 // Create clone
300 $object->context['createfromclone'] = 'createfromclone';
301 $result = $object->createCommon($user);
302 if ($result < 0) {
303 $error++;
305 }
306
307 if (!$error) {
308 // copy internal contacts
309 if ($this->copy_linked_contact($object, 'internal') < 0) {
310 $error++;
311 }
312 }
313
314 if (!$error) {
315 // copy external contacts if same company
316 if (property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
317 if ($this->copy_linked_contact($object, 'external') < 0) {
318 $error++;
319 }
320 }
321 }
322
323 unset($object->context['createfromclone']);
324
325 // End
326 if (!$error) {
327 $this->db->commit();
328 return $object;
329 } else {
330 $this->db->rollback();
331 return -1;
332 }
333 }
334
342 public function fetch($id, $ref = null)
343 {
344 $result = $this->fetchCommon($id, $ref);
345 if ($result > 0 && !empty($this->table_element_line)) {
346 $this->fetchLines();
347 }
348 return $result;
349 }
350
356 public function fetchLines()
357 {
358 $this->lines = array();
359
360 $result = $this->fetchLinesCommon();
361 return $result;
362 }
363
364
377 public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, $filter = '', $filtermode = 'AND')
378 {
379 dol_syslog(__METHOD__, LOG_DEBUG);
380
381 $records = array();
382
383 $sql = 'SELECT ';
384 $sql .= $this->getFieldList('t');
385 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
386 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
387 $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')';
388 } else {
389 $sql .= ' WHERE 1 = 1';
390 }
391
392 // Manage filter
393 $errormessage = '';
394 $sql .= forgeSQLFromUniversalSearchCriteria($filter, $errormessage);
395 if ($errormessage) {
396 $this->errors[] = $errormessage;
397 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
398 return -1;
399 }
400
401 if (!empty($sortfield)) {
402 $sql .= $this->db->order($sortfield, $sortorder);
403 }
404 if (!empty($limit)) {
405 $sql .= " ".$this->db->plimit($limit, $offset);
406 }
407
408 $resql = $this->db->query($sql);
409 if ($resql) {
410 $num = $this->db->num_rows($resql);
411 $i = 0;
412 while ($i < ($limit ? min($limit, $num) : $num)) {
413 $obj = $this->db->fetch_object($resql);
414
415 $record = new self($this->db);
416 $record->setVarsFromFetchObj($obj);
417
418 $records[$record->id] = $record;
419
420 $i++;
421 }
422 $this->db->free($resql);
423
424 return $records;
425 } else {
426 $this->errors[] = 'Error '.$this->db->lasterror();
427 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
428
429 return -1;
430 }
431 }
432
440 public function update(User $user, $notrigger = 0)
441 {
442 return $this->updateCommon($user, $notrigger);
443 }
444
452 public function delete(User $user, $notrigger = 0)
453 {
454 return $this->deleteCommon($user, $notrigger);
455 //return $this->deleteCommon($user, $notrigger, 1);
456 }
457
466 public function deleteLine(User $user, $idline, $notrigger = 0)
467 {
468 if ($this->status < 0) {
469 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
470 return -2;
471 }
472
473 return $this->deleteLineCommon($user, $idline, $notrigger);
474 }
475
476
484 public function validate($user, $notrigger = 0)
485 {
486 global $conf, $langs;
487
488 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
489
490 $error = 0;
491
492 // Protection
493 if ($this->status == self::STATUS_VALIDATED) {
494 dol_syslog(get_class($this)."::validate action abandoned: already validated", LOG_WARNING);
495 return 0;
496 }
497
498 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->skilldet->write))
499 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->skilldet->skilldet_advance->validate))))
500 {
501 $this->error='NotEnoughPermissions';
502 dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
503 return -1;
504 }*/
505
506 $now = dol_now();
507
508 $this->db->begin();
509
510 // Define new ref
511 if (!$error && (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
512 $num = $this->getNextNumRef();
513 } else {
514 $num = $this->ref;
515 }
516 $this->newref = $num;
517
518 if (!empty($num)) {
519 // Validate
520 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
521 $sql .= " SET ref = '".$this->db->escape($num)."',";
522 $sql .= " status = ".self::STATUS_VALIDATED;
523 if (!empty($this->fields['date_validation'])) {
524 $sql .= ", date_validation = '".$this->db->idate($now)."'";
525 }
526 if (!empty($this->fields['fk_user_valid'])) { // @phan-suppress-current-line PhanTypeMismatchProperty
527 $sql .= ", fk_user_valid = ".((int) $user->id);
528 }
529 $sql .= " WHERE rowid = ".((int) $this->id);
530
531 dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
532 $resql = $this->db->query($sql);
533 if (!$resql) {
534 dol_print_error($this->db);
535 $this->error = $this->db->lasterror();
536 $error++;
537 }
538
539 if (!$error && !$notrigger) {
540 // Call trigger
541 $result = $this->call_trigger('HRM_SKILLDET_VALIDATE', $user);
542 if ($result < 0) {
543 $error++;
544 }
545 // End call triggers
546 }
547 }
548
549 if (!$error) {
550 $this->oldref = $this->ref;
551
552 // Rename directory if dir was a temporary ref
553 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
554 // Now we rename also files into index
555 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'skilldet/".$this->db->escape($this->newref)."'";
556 $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'skilldet/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
557 $resql = $this->db->query($sql);
558 if (!$resql) {
559 $error++;
560 $this->error = $this->db->lasterror();
561 }
562 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'skilldet/".$this->db->escape($this->newref)."'";
563 $sql .= " WHERE filepath = 'skilldet/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
564 $resql = $this->db->query($sql);
565 if (!$resql) {
566 $error++;
567 $this->error = $this->db->lasterror();
568 }
569
570 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
571 $oldref = dol_sanitizeFileName($this->ref);
572 $newref = dol_sanitizeFileName($num);
573 $dirsource = $conf->hrm->dir_output.'/skilldet/'.$oldref;
574 $dirdest = $conf->hrm->dir_output.'/skilldet/'.$newref;
575 if (!$error && file_exists($dirsource)) {
576 dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
577
578 if (@rename($dirsource, $dirdest)) {
579 dol_syslog("Rename ok");
580 // Rename docs starting with $oldref with $newref
581 $listoffiles = dol_dir_list($conf->hrm->dir_output.'/skilldet/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
582 foreach ($listoffiles as $fileentry) {
583 $dirsource = $fileentry['name'];
584 $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
585 $dirsource = $fileentry['path'].'/'.$dirsource;
586 $dirdest = $fileentry['path'].'/'.$dirdest;
587 @rename($dirsource, $dirdest);
588 }
589 }
590 }
591 }
592 }
593
594 // Set new ref and current status
595 if (!$error) {
596 $this->ref = $num;
597 $this->status = self::STATUS_VALIDATED;
598 }
599
600 if (!$error) {
601 $this->db->commit();
602 return 1;
603 } else {
604 $this->db->rollback();
605 return -1;
606 }
607 }
608
609
617 public function setDraft($user, $notrigger = 0)
618 {
619 // Protection
620 if ($this->status <= self::STATUS_DRAFT) {
621 return 0;
622 }
623
624 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
625 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
626 {
627 $this->error='Permission denied';
628 return -1;
629 }*/
630
631 return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'SKILLDET_UNVALIDATE');
632 }
633
641 public function cancel($user, $notrigger = 0)
642 {
643 // Protection
644 if ($this->status != self::STATUS_VALIDATED) {
645 return 0;
646 }
647
648 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
649 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
650 {
651 $this->error='Permission denied';
652 return -1;
653 }*/
654
655 return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'SKILLDET_CANCEL');
656 }
657
665 public function reopen($user, $notrigger = 0)
666 {
667 // Protection
668 if ($this->status != self::STATUS_CANCELED) {
669 return 0;
670 }
671
672 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
673 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
674 {
675 $this->error='Permission denied';
676 return -1;
677 }*/
678
679 return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'SKILLDET_REOPEN');
680 }
681
692 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
693 {
694 global $conf, $langs, $hookmanager;
695
696 if (!empty($conf->dol_no_mouse_hover)) {
697 $notooltip = 1; // Force disable tooltips
698 }
699
700 $result = '';
701
702 $label = img_picto('', $this->picto).' <u>'.$langs->trans("Skilldet").'</u>';
703 if (isset($this->status)) {
704 $label .= ' '.$this->getLibStatut(5);
705 }
706 $label .= '<br>';
707 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
708
709 $url = dol_buildpath('/hrm/skilldet_card.php', 1).'?id='.$this->id;
710
711 if ($option != 'nolink') {
712 // Add param to save lastsearch_values or not
713 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
714 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
715 $add_save_lastsearch_values = 1;
716 }
717 if ($add_save_lastsearch_values) {
718 $url .= '&save_lastsearch_values=1';
719 }
720 }
721
722 $linkclose = '';
723 if (empty($notooltip)) {
724 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
725 $label = $langs->trans("ShowSkilldet");
726 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
727 }
728 $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
729 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
730 } else {
731 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
732 }
733
734 if ($option == 'nolink') {
735 $linkstart = '<span';
736 } else {
737 $linkstart = '<a href="'.$url.'"';
738 }
739 $linkstart .= $linkclose.'>';
740 if ($option == 'nolink') {
741 $linkend = '</span>';
742 } else {
743 $linkend = '</a>';
744 }
745
746 $result .= $linkstart;
747
748 if (empty($this->showphoto_on_popup)) {
749 if ($withpicto) {
750 $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);
751 }
752 } else {
753 if ($withpicto) {
754 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
755
756 list($class, $module) = explode('@', $this->picto);
757 $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
758 $filearray = dol_dir_list($upload_dir, "files");
759 $filename = $filearray[0]['name'];
760 if (!empty($filename)) {
761 $pospoint = strpos($filearray[0]['name'], '.');
762
763 $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
764 if (!getDolGlobalString(strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS')) {
765 $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>';
766 } else {
767 $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>';
768 }
769
770 $result .= '</div>';
771 } else {
772 $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);
773 }
774 }
775 }
776
777 if ($withpicto != 2) {
778 $result .= $this->ref;
779 }
780
781 $result .= $linkend;
782 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
783
784 global $action, $hookmanager;
785 $hookmanager->initHooks(array('skilldetdao'));
786 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
787 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
788 if ($reshook > 0) {
789 $result = $hookmanager->resPrint;
790 } else {
791 $result .= $hookmanager->resPrint;
792 }
793
794 return $result;
795 }
796
803 public function getLibStatut($mode = 0)
804 {
805 return $this->LibStatut($this->status, $mode);
806 }
807
808 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
816 public function LibStatut($status, $mode = 0)
817 {
818 // phpcs:enable
819 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
820 global $langs;
821 //$langs->load("hrm");
822 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
823 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
824 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
825 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
826 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
827 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
828 }
829
830 $statusType = 'status'.$status;
831 //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
832 if ($status == self::STATUS_CANCELED) {
833 $statusType = 'status6';
834 }
835
836 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
837 }
838
845 public function info($id)
846 {
847 $sql = 'SELECT rowid, date_creation as datec, tms as datem,';
848 $sql .= ' fk_user_creat, fk_user_modif';
849 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
850 $sql .= ' WHERE t.rowid = '.((int) $id);
851 $result = $this->db->query($sql);
852 if ($result) {
853 if ($this->db->num_rows($result)) {
854 $obj = $this->db->fetch_object($result);
855
856 $this->id = $obj->rowid;
857
858 $this->user_creation_id = $obj->fk_user_creat;
859 $this->user_modification_id = $obj->fk_user_modif;
860 $this->date_creation = $this->db->jdate($obj->datec);
861 $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
862 }
863
864 $this->db->free($result);
865 } else {
866 dol_print_error($this->db);
867 }
868 }
869
876 public function initAsSpecimen()
877 {
878 // Set here init that are not commonf fields
879 // $this->property1 = ...
880 // $this->property2 = ...
881
882 return $this->initAsSpecimenCommon();
883 }
884
885
891 public function getNextNumRef()
892 {
893 global $langs, $conf;
894 $langs->load("hrm");
895
896 if (!getDolGlobalString('hrm_SKILLDET_ADDON')) {
897 $conf->global->hrm_SKILLDET_ADDON = 'mod_skilldet_standard';
898 }
899
900 if (getDolGlobalString('hrm_SKILLDET_ADDON')) {
901 $mybool = false;
902
903 $file = getDolGlobalString('hrm_SKILLDET_ADDON') . ".php";
904 $classname = getDolGlobalString('hrm_SKILLDET_ADDON');
905
906 // Include file with class
907 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
908 foreach ($dirmodels as $reldir) {
909 $dir = dol_buildpath($reldir."core/modules/hrm/");
910
911 // Load file with numbering class (if found)
912 $mybool = ((bool) @include_once $dir.$file) || $mybool;
913 }
914
915 if (!$mybool) {
916 dol_print_error(null, "Failed to include file ".$file);
917 return '';
918 }
919
920 if (class_exists($classname)) {
921 $obj = new $classname();
922 '@phan-var-force ModeleNumRefEvaluation $obj';
923 $numref = $obj->getNextValue($this);
924
925 if ($numref != '' && $numref != '-1') {
926 return $numref;
927 } else {
928 $this->error = $obj->error;
929 //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
930 return "";
931 }
932 } else {
933 print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
934 return "";
935 }
936 } else {
937 print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
938 return "";
939 }
940 }
941
953 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
954 {
955 global $conf, $langs;
956
957 $result = 0;
958 $includedocgeneration = 0;
959
960 $langs->load("hrm");
961
962 if (!dol_strlen($modele)) {
963 $modele = 'standard_skilldet';
964
965 if (!empty($this->model_pdf)) {
966 $modele = $this->model_pdf;
967 } elseif (getDolGlobalString('SKILLDET_ADDON_PDF')) {
968 $modele = getDolGlobalString('SKILLDET_ADDON_PDF');
969 }
970 }
971
972 $modelpath = "core/modules/hrm/doc/";
973
974 if ($includedocgeneration && !empty($modele)) {
975 $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
976 }
977
978 return $result;
979 }
980}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
$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 Skilldet.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
update(User $user, $notrigger=0)
Update object into database.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
cancel($user, $notrigger=0)
Set cancel status.
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)
create(User $user, $notrigger=0)
Create object into database.
LibStatut($status, $mode=0)
Return the status.
fetchLines()
Load object lines in memory from the database.
deleteLine(User $user, $idline, $notrigger=0)
Delete a line of object in database.
__construct(DoliDB $db)
Constructor.
fetch($id, $ref=null)
Load object in memory from the database.
createFromClone(User $user, $fromid)
Clone an object into another one.
validate($user, $notrigger=0)
Validate object.
info($id)
Load the info information in the object.
reopen($user, $notrigger=0)
Set back to validated status.
setDraft($user, $notrigger=0)
Set draft status.
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:162
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 a Dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.