dolibarr  19.0.0-dev
job.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 Job extends CommonObject
37 {
41  public $module = 'hrm';
42 
46  public $element = 'job';
47 
51  public $table_element = 'hrm_job';
52 
57  public $ismultientitymanaged = 0;
58 
62  public $isextrafieldmanaged = 1;
63 
67  public $picto = 'technic';
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  'label' => array('type'=>'varchar(128)', 'label'=>'Label', 'enabled'=>'1', 'position'=>20, 'notnull'=>1, 'visible'=>1, 'index'=>1, 'searchall'=>1, 'showoncombobox'=>'1', 'comment'=>"Label of object"),
108  'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>21, 'notnull'=>0, 'visible'=>1,),
109  'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>2,),
110  'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>2,),
111  'deplacement' => array('type'=>'select', 'required'=> 1,'label'=> 'NeedBusinessTravels', 'enabled'=> 1, 'position'=> 90, 'notnull'=> 1, 'visible'=> 1, 'arrayofkeyval'=> array(0 =>"No", 1=>"Yes"), 'default'=>0),
112  'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>'1', 'position'=>70, 'notnull'=>0, 'visible'=>0,),
113  'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>'1', 'position'=>71, 'notnull'=>0, 'visible'=>0,),
114  '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',),
115  'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>-2,),
116  );
117  public $rowid;
118  public $ref;
119  public $label;
120  public $description;
121  public $date_creation;
122  public $tms;
123  public $deplacement;
124  public $note_public;
125  public $note_private;
126  public $fk_user_creat;
127  public $fk_user_modif;
128  // END MODULEBUILDER PROPERTIES
129 
130 
131  // If this object has a subtable with lines
132 
133  // /**
134  // * @var string Name of subtable line
135  // */
136  // public $table_element_line = 'hrm_jobline';
137 
138  // /**
139  // * @var string Field with ID of parent key if this object has a parent
140  // */
141  public $fk_element = 'fk_job';
142 
143  // /**
144  // * @var string Name of subtable class that manage subtable lines
145  // */
146  // public $class_element_line = 'Jobline';
147 
148  // /**
149  // * @var array List of child tables. To test if we can delete object.
150  // */
151  protected $childtables = array('hrm_evaluation', 'hrm_job_user');
152 
153  // /**
154  // * @var array List of child tables. To know object to delete on cascade.
155  // * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will
156  // * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object
157  // */
158  protected $childtablesoncascade = array("@SkillRank:hrm/class/skillrank.class.php:fk_object:objecttype='job'");
159 
160  // /**
161  // * @var JobLine[] Array of subtable lines
162  // */
163  // public $lines = array();
164 
165 
166 
172  public function __construct(DoliDB $db)
173  {
174  global $conf, $langs;
175 
176  $this->db = $db;
177 
178  if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields['rowid'])) {
179  $this->fields['rowid']['visible'] = 0;
180  }
181  if (!isModEnabled('multicompany') && isset($this->fields['entity'])) {
182  $this->fields['entity']['enabled'] = 0;
183  }
184 
185  // Example to show how to set values of fields definition dynamically
186  /*if ($user->rights->hrm->job->read) {
187  $this->fields['myfield']['visible'] = 1;
188  $this->fields['myfield']['noteditable'] = 0;
189  }*/
190 
191  // Unset fields that are disabled
192  foreach ($this->fields as $key => $val) {
193  if (isset($val['enabled']) && empty($val['enabled'])) {
194  unset($this->fields[$key]);
195  }
196  }
197 
198  // Translate some data of arrayofkeyval
199  if (is_object($langs)) {
200  foreach ($this->fields as $key => $val) {
201  if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
202  foreach ($val['arrayofkeyval'] as $key2 => $val2) {
203  $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
204  }
205  }
206  }
207  }
208  }
209 
217  public function create(User $user, $notrigger = false)
218  {
219  $resultcreate = $this->createCommon($user, $notrigger);
220 
221  //$resultvalidate = $this->validate($user, $notrigger);
222 
223  return $resultcreate;
224  }
225 
233  public function createFromClone(User $user, $fromid)
234  {
235  global $langs, $extrafields;
236  $error = 0;
237 
238  dol_syslog(__METHOD__, LOG_DEBUG);
239 
240  $object = new self($this->db);
241 
242  $this->db->begin();
243 
244  // Load source object
245  $result = $object->fetchCommon($fromid);
246  if ($result > 0 && !empty($object->table_element_line)) {
247  $object->fetchLines();
248  }
249 
250  // get lines so they will be clone
251  //foreach($this->lines as $line)
252  // $line->fetch_optionals();
253 
254  // Reset some properties
255  unset($object->id);
256  unset($object->fk_user_creat);
257  unset($object->import_key);
258 
259  // Clear fields
260  if (property_exists($object, 'ref')) {
261  $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
262  }
263  if (property_exists($object, 'label')) {
264  $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
265  }
266  if (property_exists($object, 'status')) {
267  $object->status = self::STATUS_DRAFT;
268  }
269  if (property_exists($object, 'date_creation')) {
270  $object->date_creation = dol_now();
271  }
272  if (property_exists($object, 'date_modification')) {
273  $object->date_modification = null;
274  }
275  // ...
276  // Clear extrafields that are unique
277  if (is_array($object->array_options) && count($object->array_options) > 0) {
278  $extrafields->fetch_name_optionals_label($this->table_element);
279  foreach ($object->array_options as $key => $option) {
280  $shortkey = preg_replace('/options_/', '', $key);
281  if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
282  //var_dump($key); var_dump($clonedObj->array_options[$key]); exit;
283  unset($object->array_options[$key]);
284  }
285  }
286  }
287 
288  // Create clone
289  $object->context['createfromclone'] = 'createfromclone';
290  $result = $object->createCommon($user);
291  if ($result < 0) {
292  $error++;
293  $this->error = $object->error;
294  $this->errors = $object->errors;
295  }
296 
297  if (!$error) {
298  // copy internal contacts
299  if ($this->copy_linked_contact($object, 'internal') < 0) {
300  $error++;
301  }
302  }
303 
304  if (!$error) {
305  // copy external contacts if same company
306  if (property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
307  if ($this->copy_linked_contact($object, 'external') < 0) {
308  $error++;
309  }
310  }
311  }
312 
313  unset($object->context['createfromclone']);
314 
315  // End
316  if (!$error) {
317  $this->db->commit();
318  return $object;
319  } else {
320  $this->db->rollback();
321  return -1;
322  }
323  }
324 
332  public function fetch($id, $ref = null)
333  {
334  $result = $this->fetchCommon($id, $ref);
335  if ($result > 0 && !empty($this->table_element_line)) {
336  $this->fetchLines();
337  }
338  return $result;
339  }
340 
346  public function fetchLines()
347  {
348  $this->lines = array();
349 
350  $result = $this->fetchLinesCommon();
351  return $result;
352  }
353 
354 
366  public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND')
367  {
368  global $conf;
369 
370  dol_syslog(__METHOD__, LOG_DEBUG);
371 
372  $records = array();
373 
374  $sql = 'SELECT ';
375  $sql .= $this->getFieldList('t');
376  $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
377  if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
378  $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')';
379  } else {
380  $sql .= ' WHERE 1 = 1';
381  }
382  // Manage filter
383  $sqlwhere = array();
384  if (count($filter) > 0) {
385  foreach ($filter as $key => $value) {
386  if ($key == 't.rowid') {
387  $sqlwhere[] = $key.'='.$value;
388  } elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) {
389  $sqlwhere[] = $key.' = \''.$this->db->idate($value).'\'';
390  } elseif ($key == 'customsql') {
391  $sqlwhere[] = $value;
392  } elseif (strpos($value, '%') === false) {
393  $sqlwhere[] = $key.' IN ('.$this->db->sanitize($this->db->escape($value)).')';
394  } else {
395  $sqlwhere[] = $key.' LIKE \'%'.$this->db->escape($value).'%\'';
396  }
397  }
398  }
399  if (count($sqlwhere) > 0) {
400  $sql .= " AND (".implode(" ".$filtermode." ", $sqlwhere).")";
401  }
402 
403  if (!empty($sortfield)) {
404  $sql .= $this->db->order($sortfield, $sortorder);
405  }
406  if (!empty($limit)) {
407  $sql .= ' '.$this->db->plimit($limit, $offset);
408  }
409 
410  $resql = $this->db->query($sql);
411  if ($resql) {
412  $num = $this->db->num_rows($resql);
413  $i = 0;
414  while ($i < ($limit ? min($limit, $num) : $num)) {
415  $obj = $this->db->fetch_object($resql);
416 
417  $record = new self($this->db);
418  $record->setVarsFromFetchObj($obj);
419 
420  $records[$record->id] = $record;
421 
422  $i++;
423  }
424  $this->db->free($resql);
425 
426  return $records;
427  } else {
428  $this->errors[] = 'Error '.$this->db->lasterror();
429  dol_syslog(__METHOD__.' '.join(',', $this->errors), LOG_ERR);
430 
431  return -1;
432  }
433  }
434 
442  public function update(User $user, $notrigger = false)
443  {
444  return $this->updateCommon($user, $notrigger);
445  }
446 
454  public function delete(User $user, $notrigger = false)
455  {
456  return $this->deleteCommon($user, $notrigger);
457  //return $this->deleteCommon($user, $notrigger, 1);
458  }
459 
468  public function deleteLine(User $user, $idline, $notrigger = false)
469  {
470  if ($this->status < 0) {
471  $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
472  return -2;
473  }
474 
475  return $this->deleteLineCommon($user, $idline, $notrigger);
476  }
477 
478 
486  public function validate($user, $notrigger = 0)
487  {
488  global $conf, $langs;
489 
490  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
491 
492  $error = 0;
493 
494  // Protection
495  if ($this->status == self::STATUS_VALIDATED) {
496  dol_syslog(get_class($this)."::validate action abandonned: already validated", LOG_WARNING);
497  return 0;
498  }
499 
500  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->job->write))
501  || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->job->job_advance->validate))))
502  {
503  $this->error='NotEnoughPermissions';
504  dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
505  return -1;
506  }*/
507 
508  $now = dol_now();
509 
510  $this->db->begin();
511 
512  // Define new ref
513  if (!$error && (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
514  $num = $this->getNextNumRef();
515  } else {
516  $num = $this->ref;
517  }
518  $this->newref = $num;
519 
520  if (!empty($num)) {
521  // Validate
522  $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
523  $sql .= " SET ref = '".$this->db->escape($num)."',";
524  $sql .= " status = ".self::STATUS_VALIDATED;
525  if (!empty($this->fields['date_validation'])) {
526  $sql .= ", date_validation = '".$this->db->idate($now)."'";
527  }
528  if (!empty($this->fields['fk_user_valid'])) {
529  $sql .= ", fk_user_valid = ".((int) $user->id);
530  }
531  $sql .= " WHERE rowid = ".((int) $this->id);
532 
533  dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
534  $resql = $this->db->query($sql);
535  if (!$resql) {
536  dol_print_error($this->db);
537  $this->error = $this->db->lasterror();
538  $error++;
539  }
540 
541  if (!$error && !$notrigger) {
542  // Call trigger
543  $result = $this->call_trigger('JOB_VALIDATE', $user);
544  if ($result < 0) {
545  $error++;
546  }
547  // End call triggers
548  }
549  }
550 
551  if (!$error) {
552  $this->oldref = $this->ref;
553 
554  // Rename directory if dir was a temporary ref
555  if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
556  // Now we rename also files into index
557  $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'job/".$this->db->escape($this->newref)."'";
558  $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'job/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
559  $resql = $this->db->query($sql);
560  if (!$resql) {
561  $error++; $this->error = $this->db->lasterror();
562  }
563 
564  // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
565  $oldref = dol_sanitizeFileName($this->ref);
566  $newref = dol_sanitizeFileName($num);
567  $dirsource = $conf->hrm->dir_output.'/job/'.$oldref;
568  $dirdest = $conf->hrm->dir_output.'/job/'.$newref;
569  if (!$error && file_exists($dirsource)) {
570  dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
571 
572  if (@rename($dirsource, $dirdest)) {
573  dol_syslog("Rename ok");
574  // Rename docs starting with $oldref with $newref
575  $listoffiles = dol_dir_list($conf->hrm->dir_output.'/job/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
576  foreach ($listoffiles as $fileentry) {
577  $dirsource = $fileentry['name'];
578  $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
579  $dirsource = $fileentry['path'].'/'.$dirsource;
580  $dirdest = $fileentry['path'].'/'.$dirdest;
581  @rename($dirsource, $dirdest);
582  }
583  }
584  }
585  }
586  }
587 
588  // Set new ref and current status
589  if (!$error) {
590  $this->ref = $num;
591  $this->status = self::STATUS_VALIDATED;
592  }
593 
594  if (!$error) {
595  $this->db->commit();
596  return 1;
597  } else {
598  $this->db->rollback();
599  return -1;
600  }
601  }
602 
609  public function getLastJobForUser($fk_user)
610  {
611  $Tab = $this->getForUser($fk_user);
612 
613  if (empty($Tab)) return '';
614 
615  $lastpos = array_shift($Tab);
616 
617  return $lastpos;
618  }
619 
626  public function getForUser($userid)
627  {
628  global $db;
629 
630  $TReturn = array();
631  $position = new Position($db);
632  $TPosition = $position->getForUser($userid);
633  foreach ($TPosition as $UPosition) {
634  $TReturn[$UPosition->Job->rowid] = $UPosition->Job->ref;
635  }
636  return $TReturn;
637  }
638 
646  public function setDraft($user, $notrigger = 0)
647  {
648  // Protection
649  if ($this->status <= self::STATUS_DRAFT) {
650  return 0;
651  }
652 
653  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
654  || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
655  {
656  $this->error='Permission denied';
657  return -1;
658  }*/
659 
660  return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'JOB_UNVALIDATE');
661  }
662 
670  public function cancel($user, $notrigger = 0)
671  {
672  // Protection
673  if ($this->status != self::STATUS_VALIDATED) {
674  return 0;
675  }
676 
677  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
678  || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
679  {
680  $this->error='Permission denied';
681  return -1;
682  }*/
683 
684  return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'JOB_CANCEL');
685  }
686 
694  public function reopen($user, $notrigger = 0)
695  {
696  // Protection
697  if ($this->status != self::STATUS_CANCELED) {
698  return 0;
699  }
700 
701  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->write))
702  || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->hrm->hrm_advance->validate))))
703  {
704  $this->error='Permission denied';
705  return -1;
706  }*/
707 
708  return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'JOB_REOPEN');
709  }
710 
721  public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
722  {
723  global $conf, $langs, $hookmanager;
724 
725  if (!empty($conf->dol_no_mouse_hover)) {
726  $notooltip = 1; // Force disable tooltips
727  }
728 
729  $result = '';
730 
731  $label = img_picto('', $this->picto).' <u>'.$langs->trans("Job").'</u>';
732  if (isset($this->status)) {
733  $label .= ' '.$this->getLibStatut(5);
734  }
735  $label .= '<br>';
736  $label .= '<b>'.$langs->trans('Label').':</b> '.$this->label;
737 
738  $url = dol_buildpath('/hrm/job_card.php', 1).'?id='.$this->id;
739 
740  if ($option != 'nolink') {
741  // Add param to save lastsearch_values or not
742  $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
743  if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
744  $add_save_lastsearch_values = 1;
745  }
746  if ($add_save_lastsearch_values) {
747  $url .= '&save_lastsearch_values=1';
748  }
749  }
750 
751  $linkclose = '';
752  if (empty($notooltip)) {
753  if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
754  $label = $langs->trans("ShowJob");
755  $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
756  }
757  $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
758  $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
759  } else {
760  $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
761  }
762 
763  if ($option == 'nolink') {
764  $linkstart = '<span';
765  } else {
766  $linkstart = '<a href="'.$url.'"';
767  }
768  $linkstart .= $linkclose.'>';
769  if ($option == 'nolink') {
770  $linkend = '</span>';
771  } else {
772  $linkend = '</a>';
773  }
774 
775  $result .= $linkstart;
776 
777  if (empty($this->showphoto_on_popup)) {
778  if ($withpicto) {
779  $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);
780  }
781  } else {
782  if ($withpicto) {
783  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
784 
785  list($class, $module) = explode('@', $this->picto);
786  $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->label);
787  $filearray = dol_dir_list($upload_dir, "files");
788  $filename = $filearray[0]['name'];
789  if (!empty($filename)) {
790  $pospoint = strpos($filearray[0]['name'], '.');
791 
792  $pathtophoto = $class.'/'.$this->label.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
793  if (!getDolGlobalString(strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS')) {
794  $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>';
795  } else {
796  $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>';
797  }
798 
799  $result .= '</div>';
800  } else {
801  $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);
802  }
803  }
804  }
805 
806  if ($withpicto != 2) {
807  $result .= $this->label;
808  }
809 
810  $result .= $linkend;
811  //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
812 
813  global $action, $hookmanager;
814  $hookmanager->initHooks(array('jobdao'));
815  $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
816  $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
817  if ($reshook > 0) {
818  $result = $hookmanager->resPrint;
819  } else {
820  $result .= $hookmanager->resPrint;
821  }
822 
823  return $result;
824  }
825 
832  public function getLibStatut($mode = 0)
833  {
834  return $this->LibStatut($this->status, $mode);
835  }
836 
837  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
845  public function LibStatut($status, $mode = 0)
846  {
847  // phpcs:enable
848  return ''; // There is no status on job profile for the moment
849 
850  /*
851  if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
852  global $langs;
853  //$langs->load("hrm");
854  $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
855  $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
856  $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
857  $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
858  $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
859  $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
860  }
861 
862  $statusType = 'status'.$status;
863  //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
864  if ($status == self::STATUS_CANCELED) {
865  $statusType = 'status6';
866  }
867 
868  return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
869  */
870  }
871 
878  public function info($id)
879  {
880  $sql = 'SELECT rowid, date_creation as datec, tms as datem,';
881  $sql .= ' fk_user_creat, fk_user_modif';
882  $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
883  $sql .= ' WHERE t.rowid = '.((int) $id);
884  $result = $this->db->query($sql);
885  if ($result) {
886  if ($this->db->num_rows($result)) {
887  $obj = $this->db->fetch_object($result);
888  $this->id = $obj->rowid;
889 
890  $this->user_creation_id = $obj->fk_user_creat;
891  $this->user_modification_id = $obj->fk_user_modif;
892  $this->date_creation = $this->db->jdate($obj->datec);
893  $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
894  }
895 
896  $this->db->free($result);
897  } else {
898  dol_print_error($this->db);
899  }
900  }
901 
908  public function initAsSpecimen()
909  {
910  // Set here init that are not commonf fields
911  // $this->property1 = ...
912  // $this->property2 = ...
913 
914  $this->initAsSpecimenCommon();
915  }
916 
922  public function getLinesArray()
923  {
924  $this->lines = array();
925 
926  $objectline = new JobLine($this->db);
927  $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_job = '.$this->id));
928 
929  if (is_numeric($result)) {
930  $this->error = $objectline->error;
931  $this->errors = $objectline->errors;
932  return $result;
933  } else {
934  $this->lines = $result;
935  return $this->lines;
936  }
937  }
938 
944  public function getNextNumRef()
945  {
946  global $langs, $conf;
947  $langs->load("hrm");
948 
949  if (empty($conf->global->hrm_JOB_ADDON)) {
950  $conf->global->hrm_JOB_ADDON = 'mod_job_standard';
951  }
952 
953  if (!empty($conf->global->hrm_JOB_ADDON)) {
954  $mybool = false;
955 
956  $file = $conf->global->hrm_JOB_ADDON.".php";
957  $classname = $conf->global->hrm_JOB_ADDON;
958 
959  // Include file with class
960  $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
961  foreach ($dirmodels as $reldir) {
962  $dir = dol_buildpath($reldir."core/modules/hrm/");
963 
964  // Load file with numbering class (if found)
965  $mybool |= @include_once $dir.$file;
966  }
967 
968  if ($mybool === false) {
969  dol_print_error('', "Failed to include file ".$file);
970  return '';
971  }
972 
973  if (class_exists($classname)) {
974  $obj = new $classname();
975  $numref = $obj->getNextValue($this);
976 
977  if ($numref != '' && $numref != '-1') {
978  return $numref;
979  } else {
980  $this->error = $obj->error;
981  //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
982  return "";
983  }
984  } else {
985  print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
986  return "";
987  }
988  } else {
989  print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
990  return "";
991  }
992  }
993 
1005  public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
1006  {
1007  global $conf, $langs;
1008 
1009  $result = 0;
1010  $includedocgeneration = 0;
1011 
1012  $langs->load("hrm");
1013 
1014  if (!dol_strlen($modele)) {
1015  $modele = 'standard_job';
1016 
1017  if (!empty($this->model_pdf)) {
1018  $modele = $this->model_pdf;
1019  } elseif (!empty($conf->global->JOB_ADDON_PDF)) {
1020  $modele = $conf->global->JOB_ADDON_PDF;
1021  }
1022  }
1023 
1024  $modelpath = "core/modules/hrm/doc/";
1025 
1026  if ($includedocgeneration && !empty($modele)) {
1027  $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1028  }
1029 
1030  return $result;
1031  }
1032 
1040  public function doScheduledJob()
1041  {
1042  global $conf, $langs;
1043 
1044  //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
1045 
1046  $error = 0;
1047  $this->output = '';
1048  $this->error = '';
1049 
1050  dol_syslog(__METHOD__, LOG_DEBUG);
1051 
1052  $now = dol_now();
1053 
1054  $this->db->begin();
1055 
1056  // ...
1057 
1058  $this->db->commit();
1059 
1060  return $error;
1061  }
1062 
1070  public function getKanbanView($option = '', $arraydata = null)
1071  {
1072  global $selected, $langs;
1073 
1074  $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
1075 
1076  $return = '<div class="box-flex-item box-flex-grow-zero">';
1077  $return .= '<div class="info-box info-box-sm">';
1078  $return .= '<span class="info-box-icon bg-infobox-action">';
1079  $return .= img_picto('', $this->picto);
1080  $return .= '</span>';
1081  $return .= '<div class="info-box-content">';
1082  $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl(0) : $this->ref).'</span>';
1083  $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
1084  /*if (property_exists($this, 'deplacement')) {
1085  $return .= '<br><span class="opacitymedium">'.$langs->trans("Type").'</span>';
1086  $return .= ' : <span class="info-box-label ">'.$this->fields['deplacement']['arrayofkeyval'][$this->deplacement].'</span>';
1087  }*/
1088  if (property_exists($this, 'description') && !(empty($this->description))) {
1089  //$return .= '<br><span class="info-box-label opacitymedium">'.$langs->trans("Description").'</span> : ';
1090  $return .= '<br><span class="info-box-label ">'.(strlen($this->description) > 30 ? dol_substr($this->description, 0, 25).'...' : $this->description).'</span>';
1091  }
1092  $return .= '</div>';
1093  $return .= '</div>';
1094  $return .= '</div>';
1095  return $return;
1096  }
1097 }
1098 
1099 
1100 require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
1101 
1106 {
1107  // To complete with content of an object JobLine
1108  // We should have a field rowid, fk_job and position
1109 
1113  public $isextrafieldmanaged = 0;
1114 
1120  public function __construct(DoliDB $db)
1121  {
1122  $this->db = $db;
1123  }
1124 }
$object ref
Definition: info.php:78
Parent class of all other business classes (invoices, contracts, proposals, orders,...
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
deleteLineCommon(User $user, $idline, $notrigger=false)
Delete a line of object in database.
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.
initAsSpecimenCommon()
Initialise object with example values Id must be 0 if object instance is a specimen.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
updateCommon(User $user, $notrigger=false)
Update object into database.
fetchLinesCommon($morewhere='')
Load object in memory from the database.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage Dolibarr database access.
Class for Job.
Definition: job.class.php:37
doScheduledJob()
Action executed by scheduler CAN BE A CRON TASK.
Definition: job.class.php:1040
update(User $user, $notrigger=false)
Update object into database.
Definition: job.class.php:442
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
Definition: job.class.php:944
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter=array(), $filtermode='AND')
Load list of objects in memory from the database.
Definition: job.class.php:366
getLastJobForUser($fk_user)
Get the last occupied position for a user.
Definition: job.class.php:609
fetchLines()
Load object lines in memory from the database.
Definition: job.class.php:346
cancel($user, $notrigger=0)
Set cancel status.
Definition: job.class.php:670
__construct(DoliDB $db)
Constructor.
Definition: job.class.php:172
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
Definition: job.class.php:1005
setDraft($user, $notrigger=0)
Set draft status.
Definition: job.class.php:646
validate($user, $notrigger=0)
Validate object.
Definition: job.class.php:486
getLibStatut($mode=0)
Return the label of the status.
Definition: job.class.php:832
getLinesArray()
Create an array of lines.
Definition: job.class.php:922
fetch($id, $ref=null)
Load object in memory from the database.
Definition: job.class.php:332
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
Definition: job.class.php:908
LibStatut($status, $mode=0)
Return the status.
Definition: job.class.php:845
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionaly the picto)
Definition: job.class.php:721
createFromClone(User $user, $fromid)
Clone an object into another one.
Definition: job.class.php:233
create(User $user, $notrigger=false)
Create object into database.
Definition: job.class.php:217
reopen($user, $notrigger=0)
Set back to validated status.
Definition: job.class.php:694
deleteLine(User $user, $idline, $notrigger=false)
Delete a line of object in database.
Definition: job.class.php:468
getForUser($userid)
Get array of occupied positions for a user.
Definition: job.class.php:626
getKanbanView($option='', $arraydata=null)
Return clicable link of object (with eventually picto)
Definition: job.class.php:1070
info($id)
Load the info information in the object.
Definition: job.class.php:878
Class JobLine.
Definition: job.class.php:1106
__construct(DoliDB $db)
Constructor.
Definition: job.class.php:1120
Class for Position.
Class to manage Dolibarr users.
Definition: user.class.php:48
if(isModEnabled('facture') && $user->hasRight('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') && $user->hasRight('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)) $sql
Social contributions to pay.
Definition: index.php:746
print *****$script_file(".$version.") pid cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition: files.lib.php:62
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dol_now($mode='auto')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_substr($string, $start, $length=null, $stringencoding='', $trunconbytes=0)
Make a substring.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.