dolibarr  16.0.1
target.class.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) ---Put here your own copyright and developer email---
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <https://www.gnu.org/licenses/>.
17  */
18 
25 // Put here all includes required by your class file
26 require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
27 //require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
28 //require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
29 
33 class Target extends CommonObject
34 {
38  public $module = 'webhook';
39 
43  public $element = 'target';
44 
48  public $table_element = 'webhook_target';
49 
54  public $ismultientitymanaged = 0;
55 
59  public $isextrafieldmanaged = 0;
60 
64  public $picto = 'webhook';
65 
66 
67  const STATUS_DRAFT = 0;
68  const STATUS_VALIDATED = 1;
69  const STATUS_CANCELED = 9;
70 
71 
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  'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>20, 'notnull'=>1, 'visible'=>4, 'noteditable'=>'1', 'index'=>1, 'searchall'=>1, 'validate'=>'1', 'comment'=>"Reference of object"),
107  'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>0, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'cssview'=>'wordbreak', 'help'=>"Help text", 'showoncombobox'=>'2', 'validate'=>'1',),
108  'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>'1', 'position'=>60, 'notnull'=>0, 'visible'=>3, 'validate'=>'1',),
109  'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>'1', 'position'=>61, 'notnull'=>0, 'visible'=>0, 'cssview'=>'wordbreak', 'validate'=>'1',),
110  'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>'1', 'position'=>62, 'notnull'=>0, 'visible'=>0, 'cssview'=>'wordbreak', 'validate'=>'1',),
111  'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2,),
112  'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2,),
113  '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',),
114  'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>-2,),
115  'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>1000, 'notnull'=>-1, 'visible'=>-2,),
116  'status' => array('type'=>'integer', 'label'=>'Status', 'enabled'=>'1', 'position'=>2000, 'notnull'=>1, 'visible'=>3, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Brouillon', '1'=>'ValidĂ©', '9'=>'AnnulĂ©'), 'validate'=>'1',),
117  'url' => array('type'=>'varchar(255)', 'label'=>'Url', 'enabled'=>'1', 'position'=>50, 'notnull'=>1, 'visible'=>1,),
118  'trigger_codes' => array('type'=>'text', 'label'=>'TriggerCodes', 'enabled'=>'1', 'position'=>50, 'notnull'=>1, 'visible'=>1, 'help'=>"TriggerCodeInfo",),
119  );
120  public $rowid;
121  public $ref;
122  public $label;
123  public $description;
124  public $note_public;
125  public $note_private;
126  public $date_creation;
127  public $tms;
128  public $fk_user_creat;
129  public $fk_user_modif;
130  public $import_key;
131  public $status;
132  public $url;
133  public $trigger_codes;
134  // END MODULEBUILDER PROPERTIES
135 
136 
137  // If this object has a subtable with lines
138 
139  // /**
140  // * @var string Name of subtable line
141  // */
142  // public $table_element_line = 'webhook_targetline';
143 
144  // /**
145  // * @var string Field with ID of parent key if this object has a parent
146  // */
147  // public $fk_element = 'fk_target';
148 
149  // /**
150  // * @var string Name of subtable class that manage subtable lines
151  // */
152  // public $class_element_line = 'Targetline';
153 
154  // /**
155  // * @var array List of child tables. To test if we can delete object.
156  // */
157  // protected $childtables = array();
158 
159  // /**
160  // * @var array List of child tables. To know object to delete on cascade.
161  // * If name matches '@ClassNAme:FilePathClass;ParentFkFieldName' it will
162  // * call method deleteByParentField(parentId, ParentFkFieldName) to fetch and delete child object
163  // */
164  // protected $childtablesoncascade = array('webhook_targetdet');
165 
166  // /**
167  // * @var TargetLine[] Array of subtable lines
168  // */
169  // public $lines = array();
170 
171 
172 
178  public function __construct(DoliDB $db)
179  {
180  global $conf, $langs;
181 
182  $this->db = $db;
183 
184  if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields['rowid'])) {
185  $this->fields['rowid']['visible'] = 0;
186  }
187  if (empty($conf->multicompany->enabled) && isset($this->fields['entity'])) {
188  $this->fields['entity']['enabled'] = 0;
189  }
190 
191  // Example to show how to set values of fields definition dynamically
192  /*if ($user->rights->webhook->target->read) {
193  $this->fields['myfield']['visible'] = 1;
194  $this->fields['myfield']['noteditable'] = 0;
195  }*/
196 
197  // Unset fields that are disabled
198  foreach ($this->fields as $key => $val) {
199  if (isset($val['enabled']) && empty($val['enabled'])) {
200  unset($this->fields[$key]);
201  }
202  }
203 
204  // Translate some data of arrayofkeyval
205  if (is_object($langs)) {
206  foreach ($this->fields as $key => $val) {
207  if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
208  foreach ($val['arrayofkeyval'] as $key2 => $val2) {
209  $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
210  }
211  }
212  }
213  }
214  }
215 
223  public function create(User $user, $notrigger = false)
224  {
225  $resultcreate = $this->createCommon($user, $notrigger);
226  $this->ref = $this->id;
227 
228  if ($resultcreate <= 0) {
229  return $resultcreate;
230  }
231  $resultvalidate = $this->validate($user, $notrigger);
232 
233  return $resultvalidate;
234  }
235 
243  public function createFromClone(User $user, $fromid)
244  {
245  global $langs, $extrafields;
246  $error = 0;
247 
248  dol_syslog(__METHOD__, LOG_DEBUG);
249 
250  $object = new self($this->db);
251 
252  $this->db->begin();
253 
254  // Load source object
255  $result = $object->fetchCommon($fromid);
256  if ($result > 0 && !empty($object->table_element_line)) {
257  $object->fetchLines();
258  }
259 
260  // get lines so they will be clone
261  //foreach($this->lines as $line)
262  // $line->fetch_optionals();
263 
264  // Reset some properties
265  unset($object->id);
266  unset($object->fk_user_creat);
267  unset($object->import_key);
268 
269  // Clear fields
270  if (property_exists($object, 'ref')) {
271  $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
272  }
273  if (property_exists($object, 'label')) {
274  $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
275  }
276  if (property_exists($object, 'status')) {
277  $object->status = self::STATUS_DRAFT;
278  }
279  if (property_exists($object, 'date_creation')) {
280  $object->date_creation = dol_now();
281  }
282  if (property_exists($object, 'date_modification')) {
283  $object->date_modification = null;
284  }
285  // ...
286  // Clear extrafields that are unique
287  if (is_array($object->array_options) && count($object->array_options) > 0) {
288  $extrafields->fetch_name_optionals_label($this->table_element);
289  foreach ($object->array_options as $key => $option) {
290  $shortkey = preg_replace('/options_/', '', $key);
291  if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
292  //var_dump($key); var_dump($clonedObj->array_options[$key]); exit;
293  unset($object->array_options[$key]);
294  }
295  }
296  }
297 
298  // Create clone
299  $object->context['createfromclone'] = 'createfromclone';
300  $result = $object->createCommon($user);
301  if ($result < 0) {
302  $error++;
303  $this->error = $object->error;
304  $this->errors = $object->errors;
305  }
306 
307  if (!$error) {
308  // copy internal contacts
309  if ($this->copy_linked_contact($object, 'internal') < 0) {
310  $error++;
311  }
312  }
313 
314  if (!$error) {
315  // copy external contacts if same company
316  if (!empty($object->socid) && property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
317  if ($this->copy_linked_contact($object, 'external') < 0) {
318  $error++;
319  }
320  }
321  }
322 
323  unset($object->context['createfromclone']);
324 
325  // End
326  if (!$error) {
327  $this->db->commit();
328  return $object;
329  } else {
330  $this->db->rollback();
331  return -1;
332  }
333  }
334 
342  public function fetch($id, $ref = null)
343  {
344  $result = $this->fetchCommon($id, $ref);
345  if ($result > 0 && !empty($this->table_element_line)) {
346  $this->fetchLines();
347  }
348  return $result;
349  }
350 
356  public function fetchLines()
357  {
358  $this->lines = array();
359 
360  $result = $this->fetchLinesCommon();
361  return $result;
362  }
363 
364 
376  public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND')
377  {
378  global $conf;
379 
380  dol_syslog(__METHOD__, LOG_DEBUG);
381 
382  $records = array();
383 
384  $sql = "SELECT ";
385  $sql .= $this->getFieldList('t');
386  $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
387  if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
388  $sql .= " WHERE t.entity IN (".getEntity($this->table_element).")";
389  } else {
390  $sql .= " WHERE 1 = 1";
391  }
392  // Manage filter
393  $sqlwhere = array();
394  if (count($filter) > 0) {
395  foreach ($filter as $key => $value) {
396  if ($key == 't.rowid') {
397  $sqlwhere[] = $key." = ".((int) $value);
398  } elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) {
399  $sqlwhere[] = $key." = '".$this->db->idate($value)."'";
400  } elseif ($key == 'customsql') {
401  $sqlwhere[] = $value;
402  } elseif (strpos($value, '%') === false) {
403  $sqlwhere[] = $key." IN (".$this->db->sanitize($this->db->escape($value)).")";
404  } else {
405  $sqlwhere[] = $key." LIKE '%".$this->db->escape($value)."%'";
406  }
407  }
408  }
409  if (count($sqlwhere) > 0) {
410  $sql .= " AND (".implode(" ".$filtermode." ", $sqlwhere).")";
411  }
412 
413  if (!empty($sortfield)) {
414  $sql .= $this->db->order($sortfield, $sortorder);
415  }
416  if (!empty($limit)) {
417  $sql .= $this->db->plimit($limit, $offset);
418  }
419 
420  $resql = $this->db->query($sql);
421  if ($resql) {
422  $num = $this->db->num_rows($resql);
423  $i = 0;
424  while ($i < ($limit ? min($limit, $num) : $num)) {
425  $obj = $this->db->fetch_object($resql);
426 
427  $record = new self($this->db);
428  $record->setVarsFromFetchObj($obj);
429 
430  $records[$record->id] = $record;
431 
432  $i++;
433  }
434  $this->db->free($resql);
435 
436  return $records;
437  } else {
438  $this->errors[] = 'Error '.$this->db->lasterror();
439  dol_syslog(__METHOD__.' '.join(',', $this->errors), LOG_ERR);
440 
441  return -1;
442  }
443  }
444 
452  public function update(User $user, $notrigger = false)
453  {
454  return $this->updateCommon($user, $notrigger);
455  }
456 
464  public function delete(User $user, $notrigger = false)
465  {
466  return $this->deleteCommon($user, $notrigger);
467  //return $this->deleteCommon($user, $notrigger, 1);
468  }
469 
478  public function deleteLine(User $user, $idline, $notrigger = false)
479  {
480  if ($this->status < 0) {
481  $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
482  return -2;
483  }
484 
485  return $this->deleteLineCommon($user, $idline, $notrigger);
486  }
487 
488 
496  public function validate($user, $notrigger = 0)
497  {
498  global $conf, $langs;
499 
500  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
501 
502  $error = 0;
503 
504  // Protection
505  if ($this->status == self::STATUS_VALIDATED) {
506  dol_syslog(get_class($this)."::validate action abandonned: already validated", LOG_WARNING);
507  return 0;
508  }
509 
510  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->webhook->target->write))
511  || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->webhook->target->target_advance->validate))))
512  {
513  $this->error='NotEnoughPermissions';
514  dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
515  return -1;
516  }*/
517 
518  $now = dol_now();
519 
520  $this->db->begin();
521 
522  // Define new ref
523  if (!$error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
524  $num = $this->getNextNumRef();
525  } else {
526  $num = $this->ref;
527  }
528  $this->newref = $num;
529 
530  if (!empty($num)) {
531  // Validate
532  $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
533  $sql .= " SET ref = '".$this->db->escape($num)."',";
534  $sql .= " status = ".self::STATUS_VALIDATED;
535  if (!empty($this->fields['date_validation'])) {
536  $sql .= ", date_validation = '".$this->db->idate($now)."'";
537  }
538  if (!empty($this->fields['fk_user_valid'])) {
539  $sql .= ", fk_user_valid = ".((int) $user->id);
540  }
541  $sql .= " WHERE rowid = ".((int) $this->id);
542 
543  dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
544  $resql = $this->db->query($sql);
545  if (!$resql) {
546  dol_print_error($this->db);
547  $this->error = $this->db->lasterror();
548  $error++;
549  }
550 
551  if (!$error && !$notrigger) {
552  // Call trigger
553  $result = $this->call_trigger('TARGET_VALIDATE', $user);
554  if ($result < 0) {
555  $error++;
556  }
557  // End call triggers
558  }
559  }
560 
561  if (!$error) {
562  $this->oldref = $this->ref;
563 
564  // Rename directory if dir was a temporary ref
565  if (preg_match('/^[\(]?PROV/i', $this->ref)) {
566  // Now we rename also files into index
567  $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'target/".$this->db->escape($this->newref)."'";
568  $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'target/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
569  $resql = $this->db->query($sql);
570  if (!$resql) {
571  $error++; $this->error = $this->db->lasterror();
572  }
573 
574  // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
575  $oldref = dol_sanitizeFileName($this->ref);
576  $newref = dol_sanitizeFileName($num);
577  $dirsource = $conf->webhook->dir_output.'/target/'.$oldref;
578  $dirdest = $conf->webhook->dir_output.'/target/'.$newref;
579  if (!$error && file_exists($dirsource)) {
580  dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
581 
582  if (@rename($dirsource, $dirdest)) {
583  dol_syslog("Rename ok");
584  // Rename docs starting with $oldref with $newref
585  $listoffiles = dol_dir_list($conf->webhook->dir_output.'/target/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
586  foreach ($listoffiles as $fileentry) {
587  $dirsource = $fileentry['name'];
588  $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
589  $dirsource = $fileentry['path'].'/'.$dirsource;
590  $dirdest = $fileentry['path'].'/'.$dirdest;
591  @rename($dirsource, $dirdest);
592  }
593  }
594  }
595  }
596  }
597 
598  // Set new ref and current status
599  if (!$error) {
600  $this->ref = $num;
601  $this->status = self::STATUS_VALIDATED;
602  }
603 
604  if (!$error) {
605  $this->db->commit();
606  return 1;
607  } else {
608  $this->db->rollback();
609  return -1;
610  }
611  }
612 
613 
621  public function setDraft($user, $notrigger = 0)
622  {
623  // Protection
624  if ($this->status <= self::STATUS_DRAFT) {
625  return 0;
626  }
627 
628  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->webhook->write))
629  || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->webhook->webhook_advance->validate))))
630  {
631  $this->error='Permission denied';
632  return -1;
633  }*/
634 
635  return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'TARGET_UNVALIDATE');
636  }
637 
645  public function cancel($user, $notrigger = 0)
646  {
647  // Protection
648  if ($this->status != self::STATUS_VALIDATED) {
649  return 0;
650  }
651 
652  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->webhook->write))
653  || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->webhook->webhook_advance->validate))))
654  {
655  $this->error='Permission denied';
656  return -1;
657  }*/
658 
659  return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'TARGET_CANCEL');
660  }
661 
669  public function reopen($user, $notrigger = 0)
670  {
671  // Protection
672  if ($this->status != self::STATUS_CANCELED) {
673  return 0;
674  }
675 
676  /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->webhook->write))
677  || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->webhook->webhook_advance->validate))))
678  {
679  $this->error='Permission denied';
680  return -1;
681  }*/
682 
683  return $this->setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, 'TARGET_REOPEN');
684  }
685 
696  public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
697  {
698  global $conf, $langs, $hookmanager;
699 
700  if (!empty($conf->dol_no_mouse_hover)) {
701  $notooltip = 1; // Force disable tooltips
702  }
703 
704  $result = '';
705 
706  $label = img_picto('', $this->picto).' <u>'.$langs->trans("Target").'</u>';
707  if (isset($this->status)) {
708  $label .= ' '.$this->getLibStatut(5);
709  }
710  $label .= '<br>';
711  $label .= '<b>'.$langs->trans('Ref').':</b> '.$this->ref;
712 
713  $url = dol_buildpath('/webhook/target_card.php', 1).'?id='.$this->id;
714 
715  if ($option != 'nolink') {
716  // Add param to save lastsearch_values or not
717  $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
718  if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
719  $add_save_lastsearch_values = 1;
720  }
721  if ($url && $add_save_lastsearch_values) {
722  $url .= '&save_lastsearch_values=1';
723  }
724  }
725 
726  $linkclose = '';
727  if (empty($notooltip)) {
728  if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
729  $label = $langs->trans("ShowTarget");
730  $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
731  }
732  $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
733  $linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
734  } else {
735  $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
736  }
737 
738  if ($option == 'nolink' || empty($url)) {
739  $linkstart = '<span';
740  } else {
741  $linkstart = '<a href="'.$url.'"';
742  }
743  $linkstart .= $linkclose.'>';
744  if ($option == 'nolink' || empty($url)) {
745  $linkend = '</span>';
746  } else {
747  $linkend = '</a>';
748  }
749 
750  $result .= $linkstart;
751 
752  if (empty($this->showphoto_on_popup)) {
753  if ($withpicto) {
754  $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);
755  }
756  } else {
757  if ($withpicto) {
758  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
759 
760  list($class, $module) = explode('@', $this->picto);
761  $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
762  $filearray = dol_dir_list($upload_dir, "files");
763  $filename = $filearray[0]['name'];
764  if (!empty($filename)) {
765  $pospoint = strpos($filearray[0]['name'], '.');
766 
767  $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
768  if (empty($conf->global->{strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS'})) {
769  $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>';
770  } else {
771  $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>';
772  }
773 
774  $result .= '</div>';
775  } else {
776  $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);
777  }
778  }
779  }
780 
781  if ($withpicto != 2) {
782  $result .= $this->ref;
783  }
784 
785  $result .= $linkend;
786  //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
787 
788  global $action, $hookmanager;
789  $hookmanager->initHooks(array('targetdao'));
790  $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
791  $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
792  if ($reshook > 0) {
793  $result = $hookmanager->resPrint;
794  } else {
795  $result .= $hookmanager->resPrint;
796  }
797 
798  return $result;
799  }
800 
807  public function getLabelStatus($mode = 0)
808  {
809  return $this->LibStatut($this->status, $mode);
810  }
811 
818  public function getLibStatut($mode = 0)
819  {
820  return $this->LibStatut($this->status, $mode);
821  }
822 
823  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
831  public function LibStatut($status, $mode = 0)
832  {
833  // phpcs:enable
834  if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
835  global $langs;
836  //$langs->load("webhook@webhook");
837  $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
838  $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
839  $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
840  $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
841  $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Enabled');
842  $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Disabled');
843  }
844 
845  $statusType = 'status'.$status;
846  //if ($status == self::STATUS_VALIDATED) $statusType = 'status1';
847  if ($status == self::STATUS_CANCELED) {
848  $statusType = 'status6';
849  }
850 
851  return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
852  }
853 
860  public function info($id)
861  {
862  $sql = "SELECT rowid, date_creation as datec, tms as datem,";
863  $sql .= " fk_user_creat, fk_user_modif";
864  $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
865  $sql .= " WHERE t.rowid = ".((int) $id);
866 
867  $result = $this->db->query($sql);
868  if ($result) {
869  if ($this->db->num_rows($result)) {
870  $obj = $this->db->fetch_object($result);
871  $this->id = $obj->rowid;
872 
873 
874  $this->user_creation_id = $obj->fk_user_creat;
875  $this->user_modification_id = $obj->fk_user_modif;
876  $this->date_creation = $this->db->jdate($obj->datec);
877  $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
878  }
879 
880  $this->db->free($result);
881  } else {
882  dol_print_error($this->db);
883  }
884  }
885 
892  public function initAsSpecimen()
893  {
894  // Set here init that are not commonf fields
895  // $this->property1 = ...
896  // $this->property2 = ...
897 
898  $this->initAsSpecimenCommon();
899  }
900 
906  public function getLinesArray()
907  {
908  $this->lines = array();
909 
910  $objectline = new TargetLine($this->db);
911  $result = $objectline->fetchAll('ASC', 'position', 0, 0, array('customsql'=>'fk_target = '.((int) $this->id)));
912 
913  if (is_numeric($result)) {
914  $this->error = $this->error;
915  $this->errors = $this->errors;
916  return $result;
917  } else {
918  $this->lines = $result;
919  return $this->lines;
920  }
921  }
922 
928  public function getNextNumRef()
929  {
930  global $langs, $conf;
931  $langs->load("webhook@webhook");
932 
933  if (empty($conf->global->WEBHOOK_TARGET_ADDON)) {
934  $conf->global->WEBHOOK_TARGET_ADDON = 'mod_target_standard';
935  }
936 
937  if (!empty($conf->global->WEBHOOK_TARGET_ADDON)) {
938  $mybool = false;
939 
940  $file = $conf->global->WEBHOOK_TARGET_ADDON.".php";
941  $classname = $conf->global->WEBHOOK_TARGET_ADDON;
942 
943  // Include file with class
944  $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
945  foreach ($dirmodels as $reldir) {
946  $dir = dol_buildpath($reldir."core/modules/webhook/");
947 
948  // Load file with numbering class (if found)
949  $mybool |= @include_once $dir.$file;
950  }
951 
952  if ($mybool === false) {
953  dol_print_error('', "Failed to include file ".$file);
954  return '';
955  }
956 
957  if (class_exists($classname)) {
958  $obj = new $classname();
959  $numref = $obj->getNextValue($this);
960 
961  if ($numref != '' && $numref != '-1') {
962  return $numref;
963  } else {
964  $this->error = $obj->error;
965  //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
966  return "";
967  }
968  } else {
969  print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
970  return "";
971  }
972  } else {
973  print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
974  return "";
975  }
976  }
977 
989  public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
990  {
991  global $conf, $langs;
992 
993  $result = 0;
994  $includedocgeneration = 0;
995 
996  $langs->load("webhook@webhook");
997 
998  if (!dol_strlen($modele)) {
999  $modele = 'standard_target';
1000 
1001  if (!empty($this->model_pdf)) {
1002  $modele = $this->model_pdf;
1003  } elseif (!empty($conf->global->TARGET_ADDON_PDF)) {
1004  $modele = $conf->global->TARGET_ADDON_PDF;
1005  }
1006  }
1007 
1008  $modelpath = "core/modules/webhook/doc/";
1009 
1010  if ($includedocgeneration && !empty($modele)) {
1011  $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1012  }
1013 
1014  return $result;
1015  }
1016 
1024  public function doScheduledJob()
1025  {
1026  global $conf, $langs;
1027 
1028  //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
1029 
1030  $error = 0;
1031  $this->output = '';
1032  $this->error = '';
1033 
1034  dol_syslog(__METHOD__, LOG_DEBUG);
1035 
1036  $now = dol_now();
1037 
1038  $this->db->begin();
1039 
1040  // ...
1041 
1042  $this->db->commit();
1043 
1044  return $error;
1045  }
1046 }
1047 
1048 
1049 require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
1050 
1055 {
1056  // To complete with content of an object TargetLine
1057  // We should have a field rowid, fk_target and position
1058 
1062  public $isextrafieldmanaged = 0;
1063 
1069  public function __construct(DoliDB $db)
1070  {
1071  $this->db = $db;
1072  }
1073 }
reopen($user, $notrigger=0)
Set back to validated status.
deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
Delete object in database.
cancel($user, $notrigger=0)
Set cancel status.
fetchLines()
Load object lines in memory from the database.
fetch($id, $ref=null)
Load object in memory from the database.
fetchLinesCommon($morewhere= '')
Load object in memory from the database.
$conf db
API class for accounts.
Definition: inc.php:41
Class TargetLine.
dol_now($mode= 'auto')
Return date for now.
update(User $user, $notrigger=false)
Update object into database.
Class to manage Dolibarr users.
Definition: user.class.php:44
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
Class to manage Dolibarr database access.
getLabelStatus($mode=0)
Return the label of the status.
createCommon(User $user, $notrigger=false)
Create object into database.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
setDraft($user, $notrigger=0)
Set draft status.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
doScheduledJob()
Action executed by scheduler CAN BE A CRON TASK.
createFromClone(User $user, $fromid)
Clone an object into another one.
__construct(DoliDB $db)
Constructor.
dol_strlen($string, $stringencoding= 'UTF-8')
Make a strlen call.
getFieldList($alias= '')
Function to concat keys of fields.
getLinesArray()
Create an array of lines.
img_picto($titlealt, $picto, $moreatt= '', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt= '', $morecss= '', $marginleftonlyshort=2)
Show picto whatever it&#39;s its name (generic function)
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename= '', $restricttologhandler= '', $logcontext=null)
Write log message into outputs.
validate($user, $notrigger=0)
Validate object.
img_object($titlealt, $picto, $moreatt= '', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
updateCommon(User $user, $notrigger=false)
Update object into database.
dol_sanitizeFileName($str, $newstr= '_', $unaccent=1)
Clean a string to use it as a file name.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0)
Scan a directory and return a list of files/directories.
Definition: files.lib.php:60
Class for Target.
getNomUrl($withpicto=0, $option= '', $notooltip=0, $morecss= '', $save_lastsearch_value=-1)
Return a link to the object card (with optionaly the picto)
__construct(DoliDB $db)
Constructor.
if(isModEnabled('facture')&&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur')&&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)&&$user->rights->fournisseur->facture->lire)||(isModEnabled('supplier_invoice')&&$user->rights->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->rights->commande->lire &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:742
getLibStatut($mode=0)
Return the label of the status.
deleteLine(User $user, $idline, $notrigger=false)
Delete a line of object in database.
deleteLineCommon(User $user, $idline, $notrigger=false)
Delete a line of object in database.
copy_linked_contact($objFrom, $source= 'internal')
Copy contact from one element to current.
create(User $user, $notrigger=false)
Create object into database.
call_trigger($triggerName, $user)
Call trigger based on this instance.
$object ref
Definition: info.php:77
dol_print_error($db= '', $error= '', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
info($id)
Load the info information in the object.
setStatusCommon($user, $status, $notrigger=0, $triggercode= '')
Set to a status.
dolGetStatus($statusLabel= '', $statusLabelShort= '', $html= '', $statusType= 'status0', $displayMode=0, $url= '', $params=array())
Output the badge of a status.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module...
fetchAll($sortorder= '', $sortfield= '', $limit=0, $offset=0, array $filter=array(), $filtermode= 'AND')
Load list of objects in memory from the database.
LibStatut($status, $mode=0)
Return the status.
Parent class of all other business classes (invoices, contracts, proposals, orders, ...)
fetchCommon($id, $ref=null, $morewhere= '')
Load object in memory from the database.