32require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/fichinter/class/fichinterligne.class.php';
34require_once DOL_DOCUMENT_ROOT.
'/core/class/commonsignedobject.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/subtotals/class/commonsubtotal.class.php';
45 use CommonSignedObject;
52 public $TRIGGER_PREFIX =
'FICHINTER';
54 public $fields = array(
55 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 10),
56 'fk_soc' => array(
'type' =>
'integer:Societe:societe/class/societe.class.php',
'label' =>
'ThirdParty',
'enabled' =>
'isModEnabled("societe")',
'visible' => -1,
'notnull' => 1,
'position' => 15),
57 'fk_projet' => array(
'type' =>
'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)',
'label' =>
'Project',
'enabled' =>
'isModEnabled("project")',
'visible' => -1,
'position' => 20),
58 'fk_contrat' => array(
'type' =>
'integer:Contrat:contrat/class/contrat.class.php',
'label' =>
'Contract',
'enabled' =>
'isModEnabled("contract")',
'visible' => -1,
'position' => 25),
59 'ref' => array(
'type' =>
'varchar(30)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'showoncombobox' => 1,
'position' => 30),
60 'ref_ext' => array(
'type' =>
'varchar(255)',
'label' =>
'RefExt',
'enabled' => 1,
'visible' => 0,
'position' => 35),
61 'ref_client' => array(
'type' =>
'varchar(255)',
'label' =>
'RefCustomer',
'enabled' => 1,
'visible' => -1,
'position' => 36),
62 'entity' => array(
'type' =>
'integer',
'label' =>
'Entity',
'default' =>
'1',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'position' => 40,
'index' => 1),
63 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 45),
64 'datec' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -1,
'position' => 50),
65 'date_valid' => array(
'type' =>
'datetime',
'label' =>
'DateValidation',
'enabled' => 1,
'visible' => -1,
'position' => 55),
66 'datei' => array(
'type' =>
'date',
'label' =>
'Datei',
'enabled' => 1,
'visible' => -1,
'position' => 60),
67 'fk_user_author' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserAuthor',
'enabled' => 1,
'visible' => -1,
'position' => 65),
68 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'visible' => -2,
'notnull' => -1,
'position' => 70),
69 'fk_user_valid' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserValidation',
'enabled' => 1,
'visible' => -1,
'position' => 75),
70 'dateo' => array(
'type' =>
'date',
'label' =>
'Dateo',
'enabled' => 1,
'visible' => -1,
'position' => 85),
71 'datee' => array(
'type' =>
'date',
'label' =>
'Datee',
'enabled' => 1,
'visible' => -1,
'position' => 90),
72 'datet' => array(
'type' =>
'date',
'label' =>
'Datet',
'enabled' => 1,
'visible' => -1,
'position' => 95),
73 'duree' => array(
'type' =>
'integer',
'label' =>
'Duree',
'enabled' => 1,
'visible' => -1,
'position' => 100),
74 'signed_status' => array(
'type' =>
'smallint(6)',
'label' =>
'SignedStatus',
'enabled' => 1,
'visible' => -1,
'position' => 101,
'arrayofkeyval' => array(0 =>
'NoSignature', 1 =>
'SignedSender', 2 =>
'SignedReceiver', 3 =>
'SignedReceiverOnline', 9 =>
'SignedAll')),
75 'description' => array(
'type' =>
'html',
'label' =>
'Description',
'enabled' => 1,
'visible' => -1,
'position' => 105,
'showoncombobox' => 2),
76 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'visible' => 0,
'position' => 110),
77 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => 0,
'position' => 115),
78 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'PDFTemplate',
'enabled' => 1,
'visible' => 0,
'position' => 120),
79 'last_main_doc' => array(
'type' =>
'varchar(255)',
'label' =>
'LastMainDoc',
'enabled' => 1,
'visible' => -1,
'position' => 125),
80 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -2,
'position' => 130),
81 'extraparams' => array(
'type' =>
'varchar(255)',
'label' =>
'Extraparams',
'enabled' => 1,
'visible' => -1,
'position' => 135),
82 'fk_statut' => array(
'type' =>
'integer',
'label' =>
'Status',
'enabled' => 1,
'visible' => -1,
'position' => 500),
88 public $element =
'fichinter';
93 public $fk_element =
'fk_fichinter';
98 public $table_element =
'fichinter';
103 public $table_element_line =
'fichinterdet';
108 public $class_element_line =
'FichinterLigne';
113 public $picto =
'intervention';
184 public $fk_contrat = 0;
200 public $extraparams = array();
205 public $lines = array();
237 public $date_delivery;
243 public $delivery_date_receipt;
249 public $user_author_id;
274 $sql =
"SELECT count(fi.rowid) as nb";
275 $sql .=
" FROM ".MAIN_DB_PREFIX.
"fichinter as fi";
276 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON fi.fk_soc = s.rowid";
277 if (!$user->hasRight(
'societe',
'client',
'voir')) {
278 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
279 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
282 $sql .=
" ".$clause.
" fi.entity IN (".
getEntity(
'intervention').
")";
284 $resql = $this->db->query($sql);
286 while ($obj = $this->db->fetch_object($resql)) {
287 $this->nb[
"interventions"] = $obj->nb;
289 $this->db->free($resql);
293 $this->error = $this->db->error();
305 public function create($user, $notrigger = 0)
312 if (!empty($this->ref)) {
315 $this->error =
'ErrorRefAlreadyExists';
316 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
317 $this->db->rollback();
321 if (!is_numeric($this->duration)) {
324 if (!empty($this->ref_client)) {
325 $this->ref_client = trim($this->ref_client);
328 if ($this->socid <= 0) {
329 $this->error =
'ErrorFicheinterCompanyDoesNotExist';
330 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
336 $result = $soc->fetch($this->socid);
342 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"fichinter (";
346 $sql .=
", ref_client";
348 $sql .=
", fk_user_author";
349 $sql .=
", fk_user_modif";
350 $sql .=
", description";
351 $sql .=
", model_pdf";
352 $sql .=
", fk_projet";
353 $sql .=
", fk_contrat";
354 $sql .=
", fk_statut";
355 $sql .=
", signed_status";
356 $sql .=
", note_private";
357 $sql .=
", note_public";
360 $sql .= ((int) $this->socid);
361 $sql .=
", '".$this->db->idate($now).
"'";
362 $sql .=
", '".$this->db->escape($this->ref).
"'";
363 $sql .=
", ".($this->ref_client ?
"'".$this->db->escape($this->ref_client).
"'" :
"null");
364 $sql .=
", ".((int) $this->entity);
365 $sql .=
", ".((int) $user->id);
366 $sql .=
", ".((int) $user->id);
367 $sql .=
", ".($this->description ?
"'".$this->db->escape($this->
description).
"'" :
"null");
368 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
369 $sql .=
", ".((int) $this->fk_project > 0 ? ((
int) $this->fk_project) : 0);
370 $sql .=
", ".((int) $this->fk_contrat > 0 ? ((
int) $this->fk_contrat) : 0);
371 $sql .=
", ".((int) $this->
status);
372 $sql .=
", ".((int) $this->signed_status);
373 $sql .=
", ".($this->note_private ?
"'".$this->db->escape($this->note_private).
"'" :
"null");
374 $sql .=
", ".($this->note_public ?
"'".$this->db->escape($this->note_public).
"'" :
"null");
377 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
378 $result = $this->db->query($sql);
380 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"fichinter");
383 $this->ref =
'(PROV'.$this->id.
')';
384 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"fichinter SET ref='".$this->db->escape($this->ref).
"' WHERE rowid=".((int) $this->
id);
386 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
387 $resql = $this->db->query($sql);
401 if (!$error && $this->origin && $this->origin_id) {
409 if (!$error && !$notrigger) {
411 $result = $this->call_trigger(
'FICHINTER_CREATE', $user);
422 $this->db->rollback();
423 $this->error = implode(
',', $this->errors);
424 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
428 $this->error = $this->db->error();
429 $this->db->rollback();
441 public function update($user, $notrigger = 0)
445 if (!is_numeric($this->duration)) {
448 if (!
dol_strlen((
string) $this->fk_project)) {
449 $this->fk_project = 0;
451 if (!empty($this->ref_client)) {
452 $this->ref_client = trim($this->ref_client);
459 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"fichinter SET ";
460 $sql .=
"description = '".$this->db->escape($this->
description).
"'";
461 $sql .=
", duree = ".((int) $this->duration);
462 $sql .=
", ref_client = ".($this->ref_client ?
"'".$this->db->escape($this->ref_client).
"'" :
"null");
463 if ((
int) $this->fk_project > 0) {
464 $sql .=
", fk_projet = ".((int) $this->fk_project);
466 if (isset($this->datec)) {
467 $sql .=
", datec = ".($this->datec ?
"'".$this->db->idate($this->datec).
"'" :
"null");
469 if (isset($this->datev)) {
470 $sql .=
", date_valid = ".($this->datev ?
"'".$this->db->idate($this->datev).
"'" :
"null");
472 if (isset($this->datet)) {
473 $sql .=
", datet = ".($this->datet ?
"'".$this->db->idate($this->datet).
"'" :
"null");
475 $sql .=
", note_private = ".($this->note_private ?
"'".$this->db->escape($this->note_private).
"'" :
"null");
476 $sql .=
", note_public = ".($this->note_public ?
"'".$this->db->escape($this->note_public).
"'" :
"null");
477 $sql .=
", fk_user_modif = ".((int) $user->id);
478 $sql .=
" WHERE rowid = ".((int) $this->
id);
480 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
481 if ($this->db->query($sql)) {
487 if (!$error && !$notrigger) {
489 $result = $this->call_trigger(
'FICHINTER_MODIFY', $user);
492 $this->db->rollback();
501 $this->error = $this->db->error();
502 $this->db->rollback();
515 public function fetch($rowid, $ref =
'', $ref_ext =
'')
517 $sql =
"SELECT f.rowid, f.ref, f.ref_client, f.description, f.fk_soc, f.fk_statut as status, f.signed_status,";
518 $sql .=
" f.datec, f.dateo, f.datee, f.datet,";
519 $sql .=
" f.date_valid as datev,";
520 $sql .=
" f.tms as datem,";
521 $sql .=
" f.fk_user_author, f.fk_user_modif,";
522 $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";
523 $sql .=
" FROM ".MAIN_DB_PREFIX.
"fichinter as f";
524 $sql .=
" WHERE f.entity IN (".getEntity(
'intervention').
")";
526 $sql .=
" AND f.ref = '".$this->db->escape($ref).
"'";
527 } elseif ($ref_ext) {
528 $sql .=
" AND f.ref_ext = '".$this->db->escape($ref_ext).
"'";
530 $sql .=
" AND f.rowid = ".((int) $rowid);
533 $resql = $this->db->query($sql);
535 if ($this->db->num_rows($resql)) {
536 $obj = $this->db->fetch_object($resql);
538 $this->
id = $obj->rowid;
539 $this->
ref = $obj->ref;
540 $this->ref_client = $obj->ref_client;
542 $this->socid = $obj->fk_soc;
543 $this->
status = $obj->status;
544 $this->statut = $obj->status;
545 $this->signed_status = $obj->signed_status;
546 $this->duration = $obj->duree;
547 $this->datec = $this->db->jdate($obj->datec);
548 $this->dateo = $this->db->jdate($obj->dateo);
549 $this->datee = $this->db->jdate($obj->datee);
550 $this->datet = $this->db->jdate($obj->datet);
551 $this->datev = $this->db->jdate($obj->datev);
552 $this->datem = $this->db->jdate($obj->datem);
553 $this->fk_project = $obj->fk_project;
554 $this->note_public = $obj->note_public;
555 $this->note_private = $obj->note_private;
556 $this->model_pdf = $obj->model_pdf;
557 $this->fk_contrat = $obj->fk_contrat;
558 $this->entity = $obj->entity;
560 $this->user_author_id = $this->user_creation_id = $obj->fk_user_author;
561 $this->user_modification_id = $obj->fk_user_modif;
563 $this->extraparams = is_null($obj->extraparams) ? [] : (array) json_decode($obj->extraparams,
true);
565 $this->last_main_doc = $obj->last_main_doc;
577 $this->db->free($resql);
583 $this->error = $this->db->lasterror();
599 if ($this->
status <= self::STATUS_DRAFT) {
603 dol_syslog(get_class($this).
"::setDraft", LOG_DEBUG);
609 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"fichinter";
610 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
611 $sql .=
" WHERE rowid = ".((int) $this->
id);
613 $resql = $this->db->query($sql);
616 $result = $this->call_trigger(
'FICHINTER_UNVALIDATE', $user);
627 $this->db->rollback();
631 $this->db->rollback();
632 $this->error = $this->db->lasterror();
647 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
651 if ($this->
status != self::STATUS_VALIDATED) {
657 if ((preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
664 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"fichinter";
665 $sql .=
" SET fk_statut = 1";
666 $sql .=
", ref = '".$this->db->escape($num).
"'";
667 $sql .=
", date_valid = '".$this->db->idate($now).
"'";
668 $sql .=
", fk_user_valid = ".($user->id > 0 ? (int) $user->id :
"null");
669 $sql .=
" WHERE rowid = ".((int) $this->
id);
670 $sql .=
" AND entity IN (".getEntity(
'intervention').
")";
672 $sql .=
" AND fk_statut = 0";
674 dol_syslog(get_class($this).
"::setValid", LOG_DEBUG);
675 $resql = $this->db->query($sql);
681 if (!$error && !$notrigger) {
683 $result = $this->call_trigger(
'FICHINTER_VALIDATE', $user);
691 $this->oldref = $this->ref;
694 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
695 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
698 $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).
"'";
699 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'ficheinter/".$this->db->escape($this->
ref).
"' and entity = ".((int) $this->entity);
700 $resql = $this->db->query($sql);
703 $this->error = $this->db->lasterror();
705 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'ficheinter/".$this->db->escape($this->newref).
"'";
706 $sql .=
" WHERE filepath = 'ficheinter/".$this->db->escape($this->
ref).
"' and entity = ".((int)
$conf->entity);
707 $resql = $this->db->query($sql);
710 $this->error = $this->db->lasterror();
716 $dirsource =
$conf->ficheinter->dir_output.
'/'.$oldref;
717 $dirdest =
$conf->ficheinter->dir_output.
'/'.$newref;
718 if (!$error && file_exists($dirsource)) {
719 dol_syslog(get_class($this).
"::setValid rename dir ".$dirsource.
" into ".$dirdest);
721 if (@rename($dirsource, $dirdest)) {
724 $listoffiles =
dol_dir_list(
$conf->ficheinter->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
725 foreach ($listoffiles as $fileentry) {
726 $dirsource = $fileentry[
'name'];
727 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
728 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
729 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
730 @rename($dirsource, $dirdest);
742 $this->date_validation = $now;
746 $this->db->rollback();
747 dol_syslog(get_class($this).
"::setValid ".$this->error, LOG_ERR);
766 if ($this->
status == self::STATUS_CANCELED) {
772 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"fichinter";
773 $sql .=
" SET fk_statut = ".self::STATUS_CANCELED.
",";
774 $sql .=
" fk_user_modif = ".((int) $user->id);
775 $sql .=
" WHERE rowid = ".((int) $this->
id);
776 $sql .=
" AND fk_statut = ".self::STATUS_VALIDATED;
777 $sql .=
" AND entity IN (".getEntity(
'intervention').
")";
779 dol_syslog(get_class($this).
"::setCanceled", LOG_DEBUG);
780 if ($this->db->query($sql)) {
783 $result = $this->call_trigger(
'FICHINTER_CANCEL', $user);
796 foreach ($this->errors as $errmsg) {
797 dol_syslog(get_class($this).
"::setCanceled ".$errmsg, LOG_ERR);
798 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
800 $this->db->rollback();
804 $this->error = $this->db->error();
805 $this->db->rollback();
824 if ($this->statut != self::STATUS_CANCELED && $this->statut != self::STATUS_CLOSED) {
825 dol_syslog(get_class($this).
"::setReopen intervention has not status closed or canceled", LOG_WARNING);
831 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'fichinter';
832 $sql .=
' SET fk_statut='.self::STATUS_VALIDATED;
833 $sql .=
", fk_user_modif = ".((int) $user->id);
834 $sql .=
" WHERE rowid = ".((int) $this->
id);
836 dol_syslog(get_class($this).
"::setReopen", LOG_DEBUG);
837 $resql = $this->db->query($sql);
841 $result = $this->call_trigger(
'FICHINTER_REOPEN', $user);
849 $this->error = $this->db->lasterror();
861 foreach ($this->errors as $errmsg) {
862 dol_syslog(get_class($this).
"::setReopen ".$errmsg, LOG_ERR);
863 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
865 $this->db->rollback();
883 if ($this->
status == self::STATUS_CLOSED) {
890 $sql =
'UPDATE ' . MAIN_DB_PREFIX . $this->table_element;
891 $sql .=
' SET fk_statut = ' . self::STATUS_CLOSED .
',';
892 $sql .=
" datet = '" . $this->db->idate($now) .
"',";
893 $sql .=
" fk_user_modif = " . ((int) $user->id);
894 $sql .=
" WHERE rowid = " . ((int) $this->
id);
896 $sql .=
" AND entity IN (".getEntity(
'intervention').
")";
898 if ($this->db->query($sql)) {
901 $result = $this->call_trigger(
'FICHINTER_CLOSE', $user);
914 $this->db->rollback();
918 $this->error = $this->db->lasterror();
919 $this->db->rollback();
934 $this->author =
new User($this->db);
935 $this->author->fetch($this->user_creation_id);
937 $thm = $this->author->thm;
939 foreach ($this->lines as $line) {
940 $amount += ($line->duration / 60 / 60 * (float) $thm);
958 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
962 $outputlangs->load(
"interventions");
967 if (!empty($this->model_pdf)) {
968 $modele = $this->model_pdf;
974 $modelpath =
"core/modules/fichinter/doc/";
976 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
987 return $this->
LibStatut((isset($this->statut) ? $this->statut : $this->status), $mode);
1003 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
1004 $langs->load(
"interventions");
1005 $langs->load(
"propal");
1009 $this->labelStatus[
self::STATUS_BILLED] = $langs->transnoentitiesnoconv(
'StatusInterInvoiced');
1012 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'Draft');
1014 $this->labelStatusShort[
self::STATUS_BILLED] = $langs->transnoentitiesnoconv(
'StatusInterInvoiced');
1019 $statuscode =
'status'.$status;
1020 if ($status == self::STATUS_BILLED || $status == self::STATUS_CLOSED) {
1021 $statuscode =
'status6';
1025 $status_label = $this->signed_status ? $this->labelStatus[$status] . $signed_label : $this->labelStatus[$status];
1026 $status_label_short = $this->signed_status ? $this->labelStatusShort[$status] . $signed_label : $this->labelStatusShort[$status];
1028 return dolGetStatus($status_label, $status_label_short,
'', $statuscode, $mode);
1041 $langs->load(
'interventions');
1044 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"ShowIntervention").
'</u>';
1045 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
1046 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1061 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $save_lastsearch_value = -1, $morecss =
'')
1063 global
$conf, $langs, $hookmanager;
1065 if (!empty(
$conf->dol_no_mouse_hover)) {
1072 'objecttype' => $this->element,
1073 'option' => $option,
1075 $classfortooltip =
'classfortooltip';
1078 $classfortooltip =
'classforajaxtooltip';
1079 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
1085 $url = DOL_URL_ROOT.
'/fichinter/card.php?id='.$this->id;
1087 if ($option !==
'nolink') {
1089 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1090 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1091 $add_save_lastsearch_values = 1;
1093 if ($add_save_lastsearch_values) {
1094 $url .=
'&save_lastsearch_values=1';
1099 if (empty($notooltip)) {
1101 $label = $langs->trans(
"ShowIntervention");
1102 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
1104 $linkclose .= ($label ?
' title="'.dolPrintHTMLForAttribute($label).
'"' :
' title="tocomplete"');
1105 $linkclose .= $dataparams.
' class="'.$classfortooltip.($morecss ?
' '.$morecss :
'').
'"';
1107 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
1110 if ($option ==
'nolink') {
1111 $linkstart =
'<span';
1113 $linkstart =
'<a href="'.$url.
'"';
1115 $linkstart .= $linkclose.
'>';
1116 if ($option ==
'nolink') {
1117 $linkend =
'</span>';
1122 $result .= $linkstart;
1124 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'"'), 0, 0, $notooltip ? 0 : 1);
1127 if ($withpicto != 2) {
1128 $result .= $this->ref;
1131 $result .= $linkend;
1134 $hookmanager->initHooks(array(
'interventiondao'));
1135 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1136 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1138 $result = $hookmanager->resPrint;
1140 $result .= $hookmanager->resPrint;
1156 global
$conf, $db, $langs;
1157 $langs->load(
"interventions");
1166 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
1168 foreach ($dirmodels as $reldir) {
1172 $mybool = ((bool) @include_once $dir.$file) || $mybool;
1180 $obj =
new $classname();
1181 '@phan-var-force ModeleNumRefFicheinter $obj';
1183 $numref = $obj->getNextValue($soc, $this);
1185 if ($numref !=
"") {
1192 $langs->load(
"errors");
1193 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_FICHEINTER_ADDON_NotDefined");
1206 $sql =
"SELECT f.rowid,";
1207 $sql .=
" f.datec,";
1208 $sql .=
" f.tms as date_modification,";
1209 $sql .=
" f.date_valid as datev,";
1210 $sql .=
" f.fk_user_author,";
1211 $sql .=
" f.fk_user_modif as fk_user_modification,";
1212 $sql .=
" f.fk_user_valid";
1213 $sql .=
" FROM ".MAIN_DB_PREFIX.
"fichinter as f";
1214 $sql .=
" WHERE f.rowid = ".((int) $id);
1216 $resql = $this->db->query($sql);
1218 if ($this->db->num_rows($resql)) {
1219 $obj = $this->db->fetch_object($resql);
1221 $this->
id = $obj->rowid;
1223 $this->date_creation = $this->db->jdate($obj->datec);
1224 $this->date_modification = $this->db->jdate($obj->date_modification);
1225 $this->date_validation = $this->db->jdate($obj->datev);
1227 $this->user_creation_id = $obj->fk_user_author;
1228 $this->user_validation_id = $obj->fk_user_valid;
1229 $this->user_modification_id = $obj->fk_user_modification;
1231 $this->db->free($resql);
1244 public function delete(
User $user, $notrigger = 0)
1246 global
$conf, $langs;
1247 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1255 $result = $this->call_trigger(
'FICHINTER_DELETE', $user);
1258 $this->db->rollback();
1274 $this->error =
'ErrorFailToDeleteLinkedContact';
1280 $main = MAIN_DB_PREFIX.
'fichinterdet';
1281 $ef = $main.
"_extrafields";
1282 $sql =
"DELETE FROM ".$this->db->sanitize($ef).
" WHERE fk_object IN (SELECT rowid FROM ".$this->db->sanitize($main).
" WHERE fk_fichinter = ".((int) $this->
id).
")";
1284 $resql = $this->db->query($sql);
1291 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"fichinterdet";
1292 $sql .=
" WHERE fk_fichinter = ".((int) $this->
id);
1294 $resql = $this->db->query($sql);
1310 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"fichinter";
1311 $sql .=
" WHERE rowid = ".((int) $this->
id);
1314 $resql = $this->db->query($sql);
1327 if ($conf->ficheinter->dir_output && !empty($fichinterref)) {
1328 $dir =
$conf->ficheinter->dir_output.
"/".$fichinterref;
1329 $file =
$conf->ficheinter->dir_output.
"/".$fichinterref.
"/".$fichinterref.
".pdf";
1330 if (file_exists($file)) {
1334 $langs->load(
"errors");
1335 $this->error = $langs->trans(
"ErrorFailToDeleteFile", $file);
1339 if (file_exists($dir)) {
1341 $langs->load(
"errors");
1342 $this->error = $langs->trans(
"ErrorFailToDeleteDir", $dir);
1350 $this->db->commit();
1353 $this->db->rollback();
1369 if ($user->hasRight(
'ficheinter',
'creer')) {
1372 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"fichinter";
1373 $sql .=
" SET datei = '".$this->db->idate($delivery_date_receipt).
"'";
1374 $sql .=
" WHERE rowid = ".((int) $this->
id);
1375 $sql .=
" AND fk_statut = 0";
1377 if ($this->db->query($sql)) {
1378 $this->date_delivery = $delivery_date_receipt;
1379 $this->delivery_date_receipt = $delivery_date_receipt;
1381 $result = $this->call_trigger($this->TRIGGER_PREFIX .
'_MODIFY', $user);
1383 $this->db->rollback();
1387 $this->db->commit();
1390 $this->error = $this->db->error();
1391 dol_syslog(
"Fichinter::set_date_delivery Erreur SQL");
1392 $this->db->rollback();
1411 if ($user->hasRight(
'ficheinter',
'creer')) {
1414 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"fichinter ";
1415 $sql .=
" SET description = '".$this->db->escape($description).
"',";
1416 $sql .=
" fk_user_modif = ".((int) $user->id);
1417 $sql .=
" WHERE rowid = ".((int) $this->
id);
1419 if ($this->db->query($sql)) {
1422 $result = $this->call_trigger($this->TRIGGER_PREFIX .
'_MODIFY', $user);
1424 $this->db->rollback();
1428 $this->db->commit();
1431 $this->error = $this->db->error();
1432 dol_syslog(
"Fichinter::set_description Erreur SQL");
1433 $this->db->rollback();
1453 if ($user->hasRight(
'ficheinter',
'creer')) {
1456 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"fichinter ";
1457 $sql .=
" SET fk_contrat = ".((int) $contractid);
1458 $sql .=
" WHERE rowid = ".((int) $this->
id);
1460 if ($this->db->query($sql)) {
1461 $this->fk_contrat = $contractid;
1463 $result = $this->call_trigger($this->TRIGGER_PREFIX .
'_MODIFY', $user);
1465 $this->db->rollback();
1469 $this->db->commit();
1472 $this->error = $this->db->error();
1473 $this->db->rollback();
1494 global $hookmanager, $langs;
1495 $langs->load(
"errors");
1502 foreach ($this->lines as $line) {
1503 $line->fetch_optionals();
1507 $objFrom = clone $this;
1510 if (!empty($socid) && $socid != $this->socid) {
1511 $objsoc =
new Societe($this->db);
1513 if ($objsoc->fetch($socid) > 0) {
1514 $this->socid = $objsoc->id;
1517 $this->fk_project = 0;
1518 $this->fk_delivery_address = 0;
1530 $this->user_author_id = $user->id;
1531 $this->user_validation_id = 0;
1532 $this->date_creation =
'';
1533 $this->date_validation =
'';
1534 $this->signed_status = 0;
1536 $this->ref_client =
'';
1538 if (!$clone_notes) {
1539 $this->note_private =
'';
1540 $this->note_public =
'';
1544 $this->context[
'createfromclone'] =
'createfromclone';
1545 $result = $this->
create($user);
1552 foreach ($this->lines as $line) {
1553 $this->
addline($user, $this->
id, $line->desc, $line->datei, $line->duration, $line->array_options);
1557 if (is_object($hookmanager)) {
1558 $parameters = array(
'objFrom' => $objFrom);
1560 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1569 if ($clone_contacts) {
1570 foreach (array(
'internal',
'external') as $source) {
1571 $tab = $objFrom->liste_contact(-1, $source);
1572 if (is_array($tab) && count($tab) > 0) {
1573 foreach ($tab as $contacttoadd) {
1575 $contacttoadd[
'id'],
1576 $contacttoadd[
'code'],
1577 $contacttoadd[
'source']
1579 if ($this->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1580 $this->error .= $langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType");
1582 } elseif ($retAddContact < 0) {
1586 } elseif ($tab < 0) {
1587 $this->error .= $objFrom->error;
1593 unset($this->context[
'createfromclone']);
1597 $this->db->commit();
1600 $this->db->rollback();
1620 public function addline($user, $fichinterid, $desc, $date_intervention, $duration, $array_options = [], $type = 0, $rang = -1, $special_code = 0)
1622 dol_syslog(get_class($this).
"::addline $fichinterid, $desc, $date_intervention, $duration, $type, $rang, $special_code");
1624 if ($this->
status == self::STATUS_DRAFT) {
1630 $line->fk_fichinter = $fichinterid;
1631 $line->desc = $desc;
1632 $line->date = $date_intervention;
1633 $line->datei = $date_intervention;
1634 $line->duration = $duration;
1635 $line->product_type = $type;
1636 $line->rang = $rang;
1637 $line->special_code = $special_code;
1640 if (is_array($array_options) && count($array_options) > 0) {
1641 $line->array_options = $array_options;
1644 $result = $line->insert($user);
1647 $this->db->commit();
1650 $this->error = $this->db->error();
1651 $this->db->rollback();
1675 $this->
ref =
'SPECIMEN';
1676 $this->ref_client =
'SPECIMEN CLIENT';
1677 $this->specimen = 1;
1679 $this->datec = $now;
1680 $this->note_private =
'Private note';
1681 $this->note_public =
'SPECIMEN';
1682 $this->duration = 0;
1683 $this->user_creation_id = 1;
1686 while ($xnbp < $nbp) {
1688 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
1689 $line->date = ($now - 3600 * (1 + $xnbp));
1690 $line->datei = ($now - 3600 * (1 + $xnbp));
1691 $line->duration = 600;
1692 $line->fk_fichinter = 0;
1693 $this->lines[$xnbp] = $line;
1696 $this->duration += $line->duration;
1711 $this->lines = array();
1713 $sql =
"SELECT rowid, fk_fichinter, description, duree, date, rang, extraparams, special_code";
1714 $sql .=
" FROM ".MAIN_DB_PREFIX.
"fichinterdet";
1715 $sql .=
" WHERE fk_fichinter = ".((int) $this->
id);
1716 $sql .=
" ORDER BY rang ASC, date ASC";
1718 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
1720 $resql = $this->db->query($sql);
1722 $num = $this->db->num_rows($resql);
1725 $objp = $this->db->fetch_object($resql);
1728 $line->id = $objp->rowid;
1729 $line->fk_fichinter = $objp->fk_fichinter;
1730 $line->desc = $objp->description;
1731 $line->duration = $objp->duree;
1732 $line->special_code = (int) ($objp->special_code ?? 0);
1733 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1735 $line->qty = (int) $objp->duree;
1738 $line->qty = round($objp->duree / 3600, 2);
1740 $line->date = $this->db->jdate($objp->date);
1741 $line->datei = $this->db->jdate($objp->date);
1742 $line->rang = $objp->rang;
1743 $line->product_type = 1;
1744 $line->fetch_optionals();
1746 $line->extraparams = !empty($objp->extraparams) ? (array) json_decode($objp->extraparams,
true) : array();
1748 $this->lines[$i] = $line;
1751 $this->db->free($resql);
1755 $this->error = $this->db->error();
1789 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
1790 return parent::setCategoriesCommon($categories, Categorie::TYPE_FICHINTER);
1804 if ($user->hasRight(
'ficheinter',
'creer')) {
1811 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET ref_client = ".(empty($ref_client) ?
'NULL' :
"'".$this->db->escape($ref_client).
"'");
1812 $sql .=
" WHERE rowid = ".((int) $this->
id);
1814 dol_syslog(__METHOD__.
' $this->id='.$this->id.
', ref_client='.$ref_client, LOG_DEBUG);
1815 $resql = $this->db->query($sql);
1817 $this->errors[] = $this->db->error();
1822 $this->ref_client = $ref_client;
1825 if (!$notrigger && empty($error)) {
1827 $result = $this->call_trigger(
'FICHINTER_MODIFY', $user);
1835 $this->db->commit();
1838 foreach ($this->errors as $errmsg) {
1839 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
1840 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1842 $this->db->rollback();
1857 public function getKanbanView($option =
'', $arraydata =
null)
1861 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
1863 $return =
'<div class="box-flex-item box-flex-grow-zero">';
1864 $return .=
'<div class="info-box info-box-sm">';
1865 $return .=
'<span class="info-box-icon bg-infobox-action">';
1867 $return .=
'</span>';
1868 $return .=
'<div class="info-box-content">';
1869 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">' . $this->
getNomUrl() .
'</span>';
1870 if ($selected >= 0) {
1871 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1873 if (!empty($arraydata[
'thirdparty'])) {
1874 $tmpthirdparty = $arraydata[
'thirdparty'];
1875 '@phan-var-force Societe $tmpthirdparty';
1877 $return .=
'<br><span class="info-box-label">'.$tmpthirdparty->getNomUrl(1).
'</span>';
1879 if (!empty($this->duration)) {
1880 $return .=
'<br><span class="info-box-label ">'.$langs->trans(
"Duration").
' : '.
convertSecondToTime($this->duration,
'allhourmin').
'</span>';
1882 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
1883 $return .=
'</div>';
1884 $return .=
'</div>';
1885 $return .=
'</div>';
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.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
setErrorsFromObject($object)
setErrorsFromObject
static isExistingObject($element, $id, $ref='', $ref_ext='')
Check if an object id or ref exists If you don't need or want to instantiate the object and just need...
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.
add_contact($fk_socpeople, $type_contact, $source='external', $notrigger=0)
Add a link between element $this->element and a contact.
Class to manage Dolibarr database access.
const STATUS_BILLED
Billed.
initAsSpecimen()
Initialise an instance with random values.
createFromClone(User $user, $socid=0, $clone_contacts=false, $clone_notes=false)
Load an object from its id and create a new one in database.
getLibStatut($mode=0)
Returns the label status.
update($user, $notrigger=0)
Update an intervention.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
setClose($user, $notrigger=0)
Close intervention.
const STATUS_DRAFT
Draft status.
create($user, $notrigger=0)
Create an intervention into data base.
setCategories($categories)
Sets object to given categories.
set_description($user, $description)
Define the label of the intervention.
getTooltipContentArray($params)
getTooltipContentArray
const STATUS_CANCELED
Canceled status.
set_date_delivery($user, $delivery_date_receipt)
Defines a delivery date of the receipt of intervention.
const STATUS_VALIDATED
Validated status.
fetch($rowid, $ref='', $ref_ext='')
Fetch a intervention.
setReopen($user, $notrigger=0)
Tag the intervention as validated (opened) Function used when the intervention is reopened after bein...
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.
addline($user, $fichinterid, $desc, $date_intervention, $duration, $array_options=[], $type=0, $rang=-1, $special_code=0)
Adding a line of intervention into data base.
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.
loadStateBoard()
Load indicators into this->nb for board.
getNomUrl($withpicto=0, $option='', $notooltip=0, $save_lastsearch_value=-1, $morecss='')
Return clickable name (with picto eventually)
__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.
setCanceled($user, $notrigger=0)
Cancel an intervention.
fetch_lines()
Load array lines ->lines.
Class to manage intervention lines.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
getLibSignedStatus(int $mode=0)
Returns the label for signed status.
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
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.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0, $level=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_dir_list($utf8_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.
dol_delete_preview($object)
Delete all preview files linked to object instance.
dol_now($mode='gmt')
Return date for now.
setEntity($currentobject)
Set entity id to use when to create an object.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string