dolibarr  18.0.0-alpha
fichinter.class.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2002-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2004-2014 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5  * Copyright (C) 2011-2020 Juanjo Menent <jmenent@2byte.es>
6  * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
7  * Copyright (C) 2015-2020 Charlene Benke <charlie@patas-monkey.com>
8  * Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com>
9  * Copyright (C) 2018-2020 Frédéric France <frederic.france@netlogic.fr>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 3 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program. If not, see <https://www.gnu.org/licenses/>.
23  */
24 
30 require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
32 
33 
37 class Fichinter extends CommonObject
38 {
39  public $fields = array(
40  'rowid' =>array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>10),
41  'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'visible'=>-1, 'notnull'=>1, 'position'=>15),
42  'fk_projet' =>array('type'=>'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)', 'label'=>'Fk projet', 'enabled'=>'isModEnabled("project")', 'visible'=>-1, 'position'=>20),
43  'fk_contrat' =>array('type'=>'integer', 'label'=>'Fk contrat', 'enabled'=>'$conf->contrat->enabled', 'visible'=>-1, 'position'=>25),
44  'ref' =>array('type'=>'varchar(30)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'showoncombobox'=>1, 'position'=>30),
45  'ref_ext' =>array('type'=>'varchar(255)', 'label'=>'Ref ext', 'enabled'=>1, 'visible'=>0, 'position'=>35),
46  'ref_client' =>array('type'=>'varchar(255)', 'label'=>'RefCustomer', 'enabled'=>1, 'visible'=>-1, 'position'=>36),
47  'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>40, 'index'=>1),
48  'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>45),
49  'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>50),
50  'date_valid' =>array('type'=>'datetime', 'label'=>'DateValidation', 'enabled'=>1, 'visible'=>-1, 'position'=>55),
51  'datei' =>array('type'=>'date', 'label'=>'Datei', 'enabled'=>1, 'visible'=>-1, 'position'=>60),
52  'fk_user_author' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Fk user author', 'enabled'=>1, 'visible'=>-1, 'position'=>65),
53  'fk_user_modif' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'position'=>70),
54  'fk_user_valid' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserValidation', 'enabled'=>1, 'visible'=>-1, 'position'=>75),
55  'fk_statut' =>array('type'=>'smallint(6)', 'label'=>'Fk statut', 'enabled'=>1, 'visible'=>-1, 'position'=>500),
56  'dateo' =>array('type'=>'date', 'label'=>'Dateo', 'enabled'=>1, 'visible'=>-1, 'position'=>85),
57  'datee' =>array('type'=>'date', 'label'=>'Datee', 'enabled'=>1, 'visible'=>-1, 'position'=>90),
58  'datet' =>array('type'=>'date', 'label'=>'Datet', 'enabled'=>1, 'visible'=>-1, 'position'=>95),
59  'duree' =>array('type'=>'double', 'label'=>'Duree', 'enabled'=>1, 'visible'=>-1, 'position'=>100),
60  'description' =>array('type'=>'html', 'label'=>'Description', 'enabled'=>1, 'visible'=>-1, 'position'=>105, 'showoncombobox'=>2),
61  'note_private' =>array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>110),
62  'note_public' =>array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>115),
63  'model_pdf' =>array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>1, 'visible'=>0, 'position'=>120),
64  'last_main_doc' =>array('type'=>'varchar(255)', 'label'=>'Last main doc', 'enabled'=>1, 'visible'=>-1, 'position'=>125),
65  'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>130),
66  'extraparams' =>array('type'=>'varchar(255)', 'label'=>'Extraparams', 'enabled'=>1, 'visible'=>-1, 'position'=>135),
67  );
68 
72  public $element = 'fichinter';
73 
77  public $table_element = 'fichinter';
78 
82  public $fk_element = 'fk_fichinter';
83 
87  public $table_element_line = 'fichinterdet';
88 
92  public $picto = 'intervention';
93 
97  protected $table_ref_field = 'ref';
98 
102  public $socid;
103 
104  public $author;
105 
111  public $datec;
112 
113  public $datev;
114  public $dateo;
115  public $datee;
116  public $datet;
117 
123  public $datem;
124 
128  public $duration;
129 
133  public $statut = 0; // 0=draft, 1=validated, 2=invoiced, 3=Terminate
134 
138  public $description;
139 
143  public $fk_contrat = 0;
144 
148  public $fk_project = 0;
149 
154  public $ref_client;
155 
159  public $extraparams = array();
160 
164  public $lines = array();
165 
169  const STATUS_DRAFT = 0;
170 
174  const STATUS_VALIDATED = 1;
175 
179  const STATUS_BILLED = 2;
180 
184  const STATUS_CLOSED = 3;
185 
186 
192  public function __construct($db)
193  {
194  $this->db = $db;
195  }
196 
197  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
203  public function load_state_board()
204  {
205  // phpcs:enable
206  global $user;
207 
208  $this->nb = array();
209  $clause = "WHERE";
210 
211  $sql = "SELECT count(fi.rowid) as nb";
212  $sql .= " FROM ".MAIN_DB_PREFIX."fichinter as fi";
213  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON fi.fk_soc = s.rowid";
214  if (empty($user->rights->societe->client->voir) && !$user->socid) {
215  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON s.rowid = sc.fk_soc";
216  $sql .= " WHERE sc.fk_user = ".((int) $user->id);
217  $clause = "AND";
218  }
219  $sql .= " ".$clause." fi.entity IN (".getEntity('intervention').")";
220 
221  $resql = $this->db->query($sql);
222  if ($resql) {
223  while ($obj = $this->db->fetch_object($resql)) {
224  $this->nb["interventions"] = $obj->nb;
225  }
226  $this->db->free($resql);
227  return 1;
228  } else {
229  dol_print_error($this->db);
230  $this->error = $this->db->error();
231  return -1;
232  }
233  }
234 
242  public function create($user, $notrigger = 0)
243  {
244  global $conf, $langs;
245 
246  $error = 0;
247 
248  dol_syslog(get_class($this)."::create ref=".$this->ref);
249 
250  // Check parameters
251  if (!empty($this->ref)) { // We check that ref is not already used
252  $result = self::isExistingObject($this->element, 0, $this->ref); // Check ref is not yet used
253  if ($result > 0) {
254  $this->error = 'ErrorRefAlreadyExists';
255  dol_syslog(get_class($this)."::create ".$this->error, LOG_WARNING);
256  $this->db->rollback();
257  return -1;
258  }
259  }
260  if (!is_numeric($this->duration)) {
261  $this->duration = 0;
262  }
263  if (isset($this->ref_client)) {
264  $this->ref_client = trim($this->ref_client);
265  }
266 
267  if ($this->socid <= 0) {
268  $this->error = 'ErrorFicheinterCompanyDoesNotExist';
269  dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR);
270  return -1;
271  }
272 
273  $soc = new Societe($this->db);
274  $result = $soc->fetch($this->socid);
275 
276  $now = dol_now();
277 
278  $this->db->begin();
279 
280  $sql = "INSERT INTO ".MAIN_DB_PREFIX."fichinter (";
281  $sql .= "fk_soc";
282  $sql .= ", datec";
283  $sql .= ", ref";
284  $sql .= ", ref_client";
285  $sql .= ", entity";
286  $sql .= ", fk_user_author";
287  $sql .= ", fk_user_modif";
288  $sql .= ", description";
289  $sql .= ", model_pdf";
290  $sql .= ", fk_projet";
291  $sql .= ", fk_contrat";
292  $sql .= ", fk_statut";
293  $sql .= ", note_private";
294  $sql .= ", note_public";
295  $sql .= ") ";
296  $sql .= " VALUES (";
297  $sql .= $this->socid;
298  $sql .= ", '".$this->db->idate($now)."'";
299  $sql .= ", '".$this->db->escape($this->ref)."'";
300  $sql .= ", ".($this->ref_client ? "'".$this->db->escape($this->ref_client)."'" : "null");
301  $sql .= ", ".((int) $conf->entity);
302  $sql .= ", ".((int) $user->id);
303  $sql .= ", ".((int) $user->id);
304  $sql .= ", ".($this->description ? "'".$this->db->escape($this->description)."'" : "null");
305  $sql .= ", '".$this->db->escape($this->model_pdf)."'";
306  $sql .= ", ".($this->fk_project ? ((int) $this->fk_project) : 0);
307  $sql .= ", ".($this->fk_contrat ? ((int) $this->fk_contrat) : 0);
308  $sql .= ", ".((int) $this->statut);
309  $sql .= ", ".($this->note_private ? "'".$this->db->escape($this->note_private)."'" : "null");
310  $sql .= ", ".($this->note_public ? "'".$this->db->escape($this->note_public)."'" : "null");
311  $sql .= ")";
312 
313  dol_syslog(get_class($this)."::create", LOG_DEBUG);
314  $result = $this->db->query($sql);
315  if ($result) {
316  $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."fichinter");
317 
318  if ($this->id) {
319  $this->ref = '(PROV'.$this->id.')';
320  $sql = 'UPDATE '.MAIN_DB_PREFIX."fichinter SET ref='".$this->db->escape($this->ref)."' WHERE rowid=".((int) $this->id);
321 
322  dol_syslog(get_class($this)."::create", LOG_DEBUG);
323  $resql = $this->db->query($sql);
324  if (!$resql) {
325  $error++;
326  }
327  }
328 
329  if (!$error) {
330  $result = $this->insertExtraFields();
331  if ($result < 0) {
332  $error++;
333  }
334  }
335 
336  // Add linked object
337  if (!$error && $this->origin && $this->origin_id) {
338  $ret = $this->add_object_linked();
339  if (!$ret) {
340  dol_print_error($this->db);
341  }
342  }
343 
344 
345  if (!$error && !$notrigger) {
346  // Call trigger
347  $result = $this->call_trigger('FICHINTER_CREATE', $user);
348  if ($result < 0) {
349  $error++;
350  }
351  // End call triggers
352  }
353 
354  if (!$error) {
355  $this->db->commit();
356  return $this->id;
357  } else {
358  $this->db->rollback();
359  $this->error = join(',', $this->errors);
360  dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR);
361  return -1;
362  }
363  } else {
364  $this->error = $this->db->error();
365  $this->db->rollback();
366  return -1;
367  }
368  }
369 
377  public function update($user, $notrigger = 0)
378  {
379  global $conf;
380 
381  if (!is_numeric($this->duration)) {
382  $this->duration = 0;
383  }
384  if (!dol_strlen($this->fk_project)) {
385  $this->fk_project = 0;
386  }
387  if (isset($this->ref_client)) {
388  $this->ref_client = trim($this->ref_client);
389  }
390 
391  $error = 0;
392 
393  $this->db->begin();
394 
395  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter SET ";
396  $sql .= "description = '".$this->db->escape($this->description)."'";
397  $sql .= ", duree = ".((int) $this->duration);
398  $sql .= ", ref_client = ".($this->ref_client ? "'".$this->db->escape($this->ref_client)."'" : "null");
399  $sql .= ", fk_projet = ".((int) $this->fk_project);
400  $sql .= ", note_private = ".($this->note_private ? "'".$this->db->escape($this->note_private)."'" : "null");
401  $sql .= ", note_public = ".($this->note_public ? "'".$this->db->escape($this->note_public)."'" : "null");
402  $sql .= ", fk_user_modif = ".((int) $user->id);
403  $sql .= " WHERE rowid = ".((int) $this->id);
404 
405  dol_syslog(get_class($this)."::update", LOG_DEBUG);
406  if ($this->db->query($sql)) {
407  if (!$error) {
408  $result = $this->insertExtraFields();
409  if ($result < 0) {
410  $error++;
411  }
412  }
413 
414  if (!$error && !$notrigger) {
415  // Call trigger
416  $result = $this->call_trigger('FICHINTER_MODIFY', $user);
417  if ($result < 0) {
418  $error++; $this->db->rollback(); return -1;
419  }
420  // End call triggers
421  }
422 
423  $this->db->commit();
424  return 1;
425  } else {
426  $this->error = $this->db->error();
427  $this->db->rollback();
428  return -1;
429  }
430  }
431 
439  public function fetch($rowid, $ref = '')
440  {
441  $sql = "SELECT f.rowid, f.ref, f.ref_client, f.description, f.fk_soc, f.fk_statut,";
442  $sql .= " f.datec, f.dateo, f.datee, f.datet, f.fk_user_author,";
443  $sql .= " f.date_valid as datev,";
444  $sql .= " f.tms as datem,";
445  $sql .= " f.duree, f.fk_projet as fk_project, f.note_public, f.note_private, f.model_pdf, f.last_main_doc, f.extraparams, fk_contrat, f.entity as entity";
446  $sql .= " FROM ".MAIN_DB_PREFIX."fichinter as f";
447  if ($ref) {
448  $sql .= " WHERE f.entity IN (".getEntity('intervention').")";
449  $sql .= " AND f.ref = '".$this->db->escape($ref)."'";
450  } else {
451  $sql .= " WHERE f.rowid = ".((int) $rowid);
452  }
453 
454  dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
455  $resql = $this->db->query($sql);
456  if ($resql) {
457  if ($this->db->num_rows($resql)) {
458  $obj = $this->db->fetch_object($resql);
459 
460  $this->id = $obj->rowid;
461  $this->ref = $obj->ref;
462  $this->ref_client = $obj->ref_client;
463  $this->description = $obj->description;
464  $this->socid = $obj->fk_soc;
465  $this->statut = $obj->fk_statut;
466  $this->duration = $obj->duree;
467  $this->datec = $this->db->jdate($obj->datec);
468  $this->dateo = $this->db->jdate($obj->dateo);
469  $this->datee = $this->db->jdate($obj->datee);
470  $this->datet = $this->db->jdate($obj->datet);
471  $this->datev = $this->db->jdate($obj->datev);
472  $this->datem = $this->db->jdate($obj->datem);
473  $this->fk_project = $obj->fk_project;
474  $this->note_public = $obj->note_public;
475  $this->note_private = $obj->note_private;
476  $this->model_pdf = $obj->model_pdf;
477  $this->modelpdf = $obj->model_pdf; // deprecated
478  $this->fk_contrat = $obj->fk_contrat;
479  $this->entity = $obj->entity;
480 
481  $this->user_creation = $obj->fk_user_author;
482 
483  $this->extraparams = (array) json_decode($obj->extraparams, true);
484 
485  $this->last_main_doc = $obj->last_main_doc;
486 
487  if ($this->statut == 0) {
488  $this->brouillon = 1;
489  }
490 
491  // Retrieve extrafields
492  $this->fetch_optionals();
493 
494  /*
495  * Lines
496  */
497  $result = $this->fetch_lines();
498  if ($result < 0) {
499  return -3;
500  }
501  $this->db->free($resql);
502  return 1;
503  }
504 
505  return 0;
506  } else {
507  $this->error = $this->db->lasterror();
508  return -1;
509  }
510  }
511 
518  public function setDraft($user)
519  {
520  $error = 0;
521 
522  // Protection
523  if ($this->statut <= self::STATUS_DRAFT) {
524  return 0;
525  }
526 
527  dol_syslog(get_class($this)."::setDraft", LOG_DEBUG);
528 
529  $this->oldcopy = dol_clone($this);
530 
531  $this->db->begin();
532 
533  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter";
534  $sql .= " SET fk_statut = ".self::STATUS_DRAFT;
535  $sql .= " WHERE rowid = ".((int) $this->id);
536 
537  $resql = $this->db->query($sql);
538  if ($resql) {
539  if (!$error) {
540  // Call trigger
541  $result = $this->call_trigger('FICHINTER_UNVALIDATE', $user);
542  if ($result < 0) {
543  $error++;
544  }
545  }
546 
547  if (!$error) {
548  $this->statut = self::STATUS_DRAFT;
549  $this->db->commit();
550  return 1;
551  } else {
552  $this->db->rollback();
553  return -1;
554  }
555  } else {
556  $this->db->rollback();
557  $this->error = $this->db->lasterror();
558  return -1;
559  }
560  }
561 
569  public function setValid($user, $notrigger = 0)
570  {
571  global $conf;
572  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
573 
574  $error = 0;
575 
576  if ($this->statut != 1) {
577  $this->db->begin();
578 
579  $now = dol_now();
580 
581  // Define new ref
582  if (!$error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
583  $num = $this->getNextNumRef($this->thirdparty);
584  } else {
585  $num = $this->ref;
586  }
587  $this->newref = dol_sanitizeFileName($num);
588 
589  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter";
590  $sql .= " SET fk_statut = 1";
591  $sql .= ", ref = '".$this->db->escape($num)."'";
592  $sql .= ", date_valid = '".$this->db->idate($now)."'";
593  $sql .= ", fk_user_valid = ".($user->id > 0 ? (int) $user->id : "null");
594  $sql .= " WHERE rowid = ".((int) $this->id);
595  $sql .= " AND entity = ".((int) $conf->entity);
596  $sql .= " AND fk_statut = 0";
597 
598  dol_syslog(get_class($this)."::setValid", LOG_DEBUG);
599  $resql = $this->db->query($sql);
600  if (!$resql) {
601  dol_print_error($this->db);
602  $error++;
603  }
604 
605  if (!$error && !$notrigger) {
606  // Call trigger
607  $result = $this->call_trigger('FICHINTER_VALIDATE', $user);
608  if ($result < 0) {
609  $error++;
610  }
611  // End call triggers
612  }
613 
614  if (!$error) {
615  $this->oldref = $this->ref;
616 
617  // Rename directory if dir was a temporary ref
618  if (preg_match('/^[\(]?PROV/i', $this->ref)) {
619  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
620 
621  // Now we rename also files into index
622  $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'ficheinter/".$this->db->escape($this->newref)."'";
623  $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'ficheinter/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
624  $resql = $this->db->query($sql);
625  if (!$resql) {
626  $error++; $this->error = $this->db->lasterror();
627  }
628 
629  // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
630  $oldref = dol_sanitizeFileName($this->ref);
631  $newref = dol_sanitizeFileName($num);
632  $dirsource = $conf->ficheinter->dir_output.'/'.$oldref;
633  $dirdest = $conf->ficheinter->dir_output.'/'.$newref;
634  if (!$error && file_exists($dirsource)) {
635  dol_syslog(get_class($this)."::setValid rename dir ".$dirsource." into ".$dirdest);
636 
637  if (@rename($dirsource, $dirdest)) {
638  dol_syslog("Rename ok");
639  // Rename docs starting with $oldref with $newref
640  $listoffiles = dol_dir_list($conf->ficheinter->dir_output.'/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
641  foreach ($listoffiles as $fileentry) {
642  $dirsource = $fileentry['name'];
643  $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
644  $dirsource = $fileentry['path'].'/'.$dirsource;
645  $dirdest = $fileentry['path'].'/'.$dirdest;
646  @rename($dirsource, $dirdest);
647  }
648  }
649  }
650  }
651  }
652 
653  // Set new ref and define current statut
654  if (!$error) {
655  $this->ref = $num;
656  $this->statut = 1;
657  $this->brouillon = 0;
658  $this->date_validation = $now;
659  $this->db->commit();
660  return 1;
661  } else {
662  $this->db->rollback();
663  dol_syslog(get_class($this)."::setValid ".$this->error, LOG_ERR);
664  return -1;
665  }
666  }
667 
668  return 0;
669  }
670 
676  public function getAmount()
677  {
678  global $db;
679 
680  $amount = 0;
681 
682  $this->author = new User($db);
683  $this->author->fetch($this->user_creation);
684 
685  $thm = $this->author->thm;
686 
687  foreach ($this->lines as $line) {
688  $amount += ($line->duration / 60 / 60 * $thm);
689  }
690 
691  return price2num($amount, 'MT');
692  }
693 
694 
706  public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
707  {
708  global $conf;
709 
710  $outputlangs->load("interventions");
711 
712  if (!dol_strlen($modele)) {
713  $modele = 'soleil';
714 
715  if (!empty($this->model_pdf)) {
716  $modele = $this->model_pdf;
717  } elseif (!empty($this->modelpdf)) { // deprecated
718  $modele = $this->modelpdf;
719  } elseif (!empty($conf->global->FICHEINTER_ADDON_PDF)) {
720  $modele = $conf->global->FICHEINTER_ADDON_PDF;
721  }
722  }
723 
724  $modelpath = "core/modules/fichinter/doc/";
725 
726  return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
727  }
728 
735  public function getLibStatut($mode = 0)
736  {
737  return $this->LibStatut((isset($this->statut) ? $this->statut : $this->status), $mode);
738  }
739 
740  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
748  public function LibStatut($status, $mode = 0)
749  {
750  // phpcs:enable
751  // Init/load array of translation of status
752  if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
753  global $langs;
754  $langs->load("fichinter");
755 
756  $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
757  $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated');
758  $this->labelStatus[self::STATUS_BILLED] = $langs->transnoentitiesnoconv('StatusInterInvoiced');
759  $this->labelStatus[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Done');
760  $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
761  $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated');
762  $this->labelStatusShort[self::STATUS_BILLED] = $langs->transnoentitiesnoconv('StatusInterInvoiced');
763  $this->labelStatusShort[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Done');
764  }
765 
766  $statuscode = 'status'.$status;
767  if ($status == self::STATUS_BILLED || $status == self::STATUS_CLOSED) {
768  $statuscode = 'status6';
769  }
770  return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statuscode, $mode);
771  }
772 
780  public function getTooltipContentArray($params)
781  {
782  global $conf, $langs;
783 
784  $langs->load('fichinter');
785 
786  $datas = [];
787  $datas['picto'] = img_picto('', $this->picto).' <u class="paddingrightonly">'.$langs->trans("Intervention").'</u>';
788  if (isset($this->status)) {
789  $datas['picto'] .= ' '.$this->getLibStatut(5);
790  }
791  $datas['ref'] = '<br><b>'.$langs->trans('Ref').':</b> '.$this->ref;
792 
793  return $datas;
794  }
795 
805  public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $save_lastsearch_value = -1)
806  {
807  global $conf, $langs, $hookmanager;
808 
809  $result = '';
810  $params = [
811  'id' => $this->id,
812  'objecttype' => $this->element,
813  ];
814  $classfortooltip = 'classfortooltip';
815  $dataparams = '';
816  if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
817  $classfortooltip = 'classforajaxtooltip';
818  $dataparams = ' data-params="'.dol_escape_htmltag(json_encode($params)).'"';
819  $label = '';
820  } else {
821  $label = implode($this->getTooltipContentArray($params));
822  }
823 
824  $url = DOL_URL_ROOT.'/fichinter/card.php?id='.$this->id;
825 
826  if ($option !== 'nolink') {
827  // Add param to save lastsearch_values or not
828  $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
829  if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
830  $add_save_lastsearch_values = 1;
831  }
832  if ($add_save_lastsearch_values) {
833  $url .= '&save_lastsearch_values=1';
834  }
835  }
836 
837  $linkclose = '';
838  if (empty($notooltip)) {
839  if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
840  $label = $langs->trans("ShowIntervention");
841  $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
842  }
843  $linkclose .= ($label ? ' title="'.dol_escape_htmltag($label, 1).'"' : ' title="tocomplete"');
844  $linkclose .= $dataparams.' class="'.$classfortooltip.'"';
845  }
846 
847  $linkstart = '<a href="'.$url.'"';
848  $linkstart .= $linkclose.'>';
849  $linkend = '</a>';
850 
851  $result .= $linkstart;
852  if ($withpicto) {
853  $result .= img_object(($notooltip ? '' : $label), $this->picto, ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : $dataparams.' class="'.(($withpicto != 2) ? 'paddingright ' : '').$classfortooltip.'"'), 0, 0, $notooltip ? 0 : 1);
854  }
855  if ($withpicto != 2) {
856  $result .= $this->ref;
857  }
858  $result .= $linkend;
859 
860  global $action;
861  $hookmanager->initHooks(array('interventiondao'));
862  $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
863  $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
864  if ($reshook > 0) {
865  $result = $hookmanager->resPrint;
866  } else {
867  $result .= $hookmanager->resPrint;
868  }
869 
870  return $result;
871  }
872 
873 
881  public function getNextNumRef($soc)
882  {
883  global $conf, $db, $langs;
884  $langs->load("interventions");
885 
886  if (!empty($conf->global->FICHEINTER_ADDON)) {
887  $mybool = false;
888 
889  $file = "mod_".$conf->global->FICHEINTER_ADDON.".php";
890  $classname = "mod_".$conf->global->FICHEINTER_ADDON;
891 
892  // Include file with class
893  $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
894 
895  foreach ($dirmodels as $reldir) {
896  $dir = dol_buildpath($reldir."core/modules/fichinter/");
897 
898  // Load file with numbering class (if found)
899  $mybool |= @include_once $dir.$file;
900  }
901 
902  if ($mybool === false) {
903  dol_print_error('', "Failed to include file ".$file);
904  return '';
905  }
906 
907  $obj = new $classname();
908  $numref = "";
909  $numref = $obj->getNextValue($soc, $this);
910 
911  if ($numref != "") {
912  return $numref;
913  } else {
914  dol_print_error($db, "Fichinter::getNextNumRef ".$obj->error);
915  return "";
916  }
917  } else {
918  $langs->load("errors");
919  print $langs->trans("Error")." ".$langs->trans("Error_FICHEINTER_ADDON_NotDefined");
920  return "";
921  }
922  }
923 
930  public function info($id)
931  {
932  $sql = "SELECT f.rowid,";
933  $sql .= " f.datec,";
934  $sql .= " f.tms as date_modification,";
935  $sql .= " f.date_valid as datev,";
936  $sql .= " f.fk_user_author,";
937  $sql .= " f.fk_user_modif as fk_user_modification,";
938  $sql .= " f.fk_user_valid";
939  $sql .= " FROM ".MAIN_DB_PREFIX."fichinter as f";
940  $sql .= " WHERE f.rowid = ".((int) $id);
941 
942  $resql = $this->db->query($sql);
943  if ($resql) {
944  if ($this->db->num_rows($resql)) {
945  $obj = $this->db->fetch_object($resql);
946 
947  $this->id = $obj->rowid;
948 
949  $this->date_creation = $this->db->jdate($obj->datec);
950  $this->date_modification = $this->db->jdate($obj->date_modification);
951  $this->date_validation = $this->db->jdate($obj->datev);
952 
953  $cuser = new User($this->db);
954  $cuser->fetch($obj->fk_user_author);
955  $this->user_creation = $cuser;
956 
957  if ($obj->fk_user_valid) {
958  $vuser = new User($this->db);
959  $vuser->fetch($obj->fk_user_valid);
960  $this->user_validation = $vuser;
961  }
962  if ($obj->fk_user_modification) {
963  $muser = new User($this->db);
964  $muser->fetch($obj->fk_user_modification);
965  $this->user_modification = $muser;
966  }
967  }
968  $this->db->free($resql);
969  } else {
970  dol_print_error($this->db);
971  }
972  }
973 
981  public function delete(User $user, $notrigger = 0)
982  {
983  global $conf, $langs;
984  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
985 
986  $error = 0;
987 
988  $this->db->begin();
989 
990  if (!$error && !$notrigger) {
991  // Call trigger
992  $result = $this->call_trigger('FICHINTER_DELETE', $user);
993  if ($result < 0) {
994  $error++; $this->db->rollback(); return -1;
995  }
996  // End call triggers
997  }
998 
999  // Delete linked object
1000  if (!$error) {
1001  $res = $this->deleteObjectLinked();
1002  if ($res < 0) {
1003  $error++;
1004  }
1005  }
1006 
1007  // Delete linked contacts
1008  if (!$error) {
1009  $res = $this->delete_linked_contact();
1010  if ($res < 0) {
1011  $this->error = 'ErrorFailToDeleteLinkedContact';
1012  $error++;
1013  }
1014  }
1015 
1016  if (!$error) {
1017  $main = MAIN_DB_PREFIX.'fichinterdet';
1018  $ef = $main."_extrafields";
1019  $sql = "DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_fichinter = ".((int) $this->id).")";
1020 
1021  $resql = $this->db->query($sql);
1022  if (!$resql) {
1023  $error++;
1024  }
1025  }
1026 
1027  if (!$error) {
1028  $sql = "DELETE FROM ".MAIN_DB_PREFIX."fichinterdet";
1029  $sql .= " WHERE fk_fichinter = ".((int) $this->id);
1030 
1031  $resql = $this->db->query($sql);
1032  if (!$resql) {
1033  $error++;
1034  }
1035  }
1036 
1037  if (!$error) {
1038  // Remove extrafields
1039  $res = $this->deleteExtraFields();
1040  if ($res < 0) {
1041  $error++;
1042  }
1043  }
1044 
1045  if (!$error) {
1046  // Delete object
1047  $sql = "DELETE FROM ".MAIN_DB_PREFIX."fichinter";
1048  $sql .= " WHERE rowid = ".((int) $this->id);
1049 
1050  dol_syslog("Fichinter::delete", LOG_DEBUG);
1051  $resql = $this->db->query($sql);
1052  if (!$resql) {
1053  $error++;
1054  }
1055  }
1056 
1057  if (!$error) {
1058  // Delete record into ECM index (Note that delete is also done when deleting files with the dol_delete_dir_recursive
1059  $this->deleteEcmFiles();
1060 
1061  // Remove directory with files
1062  $fichinterref = dol_sanitizeFileName($this->ref);
1063  if ($conf->ficheinter->dir_output) {
1064  $dir = $conf->ficheinter->dir_output."/".$fichinterref;
1065  $file = $conf->ficheinter->dir_output."/".$fichinterref."/".$fichinterref.".pdf";
1066  if (file_exists($file)) {
1067  dol_delete_preview($this);
1068 
1069  if (!dol_delete_file($file, 0, 0, 0, $this)) { // For triggers
1070  $langs->load("errors");
1071  $this->error = $langs->trans("ErrorFailToDeleteFile", $file);
1072  return 0;
1073  }
1074  }
1075  if (file_exists($dir)) {
1076  if (!dol_delete_dir_recursive($dir)) {
1077  $langs->load("errors");
1078  $this->error = $langs->trans("ErrorFailToDeleteDir", $dir);
1079  return 0;
1080  }
1081  }
1082  }
1083  }
1084 
1085  if (!$error) {
1086  $this->db->commit();
1087  return 1;
1088  } else {
1089  $this->db->rollback();
1090  return -1;
1091  }
1092  }
1093 
1094  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1102  public function set_date_delivery($user, $date_delivery)
1103  {
1104  // phpcs:enable
1105  if ($user->rights->ficheinter->creer) {
1106  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter ";
1107  $sql .= " SET datei = '".$this->db->idate($date_delivery)."'";
1108  $sql .= " WHERE rowid = ".((int) $this->id);
1109  $sql .= " AND fk_statut = 0";
1110 
1111  if ($this->db->query($sql)) {
1112  $this->date_delivery = $date_delivery;
1113  return 1;
1114  } else {
1115  $this->error = $this->db->error();
1116  dol_syslog("Fichinter::set_date_delivery Erreur SQL");
1117  return -1;
1118  }
1119  }
1120 
1121  return 0;
1122  }
1123 
1124  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1132  public function set_description($user, $description)
1133  {
1134  // phpcs:enable
1135  if ($user->rights->ficheinter->creer) {
1136  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter ";
1137  $sql .= " SET description = '".$this->db->escape($description)."',";
1138  $sql .= " fk_user_modif = ".$user->id;
1139  $sql .= " WHERE rowid = ".((int) $this->id);
1140 
1141  if ($this->db->query($sql)) {
1142  $this->description = $description;
1143  return 1;
1144  } else {
1145  $this->error = $this->db->error();
1146  dol_syslog("Fichinter::set_description Erreur SQL");
1147  return -1;
1148  }
1149  }
1150 
1151  return 0;
1152  }
1153 
1154 
1155  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1163  public function set_contrat($user, $contractid)
1164  {
1165  // phpcs:enable
1166  if ($user->rights->ficheinter->creer) {
1167  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter ";
1168  $sql .= " SET fk_contrat = ".((int) $contractid);
1169  $sql .= " WHERE rowid = ".((int) $this->id);
1170 
1171  if ($this->db->query($sql)) {
1172  $this->fk_contrat = $contractid;
1173  return 1;
1174  } else {
1175  $this->error = $this->db->error();
1176  return -1;
1177  }
1178  }
1179 
1180  return -2;
1181  }
1182 
1183 
1184 
1192  public function createFromClone(User $user, $socid = 0)
1193  {
1194  global $hookmanager;
1195 
1196  $error = 0;
1197 
1198  $this->db->begin();
1199 
1200  // get extrafields so they will be clone
1201  foreach ($this->lines as $line) {
1202  $line->fetch_optionals();
1203  }
1204 
1205  // Load source object
1206  $objFrom = clone $this;
1207 
1208  // Change socid if needed
1209  if (!empty($socid) && $socid != $this->socid) {
1210  $objsoc = new Societe($this->db);
1211 
1212  if ($objsoc->fetch($socid) > 0) {
1213  $this->socid = $objsoc->id;
1214  //$this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1215  //$this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1216  $this->fk_project = '';
1217  $this->fk_delivery_address = '';
1218  }
1219 
1220  // TODO Change product price if multi-prices
1221  }
1222 
1223  $this->id = 0;
1224  $this->ref = '';
1225  $this->statut = 0;
1226 
1227  // Clear fields
1228  $this->user_author_id = $user->id;
1229  $this->user_valid = 0;
1230  $this->date_creation = '';
1231  $this->date_validation = '';
1232  $this->ref_client = '';
1233 
1234  // Create clone
1235  $this->context['createfromclone'] = 'createfromclone';
1236  $result = $this->create($user);
1237  if ($result < 0) {
1238  $error++;
1239  }
1240 
1241  if (!$error) {
1242  // Add lines because it is not included into create function
1243  foreach ($this->lines as $line) {
1244  $this->addline($user, $this->id, $line->desc, $line->datei, $line->duration, $line->array_options);
1245  }
1246 
1247  // Hook of thirdparty module
1248  if (is_object($hookmanager)) {
1249  $parameters = array('objFrom'=>$objFrom);
1250  $action = '';
1251  $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1252  if ($reshook < 0) {
1253  $this->setErrorsFromObject($hookmanager);
1254  $error++;
1255  }
1256  }
1257  }
1258 
1259  unset($this->context['createfromclone']);
1260 
1261  // End
1262  if (!$error) {
1263  $this->db->commit();
1264  return $this->id;
1265  } else {
1266  $this->db->rollback();
1267  return -1;
1268  }
1269  }
1270 
1271 
1283  public function addline($user, $fichinterid, $desc, $date_intervention, $duration, $array_options = '')
1284  {
1285  dol_syslog(get_class($this)."::addline $fichinterid, $desc, $date_intervention, $duration");
1286 
1287  if ($this->statut == self::STATUS_DRAFT) {
1288  $this->db->begin();
1289 
1290  // Insertion ligne
1291  $line = new FichinterLigne($this->db);
1292 
1293  $line->fk_fichinter = $fichinterid;
1294  $line->desc = $desc;
1295  $line->date = $date_intervention;
1296  $line->datei = $date_intervention; // For backward compatibility
1297  $line->duration = $duration;
1298 
1299  if (is_array($array_options) && count($array_options) > 0) {
1300  $line->array_options = $array_options;
1301  }
1302 
1303  $result = $line->insert($user);
1304 
1305  if ($result >= 0) {
1306  $this->db->commit();
1307  return 1;
1308  } else {
1309  $this->error = $this->db->error();
1310  $this->db->rollback();
1311  return -1;
1312  }
1313  }
1314 
1315  return 0;
1316  }
1317 
1318 
1326  public function initAsSpecimen()
1327  {
1328  global $langs;
1329 
1330  $now = dol_now();
1331 
1332  // Initialise parametres
1333  $this->id = 0;
1334  $this->ref = 'SPECIMEN';
1335  $this->ref_client = 'SPECIMEN CLIENT';
1336  $this->specimen = 1;
1337  $this->socid = 1;
1338  $this->datec = $now;
1339  $this->note_private = 'Private note';
1340  $this->note_public = 'SPECIMEN';
1341  $this->duration = 0;
1342  $nbp = 25;
1343  $xnbp = 0;
1344  while ($xnbp < $nbp) {
1345  $line = new FichinterLigne($this->db);
1346  $line->desc = $langs->trans("Description")." ".$xnbp;
1347  $line->date = ($now - 3600 * (1 + $xnbp));
1348  $line->datei = ($now - 3600 * (1 + $xnbp)); // For backward compatibility
1349  $line->duration = 600;
1350  $line->fk_fichinter = 0;
1351  $this->lines[$xnbp] = $line;
1352  $xnbp++;
1353 
1354  $this->duration += $line->duration;
1355  }
1356  }
1357 
1358  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1364  public function fetch_lines()
1365  {
1366  // phpcs:enable
1367  $this->lines = array();
1368 
1369  $sql = "SELECT rowid, fk_fichinter, description, duree, date, rang";
1370  $sql .= " FROM ".MAIN_DB_PREFIX."fichinterdet";
1371  $sql .= " WHERE fk_fichinter = ".((int) $this->id);
1372  $sql .= " ORDER BY rang ASC, date ASC";
1373 
1374  dol_syslog(get_class($this)."::fetch_lines", LOG_DEBUG);
1375 
1376  $resql = $this->db->query($sql);
1377  if ($resql) {
1378  $num = $this->db->num_rows($resql);
1379  $i = 0;
1380  while ($i < $num) {
1381  $objp = $this->db->fetch_object($resql);
1382 
1383  $line = new FichinterLigne($this->db);
1384  $line->id = $objp->rowid;
1385  $line->fk_fichinter = $objp->fk_fichinter;
1386  $line->desc = $objp->description;
1387  $line->duration = $objp->duree;
1388  //For invoicing we calculing hours
1389  $line->qty = round($objp->duree / 3600, 2);
1390  $line->date = $this->db->jdate($objp->date);
1391  $line->datei = $this->db->jdate($objp->date); // For backward compatibility
1392  $line->rang = $objp->rang;
1393  $line->product_type = 1;
1394  $line->fetch_optionals();
1395 
1396  $this->lines[$i] = $line;
1397  $i++;
1398  }
1399  $this->db->free($resql);
1400 
1401  return 1;
1402  } else {
1403  $this->error = $this->db->error();
1404  return -1;
1405  }
1406  }
1407 
1416  public static function replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
1417  {
1418  $tables = array(
1419  'fichinter'
1420  );
1421 
1422  return CommonObject::commonReplaceThirdparty($dbs, $origin_id, $dest_id, $tables);
1423  }
1424 
1433  public function setRefClient($user, $ref_client, $notrigger = 0)
1434  {
1435  // phpcs:enable
1436  if (!empty($user->rights->ficheinter->creer)) {
1437  $error = 0;
1438 
1439  $this->db->begin();
1440 
1441  $this->oldcopy = dol_clone($this);
1442 
1443  $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ref_client = ".(empty($ref_client) ? 'NULL' : "'".$this->db->escape($ref_client)."'");
1444  $sql .= " WHERE rowid = ".((int) $this->id);
1445 
1446  dol_syslog(__METHOD__.' $this->id='.$this->id.', ref_client='.$ref_client, LOG_DEBUG);
1447  $resql = $this->db->query($sql);
1448  if (!$resql) {
1449  $this->errors[] = $this->db->error();
1450  $error++;
1451  }
1452 
1453  if (!$error) {
1454  $this->ref_client = $ref_client;
1455  }
1456 
1457  if (!$notrigger && empty($error)) {
1458  // Call trigger
1459  $result = $this->call_trigger('FICHINTER_MODIFY', $user);
1460  if ($result < 0) {
1461  $error++;
1462  }
1463  // End call triggers
1464  }
1465 
1466  if (!$error) {
1467  $this->db->commit();
1468  return 1;
1469  } else {
1470  foreach ($this->errors as $errmsg) {
1471  dol_syslog(__METHOD__.' Error: '.$errmsg, LOG_ERR);
1472  $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
1473  }
1474  $this->db->rollback();
1475  return -1 * $error;
1476  }
1477  } else {
1478  return -1;
1479  }
1480  }
1481 
1489  public function getKanbanView($option = '', $arraydata = null)
1490  {
1491  global $langs;
1492 
1493  $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
1494 
1495  $return = '<div class="box-flex-item box-flex-grow-zero">';
1496  $return .= '<div class="info-box info-box-sm">';
1497  $return .= '<span class="info-box-icon bg-infobox-action">';
1498  $return .= img_picto('', $this->picto);
1499  $return .= '</span>';
1500  $return .= '<div class="info-box-content">';
1501  $return .= '<span class="info-box-ref">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
1502  $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
1503  if (!empty($arraydata['thirdparty'])) {
1504  $tmpthirdparty = $arraydata['thirdparty'];
1505  $return .= '<br><span class="info-box-label">'.$tmpthirdparty->getNomUrl(1).'</span>';
1506  }
1507  if (property_exists($this, 'duration')) {
1508  $return .= '<br><span class="info-box-label ">'.$langs->trans("Duration").' : '.convertSecondToTime($this->duration, 'allhourmin').'</span>';
1509  }
1510  if (method_exists($this, 'getLibStatut')) {
1511  $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
1512  }
1513  $return .= '</div>';
1514  $return .= '</div>';
1515  $return .= '</div>';
1516  return $return;
1517  }
1518 }
1519 
1524 {
1528  public $db;
1529 
1533  public $error = '';
1534 
1535  // From llx_fichinterdet
1539  public $fk_fichinter;
1540 
1541  public $desc; // Description ligne
1542 
1546  public $date; // Date intervention
1551  public $datei; // Date intervention
1552 
1553  public $duration; // Duration of intervention
1554  public $rang = 0;
1555  public $tva_tx;
1556  public $subprice;
1557 
1561  public $element = 'fichinterdet';
1562 
1566  public $table_element = 'fichinterdet';
1567 
1571  public $fk_element = 'fk_fichinter';
1572 
1573 
1574 
1580  public function __construct($db)
1581  {
1582  $this->db = $db;
1583  }
1584 
1591  public function fetch($rowid)
1592  {
1593  dol_syslog("FichinterLigne::fetch", LOG_DEBUG);
1594 
1595  $sql = 'SELECT ft.rowid, ft.fk_fichinter, ft.description, ft.duree, ft.rang, ft.date';
1596  $sql .= ' FROM '.MAIN_DB_PREFIX.'fichinterdet as ft';
1597  $sql .= ' WHERE ft.rowid = '.((int) $rowid);
1598 
1599  $resql = $this->db->query($sql);
1600  if ($resql) {
1601  $objp = $this->db->fetch_object($resql);
1602  $this->rowid = $objp->rowid;
1603  $this->id = $objp->rowid;
1604  $this->fk_fichinter = $objp->fk_fichinter;
1605  $this->date = $this->db->jdate($objp->date);
1606  $this->datei = $this->db->jdate($objp->date); // For backward compatibility
1607  $this->desc = $objp->description;
1608  $this->duration = $objp->duree;
1609  $this->rang = $objp->rang;
1610 
1611  $this->db->free($resql);
1612 
1613  $this->fetch_optionals();
1614 
1615  return 1;
1616  } else {
1617  $this->error = $this->db->error().' sql='.$sql;
1618  return -1;
1619  }
1620  }
1621 
1629  public function insert($user, $notrigger = 0)
1630  {
1631  $error = 0;
1632 
1633  dol_syslog("FichinterLigne::insert rang=".$this->rang);
1634 
1635  if (empty($this->date) && !empty($this->datei)) { // For backward compatibility
1636  $this->date = $this->datei;
1637  }
1638 
1639  $this->db->begin();
1640 
1641  $rangToUse = $this->rang;
1642  if ($rangToUse == -1) {
1643  // Recupere rang max de la ligne d'intervention dans $rangmax
1644  $sql = 'SELECT max(rang) as max FROM '.MAIN_DB_PREFIX.'fichinterdet';
1645  $sql .= ' WHERE fk_fichinter = '.((int) $this->fk_fichinter);
1646  $resql = $this->db->query($sql);
1647  if ($resql) {
1648  $obj = $this->db->fetch_object($resql);
1649  $rangToUse = $obj->max + 1;
1650  } else {
1651  dol_print_error($this->db);
1652  $this->db->rollback();
1653  return -1;
1654  }
1655  }
1656 
1657  // Insertion dans base de la ligne
1658  $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'fichinterdet';
1659  $sql .= ' (fk_fichinter, description, date, duree, rang)';
1660  $sql .= " VALUES (".((int) $this->fk_fichinter).",";
1661  $sql .= " '".$this->db->escape($this->desc)."',";
1662  $sql .= " '".$this->db->idate($this->date)."',";
1663  $sql .= " ".((int) $this->duration).",";
1664  $sql .= ' '.((int) $rangToUse);
1665  $sql .= ')';
1666 
1667  dol_syslog("FichinterLigne::insert", LOG_DEBUG);
1668  $resql = $this->db->query($sql);
1669  if ($resql) {
1670  $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.'fichinterdet');
1671  $this->rowid = $this->id;
1672 
1673  if (!$error) {
1674  $result = $this->insertExtraFields();
1675  if ($result < 0) {
1676  $error++;
1677  }
1678  }
1679 
1680 
1681  $result = $this->update_total();
1682 
1683  if ($result > 0) {
1684  $this->rang = $rangToUse;
1685 
1686  if (!$notrigger) {
1687  // Call trigger
1688  $result = $this->call_trigger('LINEFICHINTER_CREATE', $user);
1689  if ($result < 0) {
1690  $error++;
1691  }
1692  // End call triggers
1693  }
1694  }
1695 
1696  if (!$error) {
1697  $this->db->commit();
1698  return $result;
1699  } else {
1700  $this->db->rollback();
1701  return -1;
1702  }
1703  } else {
1704  $this->error = $this->db->error()." sql=".$sql;
1705  $this->db->rollback();
1706  return -1;
1707  }
1708  }
1709 
1710 
1718  public function update($user, $notrigger = 0)
1719  {
1720  $error = 0;
1721 
1722  if (empty($this->date) && !empty($this->datei)) { // For backward compatibility
1723  $this->date = $this->datei;
1724  }
1725 
1726  $this->db->begin();
1727 
1728  // Mise a jour ligne en base
1729  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinterdet SET";
1730  $sql .= " description = '".$this->db->escape($this->desc)."',";
1731  $sql .= " date = '".$this->db->idate($this->date)."',";
1732  $sql .= " duree = ".((int) $this->duration).",";
1733  $sql .= " rang = ".((int) $this->rang);
1734  $sql .= " WHERE rowid = ".((int) $this->id);
1735 
1736  dol_syslog("FichinterLigne::update", LOG_DEBUG);
1737  $resql = $this->db->query($sql);
1738  if ($resql) {
1739  if (!$error) {
1740  $result = $this->insertExtraFields();
1741  if ($result < 0) {
1742  $error++;
1743  }
1744  }
1745 
1746  $result = $this->update_total();
1747  if ($result > 0) {
1748  if (!$notrigger) {
1749  // Call trigger
1750  $result = $this->call_trigger('LINEFICHINTER_MODIFY', $user);
1751  if ($result < 0) {
1752  $error++;
1753  }
1754  // End call triggers
1755  }
1756  }
1757 
1758  if (!$error) {
1759  $this->db->commit();
1760  return $result;
1761  } else {
1762  $this->error = $this->db->lasterror();
1763  $this->db->rollback();
1764  return -1;
1765  }
1766  } else {
1767  $this->error = $this->db->lasterror();
1768  $this->db->rollback();
1769  return -1;
1770  }
1771  }
1772 
1773  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1779  public function update_total()
1780  {
1781  // phpcs:enable
1782  global $conf;
1783 
1784  $this->db->begin();
1785 
1786  $sql = "SELECT SUM(duree) as total_duration, min(date) as dateo, max(date) as datee ";
1787  $sql .= " FROM ".MAIN_DB_PREFIX."fichinterdet";
1788  $sql .= " WHERE fk_fichinter=".((int) $this->fk_fichinter);
1789 
1790  dol_syslog("FichinterLigne::update_total", LOG_DEBUG);
1791  $resql = $this->db->query($sql);
1792  if ($resql) {
1793  $obj = $this->db->fetch_object($resql);
1794  $total_duration = 0;
1795  if (!empty($obj->total_duration)) {
1796  $total_duration = $obj->total_duration;
1797  }
1798 
1799  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter";
1800  $sql .= " SET duree = ".((int) $total_duration);
1801  $sql .= " , dateo = ".(!empty($obj->dateo) ? "'".$this->db->escape($obj->dateo)."'" : "null");
1802  $sql .= " , datee = ".(!empty($obj->datee) ? "'".$this->db->escape($obj->datee)."'" : "null");
1803  $sql .= " WHERE rowid = ".((int) $this->fk_fichinter);
1804 
1805  dol_syslog("FichinterLigne::update_total", LOG_DEBUG);
1806  $resql = $this->db->query($sql);
1807  if ($resql) {
1808  $this->db->commit();
1809  return 1;
1810  } else {
1811  $this->error = $this->db->error();
1812  $this->db->rollback();
1813  return -2;
1814  }
1815  } else {
1816  $this->error = $this->db->error();
1817  $this->db->rollback();
1818  return -1;
1819  }
1820  }
1821 
1829  public function deleteline($user, $notrigger = 0)
1830  {
1831  global $langs, $conf;
1832 
1833  $error = 0;
1834 
1835  if ($this->statut == 0) {
1836  dol_syslog(get_class($this)."::deleteline lineid=".$this->id);
1837  $this->db->begin();
1838 
1839  $result = $this->deleteExtraFields();
1840  if ($result < 0) {
1841  $error++;
1842  $this->db->rollback();
1843  return -1;
1844  }
1845 
1846  $sql = "DELETE FROM ".MAIN_DB_PREFIX."fichinterdet WHERE rowid = ".((int) $this->id);
1847  $resql = $this->db->query($sql);
1848 
1849  if ($resql) {
1850  $result = $this->update_total();
1851  if ($result > 0) {
1852  if (!$notrigger) {
1853  // Call trigger
1854  $result = $this->call_trigger('LINEFICHINTER_DELETE', $user);
1855  if ($result < 0) {
1856  $error++; $this->db->rollback(); return -1;
1857  }
1858  // End call triggers
1859  }
1860 
1861  $this->db->commit();
1862  return $result;
1863  } else {
1864  $this->db->rollback();
1865  return -1;
1866  }
1867  } else {
1868  $this->error = $this->db->error()." sql=".$sql;
1869  $this->db->rollback();
1870  return -1;
1871  }
1872  } else {
1873  return -2;
1874  }
1875  }
1876 }
Societe
Class to manage third parties objects (customers, suppliers, prospects...)
Definition: societe.class.php:50
Fichinter\set_description
set_description($user, $description)
Define the label of the intervention.
Definition: fichinter.class.php:1132
FichinterLigne\update_total
update_total()
Update total duration into llx_fichinter.
Definition: fichinter.class.php:1779
dol_sanitizeFileName
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
Definition: functions.lib.php:1282
description
print *****$script_file(".$version.") pid cd cd cd description as description
Definition: email_expire_services_to_customers.php:83
dol_delete_dir_recursive
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
Definition: files.lib.php:1483
Fichinter\STATUS_CLOSED
const STATUS_CLOSED
Closed.
Definition: fichinter.class.php:184
DoliDB
Class to manage Dolibarr database access.
Definition: DoliDB.class.php:30
Fichinter\fetch_lines
fetch_lines()
Load array lines ->lines.
Definition: fichinter.class.php:1364
$sql
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)) $sql
Social contributions to pay.
Definition: index.php:745
Fichinter\LibStatut
LibStatut($status, $mode=0)
Returns the label of a status.
Definition: fichinter.class.php:748
FichinterLigne\fetch
fetch($rowid)
Retrieve the line of intervention.
Definition: fichinter.class.php:1591
dol_print_error
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
Definition: functions.lib.php:5052
CommonObject\setErrorsFromObject
setErrorsFromObject($object)
setErrorsFromObject
Definition: commonobject.class.php:711
FichinterLigne\update
update($user, $notrigger=0)
Update intervention into database.
Definition: fichinter.class.php:1718
dol_buildpath
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
Definition: functions.lib.php:1117
dol_dir_list
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
Fichinter\STATUS_BILLED
const STATUS_BILLED
Billed.
Definition: fichinter.class.php:179
CommonObject\deleteObjectLinked
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='', $f_user=null, $notrigger=0)
Delete all links between an object $this.
Definition: commonobject.class.php:4381
Fichinter\setValid
setValid($user, $notrigger=0)
Validate a intervention.
Definition: fichinter.class.php:569
dol_clone
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
Definition: functions.lib.php:1214
CommonObjectLine
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Definition: commonobjectline.class.php:32
CommonObject
Parent class of all other business classes (invoices, contracts, proposals, orders,...
Definition: commonobject.class.php:45
price2num
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
Definition: functions.lib.php:5897
Fichinter\load_state_board
load_state_board()
Load indicators into this->nb for board.
Definition: fichinter.class.php:203
convertSecondToTime
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
Definition: date.lib.php:239
img_picto
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
Definition: functions.lib.php:4082
rowid
print *****$script_file(".$version.") pid c cd cd cd description as p label as s rowid
Definition: email_expire_services_to_representatives.php:79
CommonObject\commonGenerateDocument
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
Definition: commonobject.class.php:5572
FichinterLigne\insert
insert($user, $notrigger=0)
Insert the line into database.
Definition: fichinter.class.php:1629
dol_delete_file
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
Definition: files.lib.php:1332
getEntity
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
Definition: functions.lib.php:225
CommonObject\insertExtraFields
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
Definition: commonobject.class.php:6348
CommonObject\isExistingObject
static isExistingObject($element, $id, $ref='', $ref_ext='')
Check an object id/ref exists If you don't need/want to instantiate object and just need to know if o...
Definition: commonobject.class.php:669
CommonObject\delete_linked_contact
delete_linked_contact($source='', $code='')
Delete all links between an object $this and all its contacts in llx_element_contact.
Definition: commonobject.class.php:1427
Fichinter\getLibStatut
getLibStatut($mode=0)
Returns the label status.
Definition: fichinter.class.php:735
FichinterLigne
Class to manage intervention lines.
Definition: fichinter.class.php:1523
CommonObject\deleteEcmFiles
deleteEcmFiles($mode=0)
Delete related files of object in database.
Definition: commonobject.class.php:10322
Fichinter\getAmount
getAmount()
Returns amount based on user thm.
Definition: fichinter.class.php:676
dol_syslog
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
Definition: functions.lib.php:1689
Fichinter\create
create($user, $notrigger=0)
Create an intervention into data base.
Definition: fichinter.class.php:242
Fichinter\getTooltipContentArray
getTooltipContentArray($params)
getTooltipContentArray
Definition: fichinter.class.php:780
Fichinter\replaceThirdparty
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
Definition: fichinter.class.php:1416
Fichinter\info
info($id)
Load information on object.
Definition: fichinter.class.php:930
CommonObject\fetch_optionals
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
Definition: commonobject.class.php:6197
Fichinter\setDraft
setDraft($user)
Set status to draft.
Definition: fichinter.class.php:518
Fichinter\addline
addline($user, $fichinterid, $desc, $date_intervention, $duration, $array_options='')
Adding a line of intervention into data base.
Definition: fichinter.class.php:1283
dol_strlen
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
Definition: functions.lib.php:3944
Fichinter
Class to manage interventions.
Definition: fichinter.class.php:37
Fichinter\createFromClone
createFromClone(User $user, $socid=0)
Load an object from its id and create a new one in database.
Definition: fichinter.class.php:1192
ref
$object ref
Definition: info.php:78
User
Class to manage Dolibarr users.
Definition: user.class.php:46
CommonObject\deleteExtraFields
deleteExtraFields()
Delete all extra fields values for the current object.
Definition: commonobject.class.php:6308
Fichinter\fetch
fetch($rowid, $ref='')
Fetch a intervention.
Definition: fichinter.class.php:439
Fichinter\STATUS_DRAFT
const STATUS_DRAFT
Draft status.
Definition: fichinter.class.php:169
dol_delete_preview
dol_delete_preview($object)
Delete all preview files linked to object instance.
Definition: files.lib.php:1535
CommonObject\add_object_linked
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
Definition: commonobject.class.php:3971
dolGetStatus
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
Definition: functions.lib.php:10863
Fichinter\generateDocument
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
Definition: fichinter.class.php:706
Fichinter\$table_ref_field
$table_ref_field
{}
Definition: fichinter.class.php:97
img_object
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
Definition: functions.lib.php:4419
Fichinter\STATUS_VALIDATED
const STATUS_VALIDATED
Validated status.
Definition: fichinter.class.php:174
Fichinter\update
update($user, $notrigger=0)
Update an intervention.
Definition: fichinter.class.php:377
Fichinter\getNextNumRef
getNextNumRef($soc)
Returns the next non used reference of intervention depending on the module numbering assets within F...
Definition: fichinter.class.php:881
dol_now
dol_now($mode='auto')
Return date for now.
Definition: functions.lib.php:3003
Fichinter\setRefClient
setRefClient($user, $ref_client, $notrigger=0)
Set customer reference number.
Definition: fichinter.class.php:1433
Fichinter\initAsSpecimen
initAsSpecimen()
Initialise an instance with random values.
Definition: fichinter.class.php:1326
CommonObject\call_trigger
call_trigger($triggerName, $user)
Call trigger based on this instance.
Definition: commonobject.class.php:5981
Fichinter\getKanbanView
getKanbanView($option='', $arraydata=null)
Return clicable link of object (with eventually picto)
Definition: fichinter.class.php:1489
Fichinter\set_date_delivery
set_date_delivery($user, $date_delivery)
Defines a delivery date of intervention.
Definition: fichinter.class.php:1102
getDolGlobalInt
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
Definition: functions.lib.php:116
Fichinter\__construct
__construct($db)
Constructor.
Definition: fichinter.class.php:192
CommonObject\commonReplaceThirdparty
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
Definition: commonobject.class.php:8705
Fichinter\getNomUrl
getNomUrl($withpicto=0, $option='', $notooltip=0, $save_lastsearch_value=-1)
Return clicable name (with picto eventually)
Definition: fichinter.class.php:805
Fichinter\set_contrat
set_contrat($user, $contractid)
Link intervention to a contract.
Definition: fichinter.class.php:1163
FichinterLigne\deleteline
deleteline($user, $notrigger=0)
Delete a intervention line.
Definition: fichinter.class.php:1829
FichinterLigne\__construct
__construct($db)
Constructor.
Definition: fichinter.class.php:1580