dolibarr  17.0.3
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'=>'$conf->societe->enabled', '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'=>'text', 'label'=>'Description', 'enabled'=>1, 'visible'=>-1, 'position'=>105, 'showoncombobox'=>2),
61  'note_private' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>110),
62  'note_public' =>array('type'=>'text', '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  } else {
505  $this->error = $this->db->lasterror();
506  return -1;
507  }
508  }
509 
516  public function setDraft($user)
517  {
518  global $langs, $conf;
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 
674  public function getAmount()
675  {
676  global $db;
677 
678  $amount = 0;
679 
680  $this->author = new User($db);
681  $this->author->fetch($this->user_creation);
682 
683  $thm = $this->author->thm;
684 
685  foreach ($this->lines as $line) {
686  $amount += ($line->duration / 60 / 60 * $thm);
687  }
688 
689  return price2num($amount, 'MT');
690  }
691 
692 
704  public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
705  {
706  global $conf;
707 
708  $outputlangs->load("interventions");
709 
710  if (!dol_strlen($modele)) {
711  $modele = 'soleil';
712 
713  if (!empty($this->model_pdf)) {
714  $modele = $this->model_pdf;
715  } elseif (!empty($this->modelpdf)) { // deprecated
716  $modele = $this->modelpdf;
717  } elseif (!empty($conf->global->FICHEINTER_ADDON_PDF)) {
718  $modele = $conf->global->FICHEINTER_ADDON_PDF;
719  }
720  }
721 
722  $modelpath = "core/modules/fichinter/doc/";
723 
724  return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
725  }
726 
733  public function getLibStatut($mode = 0)
734  {
735  return $this->LibStatut((isset($this->statut) ? $this->statut : $this->status), $mode);
736  }
737 
738  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
746  public function LibStatut($status, $mode = 0)
747  {
748  // phpcs:enable
749  // Init/load array of translation of status
750  if (empty($this->statuts) || empty($this->statuts_short) || empty($this->statuts_logo)) {
751  global $langs;
752  $langs->load("fichinter");
753 
754  $this->statuts[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
755  $this->statuts[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated');
756  $this->statuts[self::STATUS_BILLED] = $langs->transnoentitiesnoconv('StatusInterInvoiced');
757  $this->statuts[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Done');
758  $this->statuts_short[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
759  $this->statuts_short[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated');
760  $this->statuts_short[self::STATUS_BILLED] = $langs->transnoentitiesnoconv('StatusInterInvoiced');
761  $this->statuts_short[self::STATUS_CLOSED] = $langs->transnoentitiesnoconv('Done');
762  $this->statuts_logo[self::STATUS_DRAFT] = 'status0';
763  $this->statuts_logo[self::STATUS_VALIDATED] = 'status1';
764  $this->statuts_logo[self::STATUS_BILLED] = 'status6';
765  $this->statuts_logo[self::STATUS_CLOSED] = 'status6';
766  }
767 
768  return dolGetStatus($this->statuts[$status], $this->statuts_short[$status], '', $this->statuts_logo[$status], $mode);
769  }
770 
780  public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $save_lastsearch_value = -1)
781  {
782  global $conf, $langs, $hookmanager;
783 
784  $result = '';
785 
786  $label = img_picto('', $this->picto).' <u class="paddingrightonly">'.$langs->trans("Intervention").'</u>';
787  if (isset($this->status)) {
788  $label .= ' '.$this->getLibStatut(5);
789  }
790  $label .= '<br><b>'.$langs->trans('Ref').':</b> '.$this->ref;
791 
792  $url = DOL_URL_ROOT.'/fichinter/card.php?id='.$this->id;
793 
794  if ($option !== 'nolink') {
795  // Add param to save lastsearch_values or not
796  $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
797  if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
798  $add_save_lastsearch_values = 1;
799  }
800  if ($add_save_lastsearch_values) {
801  $url .= '&save_lastsearch_values=1';
802  }
803  }
804 
805  $linkclose = '';
806  if (empty($notooltip)) {
807  if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
808  $label = $langs->trans("ShowIntervention");
809  $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
810  }
811  $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
812  $linkclose .= ' class="classfortooltip"';
813 
814  /*
815  $hookmanager->initHooks(array('fichinterdao'));
816  $parameters=array('id'=>$this->id);
817  $reshook=$hookmanager->executeHooks('getnomurltooltip',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks
818  if ($reshook > 0) $linkclose = $hookmanager->resPrint;
819  */
820  }
821 
822  $linkstart = '<a href="'.$url.'"';
823  $linkstart .= $linkclose.'>';
824  $linkend = '</a>';
825 
826  $result .= $linkstart;
827  if ($withpicto) {
828  $result .= img_object(($notooltip ? '' : $label), $this->picto, ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
829  }
830  if ($withpicto != 2) {
831  $result .= $this->ref;
832  }
833  $result .= $linkend;
834 
835  global $action;
836  $hookmanager->initHooks(array('interventiondao'));
837  $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
838  $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
839  if ($reshook > 0) {
840  $result = $hookmanager->resPrint;
841  } else {
842  $result .= $hookmanager->resPrint;
843  }
844 
845  return $result;
846  }
847 
848 
856  public function getNextNumRef($soc)
857  {
858  global $conf, $db, $langs;
859  $langs->load("interventions");
860 
861  if (!empty($conf->global->FICHEINTER_ADDON)) {
862  $mybool = false;
863 
864  $file = "mod_".$conf->global->FICHEINTER_ADDON.".php";
865  $classname = "mod_".$conf->global->FICHEINTER_ADDON;
866 
867  // Include file with class
868  $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
869 
870  foreach ($dirmodels as $reldir) {
871  $dir = dol_buildpath($reldir."core/modules/fichinter/");
872 
873  // Load file with numbering class (if found)
874  $mybool |= @include_once $dir.$file;
875  }
876 
877  if ($mybool === false) {
878  dol_print_error('', "Failed to include file ".$file);
879  return '';
880  }
881 
882  $obj = new $classname();
883  $numref = "";
884  $numref = $obj->getNextValue($soc, $this);
885 
886  if ($numref != "") {
887  return $numref;
888  } else {
889  dol_print_error($db, "Fichinter::getNextNumRef ".$obj->error);
890  return "";
891  }
892  } else {
893  $langs->load("errors");
894  print $langs->trans("Error")." ".$langs->trans("Error_FICHEINTER_ADDON_NotDefined");
895  return "";
896  }
897  }
898 
905  public function info($id)
906  {
907  global $conf;
908 
909  $sql = "SELECT f.rowid,";
910  $sql .= " f.datec,";
911  $sql .= " f.tms as date_modification,";
912  $sql .= " f.date_valid as datev,";
913  $sql .= " f.fk_user_author,";
914  $sql .= " f.fk_user_modif as fk_user_modification,";
915  $sql .= " f.fk_user_valid";
916  $sql .= " FROM ".MAIN_DB_PREFIX."fichinter as f";
917  $sql .= " WHERE f.rowid = ".((int) $id);
918 
919  $resql = $this->db->query($sql);
920  if ($resql) {
921  if ($this->db->num_rows($resql)) {
922  $obj = $this->db->fetch_object($resql);
923 
924  $this->id = $obj->rowid;
925 
926  $this->date_creation = $this->db->jdate($obj->datec);
927  $this->date_modification = $this->db->jdate($obj->date_modification);
928  $this->date_validation = $this->db->jdate($obj->datev);
929 
930  $cuser = new User($this->db);
931  $cuser->fetch($obj->fk_user_author);
932  $this->user_creation = $cuser;
933 
934  if ($obj->fk_user_valid) {
935  $vuser = new User($this->db);
936  $vuser->fetch($obj->fk_user_valid);
937  $this->user_validation = $vuser;
938  }
939  if ($obj->fk_user_modification) {
940  $muser = new User($this->db);
941  $muser->fetch($obj->fk_user_modification);
942  $this->user_modification = $muser;
943  }
944  }
945  $this->db->free($resql);
946  } else {
947  dol_print_error($this->db);
948  }
949  }
950 
958  public function delete($user, $notrigger = 0)
959  {
960  global $conf, $langs;
961  require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
962 
963  $error = 0;
964 
965  $this->db->begin();
966 
967  if (!$error && !$notrigger) {
968  // Call trigger
969  $result = $this->call_trigger('FICHINTER_DELETE', $user);
970  if ($result < 0) {
971  $error++; $this->db->rollback(); return -1;
972  }
973  // End call triggers
974  }
975 
976  // Delete linked object
977  if (!$error) {
978  $res = $this->deleteObjectLinked();
979  if ($res < 0) {
980  $error++;
981  }
982  }
983 
984  // Delete linked contacts
985  if (!$error) {
986  $res = $this->delete_linked_contact();
987  if ($res < 0) {
988  $this->error = 'ErrorFailToDeleteLinkedContact';
989  $error++;
990  }
991  }
992 
993  if (!$error) {
994  $main = MAIN_DB_PREFIX.'fichinterdet';
995  $ef = $main."_extrafields";
996  $sql = "DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_fichinter = ".((int) $this->id).")";
997 
998  $resql = $this->db->query($sql);
999  if (!$resql) {
1000  $error++;
1001  }
1002  }
1003 
1004  if (!$error) {
1005  $sql = "DELETE FROM ".MAIN_DB_PREFIX."fichinterdet";
1006  $sql .= " WHERE fk_fichinter = ".((int) $this->id);
1007 
1008  $resql = $this->db->query($sql);
1009  if (!$resql) {
1010  $error++;
1011  }
1012  }
1013 
1014  if (!$error) {
1015  // Remove extrafields
1016  $res = $this->deleteExtraFields();
1017  if ($res < 0) {
1018  $error++;
1019  }
1020  }
1021 
1022  if (!$error) {
1023  // Delete object
1024  $sql = "DELETE FROM ".MAIN_DB_PREFIX."fichinter";
1025  $sql .= " WHERE rowid = ".((int) $this->id);
1026 
1027  dol_syslog("Fichinter::delete", LOG_DEBUG);
1028  $resql = $this->db->query($sql);
1029  if (!$resql) {
1030  $error++;
1031  }
1032  }
1033 
1034  if (!$error) {
1035  // Delete record into ECM index (Note that delete is also done when deleting files with the dol_delete_dir_recursive
1036  $this->deleteEcmFiles();
1037 
1038  // Remove directory with files
1039  $fichinterref = dol_sanitizeFileName($this->ref);
1040  if ($conf->ficheinter->dir_output) {
1041  $dir = $conf->ficheinter->dir_output."/".$fichinterref;
1042  $file = $conf->ficheinter->dir_output."/".$fichinterref."/".$fichinterref.".pdf";
1043  if (file_exists($file)) {
1044  dol_delete_preview($this);
1045 
1046  if (!dol_delete_file($file, 0, 0, 0, $this)) { // For triggers
1047  $langs->load("errors");
1048  $this->error = $langs->trans("ErrorFailToDeleteFile", $file);
1049  return 0;
1050  }
1051  }
1052  if (file_exists($dir)) {
1053  if (!dol_delete_dir_recursive($dir)) {
1054  $langs->load("errors");
1055  $this->error = $langs->trans("ErrorFailToDeleteDir", $dir);
1056  return 0;
1057  }
1058  }
1059  }
1060  }
1061 
1062  if (!$error) {
1063  $this->db->commit();
1064  return 1;
1065  } else {
1066  $this->db->rollback();
1067  return -1;
1068  }
1069  }
1070 
1071  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1079  public function set_date_delivery($user, $date_delivery)
1080  {
1081  // phpcs:enable
1082  global $conf;
1083 
1084  if ($user->rights->ficheinter->creer) {
1085  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter ";
1086  $sql .= " SET datei = '".$this->db->idate($date_delivery)."'";
1087  $sql .= " WHERE rowid = ".((int) $this->id);
1088  $sql .= " AND fk_statut = 0";
1089 
1090  if ($this->db->query($sql)) {
1091  $this->date_delivery = $date_delivery;
1092  return 1;
1093  } else {
1094  $this->error = $this->db->error();
1095  dol_syslog("Fichinter::set_date_delivery Erreur SQL");
1096  return -1;
1097  }
1098  }
1099  }
1100 
1101  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1109  public function set_description($user, $description)
1110  {
1111  // phpcs:enable
1112  global $conf;
1113 
1114  if ($user->rights->ficheinter->creer) {
1115  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter ";
1116  $sql .= " SET description = '".$this->db->escape($description)."',";
1117  $sql .= " fk_user_modif = ".$user->id;
1118  $sql .= " WHERE rowid = ".((int) $this->id);
1119 
1120  if ($this->db->query($sql)) {
1121  $this->description = $description;
1122  return 1;
1123  } else {
1124  $this->error = $this->db->error();
1125  dol_syslog("Fichinter::set_description Erreur SQL");
1126  return -1;
1127  }
1128  }
1129  }
1130 
1131 
1132  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1140  public function set_contrat($user, $contractid)
1141  {
1142  // phpcs:enable
1143  global $conf;
1144 
1145  if ($user->rights->ficheinter->creer) {
1146  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter ";
1147  $sql .= " SET fk_contrat = ".((int) $contractid);
1148  $sql .= " WHERE rowid = ".((int) $this->id);
1149 
1150  if ($this->db->query($sql)) {
1151  $this->fk_contrat = $contractid;
1152  return 1;
1153  } else {
1154  $this->error = $this->db->error();
1155  return -1;
1156  }
1157  }
1158  return -2;
1159  }
1160 
1161 
1162 
1170  public function createFromClone(User $user, $socid = 0)
1171  {
1172  global $hookmanager;
1173 
1174  $error = 0;
1175 
1176  $this->db->begin();
1177 
1178  // get extrafields so they will be clone
1179  foreach ($this->lines as $line) {
1180  $line->fetch_optionals();
1181  }
1182 
1183  // Load source object
1184  $objFrom = clone $this;
1185 
1186  // Change socid if needed
1187  if (!empty($socid) && $socid != $this->socid) {
1188  $objsoc = new Societe($this->db);
1189 
1190  if ($objsoc->fetch($socid) > 0) {
1191  $this->socid = $objsoc->id;
1192  //$this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1193  //$this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1194  $this->fk_project = '';
1195  $this->fk_delivery_address = '';
1196  }
1197 
1198  // TODO Change product price if multi-prices
1199  }
1200 
1201  $this->id = 0;
1202  $this->ref = '';
1203  $this->statut = 0;
1204 
1205  // Clear fields
1206  $this->user_author_id = $user->id;
1207  $this->user_valid = 0;
1208  $this->date_creation = '';
1209  $this->date_validation = '';
1210  $this->ref_client = '';
1211 
1212  // Create clone
1213  $this->context['createfromclone'] = 'createfromclone';
1214  $result = $this->create($user);
1215  if ($result < 0) {
1216  $error++;
1217  }
1218 
1219  if (!$error) {
1220  // Add lines because it is not included into create function
1221  foreach ($this->lines as $line) {
1222  $this->addline($user, $this->id, $line->desc, $line->datei, $line->duration, $line->array_options);
1223  }
1224 
1225  // Hook of thirdparty module
1226  if (is_object($hookmanager)) {
1227  $parameters = array('objFrom'=>$objFrom);
1228  $action = '';
1229  $reshook = $hookmanager->executeHooks('createFrom', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1230  if ($reshook < 0) {
1231  $this->errors += $hookmanager->errors;
1232  $this->error = $hookmanager->error;
1233  $error++;
1234  }
1235  }
1236  }
1237 
1238  unset($this->context['createfromclone']);
1239 
1240  // End
1241  if (!$error) {
1242  $this->db->commit();
1243  return $this->id;
1244  } else {
1245  $this->db->rollback();
1246  return -1;
1247  }
1248  }
1249 
1250 
1262  public function addline($user, $fichinterid, $desc, $date_intervention, $duration, $array_options = '')
1263  {
1264  dol_syslog(get_class($this)."::addline $fichinterid, $desc, $date_intervention, $duration");
1265 
1266  if ($this->statut == 0) {
1267  $this->db->begin();
1268 
1269  // Insertion ligne
1270  $line = new FichinterLigne($this->db);
1271 
1272  $line->fk_fichinter = $fichinterid;
1273  $line->desc = $desc;
1274  $line->date = $date_intervention;
1275  $line->datei = $date_intervention; // For backward compatibility
1276  $line->duration = $duration;
1277 
1278  if (is_array($array_options) && count($array_options) > 0) {
1279  $line->array_options = $array_options;
1280  }
1281 
1282  $result = $line->insert($user);
1283 
1284  if ($result >= 0) {
1285  $this->db->commit();
1286  return 1;
1287  } else {
1288  $this->error = $this->db->error();
1289  $this->db->rollback();
1290  return -1;
1291  }
1292  }
1293  }
1294 
1295 
1303  public function initAsSpecimen()
1304  {
1305  global $user, $langs, $conf;
1306 
1307  $now = dol_now();
1308 
1309  // Initialise parametres
1310  $this->id = 0;
1311  $this->ref = 'SPECIMEN';
1312  $this->ref_client = 'SPECIMEN CLIENT';
1313  $this->specimen = 1;
1314  $this->socid = 1;
1315  $this->datec = $now;
1316  $this->note_private = 'Private note';
1317  $this->note_public = 'SPECIMEN';
1318  $this->duration = 0;
1319  $nbp = 25;
1320  $xnbp = 0;
1321  while ($xnbp < $nbp) {
1322  $line = new FichinterLigne($this->db);
1323  $line->desc = $langs->trans("Description")." ".$xnbp;
1324  $line->date = ($now - 3600 * (1 + $xnbp));
1325  $line->datei = ($now - 3600 * (1 + $xnbp)); // For backward compatibility
1326  $line->duration = 600;
1327  $line->fk_fichinter = 0;
1328  $this->lines[$xnbp] = $line;
1329  $xnbp++;
1330 
1331  $this->duration += $line->duration;
1332  }
1333  }
1334 
1335  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1341  public function fetch_lines()
1342  {
1343  // phpcs:enable
1344  $this->lines = array();
1345 
1346  $sql = "SELECT rowid, fk_fichinter, description, duree, date, rang";
1347  $sql .= " FROM ".MAIN_DB_PREFIX."fichinterdet";
1348  $sql .= " WHERE fk_fichinter = ".((int) $this->id);
1349  $sql .= " ORDER BY rang ASC, date ASC";
1350 
1351  dol_syslog(get_class($this)."::fetch_lines", LOG_DEBUG);
1352 
1353  $resql = $this->db->query($sql);
1354  if ($resql) {
1355  $num = $this->db->num_rows($resql);
1356  $i = 0;
1357  while ($i < $num) {
1358  $objp = $this->db->fetch_object($resql);
1359 
1360  $line = new FichinterLigne($this->db);
1361  $line->id = $objp->rowid;
1362  $line->fk_fichinter = $objp->fk_fichinter;
1363  $line->desc = $objp->description;
1364  $line->duration = $objp->duree;
1365  //For invoicing we calculing hours
1366  $line->qty = round($objp->duree / 3600, 2);
1367  $line->date = $this->db->jdate($objp->date);
1368  $line->datei = $this->db->jdate($objp->date); // For backward compatibility
1369  $line->rang = $objp->rang;
1370  $line->product_type = 1;
1371  $line->fetch_optionals();
1372 
1373  $this->lines[$i] = $line;
1374  $i++;
1375  }
1376  $this->db->free($resql);
1377 
1378  return 1;
1379  } else {
1380  $this->error = $this->db->error();
1381  return -1;
1382  }
1383  }
1384 
1393  public static function replaceThirdparty(DoliDB $db, $origin_id, $dest_id)
1394  {
1395  $tables = array(
1396  'fichinter'
1397  );
1398 
1399  return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables);
1400  }
1401 
1410  public function setRefClient($user, $ref_client, $notrigger = 0)
1411  {
1412  // phpcs:enable
1413  if (!empty($user->rights->ficheinter->creer)) {
1414  $error = 0;
1415 
1416  $this->db->begin();
1417 
1418  $this->oldcopy = dol_clone($this);
1419 
1420  $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ref_client = ".(empty($ref_client) ? 'NULL' : "'".$this->db->escape($ref_client)."'");
1421  $sql .= " WHERE rowid = ".((int) $this->id);
1422 
1423  dol_syslog(__METHOD__.' $this->id='.$this->id.', ref_client='.$ref_client, LOG_DEBUG);
1424  $resql = $this->db->query($sql);
1425  if (!$resql) {
1426  $this->errors[] = $this->db->error();
1427  $error++;
1428  }
1429 
1430  if (!$error) {
1431  $this->ref_client = $ref_client;
1432  }
1433 
1434  if (!$notrigger && empty($error)) {
1435  // Call trigger
1436  $result = $this->call_trigger('FICHINTER_MODIFY', $user);
1437  if ($result < 0) {
1438  $error++;
1439  }
1440  // End call triggers
1441  }
1442 
1443  if (!$error) {
1444  $this->db->commit();
1445  return 1;
1446  } else {
1447  foreach ($this->errors as $errmsg) {
1448  dol_syslog(__METHOD__.' Error: '.$errmsg, LOG_ERR);
1449  $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
1450  }
1451  $this->db->rollback();
1452  return -1 * $error;
1453  }
1454  } else {
1455  return -1;
1456  }
1457  }
1458 }
1459 
1464 {
1468  public $db;
1469 
1473  public $error = '';
1474 
1475  // From llx_fichinterdet
1479  public $fk_fichinter;
1480 
1481  public $desc; // Description ligne
1482 
1486  public $date; // Date intervention
1491  public $datei; // Date intervention
1492 
1493  public $duration; // Duration of intervention
1494  public $rang = 0;
1495  public $tva_tx;
1496  public $subprice;
1497 
1501  public $element = 'fichinterdet';
1502 
1506  public $table_element = 'fichinterdet';
1507 
1511  public $fk_element = 'fk_fichinter';
1512 
1513 
1514 
1520  public function __construct($db)
1521  {
1522  $this->db = $db;
1523  }
1524 
1531  public function fetch($rowid)
1532  {
1533  $sql = 'SELECT ft.rowid, ft.fk_fichinter, ft.description, ft.duree, ft.rang, ft.date';
1534  $sql .= ' FROM '.MAIN_DB_PREFIX.'fichinterdet as ft';
1535  $sql .= ' WHERE ft.rowid = '.((int) $rowid);
1536 
1537  dol_syslog("FichinterLigne::fetch", LOG_DEBUG);
1538  $result = $this->db->query($sql);
1539  if ($result) {
1540  $objp = $this->db->fetch_object($result);
1541  $this->rowid = $objp->rowid;
1542  $this->id = $objp->rowid;
1543  $this->fk_fichinter = $objp->fk_fichinter;
1544  $this->date = $this->db->jdate($objp->date);
1545  $this->datei = $this->db->jdate($objp->date); // For backward compatibility
1546  $this->desc = $objp->description;
1547  $this->duration = $objp->duree;
1548  $this->rang = $objp->rang;
1549 
1550  $this->db->free($result);
1551  return 1;
1552  } else {
1553  $this->error = $this->db->error().' sql='.$sql;
1554  return -1;
1555  }
1556  }
1557 
1565  public function insert($user, $notrigger = 0)
1566  {
1567  global $langs, $conf;
1568 
1569  $error = 0;
1570 
1571  dol_syslog("FichinterLigne::insert rang=".$this->rang);
1572 
1573  if (empty($this->date) && !empty($this->datei)) { // For backward compatibility
1574  $this->date = $this->datei;
1575  }
1576 
1577  $this->db->begin();
1578 
1579  $rangToUse = $this->rang;
1580  if ($rangToUse == -1) {
1581  // Recupere rang max de la ligne d'intervention dans $rangmax
1582  $sql = 'SELECT max(rang) as max FROM '.MAIN_DB_PREFIX.'fichinterdet';
1583  $sql .= ' WHERE fk_fichinter = '.((int) $this->fk_fichinter);
1584  $resql = $this->db->query($sql);
1585  if ($resql) {
1586  $obj = $this->db->fetch_object($resql);
1587  $rangToUse = $obj->max + 1;
1588  } else {
1589  dol_print_error($this->db);
1590  $this->db->rollback();
1591  return -1;
1592  }
1593  }
1594 
1595  // Insertion dans base de la ligne
1596  $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'fichinterdet';
1597  $sql .= ' (fk_fichinter, description, date, duree, rang)';
1598  $sql .= " VALUES (".((int) $this->fk_fichinter).",";
1599  $sql .= " '".$this->db->escape($this->desc)."',";
1600  $sql .= " '".$this->db->idate($this->date)."',";
1601  $sql .= " ".((int) $this->duration).",";
1602  $sql .= ' '.((int) $rangToUse);
1603  $sql .= ')';
1604 
1605  dol_syslog("FichinterLigne::insert", LOG_DEBUG);
1606  $resql = $this->db->query($sql);
1607  if ($resql) {
1608  $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.'fichinterdet');
1609  $this->rowid = $this->id;
1610 
1611  if (!$error) {
1612  $result = $this->insertExtraFields();
1613  if ($result < 0) {
1614  $error++;
1615  }
1616  }
1617 
1618 
1619  $result = $this->update_total();
1620 
1621  if ($result > 0) {
1622  $this->rang = $rangToUse;
1623 
1624  if (!$notrigger) {
1625  // Call trigger
1626  $result = $this->call_trigger('LINEFICHINTER_CREATE', $user);
1627  if ($result < 0) {
1628  $error++;
1629  }
1630  // End call triggers
1631  }
1632  }
1633 
1634  if (!$error) {
1635  $this->db->commit();
1636  return $result;
1637  } else {
1638  $this->db->rollback();
1639  return -1;
1640  }
1641  } else {
1642  $this->error = $this->db->error()." sql=".$sql;
1643  $this->db->rollback();
1644  return -1;
1645  }
1646  }
1647 
1648 
1656  public function update($user, $notrigger = 0)
1657  {
1658  global $langs, $conf;
1659 
1660  $error = 0;
1661 
1662  if (empty($this->date) && !empty($this->datei)) { // For backward compatibility
1663  $this->date = $this->datei;
1664  }
1665 
1666  $this->db->begin();
1667 
1668  // Mise a jour ligne en base
1669  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinterdet SET";
1670  $sql .= " description = '".$this->db->escape($this->desc)."',";
1671  $sql .= " date = '".$this->db->idate($this->date)."',";
1672  $sql .= " duree = ".((int) $this->duration).",";
1673  $sql .= " rang = ".((int) $this->rang);
1674  $sql .= " WHERE rowid = ".((int) $this->id);
1675 
1676  dol_syslog("FichinterLigne::update", LOG_DEBUG);
1677  $resql = $this->db->query($sql);
1678  if ($resql) {
1679  if (!$error) {
1680  $result = $this->insertExtraFields();
1681  if ($result < 0) {
1682  $error++;
1683  }
1684  }
1685 
1686  $result = $this->update_total();
1687  if ($result > 0) {
1688  if (!$notrigger) {
1689  // Call trigger
1690  $result = $this->call_trigger('LINEFICHINTER_MODIFY', $user);
1691  if ($result < 0) {
1692  $error++;
1693  }
1694  // End call triggers
1695  }
1696  }
1697 
1698  if (!$error) {
1699  $this->db->commit();
1700  return $result;
1701  } else {
1702  $this->error = $this->db->lasterror();
1703  $this->db->rollback();
1704  return -1;
1705  }
1706  } else {
1707  $this->error = $this->db->lasterror();
1708  $this->db->rollback();
1709  return -1;
1710  }
1711  }
1712 
1713  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1719  public function update_total()
1720  {
1721  // phpcs:enable
1722  global $conf;
1723 
1724  $this->db->begin();
1725 
1726  $sql = "SELECT SUM(duree) as total_duration, min(date) as dateo, max(date) as datee ";
1727  $sql .= " FROM ".MAIN_DB_PREFIX."fichinterdet";
1728  $sql .= " WHERE fk_fichinter=".((int) $this->fk_fichinter);
1729 
1730  dol_syslog("FichinterLigne::update_total", LOG_DEBUG);
1731  $resql = $this->db->query($sql);
1732  if ($resql) {
1733  $obj = $this->db->fetch_object($resql);
1734  $total_duration = 0;
1735  if (!empty($obj->total_duration)) {
1736  $total_duration = $obj->total_duration;
1737  }
1738 
1739  $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter";
1740  $sql .= " SET duree = ".((int) $total_duration);
1741  $sql .= " , dateo = ".(!empty($obj->dateo) ? "'".$this->db->escape($obj->dateo)."'" : "null");
1742  $sql .= " , datee = ".(!empty($obj->datee) ? "'".$this->db->escape($obj->datee)."'" : "null");
1743  $sql .= " WHERE rowid = ".((int) $this->fk_fichinter);
1744 
1745  dol_syslog("FichinterLigne::update_total", LOG_DEBUG);
1746  $resql = $this->db->query($sql);
1747  if ($resql) {
1748  $this->db->commit();
1749  return 1;
1750  } else {
1751  $this->error = $this->db->error();
1752  $this->db->rollback();
1753  return -2;
1754  }
1755  } else {
1756  $this->error = $this->db->error();
1757  $this->db->rollback();
1758  return -1;
1759  }
1760  }
1761 
1769  public function deleteline($user, $notrigger = 0)
1770  {
1771  global $langs, $conf;
1772 
1773  $error = 0;
1774 
1775  if ($this->statut == 0) {
1776  dol_syslog(get_class($this)."::deleteline lineid=".$this->id);
1777  $this->db->begin();
1778 
1779  $result = $this->deleteExtraFields();
1780  if ($result < 0) {
1781  $error++;
1782  $this->db->rollback();
1783  return -1;
1784  }
1785 
1786  $sql = "DELETE FROM ".MAIN_DB_PREFIX."fichinterdet WHERE rowid = ".((int) $this->id);
1787  $resql = $this->db->query($sql);
1788 
1789  if ($resql) {
1790  $result = $this->update_total();
1791  if ($result > 0) {
1792  if (!$notrigger) {
1793  // Call trigger
1794  $result = $this->call_trigger('LINEFICHINTER_DELETE', $user);
1795  if ($result < 0) {
1796  $error++; $this->db->rollback(); return -1;
1797  }
1798  // End call triggers
1799  }
1800 
1801  $this->db->commit();
1802  return $result;
1803  } else {
1804  $this->db->rollback();
1805  return -1;
1806  }
1807  } else {
1808  $this->error = $this->db->error()." sql=".$sql;
1809  $this->db->rollback();
1810  return -1;
1811  }
1812  } else {
1813  return -2;
1814  }
1815  }
1816 }
Societe
Class to manage third parties objects (customers, suppliers, prospects...)
Definition: societe.class.php:49
Fichinter\set_description
set_description($user, $description)
Define the label of the intervention.
Definition: fichinter.class.php:1109
db
$conf db
API class for accounts.
Definition: inc.php:41
FichinterLigne\update_total
update_total()
Update total duration into llx_fichinter.
Definition: fichinter.class.php:1719
dol_sanitizeFileName
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
Definition: functions.lib.php:1225
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:1402
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:1341
Fichinter\LibStatut
LibStatut($status, $mode=0)
Returns the label of a status.
Definition: fichinter.class.php:746
FichinterLigne\fetch
fetch($rowid)
Retrieve the line of intervention.
Definition: fichinter.class.php:1531
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:4993
ref
$object ref
Definition: info.php:78
FichinterLigne\update
update($user, $notrigger=0)
Update intervention into database.
Definition: fichinter.class.php:1656
dol_buildpath
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
Definition: functions.lib.php:1061
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:61
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:4244
Fichinter\setValid
setValid($user, $notrigger=0)
Validate a intervention.
Definition: fichinter.class.php:569
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
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:1157
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:44
price2num
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
Definition: functions.lib.php:5823
Fichinter\load_state_board
load_state_board()
Load indicators into this->nb for board.
Definition: fichinter.class.php:203
Fichinter\replaceThirdparty
static replaceThirdparty(DoliDB $db, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
Definition: fichinter.class.php:1393
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:4024
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:5427
FichinterLigne\insert
insert($user, $notrigger=0)
Insert the line into database.
Definition: fichinter.class.php:1565
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:1251
getEntity
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
Definition: functions.lib.php:180
CommonObject\insertExtraFields
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
Definition: commonobject.class.php:6185
$resql
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
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:622
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:1338
Fichinter\getLibStatut
getLibStatut($mode=0)
Returns the label status.
Definition: fichinter.class.php:733
FichinterLigne
Class to manage intervention lines.
Definition: fichinter.class.php:1463
CommonObject\deleteEcmFiles
deleteEcmFiles($mode=0)
Delete related files of object in database.
Definition: commonobject.class.php:10134
Fichinter\getAmount
getAmount()
Returns amount based on user thm.
Definition: fichinter.class.php:674
CommonObject\commonReplaceThirdparty
static commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
Definition: commonobject.class.php:8499
dol_syslog
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
Definition: functions.lib.php:1628
Fichinter\create
create($user, $notrigger=0)
Create an intervention into data base.
Definition: fichinter.class.php:242
Fichinter\info
info($id)
Load information on object.
Definition: fichinter.class.php:905
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:6034
Fichinter\setDraft
setDraft($user)
Set status to draft.
Definition: fichinter.class.php:516
Fichinter\addline
addline($user, $fichinterid, $desc, $date_intervention, $duration, $array_options='')
Adding a line of intervention into data base.
Definition: fichinter.class.php:1262
dol_strlen
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
Definition: functions.lib.php:3887
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:1170
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:6145
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:1454
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:3834
dolGetStatus
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
Definition: functions.lib.php:10745
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:704
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:4360
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:856
dol_now
dol_now($mode='auto')
Return date for now.
Definition: functions.lib.php:2951
Fichinter\setRefClient
setRefClient($user, $ref_client, $notrigger=0)
Set customer reference number.
Definition: fichinter.class.php:1410
Fichinter\initAsSpecimen
initAsSpecimen()
Initialise an instance with random values.
Definition: fichinter.class.php:1303
CommonObject\call_trigger
call_trigger($triggerName, $user)
Call trigger based on this instance.
Definition: commonobject.class.php:5818
Fichinter\set_date_delivery
set_date_delivery($user, $date_delivery)
Defines a delivery date of intervention.
Definition: fichinter.class.php:1079
Fichinter\__construct
__construct($db)
Constructor.
Definition: fichinter.class.php:192
Fichinter\getNomUrl
getNomUrl($withpicto=0, $option='', $notooltip=0, $save_lastsearch_value=-1)
Return clicable name (with picto eventually)
Definition: fichinter.class.php:780
Fichinter\set_contrat
set_contrat($user, $contractid)
Link intervention to a contract.
Definition: fichinter.class.php:1140
FichinterLigne\deleteline
deleteline($user, $notrigger=0)
Delete a intervention line.
Definition: fichinter.class.php:1769
FichinterLigne\__construct
__construct($db)
Constructor.
Definition: fichinter.class.php:1520