dolibarr  17.0.4
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  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
28 // Put here all includes required by your class file
29 require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
30 //require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
31 //require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
32 
36 class Skilldet extends CommonObject
37 {
41  public $module = 'hrm';
42 
46  public $element = 'skilldet';
47 
51  public $table_element = 'hrm_skilldet';
52 
57  public $ismultientitymanaged = 0;
58 
62  public $isextrafieldmanaged = 1;
63 
67  public $picto = 'skilldet@hrm';
68 
69 
70  const STATUS_DRAFT = 0;
71  const STATUS_VALIDATED = 1;
72  const STATUS_CANCELED = 9;
73 
74 
101  // BEGIN MODULEBUILDER PROPERTIES
105  public $fields=array(
106  'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"),
107  'fk_skill' => array('type'=>'integer:Skill:/hrm/class/skill.class.php', 'label'=>'fk_skill', 'enabled'=>'1', 'position'=>5, 'notnull'=>1, 'visible'=>0,),
108  'rankorder' => array('type'=>'integer', 'label'=>'rank', 'enabled'=>'1', 'position'=>10, 'notnull'=>0, 'visible'=>2,),
109  'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>1,),
110  'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>'1', 'position'=>510, 'notnull'=>1, 'visible'=>-2, 'foreignkey'=>'user.rowid',),
111  'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>0,),
112  );
113  public $rowid;
114  public $fk_skill;
115  public $rankorder;
116  public $description;
117  public $fk_user_creat;
118  public $fk_user_modif;
119  // END MODULEBUILDER PROPERTIES
120 
121 
122  // If this object has a subtable with lines
123 
124  // /**
125  // * @var string Name of subtable line
126  // */
127  // public $table_element_line = 'hrm_skilldetline';
128 
129  // /**
130  // * @var string Field with ID of parent key if this object has a parent
131  // */
132  // public $fk_element = 'fk_skilldet';
133 
134  // /**
135  // * @var string Name of subtable class that manage subtable lines
136  // */
137  // public $class_element_line = 'Skilldetline';
138 
139  // /**
140  // * @var array List of child tables. To test if we can delete object.
141  // */
142  // protected $childtables = array();
143 
144  // /**
145  // * @var array List of child tables. To know object to delete on cascade.
146  // * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will
147  // * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object
148  // */
149  // protected $childtablesoncascade = array('hrm_skilldetdet');
150 
151  // /**
152  // * @var SkilldetLine[] Array of subtable lines
153  // */
154  // public $lines = array();
155 
156 
157 
163  public function __construct(DoliDB $db)
164  {
165  global $conf, $langs;
166 
167  $this->db = $db;
168 
169  if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields['rowid'])) {
170  $this->fields['rowid']['visible'] = 0;
171  }
172  if (!isModEnabled('multicompany') && isset($this->fields['entity'])) {
173  $this->fields['entity']['enabled'] = 0;
174  }
175 
176  // Example to show how to set values of fields definition dynamically
177  /*if ($user->rights->hrm->skilldet->read) {
178  $this->fields['myfield']['visible'] = 1;
179  $this->fields['myfield']['noteditable'] = 0;
180  }*/
181 
182  // Unset fields that are disabled
183  foreach ($this->fields as $key => $val) {
184  if (isset($val['enabled']) && empty($val['enabled'])) {
185  unset($this->fields[$key]);
186  }
187  }
188 
189  // Translate some data of arrayofkeyval
190  if (is_object($langs)) {
191  foreach ($this->fields as $key => $val) {
192  if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
193  foreach ($val['arrayofkeyval'] as $key2 => $val2) {
194  $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
195  }
196  }
197  }
198  }
199  }
200 
208  public function create(User $user, $notrigger = false)
209  {
210  $resultcreate = $this->createCommon($user, $notrigger);
211 
212  //$resultvalidate = $this->validate($user, $notrigger);
213 
214  return $resultcreate;
215  }
216 
224  public function createFromClone(User $user, $fromid)
225  {
226  global $langs, $extrafields;
227  $error = 0;
228 
229  dol_syslog(__METHOD__, LOG_DEBUG);
230 
231  $object = new self($this->db);
232 
233  $this->db->begin();
234 
235  // Load source object
236  $result = $object->fetchCommon($fromid);
237  if ($result > 0 && !empty($object->table_element_line)) {
238  $object->fetchLines();
239  }
240 
241  // get lines so they will be clone
242  //foreach($this->lines as $line)
243  // $line->fetch_optionals();
244 
245  // Reset some properties
246  unset($object->id);
247  unset($object->fk_user_creat);
248  unset($object->import_key);
249 
250  // Clear fields
251  if (property_exists($object, 'ref')) {
252  $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
253  }
254  if (property_exists($object, 'label')) {
255  $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
256  }
257  if (property_exists($object, 'status')) {
258  $object->status = self::STATUS_DRAFT;
259  }
260  if (property_exists($object, 'date_creation')) {
261  $object->date_creation = dol_now();
262  }
263  if (property_exists($object, 'date_modification')) {
264  $object->date_modification = null;
265  }
266  // ...
267  // Clear extrafields that are unique
268  if (is_array($object->array_options) && count($object->array_options) > 0) {
269  $extrafields->fetch_name_optionals_label($this->table_element);
270  foreach ($object->array_options as $key => $option) {
271  $shortkey = preg_replace('/options_/', '', $key);
272  if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
273  //var_dump($key); var_dump($clonedObj->array_options[$key]); exit;
274  unset($object->array_options[$key]);
275  }
276  }
277  }
278 
279  // Create clone
280  $object->context['createfromclone'] = 'createfromclone';
281  $result = $object->createCommon($user);
282  if ($result < 0) {
283  $error++;
284  $this->error = $object->error;
285  $this->errors = $object->errors;
286  }
287 
288  if (!$error) {
289  // copy internal contacts
290  if ($this->copy_linked_contact($object, 'internal') < 0) {
291  $error++;
292  }
293  }
294 
295  if (!$error) {
296  // copy external contacts if same company
297  if (property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
298  if ($this->copy_linked_contact($object, 'external') < 0) {
299  $error++;
300  }
301  }
302  }
303 
304  unset($object->context['createfromclone']);
305 
306  // End
307  if (!$error) {
308  $this->db->commit();
309  return $object;
310  } else {
311  $this->db->rollback();
312  return -1;
313  }
314  }
315 
323  public function fetch($id, $ref = null)
324  {
325  $result = $this->fetchCommon($id, $ref);
326  if ($result > 0 && !empty($this->table_element_line)) {
327  $this->fetchLines();
328  }
329  return $result;
330  }
331 
337  public function fetchLines()
338  {
339  $this->lines = array();
340 
341  $result = $this->fetchLinesCommon();
342  return $result;
343  }
344 
345 
357  public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND')
358  {
359  global $conf;
360 
361  dol_syslog(__METHOD__, LOG_DEBUG);
362 
363  $records = array();
364 
365  $sql = 'SELECT ';
366  $sql .= $this->getFieldList('t');
367  $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
368  if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
369  $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')';
370  } else {
371  $sql .= ' WHERE 1 = 1';
372  }
373  // Manage filter
374  $sqlwhere = array();
375  if (count($filter) > 0) {
376  foreach ($filter as $key => $value) {
377  if ($key == 't.rowid') {
378  $sqlwhere[] = $key.'='.$value;
379  } elseif ($key == 'customsql') {
380  $sqlwhere[] = $value;
381  } elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) {
382  $sqlwhere[] = $key." = '".$this->db->idate($value)."'";
383  } elseif (strpos($value, '%') === false) {
384  $sqlwhere[] = $key." IN (".$this->db->sanitize($this->db->escape($value)).")";
385  } else {
386  $sqlwhere[] = $key." LIKE '%".$this->db->escape($value)."%'";
387  }
388  }
389  }
390  if (count($sqlwhere) > 0) {
391  $sql .= " AND (".implode(" ".$filtermode." ", $sqlwhere).")";
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__.' '.join(',', $this->errors), LOG_ERR);
421 
422  return -1;
423  }
424  }
425 
433  public function update(User $user, $notrigger = false)
434  {
435  return $this->updateCommon($user, $notrigger);
436  }
437 
445  public function delete(User $user, $notrigger = false)
446  {
447  return $this->deleteCommon($user, $notrigger);
448  //return $this->deleteCommon($user, $notrigger, 1);
449  }
450 
459  public function deleteLine(User $user, $idline, $notrigger = false)
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, $langs;
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 abandonned: 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 (!$error && (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 = $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'])) {
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('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++; $this->error = $this->db->lasterror();
553  }
554 
555  // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
556  $oldref = dol_sanitizeFileName($this->ref);
557  $newref = dol_sanitizeFileName($num);
558  $dirsource = $conf->hrm->dir_output.'/skilldet/'.$oldref;
559  $dirdest = $conf->hrm->dir_output.'/skilldet/'.$newref;
560  if (!$error && file_exists($dirsource)) {
561  dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
562 
563  if (@rename($dirsource, $dirdest)) {
564  dol_syslog("Rename ok");
565  // Rename docs starting with $oldref with $newref
566  $listoffiles = dol_dir_list($conf->hrm->dir_output.'/skilldet/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
567  foreach ($listoffiles as $fileentry) {
568  $dirsource = $fileentry['name'];
569  $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
570  $dirsource = $fileentry['path'].'/'.$dirsource;
571  $dirdest = $fileentry['path'].'/'.$dirdest;
572  @rename($dirsource, $dirdest);
573  }
574  }
575  }
576  }
577  }
578 
579  // Set new ref and current status
580  if (!$error) {
581  $this->ref = $num;
582  $this->status = self::STATUS_VALIDATED;
583  }
584 
585  if (!$error) {
586  $this->db->commit();
587  return 1;
588  } else {
589  $this->db->rollback();
590  return -1;
591  }
592  }
593 
594 
602  public function setDraft($user, $notrigger = 0)
603  {
604  // Protection
605  if ($this->status <= self::STATUS_DRAFT) {
606  return 0;
607  }
608 
609  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
610  || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
611  {
612  $this->error='Permission denied';
613  return -1;
614  }*/
615 
616  return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'SKILLDET_UNVALIDATE');
617  }
618 
626  public function cancel($user, $notrigger = 0)
627  {
628  // Protection
629  if ($this->status != self::STATUS_VALIDATED) {
630  return 0;
631  }
632 
633  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
634  || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
635  {
636  $this->error='Permission denied';
637  return -1;
638  }*/
639 
640  return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'SKILLDET_CANCEL');
641  }
642 
650  public function reopen($user, $notrigger = 0)
651  {
652  // Protection
653  if ($this->status != self::STATUS_CANCELED) {
654  return 0;
655  }
656 
657  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
658  || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
659  {
660  $this->error='Permission denied';
661  return -1;
662  }*/
663 
664  return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'SKILLDET_REOPEN');
665  }
666 
677  public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
678  {
679  global $conf, $langs, $hookmanager;
680 
681  if (!empty($conf->dol_no_mouse_hover)) {
682  $notooltip = 1; // Force disable tooltips
683  }
684 
685  $result = '';
686 
687  $label = img_picto('', $this->picto).' <u>'.$langs->trans("Skilldet").'</u>';
688  if (isset($this->status)) {
689  $label .= ' '.$this->getLibStatut(5);
690  }
691  $label .= '<br>';
692  $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
693 
694  $url = dol_buildpath('/hrm/skilldet_card.php', 1).'?id='.$this->id;
695 
696  if ($option != 'nolink') {
697  // Add param to save lastsearch_values or not
698  $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
699  if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
700  $add_save_lastsearch_values = 1;
701  }
702  if ($add_save_lastsearch_values) {
703  $url .= '&save_lastsearch_values=1';
704  }
705  }
706 
707  $linkclose = '';
708  if (empty($notooltip)) {
709  if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
710  $label = $langs->trans("ShowSkilldet");
711  $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
712  }
713  $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
714  $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
715  } else {
716  $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
717  }
718 
719  if ($option == 'nolink') {
720  $linkstart = '<span';
721  } else {
722  $linkstart = '<a href="'.$url.'"';
723  }
724  $linkstart .= $linkclose.'>';
725  if ($option == 'nolink') {
726  $linkend = '</span>';
727  } else {
728  $linkend = '</a>';
729  }
730 
731  $result .= $linkstart;
732 
733  if (empty($this->showphoto_on_popup)) {
734  if ($withpicto) {
735  $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);
736  }
737  } else {
738  if ($withpicto) {
739  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
740 
741  list($class, $module) = explode('@', $this->picto);
742  $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
743  $filearray = dol_dir_list($upload_dir, "files");
744  $filename = $filearray[0]['name'];
745  if (!empty($filename)) {
746  $pospoint = strpos($filearray[0]['name'], '.');
747 
748  $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
749  if (empty($conf->global->{strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS'})) {
750  $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>';
751  } else {
752  $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>';
753  }
754 
755  $result .= '</div>';
756  } else {
757  $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);
758  }
759  }
760  }
761 
762  if ($withpicto != 2) {
763  $result .= $this->ref;
764  }
765 
766  $result .= $linkend;
767  //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
768 
769  global $action, $hookmanager;
770  $hookmanager->initHooks(array('skilldetdao'));
771  $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
772  $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
773  if ($reshook > 0) {
774  $result = $hookmanager->resPrint;
775  } else {
776  $result .= $hookmanager->resPrint;
777  }
778 
779  return $result;
780  }
781 
788  public function getLibStatut($mode = 0)
789  {
790  return $this->LibStatut($this->status, $mode);
791  }
792 
793  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
801  public function LibStatut($status, $mode = 0)
802  {
803  // phpcs:enable
804  if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
805  global $langs;
806  //$langs->load("hrm");
807  $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
808  $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
809  $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
810  $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
811  $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
812  $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
813  }
814 
815  $statusType = 'status'.$status;
816  //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
817  if ($status == self::STATUS_CANCELED) {
818  $statusType = 'status6';
819  }
820 
821  return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
822  }
823 
830  public function info($id)
831  {
832  $sql = 'SELECT rowid, date_creation as datec, tms as datem,';
833  $sql .= ' fk_user_creat, fk_user_modif';
834  $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
835  $sql .= ' WHERE t.rowid = '.((int) $id);
836  $result = $this->db->query($sql);
837  if ($result) {
838  if ($this->db->num_rows($result)) {
839  $obj = $this->db->fetch_object($result);
840  $this->id = $obj->rowid;
841 
842  $this->user_creation_id = $obj->fk_user_creat;
843  $this->user_modification_id = $obj->fk_user_modif;
844  $this->date_creation = $this->db->jdate($obj->datec);
845  $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
846  }
847 
848  $this->db->free($result);
849  } else {
850  dol_print_error($this->db);
851  }
852  }
853 
860  public function initAsSpecimen()
861  {
862  // Set here init that are not commonf fields
863  // $this->property1 = ...
864  // $this->property2 = ...
865 
866  $this->initAsSpecimenCommon();
867  }
868 
869 
875  public function getNextNumRef()
876  {
877  global $langs, $conf;
878  $langs->load("hrm");
879 
880  if (empty($conf->global->hrm_SKILLDET_ADDON)) {
881  $conf->global->hrm_SKILLDET_ADDON = 'mod_skilldet_standard';
882  }
883 
884  if (!empty($conf->global->hrm_SKILLDET_ADDON)) {
885  $mybool = false;
886 
887  $file = $conf->global->hrm_SKILLDET_ADDON.".php";
888  $classname = $conf->global->hrm_SKILLDET_ADDON;
889 
890  // Include file with class
891  $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
892  foreach ($dirmodels as $reldir) {
893  $dir = dol_buildpath($reldir."core/modules/hrm/");
894 
895  // Load file with numbering class (if found)
896  $mybool |= @include_once $dir.$file;
897  }
898 
899  if ($mybool === false) {
900  dol_print_error('', "Failed to include file ".$file);
901  return '';
902  }
903 
904  if (class_exists($classname)) {
905  $obj = new $classname();
906  $numref = $obj->getNextValue($this);
907 
908  if ($numref != '' && $numref != '-1') {
909  return $numref;
910  } else {
911  $this->error = $obj->error;
912  //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
913  return "";
914  }
915  } else {
916  print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
917  return "";
918  }
919  } else {
920  print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
921  return "";
922  }
923  }
924 
936  public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
937  {
938  global $conf, $langs;
939 
940  $result = 0;
941  $includedocgeneration = 0;
942 
943  $langs->load("hrm");
944 
945  if (!dol_strlen($modele)) {
946  $modele = 'standard_skilldet';
947 
948  if (!empty($this->model_pdf)) {
949  $modele = $this->model_pdf;
950  } elseif (!empty($conf->global->SKILLDET_ADDON_PDF)) {
951  $modele = $conf->global->SKILLDET_ADDON_PDF;
952  }
953  }
954 
955  $modelpath = "core/modules/hrm/doc/";
956 
957  if ($includedocgeneration && !empty($modele)) {
958  $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
959  }
960 
961  return $result;
962  }
963 
971  public function doScheduledJob()
972  {
973  global $conf, $langs;
974 
975  //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
976 
977  $error = 0;
978  $this->output = '';
979  $this->error = '';
980 
981  dol_syslog(__METHOD__, LOG_DEBUG);
982 
983  $now = dol_now();
984 
985  $this->db->begin();
986 
987  // ...
988 
989  $this->db->commit();
990 
991  return $error;
992  }
993 }
$object ref
Definition: info.php:78
Parent class of all other business classes (invoices, contracts, proposals, orders,...
deleteLineCommon(User $user, $idline, $notrigger=false)
Delete a line of object in database.
getFieldList($alias='')
Function to concat keys of fields.
fetchCommon($id, $ref=null, $morewhere='')
Load object in memory from the database.
createCommon(User $user, $notrigger=false)
Create object into database.
deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
Delete object in database.
setStatusCommon($user, $status, $notrigger=0, $triggercode='')
Set to a status.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
updateCommon(User $user, $notrigger=false)
Update object into database.
fetchLinesCommon($morewhere='')
Load object in memory from the database.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage Dolibarr database access.
Class for Skilldet.
update(User $user, $notrigger=false)
Update object into database.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
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 optionaly the picto)
LibStatut($status, $mode=0)
Return the status.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter=array(), $filtermode='AND')
Load list of objects in memory from the database.
fetchLines()
Load object lines in memory from the database.
create(User $user, $notrigger=false)
Create object into database.
deleteLine(User $user, $idline, $notrigger=false)
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.
doScheduledJob()
Action executed by scheduler CAN BE A CRON TASK.
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.
Definition: user.class.php:47
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition: files.lib.php:61
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dol_now($mode='auto')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
$conf db
API class for accounts.
Definition: inc.php:41