dolibarr  19.0.0-dev
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  'dateo' =>array('type'=>'date', 'label'=>'Dateo', 'enabled'=>1, 'visible'=>-1, 'position'=>85),
56  'datee' =>array('type'=>'date', 'label'=>'Datee', 'enabled'=>1, 'visible'=>-1, 'position'=>90),
57  'datet' =>array('type'=>'date', 'label'=>'Datet', 'enabled'=>1, 'visible'=>-1, 'position'=>95),
58  'duree' =>array('type'=>'double', 'label'=>'Duree', 'enabled'=>1, 'visible'=>-1, 'position'=>100),
59  'description' =>array('type'=>'html', 'label'=>'Description', 'enabled'=>1, 'visible'=>-1, 'position'=>105, 'showoncombobox'=>2),
60  'note_private' =>array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>110),
61  'note_public' =>array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>115),
62  'model_pdf' =>array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>1, 'visible'=>0, 'position'=>120),
63  'last_main_doc' =>array('type'=>'varchar(255)', 'label'=>'Last main doc', 'enabled'=>1, 'visible'=>-1, 'position'=>125),
64  'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>130),
65  'extraparams' =>array('type'=>'varchar(255)', 'label'=>'Extraparams', 'enabled'=>1, 'visible'=>-1, 'position'=>135),
66  'fk_statut' =>array('type'=>'integer', 'label'=>'Fk statut', 'enabled'=>1, 'visible'=>-1, 'position'=>500),
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 
806  public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $save_lastsearch_value = -1, $morecss = '')
807  {
808  global $conf, $langs, $hookmanager;
809 
810  if (!empty($conf->dol_no_mouse_hover)) {
811  $notooltip = 1; // Force disable tooltips
812  }
813 
814  $result = '';
815  $params = [
816  'id' => $this->id,
817  'objecttype' => $this->element,
818  'option' => $option,
819  ];
820  $classfortooltip = 'classfortooltip';
821  $dataparams = '';
822  if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
823  $classfortooltip = 'classforajaxtooltip';
824  $dataparams = ' data-params="'.dol_escape_htmltag(json_encode($params)).'"';
825  $label = '';
826  } else {
827  $label = implode($this->getTooltipContentArray($params));
828  }
829 
830  $url = DOL_URL_ROOT.'/fichinter/card.php?id='.$this->id;
831 
832  if ($option !== 'nolink') {
833  // Add param to save lastsearch_values or not
834  $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
835  if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
836  $add_save_lastsearch_values = 1;
837  }
838  if ($add_save_lastsearch_values) {
839  $url .= '&save_lastsearch_values=1';
840  }
841  }
842 
843  $linkclose = '';
844  if (empty($notooltip)) {
845  if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
846  $label = $langs->trans("ShowIntervention");
847  $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
848  }
849  $linkclose .= ($label ? ' title="'.dol_escape_htmltag($label, 1).'"' : ' title="tocomplete"');
850  $linkclose .= $dataparams.' class="'.$classfortooltip.($morecss ? ' '.$morecss : '').'"';
851  } else {
852  $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
853  }
854 
855  if ($option == 'nolink' || empty($url)) {
856  $linkstart = '<span';
857  } else {
858  $linkstart = '<a href="'.$url.'"';
859  }
860  $linkstart .= $linkclose.'>';
861  if ($option == 'nolink' || empty($url)) {
862  $linkend = '</span>';
863  } else {
864  $linkend = '</a>';
865  }
866 
867  $result .= $linkstart;
868  if ($withpicto) {
869  $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'"'), 0, 0, $notooltip ? 0 : 1);
870  }
871 
872  if ($withpicto != 2) {
873  $result .= $this->ref;
874  }
875 
876  $result .= $linkend;
877 
878  global $action;
879  $hookmanager->initHooks(array('interventiondao'));
880  $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
881  $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
882  if ($reshook > 0) {
883  $result = $hookmanager->resPrint;
884  } else {
885  $result .= $hookmanager->resPrint;
886  }
887 
888  return $result;
889  }
890 
891 
899  public function getNextNumRef($soc)
900  {
901  global $conf, $db, $langs;
902  $langs->load("interventions");
903 
904  if (!empty($conf->global->FICHEINTER_ADDON)) {
905  $mybool = false;
906 
907  $file = "mod_".$conf->global->FICHEINTER_ADDON.".php";
908  $classname = "mod_".$conf->global->FICHEINTER_ADDON;
909 
910  // Include file with class
911  $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
912 
913  foreach ($dirmodels as $reldir) {
914  $dir = dol_buildpath($reldir."core/modules/fichinter/");
915 
916  // Load file with numbering class (if found)
917  $mybool |= @include_once $dir.$file;
918  }
919 
920  if ($mybool === false) {
921  dol_print_error('', "Failed to include file ".$file);
922  return '';
923  }
924 
925  $obj = new $classname();
926  $numref = "";
927  $numref = $obj->getNextValue($soc, $this);
928 
929  if ($numref != "") {
930  return $numref;
931  } else {
932  dol_print_error($db, "Fichinter::getNextNumRef ".$obj->error);
933  return "";
934  }
935  } else {
936  $langs->load("errors");
937  print $langs->trans("Error")." ".$langs->trans("Error_FICHEINTER_ADDON_NotDefined");
938  return "";
939  }
940  }
941 
948  public function info($id)
949  {
950  $sql = "SELECT f.rowid,";
951  $sql .= " f.datec,";
952  $sql .= " f.tms as date_modification,";
953  $sql .= " f.date_valid as datev,";
954  $sql .= " f.fk_user_author,";
955  $sql .= " f.fk_user_modif as fk_user_modification,";
956  $sql .= " f.fk_user_valid";
957  $sql .= " FROM ".MAIN_DB_PREFIX."fichinter as f";
958  $sql .= " WHERE f.rowid = ".((int) $id);
959 
960  $resql = $this->db->query($sql);
961  if ($resql) {
962  if ($this->db->num_rows($resql)) {
963  $obj = $this->db->fetch_object($resql);
964 
965  $this->id = $obj->rowid;
966 
967  $this->date_creation = $this->db->jdate($obj->datec);
968  $this->date_modification = $this->db->jdate($obj->date_modification);
969  $this->date_validation = $this->db->jdate($obj->datev);
970 
971  $cuser = new User($this->db);
972  $cuser->fetch($obj->fk_user_author);
973  $this->user_creation = $cuser;
974 
975  if ($obj->fk_user_valid) {
976  $vuser = new User($this->db);
977  $vuser->fetch($obj->fk_user_valid);
978  $this->user_validation = $vuser;
979  }
980  if ($obj->fk_user_modification) {
981  $muser = new User($this->db);
982  $muser->fetch($obj->fk_user_modification);
983  $this->user_modification = $muser;
984  }
985  }
986  $this->db->free($resql);
987  } else {
988  dol_print_error($this->db);
989  }
990  }
991 
999  public function delete(User $user, $notrigger = 0)
1000  {
1001  global $conf, $langs;
1002  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
1003 
1004  $error = 0;
1005 
1006  $this->db->begin();
1007 
1008  if (!$error && !$notrigger) {
1009  // Call trigger
1010  $result = $this->call_trigger('FICHINTER_DELETE', $user);
1011  if ($result < 0) {
1012  $error++; $this->db->rollback(); return -1;
1013  }
1014  // End call triggers
1015  }
1016 
1017  // Delete linked object
1018  if (!$error) {
1019  $res = $this->deleteObjectLinked();
1020  if ($res < 0) {
1021  $error++;
1022  }
1023  }
1024 
1025  // Delete linked contacts
1026  if (!$error) {
1027  $res = $this->delete_linked_contact();
1028  if ($res < 0) {
1029  $this->error = 'ErrorFailToDeleteLinkedContact';
1030  $error++;
1031  }
1032  }
1033 
1034  if (!$error) {
1035  $main = MAIN_DB_PREFIX.'fichinterdet';
1036  $ef = $main."_extrafields";
1037  $sql = "DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_fichinter = ".((int) $this->id).")";
1038 
1039  $resql = $this->db->query($sql);
1040  if (!$resql) {
1041  $error++;
1042  }
1043  }
1044 
1045  if (!$error) {
1046  $sql = "DELETE FROM ".MAIN_DB_PREFIX."fichinterdet";
1047  $sql .= " WHERE fk_fichinter = ".((int) $this->id);
1048 
1049  $resql = $this->db->query($sql);
1050  if (!$resql) {
1051  $error++;
1052  }
1053  }
1054 
1055  if (!$error) {
1056  // Remove extrafields
1057  $res = $this->deleteExtraFields();
1058  if ($res < 0) {
1059  $error++;
1060  }
1061  }
1062 
1063  if (!$error) {
1064  // Delete object
1065  $sql = "DELETE FROM ".MAIN_DB_PREFIX."fichinter";
1066  $sql .= " WHERE rowid = ".((int) $this->id);
1067 
1068  dol_syslog("Fichinter::delete", LOG_DEBUG);
1069  $resql = $this->db->query($sql);
1070  if (!$resql) {
1071  $error++;
1072  }
1073  }
1074 
1075  if (!$error) {
1076  // Delete record into ECM index (Note that delete is also done when deleting files with the dol_delete_dir_recursive
1077  $this->deleteEcmFiles();
1078 
1079  // Remove directory with files
1080  $fichinterref = dol_sanitizeFileName($this->ref);
1081  if ($conf->ficheinter->dir_output) {
1082  $dir = $conf->ficheinter->dir_output."/".$fichinterref;
1083  $file = $conf->ficheinter->dir_output."/".$fichinterref."/".$fichinterref.".pdf";
1084  if (file_exists($file)) {
1085  dol_delete_preview($this);
1086 
1087  if (!dol_delete_file($file, 0, 0, 0, $this)) { // For triggers
1088  $langs->load("errors");
1089  $this->error = $langs->trans("ErrorFailToDeleteFile", $file);
1090  return 0;
1091  }
1092  }
1093  if (file_exists($dir)) {
1094  if (!dol_delete_dir_recursive($dir)) {
1095  $langs->load("errors");
1096  $this->error = $langs->trans("ErrorFailToDeleteDir", $dir);
1097  return 0;
1098  }
1099  }
1100  }
1101  }
1102 
1103  if (!$error) {
1104  $this->db->commit();
1105  return 1;
1106  } else {
1107  $this->db->rollback();
1108  return -1;
1109  }
1110  }
1111 
1112  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1120  public function set_date_delivery($user, $date_delivery)
1121  {
1122  // phpcs:enable
1123  if ($user->rights->ficheinter->creer) {
1124  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter ";
1125  $sql .= " SET datei = '".$this->db->idate($date_delivery)."'";
1126  $sql .= " WHERE rowid = ".((int) $this->id);
1127  $sql .= " AND fk_statut = 0";
1128 
1129  if ($this->db->query($sql)) {
1130  $this->date_delivery = $date_delivery;
1131  return 1;
1132  } else {
1133  $this->error = $this->db->error();
1134  dol_syslog("Fichinter::set_date_delivery Erreur SQL");
1135  return -1;
1136  }
1137  }
1138 
1139  return 0;
1140  }
1141 
1142  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1150  public function set_description($user, $description)
1151  {
1152  // phpcs:enable
1153  if ($user->rights->ficheinter->creer) {
1154  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter ";
1155  $sql .= " SET description = '".$this->db->escape($description)."',";
1156  $sql .= " fk_user_modif = ".$user->id;
1157  $sql .= " WHERE rowid = ".((int) $this->id);
1158 
1159  if ($this->db->query($sql)) {
1160  $this->description = $description;
1161  return 1;
1162  } else {
1163  $this->error = $this->db->error();
1164  dol_syslog("Fichinter::set_description Erreur SQL");
1165  return -1;
1166  }
1167  }
1168 
1169  return 0;
1170  }
1171 
1172 
1173  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1181  public function set_contrat($user, $contractid)
1182  {
1183  // phpcs:enable
1184  if ($user->rights->ficheinter->creer) {
1185  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter ";
1186  $sql .= " SET fk_contrat = ".((int) $contractid);
1187  $sql .= " WHERE rowid = ".((int) $this->id);
1188 
1189  if ($this->db->query($sql)) {
1190  $this->fk_contrat = $contractid;
1191  return 1;
1192  } else {
1193  $this->error = $this->db->error();
1194  return -1;
1195  }
1196  }
1197 
1198  return -2;
1199  }
1200 
1201 
1202 
1210  public function createFromClone(User $user, $socid = 0)
1211  {
1212  global $hookmanager;
1213 
1214  $error = 0;
1215 
1216  $this->db->begin();
1217 
1218  // get extrafields so they will be clone
1219  foreach ($this->lines as $line) {
1220  $line->fetch_optionals();
1221  }
1222 
1223  // Load source object
1224  $objFrom = clone $this;
1225 
1226  // Change socid if needed
1227  if (!empty($socid) && $socid != $this->socid) {
1228  $objsoc = new Societe($this->db);
1229 
1230  if ($objsoc->fetch($socid) > 0) {
1231  $this->socid = $objsoc->id;
1232  //$this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1233  //$this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1234  $this->fk_project = '';
1235  $this->fk_delivery_address = '';
1236  }
1237 
1238  // TODO Change product price if multi-prices
1239  }
1240 
1241  $this->id = 0;
1242  $this->ref = '';
1243  $this->statut = 0;
1244 
1245  // Clear fields
1246  $this->user_author_id = $user->id;
1247  $this->user_valid = 0;
1248  $this->date_creation = '';
1249  $this->date_validation = '';
1250  $this->ref_client = '';
1251 
1252  // Create clone
1253  $this->context['createfromclone'] = 'createfromclone';
1254  $result = $this->create($user);
1255  if ($result < 0) {
1256  $error++;
1257  }
1258 
1259  if (!$error) {
1260  // Add lines because it is not included into create function
1261  foreach ($this->lines as $line) {
1262  $this->addline($user, $this->id, $line->desc, $line->datei, $line->duration, $line->array_options);
1263  }
1264 
1265  // Hook of thirdparty module
1266  if (is_object($hookmanager)) {
1267  $parameters = array('objFrom'=>$objFrom);
1268  $action = '';
1269  $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1270  if ($reshook < 0) {
1271  $this->setErrorsFromObject($hookmanager);
1272  $error++;
1273  }
1274  }
1275  }
1276 
1277  unset($this->context['createfromclone']);
1278 
1279  // End
1280  if (!$error) {
1281  $this->db->commit();
1282  return $this->id;
1283  } else {
1284  $this->db->rollback();
1285  return -1;
1286  }
1287  }
1288 
1289 
1301  public function addline($user, $fichinterid, $desc, $date_intervention, $duration, $array_options = '')
1302  {
1303  dol_syslog(get_class($this)."::addline $fichinterid, $desc, $date_intervention, $duration");
1304 
1305  if ($this->statut == self::STATUS_DRAFT) {
1306  $this->db->begin();
1307 
1308  // Insertion ligne
1309  $line = new FichinterLigne($this->db);
1310 
1311  $line->fk_fichinter = $fichinterid;
1312  $line->desc = $desc;
1313  $line->date = $date_intervention;
1314  $line->datei = $date_intervention; // For backward compatibility
1315  $line->duration = $duration;
1316 
1317  if (is_array($array_options) && count($array_options) > 0) {
1318  $line->array_options = $array_options;
1319  }
1320 
1321  $result = $line->insert($user);
1322 
1323  if ($result >= 0) {
1324  $this->db->commit();
1325  return 1;
1326  } else {
1327  $this->error = $this->db->error();
1328  $this->db->rollback();
1329  return -1;
1330  }
1331  }
1332 
1333  return 0;
1334  }
1335 
1336 
1344  public function initAsSpecimen()
1345  {
1346  global $langs;
1347 
1348  $now = dol_now();
1349 
1350  // Initialise parametres
1351  $this->id = 0;
1352  $this->ref = 'SPECIMEN';
1353  $this->ref_client = 'SPECIMEN CLIENT';
1354  $this->specimen = 1;
1355  $this->socid = 1;
1356  $this->datec = $now;
1357  $this->note_private = 'Private note';
1358  $this->note_public = 'SPECIMEN';
1359  $this->duration = 0;
1360  $nbp = 25;
1361  $xnbp = 0;
1362  while ($xnbp < $nbp) {
1363  $line = new FichinterLigne($this->db);
1364  $line->desc = $langs->trans("Description")." ".$xnbp;
1365  $line->date = ($now - 3600 * (1 + $xnbp));
1366  $line->datei = ($now - 3600 * (1 + $xnbp)); // For backward compatibility
1367  $line->duration = 600;
1368  $line->fk_fichinter = 0;
1369  $this->lines[$xnbp] = $line;
1370  $xnbp++;
1371 
1372  $this->duration += $line->duration;
1373  }
1374  }
1375 
1376  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1382  public function fetch_lines()
1383  {
1384  // phpcs:enable
1385  $this->lines = array();
1386 
1387  $sql = "SELECT rowid, fk_fichinter, description, duree, date, rang";
1388  $sql .= " FROM ".MAIN_DB_PREFIX."fichinterdet";
1389  $sql .= " WHERE fk_fichinter = ".((int) $this->id);
1390  $sql .= " ORDER BY rang ASC, date ASC";
1391 
1392  dol_syslog(get_class($this)."::fetch_lines", LOG_DEBUG);
1393 
1394  $resql = $this->db->query($sql);
1395  if ($resql) {
1396  $num = $this->db->num_rows($resql);
1397  $i = 0;
1398  while ($i < $num) {
1399  $objp = $this->db->fetch_object($resql);
1400 
1401  $line = new FichinterLigne($this->db);
1402  $line->id = $objp->rowid;
1403  $line->fk_fichinter = $objp->fk_fichinter;
1404  $line->desc = $objp->description;
1405  $line->duration = $objp->duree;
1406  //For invoicing we calculing hours
1407  $line->qty = round($objp->duree / 3600, 2);
1408  $line->date = $this->db->jdate($objp->date);
1409  $line->datei = $this->db->jdate($objp->date); // For backward compatibility
1410  $line->rang = $objp->rang;
1411  $line->product_type = 1;
1412  $line->fetch_optionals();
1413 
1414  $this->lines[$i] = $line;
1415  $i++;
1416  }
1417  $this->db->free($resql);
1418 
1419  return 1;
1420  } else {
1421  $this->error = $this->db->error();
1422  return -1;
1423  }
1424  }
1425 
1434  public static function replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
1435  {
1436  $tables = array(
1437  'fichinter'
1438  );
1439 
1440  return CommonObject::commonReplaceThirdparty($dbs, $origin_id, $dest_id, $tables);
1441  }
1442 
1451  public function setRefClient($user, $ref_client, $notrigger = 0)
1452  {
1453  // phpcs:enable
1454  if (!empty($user->rights->ficheinter->creer)) {
1455  $error = 0;
1456 
1457  $this->db->begin();
1458 
1459  $this->oldcopy = dol_clone($this);
1460 
1461  $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ref_client = ".(empty($ref_client) ? 'NULL' : "'".$this->db->escape($ref_client)."'");
1462  $sql .= " WHERE rowid = ".((int) $this->id);
1463 
1464  dol_syslog(__METHOD__.' $this->id='.$this->id.', ref_client='.$ref_client, LOG_DEBUG);
1465  $resql = $this->db->query($sql);
1466  if (!$resql) {
1467  $this->errors[] = $this->db->error();
1468  $error++;
1469  }
1470 
1471  if (!$error) {
1472  $this->ref_client = $ref_client;
1473  }
1474 
1475  if (!$notrigger && empty($error)) {
1476  // Call trigger
1477  $result = $this->call_trigger('FICHINTER_MODIFY', $user);
1478  if ($result < 0) {
1479  $error++;
1480  }
1481  // End call triggers
1482  }
1483 
1484  if (!$error) {
1485  $this->db->commit();
1486  return 1;
1487  } else {
1488  foreach ($this->errors as $errmsg) {
1489  dol_syslog(__METHOD__.' Error: '.$errmsg, LOG_ERR);
1490  $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
1491  }
1492  $this->db->rollback();
1493  return -1 * $error;
1494  }
1495  } else {
1496  return -1;
1497  }
1498  }
1499 
1507  public function getKanbanView($option = '', $arraydata = null)
1508  {
1509  global $langs;
1510 
1511  $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
1512 
1513  $return = '<div class="box-flex-item box-flex-grow-zero">';
1514  $return .= '<div class="info-box info-box-sm">';
1515  $return .= '<span class="info-box-icon bg-infobox-action">';
1516  $return .= img_picto('', $this->picto);
1517  $return .= '</span>';
1518  $return .= '<div class="info-box-content">';
1519  $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
1520  $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
1521  if (!empty($arraydata['thirdparty'])) {
1522  $tmpthirdparty = $arraydata['thirdparty'];
1523  $return .= '<br><span class="info-box-label">'.$tmpthirdparty->getNomUrl(1).'</span>';
1524  }
1525  if (property_exists($this, 'duration')) {
1526  $return .= '<br><span class="info-box-label ">'.$langs->trans("Duration").' : '.convertSecondToTime($this->duration, 'allhourmin').'</span>';
1527  }
1528  if (method_exists($this, 'getLibStatut')) {
1529  $return .= '<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).'</div>';
1530  }
1531  $return .= '</div>';
1532  $return .= '</div>';
1533  $return .= '</div>';
1534  return $return;
1535  }
1536 }
1537 
1542 {
1546  public $db;
1547 
1551  public $error = '';
1552 
1553  // From llx_fichinterdet
1557  public $fk_fichinter;
1558 
1559  public $desc; // Description ligne
1560 
1564  public $date; // Date intervention
1569  public $datei; // Date intervention
1570 
1571  public $duration; // Duration of intervention
1572  public $rang = 0;
1573  public $tva_tx;
1574  public $subprice;
1575 
1579  public $element = 'fichinterdet';
1580 
1584  public $table_element = 'fichinterdet';
1585 
1589  public $fk_element = 'fk_fichinter';
1590 
1591 
1592 
1598  public function __construct($db)
1599  {
1600  $this->db = $db;
1601  }
1602 
1609  public function fetch($rowid)
1610  {
1611  dol_syslog("FichinterLigne::fetch", LOG_DEBUG);
1612 
1613  $sql = 'SELECT ft.rowid, ft.fk_fichinter, ft.description, ft.duree, ft.rang, ft.date';
1614  $sql .= ' FROM '.MAIN_DB_PREFIX.'fichinterdet as ft';
1615  $sql .= ' WHERE ft.rowid = '.((int) $rowid);
1616 
1617  $resql = $this->db->query($sql);
1618  if ($resql) {
1619  $objp = $this->db->fetch_object($resql);
1620  $this->rowid = $objp->rowid;
1621  $this->id = $objp->rowid;
1622  $this->fk_fichinter = $objp->fk_fichinter;
1623  $this->date = $this->db->jdate($objp->date);
1624  $this->datei = $this->db->jdate($objp->date); // For backward compatibility
1625  $this->desc = $objp->description;
1626  $this->duration = $objp->duree;
1627  $this->rang = $objp->rang;
1628 
1629  $this->db->free($resql);
1630 
1631  $this->fetch_optionals();
1632 
1633  return 1;
1634  } else {
1635  $this->error = $this->db->error().' sql='.$sql;
1636  return -1;
1637  }
1638  }
1639 
1647  public function insert($user, $notrigger = 0)
1648  {
1649  $error = 0;
1650 
1651  dol_syslog("FichinterLigne::insert rang=".$this->rang);
1652 
1653  if (empty($this->date) && !empty($this->datei)) { // For backward compatibility
1654  $this->date = $this->datei;
1655  }
1656 
1657  $this->db->begin();
1658 
1659  $rangToUse = $this->rang;
1660  if ($rangToUse == -1) {
1661  // Recupere rang max de la ligne d'intervention dans $rangmax
1662  $sql = 'SELECT max(rang) as max FROM '.MAIN_DB_PREFIX.'fichinterdet';
1663  $sql .= ' WHERE fk_fichinter = '.((int) $this->fk_fichinter);
1664  $resql = $this->db->query($sql);
1665  if ($resql) {
1666  $obj = $this->db->fetch_object($resql);
1667  $rangToUse = $obj->max + 1;
1668  } else {
1669  dol_print_error($this->db);
1670  $this->db->rollback();
1671  return -1;
1672  }
1673  }
1674 
1675  // Insertion dans base de la ligne
1676  $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'fichinterdet';
1677  $sql .= ' (fk_fichinter, description, date, duree, rang)';
1678  $sql .= " VALUES (".((int) $this->fk_fichinter).",";
1679  $sql .= " '".$this->db->escape($this->desc)."',";
1680  $sql .= " '".$this->db->idate($this->date)."',";
1681  $sql .= " ".((int) $this->duration).",";
1682  $sql .= ' '.((int) $rangToUse);
1683  $sql .= ')';
1684 
1685  dol_syslog("FichinterLigne::insert", LOG_DEBUG);
1686  $resql = $this->db->query($sql);
1687  if ($resql) {
1688  $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.'fichinterdet');
1689  $this->rowid = $this->id;
1690 
1691  if (!$error) {
1692  $result = $this->insertExtraFields();
1693  if ($result < 0) {
1694  $error++;
1695  }
1696  }
1697 
1698 
1699  $result = $this->update_total();
1700 
1701  if ($result > 0) {
1702  $this->rang = $rangToUse;
1703 
1704  if (!$notrigger) {
1705  // Call trigger
1706  $result = $this->call_trigger('LINEFICHINTER_CREATE', $user);
1707  if ($result < 0) {
1708  $error++;
1709  }
1710  // End call triggers
1711  }
1712  }
1713 
1714  if (!$error) {
1715  $this->db->commit();
1716  return $result;
1717  } else {
1718  $this->db->rollback();
1719  return -1;
1720  }
1721  } else {
1722  $this->error = $this->db->error()." sql=".$sql;
1723  $this->db->rollback();
1724  return -1;
1725  }
1726  }
1727 
1728 
1736  public function update($user, $notrigger = 0)
1737  {
1738  $error = 0;
1739 
1740  if (empty($this->date) && !empty($this->datei)) { // For backward compatibility
1741  $this->date = $this->datei;
1742  }
1743 
1744  $this->db->begin();
1745 
1746  // Mise a jour ligne en base
1747  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinterdet SET";
1748  $sql .= " description = '".$this->db->escape($this->desc)."',";
1749  $sql .= " date = '".$this->db->idate($this->date)."',";
1750  $sql .= " duree = ".((int) $this->duration).",";
1751  $sql .= " rang = ".((int) $this->rang);
1752  $sql .= " WHERE rowid = ".((int) $this->id);
1753 
1754  dol_syslog("FichinterLigne::update", LOG_DEBUG);
1755  $resql = $this->db->query($sql);
1756  if ($resql) {
1757  if (!$error) {
1758  $result = $this->insertExtraFields();
1759  if ($result < 0) {
1760  $error++;
1761  }
1762  }
1763 
1764  $result = $this->update_total();
1765  if ($result > 0) {
1766  if (!$notrigger) {
1767  // Call trigger
1768  $result = $this->call_trigger('LINEFICHINTER_MODIFY', $user);
1769  if ($result < 0) {
1770  $error++;
1771  }
1772  // End call triggers
1773  }
1774  }
1775 
1776  if (!$error) {
1777  $this->db->commit();
1778  return $result;
1779  } else {
1780  $this->error = $this->db->lasterror();
1781  $this->db->rollback();
1782  return -1;
1783  }
1784  } else {
1785  $this->error = $this->db->lasterror();
1786  $this->db->rollback();
1787  return -1;
1788  }
1789  }
1790 
1791  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1797  public function update_total()
1798  {
1799  // phpcs:enable
1800  global $conf;
1801 
1802  $this->db->begin();
1803 
1804  $sql = "SELECT SUM(duree) as total_duration, min(date) as dateo, max(date) as datee ";
1805  $sql .= " FROM ".MAIN_DB_PREFIX."fichinterdet";
1806  $sql .= " WHERE fk_fichinter=".((int) $this->fk_fichinter);
1807 
1808  dol_syslog("FichinterLigne::update_total", LOG_DEBUG);
1809  $resql = $this->db->query($sql);
1810  if ($resql) {
1811  $obj = $this->db->fetch_object($resql);
1812  $total_duration = 0;
1813  if (!empty($obj->total_duration)) {
1814  $total_duration = $obj->total_duration;
1815  }
1816 
1817  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter";
1818  $sql .= " SET duree = ".((int) $total_duration);
1819  $sql .= " , dateo = ".(!empty($obj->dateo) ? "'".$this->db->escape($obj->dateo)."'" : "null");
1820  $sql .= " , datee = ".(!empty($obj->datee) ? "'".$this->db->escape($obj->datee)."'" : "null");
1821  $sql .= " WHERE rowid = ".((int) $this->fk_fichinter);
1822 
1823  dol_syslog("FichinterLigne::update_total", LOG_DEBUG);
1824  $resql = $this->db->query($sql);
1825  if ($resql) {
1826  $this->db->commit();
1827  return 1;
1828  } else {
1829  $this->error = $this->db->error();
1830  $this->db->rollback();
1831  return -2;
1832  }
1833  } else {
1834  $this->error = $this->db->error();
1835  $this->db->rollback();
1836  return -1;
1837  }
1838  }
1839 
1847  public function deleteline($user, $notrigger = 0)
1848  {
1849  global $langs, $conf;
1850 
1851  $error = 0;
1852 
1853  if ($this->statut == 0) {
1854  dol_syslog(get_class($this)."::deleteline lineid=".$this->id);
1855  $this->db->begin();
1856 
1857  $result = $this->deleteExtraFields();
1858  if ($result < 0) {
1859  $error++;
1860  $this->db->rollback();
1861  return -1;
1862  }
1863 
1864  $sql = "DELETE FROM ".MAIN_DB_PREFIX."fichinterdet WHERE rowid = ".((int) $this->id);
1865  $resql = $this->db->query($sql);
1866 
1867  if ($resql) {
1868  $result = $this->update_total();
1869  if ($result > 0) {
1870  if (!$notrigger) {
1871  // Call trigger
1872  $result = $this->call_trigger('LINEFICHINTER_DELETE', $user);
1873  if ($result < 0) {
1874  $error++; $this->db->rollback(); return -1;
1875  }
1876  // End call triggers
1877  }
1878 
1879  $this->db->commit();
1880  return $result;
1881  } else {
1882  $this->db->rollback();
1883  return -1;
1884  }
1885  } else {
1886  $this->error = $this->db->error()." sql=".$sql;
1887  $this->db->rollback();
1888  return -1;
1889  }
1890  } else {
1891  return -2;
1892  }
1893  }
1894 }
$object ref
Definition: info.php:78
Parent class of all other business classes (invoices, contracts, proposals, orders,...
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...
deleteEcmFiles($mode=0)
Delete related files of object in database.
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
setErrorsFromObject($object)
setErrorsFromObject
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...
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='', $f_user=null, $notrigger=0)
Delete all links between an object $this.
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
delete_linked_contact($source='', $code='')
Delete all links between an object $this and all its contacts in llx_element_contact.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage Dolibarr database access.
Class to manage interventions.
const STATUS_BILLED
Billed.
addline($user, $fichinterid, $desc, $date_intervention, $duration, $array_options='')
Adding a line of intervention into data base.
initAsSpecimen()
Initialise an instance with random values.
getLibStatut($mode=0)
Returns the label status.
update($user, $notrigger=0)
Update an intervention.
createFromClone(User $user, $socid=0)
Load an object from its id and create a new one in database.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
set_date_delivery($user, $date_delivery)
Defines a delivery date of intervention.
const STATUS_DRAFT
Draft status.
create($user, $notrigger=0)
Create an intervention into data base.
set_description($user, $description)
Define the label of the intervention.
getTooltipContentArray($params)
getTooltipContentArray
getKanbanView($option='', $arraydata=null)
Return clicable link of object (with eventually picto)
const STATUS_VALIDATED
Validated status.
const STATUS_CLOSED
Closed.
setDraft($user)
Set status to draft.
getNextNumRef($soc)
Returns the next non used reference of intervention depending on the module numbering assets within F...
getAmount()
Returns amount based on user thm.
fetch($rowid, $ref='')
Fetch a intervention.
setRefClient($user, $ref_client, $notrigger=0)
Set customer reference number.
set_contrat($user, $contractid)
Link intervention to a contract.
LibStatut($status, $mode=0)
Returns the label of a status.
setValid($user, $notrigger=0)
Validate a intervention.
getNomUrl($withpicto=0, $option='', $notooltip=0, $save_lastsearch_value=-1, $morecss='')
Return clicable name (with picto eventually)
load_state_board()
Load indicators into this->nb for board.
__construct($db)
Constructor.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
info($id)
Load information on object.
fetch_lines()
Load array lines ->lines.
Class to manage intervention lines.
fetch($rowid)
Retrieve the line of intervention.
update_total()
Update total duration into llx_fichinter.
update($user, $notrigger=0)
Update intervention into database.
deleteline($user, $notrigger=0)
Delete a intervention line.
__construct($db)
Constructor.
insert($user, $notrigger=0)
Insert the line into database.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
Definition: user.class.php:48
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:746
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
print *****$script_file(".$version.") pid cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
print *****$script_file(".$version.") pid c cd cd cd description as p label as s rowid
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:1485
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:1334
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition: files.lib.php:62
dol_delete_preview($object)
Delete all preview files linked to object instance.
Definition: files.lib.php:1537
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.