dolibarr 24.0.0-beta
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-2025 Frédéric France <frederic.france@free.fr>
8 * Copyright (C) 2024-2026 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 $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 // Unset fields that are disabled
197 foreach ($this->fields as $key => $val) {
198 if (isset($val['enabled']) && empty($val['enabled'])) {
199 unset($this->fields[$key]);
200 }
201 }
202
203 // Translate some data of arrayofkeyval
204 if (is_object($langs)) {
205 foreach ($this->fields as $key => $val) {
206 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
207 foreach ($val['arrayofkeyval'] as $key2 => $val2) {
208 $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
209 }
210 }
211 }
212 }
213 }
214
222 public function create(User $user, $notrigger = 0)
223 {
224 $resultcreate = $this->createCommon($user, $notrigger);
225
226 //$resultvalidate = $this->validate($user, $notrigger);
227
228 return $resultcreate;
229 }
230
238 public function createFromClone(User $user, $fromid)
239 {
240 global $extrafields;
241
242 $error = 0;
243
244 dol_syslog(__METHOD__, LOG_DEBUG);
245
246 $object = new self($this->db);
247
248 $this->db->begin();
249
250 // Load source object
251 $result = $object->fetchCommon($fromid);
252 if ($result > 0 && !empty($object->table_element_line)) {
253 $object->fetchLines();
254 }
255
256 // get lines so they will be clone
257 //foreach($this->lines as $line)
258 // $line->fetch_optionals();
259
260 // Reset some properties
261 unset($object->id);
262 unset($object->fk_user_creat);
263 unset($object->user_creation_id);
264 unset($object->import_key);
265
266 // Clear fields
267 if (property_exists($object, 'ref')) {
268 $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
269 }
270 if (property_exists($object, 'status')) {
271 $object->status = self::STATUS_DRAFT;
272 }
273 if (property_exists($object, 'date_creation')) {
274 $object->date_creation = dol_now();
275 }
276 if (property_exists($object, 'date_modification')) {
277 $object->date_modification = null;
278 }
279 // ...
280 // Clear extrafields that are unique
281 if (is_array($object->array_options) && count($object->array_options) > 0) {
282 $extrafields->fetch_name_optionals_label($this->table_element);
283 foreach ($object->array_options as $key => $option) {
284 $shortkey = preg_replace('/options_/', '', $key);
285 if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
286 //var_dump($key); var_dump($clonedObj->array_options[$key]); exit;
287 unset($object->array_options[$key]);
288 }
289 }
290 }
291
292 // Create clone
293 $object->context['createfromclone'] = 'createfromclone';
294 $result = $object->createCommon($user);
295 if ($result < 0) {
296 $error++;
298 }
299
300 if (!$error) {
301 // copy internal contacts
302 if ($this->copy_linked_contact($object, 'internal') < 0) {
303 $error++;
304 }
305 }
306
307 if (!$error) {
308 // copy external contacts if same company
309 if (property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
310 if ($this->copy_linked_contact($object, 'external') < 0) {
311 $error++;
312 }
313 }
314 }
315
316 unset($object->context['createfromclone']);
317
318 // End
319 if (!$error) {
320 $this->db->commit();
321 return $object;
322 } else {
323 $this->db->rollback();
324 return -1;
325 }
326 }
327
335 public function fetch($id, $ref = null)
336 {
337 $result = $this->fetchCommon($id, $ref);
338 if ($result > 0 && !empty($this->table_element_line)) {
339 $this->fetchLines();
340 }
341 return $result;
342 }
343
349 public function fetchLines()
350 {
351 $this->lines = array();
352
353 $result = $this->fetchLinesCommon();
354 return $result;
355 }
356
357
370 public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, $filter = '', $filtermode = 'AND')
371 {
372 dol_syslog(__METHOD__, LOG_DEBUG);
373
374 $records = array();
375
376 $sql = 'SELECT ';
377 $sql .= $this->getFieldList('t');
378 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
379 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
380 $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')';
381 } else {
382 $sql .= ' WHERE 1 = 1';
383 }
384
385 // Manage filter
386 $errormessage = '';
387 $sql .= forgeSQLFromUniversalSearchCriteria($filter, $errormessage);
388 if ($errormessage) {
389 $this->errors[] = $errormessage;
390 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
391 return -1;
392 }
393
394 if (!empty($sortfield)) {
395 $sql .= $this->db->order($sortfield, $sortorder);
396 }
397 if (!empty($limit)) {
398 $sql .= " ".$this->db->plimit($limit, $offset);
399 }
400
401 $resql = $this->db->query($sql);
402 if ($resql) {
403 $num = $this->db->num_rows($resql);
404 $i = 0;
405 while ($i < ($limit ? min($limit, $num) : $num)) {
406 $obj = $this->db->fetch_object($resql);
407
408 $record = new self($this->db);
409 $record->setVarsFromFetchObj($obj);
410
411 $records[$record->id] = $record;
412
413 $i++;
414 }
415 $this->db->free($resql);
416
417 return $records;
418 } else {
419 $this->errors[] = 'Error '.$this->db->lasterror();
420 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
421
422 return -1;
423 }
424 }
425
433 public function update(User $user, $notrigger = 0)
434 {
435 return $this->updateCommon($user, $notrigger);
436 }
437
445 public function delete(User $user, $notrigger = 0)
446 {
447 return $this->deleteCommon($user, $notrigger);
448 //return $this->deleteCommon($user, $notrigger, 1);
449 }
450
459 public function deleteLine(User $user, $idline, $notrigger = 0)
460 {
461 if ($this->status < 0) {
462 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
463 return -2;
464 }
465
466 return $this->deleteLineCommon($user, $idline, $notrigger);
467 }
468
469
477 public function validate($user, $notrigger = 0)
478 {
479 global $conf;
480
481 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
482
483 $error = 0;
484
485 // Protection
486 if ($this->status == self::STATUS_VALIDATED) {
487 dol_syslog(get_class($this)."::validate action abandoned: already validated", LOG_WARNING);
488 return 0;
489 }
490
491 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->skilldet->write))
492 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->skilldet->skilldet_advance->validate))))
493 {
494 $this->error='NotEnoughPermissions';
495 dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
496 return -1;
497 }*/
498
499 $now = dol_now();
500
501 $this->db->begin();
502
503 // Define new ref
504 if (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref)) { // empty should not happened, but when it occurs, the test save life
505 $num = $this->getNextNumRef();
506 } else {
507 $num = (string) $this->ref;
508 }
509 $this->newref = $num;
510
511 if (!empty($num)) {
512 // Validate
513 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
514 $sql .= " SET ref = '".$this->db->escape($num)."',";
515 $sql .= " status = ".self::STATUS_VALIDATED;
516 if (!empty($this->fields['date_validation'])) {
517 $sql .= ", date_validation = '".$this->db->idate($now)."'";
518 }
519 if (!empty($this->fields['fk_user_valid'])) { // @phan-suppress-current-line PhanTypeMismatchProperty
520 $sql .= ", fk_user_valid = ".((int) $user->id);
521 }
522 $sql .= " WHERE rowid = ".((int) $this->id);
523
524 dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
525 $resql = $this->db->query($sql);
526 if (!$resql) {
527 dol_print_error($this->db);
528 $this->error = $this->db->lasterror();
529 $error++;
530 }
531
532 if (!$error && !$notrigger) {
533 // Call trigger
534 $result = $this->call_trigger('HRM_SKILLDET_VALIDATE', $user);
535 if ($result < 0) {
536 $error++;
537 }
538 // End call triggers
539 }
540 }
541
542 if (!$error) {
543 $this->oldref = $this->ref;
544
545 // Rename directory if dir was a temporary ref
546 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
547 // Now we rename also files into index
548 $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)."'";
549 $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'skilldet/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
550 $resql = $this->db->query($sql);
551 if (!$resql) {
552 $error++;
553 $this->error = $this->db->lasterror();
554 }
555 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'skilldet/".$this->db->escape($this->newref)."'";
556 $sql .= " WHERE 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
563 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
564 $oldref = dol_sanitizeFileName($this->ref);
565 $newref = dol_sanitizeFileName($num);
566 $dirsource = $conf->hrm->dir_output.'/skilldet/'.$oldref;
567 $dirdest = $conf->hrm->dir_output.'/skilldet/'.$newref;
568 if (!$error && file_exists($dirsource)) {
569 dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
570
571 if (@rename($dirsource, $dirdest)) {
572 dol_syslog("Rename ok");
573 // Rename docs starting with $oldref with $newref
574 $listoffiles = dol_dir_list($conf->hrm->dir_output.'/skilldet/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
575 foreach ($listoffiles as $fileentry) {
576 $dirsource = $fileentry['name'];
577 $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
578 $dirsource = $fileentry['path'].'/'.$dirsource;
579 $dirdest = $fileentry['path'].'/'.$dirdest;
580 @rename($dirsource, $dirdest);
581 }
582 }
583 }
584 }
585 }
586
587 // Set new ref and current status
588 if (!$error) {
589 $this->ref = $num;
590 $this->status = self::STATUS_VALIDATED;
591 }
592
593 if (!$error) {
594 $this->db->commit();
595 return 1;
596 } else {
597 $this->db->rollback();
598 return -1;
599 }
600 }
601
602
610 public function setDraft($user, $notrigger = 0)
611 {
612 // Protection
613 if ($this->status <= self::STATUS_DRAFT) {
614 return 0;
615 }
616
617 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
618 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
619 {
620 $this->error='Permission denied';
621 return -1;
622 }*/
623
624 return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'SKILLDET_UNVALIDATE');
625 }
626
634 public function cancel($user, $notrigger = 0)
635 {
636 // Protection
637 if ($this->status != self::STATUS_VALIDATED) {
638 return 0;
639 }
640
641 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
642 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
643 {
644 $this->error='Permission denied';
645 return -1;
646 }*/
647
648 return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'SKILLDET_CANCEL');
649 }
650
658 public function reopen($user, $notrigger = 0)
659 {
660 // Protection
661 if ($this->status != self::STATUS_CANCELED) {
662 return 0;
663 }
664
665 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
666 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
667 {
668 $this->error='Permission denied';
669 return -1;
670 }*/
671
672 return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'SKILLDET_REOPEN');
673 }
674
685 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
686 {
687 global $conf, $langs, $hookmanager;
688
689 if (!empty($conf->dol_no_mouse_hover)) {
690 $notooltip = 1; // Force disable tooltips
691 }
692
693 $result = '';
694
695 $label = img_picto('', $this->picto).' <u>'.$langs->trans("Skilldet").'</u>';
696 if (isset($this->status)) {
697 $label .= ' '.$this->getLibStatut(5);
698 }
699 $label .= '<br>';
700 $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
701
702 $url = dol_buildpath('/hrm/skilldet_card.php', 1).'?id='.$this->id;
703
704 if ($option != 'nolink') {
705 // Add param to save lastsearch_values or not
706 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
707 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
708 $add_save_lastsearch_values = 1;
709 }
710 if ($add_save_lastsearch_values) {
711 $url .= '&save_lastsearch_values=1';
712 }
713 }
714
715 $linkclose = '';
716 if (empty($notooltip)) {
717 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
718 $label = $langs->trans("ShowSkilldet");
719 $linkclose .= ' alt="'.dolPrintHTMLForAttribute($label).'"';
720 }
721 $linkclose .= ' title="'.dolPrintHTMLForAttribute($label).'"';
722 $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
723 } else {
724 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
725 }
726
727 if ($option == 'nolink') {
728 $linkstart = '<span';
729 } else {
730 $linkstart = '<a href="'.$url.'"';
731 }
732 $linkstart .= $linkclose.'>';
733 if ($option == 'nolink') {
734 $linkend = '</span>';
735 } else {
736 $linkend = '</a>';
737 }
738
739 $result .= $linkstart;
740
741 if (empty($this->showphoto_on_popup)) {
742 if ($withpicto) {
743 $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);
744 }
745 } else {
746 if ($withpicto) {
747 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
748
749 list($class, $module) = explode('@', $this->picto);
750 $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
751 $filearray = dol_dir_list($upload_dir, "files");
752 $filename = $filearray[0]['name'];
753 if (!empty($filename)) {
754 $pospoint = strpos($filearray[0]['name'], '.');
755
756 $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
757 if (!getDolGlobalString(strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS')) {
758 $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>';
759 } else {
760 $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>';
761 }
762
763 $result .= '</div>';
764 } else {
765 $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);
766 }
767 }
768 }
769
770 if ($withpicto != 2) {
771 $result .= $this->ref;
772 }
773
774 $result .= $linkend;
775 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
776
777 global $action, $hookmanager;
778 $hookmanager->initHooks(array('skilldetdao'));
779 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
780 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
781 if ($reshook > 0) {
782 $result = $hookmanager->resPrint;
783 } else {
784 $result .= $hookmanager->resPrint;
785 }
786
787 return $result;
788 }
789
796 public function getLibStatut($mode = 0)
797 {
798 return $this->LibStatut($this->status, $mode);
799 }
800
801 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
809 public function LibStatut($status, $mode = 0)
810 {
811 // phpcs:enable
812 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
813 global $langs;
814 //$langs->load("hrm");
815 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
816 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
817 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
818 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
819 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
820 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
821 }
822
823 $statusType = 'status'.$status;
824 //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
825 if ($status == self::STATUS_CANCELED) {
826 $statusType = 'status6';
827 }
828
829 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
830 }
831
838 public function info($id)
839 {
840 $sql = 'SELECT rowid, date_creation as datec, tms as datem,';
841 $sql .= ' fk_user_creat, fk_user_modif';
842 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
843 $sql .= ' WHERE t.rowid = '.((int) $id);
844 $result = $this->db->query($sql);
845 if ($result) {
846 if ($this->db->num_rows($result)) {
847 $obj = $this->db->fetch_object($result);
848
849 $this->id = $obj->rowid;
850
851 $this->user_creation_id = $obj->fk_user_creat;
852 $this->user_modification_id = $obj->fk_user_modif;
853 $this->date_creation = $this->db->jdate($obj->datec);
854 $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
855 }
856
857 $this->db->free($result);
858 } else {
859 dol_print_error($this->db);
860 }
861 }
862
869 public function initAsSpecimen()
870 {
871 // Set here init that are not commonf fields
872 // $this->property1 = ...
873 // $this->property2 = ...
874
875 return $this->initAsSpecimenCommon();
876 }
877
878
884 public function getNextNumRef()
885 {
886 global $langs, $conf;
887 $langs->load("hrm");
888
889 if (!getDolGlobalString('hrm_SKILLDET_ADDON')) {
890 $conf->global->hrm_SKILLDET_ADDON = 'mod_skilldet_standard';
891 }
892
893 if (getDolGlobalString('hrm_SKILLDET_ADDON')) {
894 $mybool = false;
895
896 $file = getDolGlobalString('hrm_SKILLDET_ADDON') . ".php";
897 $classname = getDolGlobalString('hrm_SKILLDET_ADDON');
898
899 // Include file with class
900 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
901 foreach ($dirmodels as $reldir) {
902 $dir = dol_buildpath($reldir."core/modules/hrm/");
903
904 // Load file with numbering class (if found)
905 $mybool = ((bool) @include_once $dir.$file) || $mybool;
906 }
907
908 if (!$mybool) {
909 dol_print_error(null, "Failed to include file ".$file);
910 return '';
911 }
912
913 if (class_exists($classname)) {
914 $obj = new $classname();
915 '@phan-var-force ModeleNumRefEvaluation $obj';
916 $numref = $obj->getNextValue($this);
917
918 if ($numref != '' && $numref != '-1') {
919 return $numref;
920 } else {
921 $this->error = $obj->error;
922 //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
923 return "";
924 }
925 } else {
926 print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
927 return "";
928 }
929 } else {
930 print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
931 return "";
932 }
933 }
934
946 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
947 {
948 global $langs;
949
950 $result = 0;
951 $includedocgeneration = 0;
952
953 $langs->load("hrm");
954
955 if (!dol_strlen($modele)) {
956 $modele = 'standard_skilldet';
957
958 if (!empty($this->model_pdf)) {
959 $modele = $this->model_pdf;
960 } elseif (getDolGlobalString('SKILLDET_ADDON_PDF')) {
961 $modele = getDolGlobalString('SKILLDET_ADDON_PDF');
962 }
963 }
964
965 $modelpath = "core/modules/hrm/doc/";
966
967 if ($includedocgeneration && !empty($modele)) {
968 $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
969 }
970
971 return $result;
972 }
973}
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$object ref
Definition info.php:90
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.
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:168
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
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:64
dol_now($mode='gmt')
Return date for now.
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_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
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...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php