30require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
31require_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereportline.class.php';
32require_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport_ik.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport_rule.class.php';
44 public $element =
'expensereport';
49 public $table_element =
'expensereport';
54 public $table_element_line =
'expensereport_det';
59 public $fk_element =
'fk_expensereport';
64 public $picto =
'trip';
69 public $lines = array();
89 public $date_approbation;
99 public $user_approve_id;
119 public $fk_c_paiement;
124 public $modepaymentid;
135 public $user_paid_infos;
140 public $user_author_infos;
145 public $user_validator_infos;
150 public $rule_warning_message;
163 public $fk_user_creat;
168 public $fk_user_author;
179 public $fk_user_modif;
190 public $detail_refuse;
195 public $fk_user_refuse;
206 public $detail_cancel;
211 public $fk_user_cancel;
216 public $fk_user_validator;
235 public $fk_user_valid;
240 public $user_valid_infos;
246 public $date_approve;
251 public $fk_user_approve;
294 public $fields = array(
295 'rowid' => array(
'type' =>
'integer',
'label' =>
'ID',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 10),
296 'ref' => array(
'type' =>
'varchar(50)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'showoncombobox' => 1,
'position' => 15),
297 'entity' => array(
'type' =>
'integer',
'label' =>
'Entity',
'default' =>
'1',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'position' => 20),
298 'ref_number_int' => array(
'type' =>
'integer',
'label' =>
'Ref number int',
'enabled' => 1,
'visible' => -1,
'position' => 25),
299 'ref_ext' => array(
'type' =>
'integer',
'label' =>
'Ref ext',
'enabled' => 1,
'visible' => -1,
'position' => 30),
300 'total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'Total ht',
'enabled' => 1,
'visible' => -1,
'position' => 35),
301 'total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'Total tva',
'enabled' => 1,
'visible' => -1,
'position' => 40),
302 'localtax1' => array(
'type' =>
'double(24,8)',
'label' =>
'Localtax1',
'enabled' => 1,
'visible' => -1,
'position' => 45),
303 'localtax2' => array(
'type' =>
'double(24,8)',
'label' =>
'Localtax2',
'enabled' => 1,
'visible' => -1,
'position' => 50),
304 'total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'Total ttc',
'enabled' => 1,
'visible' => -1,
'position' => 55),
305 'date_debut' => array(
'type' =>
'date',
'label' =>
'Date debut',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 60),
306 'date_fin' => array(
'type' =>
'date',
'label' =>
'Date fin',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 65),
307 'date_valid' => array(
'type' =>
'datetime',
'label' =>
'Date valid',
'enabled' => 1,
'visible' => -1,
'position' => 75),
308 'date_approve' => array(
'type' =>
'datetime',
'label' =>
'Date approve',
'enabled' => 1,
'visible' => -1,
'position' => 80),
309 'date_refuse' => array(
'type' =>
'datetime',
'label' =>
'Date refuse',
'enabled' => 1,
'visible' => -1,
'position' => 85),
310 'date_cancel' => array(
'type' =>
'datetime',
'label' =>
'Date cancel',
'enabled' => 1,
'visible' => -1,
'position' => 90),
311 'fk_user_author' => array(
'type' =>
'integer',
'label' =>
'Fk user author',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 100),
312 'fk_user_modif' => array(
'type' =>
'integer',
'label' =>
'Fk user modif',
'enabled' => 1,
'visible' => -1,
'position' => 105),
313 'fk_user_valid' => array(
'type' =>
'integer',
'label' =>
'Fk user valid',
'enabled' => 1,
'visible' => -1,
'position' => 110),
314 'fk_user_validator' => array(
'type' =>
'integer',
'label' =>
'Fk user validator',
'enabled' => 1,
'visible' => -1,
'position' => 115),
315 'fk_user_approve' => array(
'type' =>
'integer',
'label' =>
'Fk user approve',
'enabled' => 1,
'visible' => -1,
'position' => 120),
316 'fk_user_refuse' => array(
'type' =>
'integer',
'label' =>
'Fk user refuse',
'enabled' => 1,
'visible' => -1,
'position' => 125),
317 'fk_user_cancel' => array(
'type' =>
'integer',
'label' =>
'Fk user cancel',
'enabled' => 1,
'visible' => -1,
'position' => 130),
318 'fk_c_paiement' => array(
'type' =>
'integer',
'label' =>
'Fk c paiement',
'enabled' => 1,
'visible' => -1,
'position' => 140),
319 'paid' => array(
'type' =>
'integer',
'label' =>
'Paid',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 145),
320 'note_public' => array(
'type' =>
'html',
'label' =>
'Note public',
'enabled' => 1,
'visible' => 0,
'position' => 150),
321 'note_private' => array(
'type' =>
'html',
'label' =>
'Note private',
'enabled' => 1,
'visible' => 0,
'position' => 155),
322 'detail_refuse' => array(
'type' =>
'varchar(255)',
'label' =>
'Detail refuse',
'enabled' => 1,
'visible' => -1,
'position' => 160),
323 'detail_cancel' => array(
'type' =>
'varchar(255)',
'label' =>
'Detail cancel',
'enabled' => 1,
'visible' => -1,
'position' => 165),
324 'integration_compta' => array(
'type' =>
'integer',
'label' =>
'Integration compta',
'enabled' => 1,
'visible' => -1,
'position' => 170),
325 'fk_bank_account' => array(
'type' =>
'integer',
'label' =>
'Fk bank account',
'enabled' => 1,
'visible' => -1,
'position' => 175),
326 'fk_multicurrency' => array(
'type' =>
'integer',
'label' =>
'Fk multicurrency',
'enabled' => 1,
'visible' => -1,
'position' => 185),
327 'multicurrency_code' => array(
'type' =>
'varchar(255)',
'label' =>
'Multicurrency code',
'enabled' => 1,
'visible' => -1,
'position' => 190),
328 'multicurrency_tx' => array(
'type' =>
'double(24,8)',
'label' =>
'Multicurrency tx',
'enabled' => 1,
'visible' => -1,
'position' => 195),
329 'multicurrency_total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'Multicurrency total ht',
'enabled' => 1,
'visible' => -1,
'position' => 200),
330 'multicurrency_total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'Multicurrency total tva',
'enabled' => 1,
'visible' => -1,
'position' => 205),
331 'multicurrency_total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'Multicurrency total ttc',
'enabled' => 1,
'visible' => -1,
'position' => 210),
332 'extraparams' => array(
'type' =>
'varchar(255)',
'label' =>
'Extraparams',
'enabled' => 1,
'visible' => -1,
'position' => 220),
333 'date_create' => array(
'type' =>
'datetime',
'label' =>
'Date create',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 300),
334 'tms' => array(
'type' =>
'timestamp',
'label' =>
'Tms',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 305),
335 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -1,
'position' => 1000),
336 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'Model pdf',
'enabled' => 1,
'visible' => 0,
'position' => 1010),
337 'fk_statut' => array(
'type' =>
'integer',
'label' =>
'Fk statut',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 500),
349 $this->total_ttc = 0;
350 $this->total_tva = 0;
351 $this->total_localtax1 = 0;
352 $this->total_localtax2 = 0;
353 $this->localtax1 = 0;
354 $this->localtax2 = 0;
355 $this->modepaymentid = 0;
358 $this->labelStatusShort = array(0 =>
'Draft', 2 =>
'Validated', 4 =>
'Canceled', 5 =>
'Approved', 6 =>
'Paid', 99 =>
'Refused');
359 $this->labelStatus = array(0 =>
'Draft', 2 =>
'ValidatedWaitingApproval', 4 =>
'Canceled', 5 =>
'Approved', 6 =>
'Paid', 99 =>
'Refused');
369 public function create($user, $notrigger = 0)
371 global $conf, $langs;
378 if (empty($this->date_debut) || empty($this->date_fin)) {
379 $this->error = $langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Date'));
383 $fuserid = $this->fk_user_author;
384 if (empty($fuserid)) {
385 $fuserid = $user->id;
390 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.$this->table_element.
" (";
393 $sql .=
",total_ttc";
394 $sql .=
",total_tva";
395 $sql .=
",date_debut";
397 $sql .=
",date_create";
398 $sql .=
",fk_user_creat";
399 $sql .=
",fk_user_author";
400 $sql .=
",fk_user_validator";
401 $sql .=
",fk_user_approve";
402 $sql .=
",fk_user_modif";
403 $sql .=
",fk_statut";
404 $sql .=
",fk_c_paiement";
406 $sql .=
",note_public";
407 $sql .=
",note_private";
411 $sql .=
", ".price2num($this->total_ht,
'MT');
412 $sql .=
", ".price2num($this->total_ttc,
'MT');
413 $sql .=
", ".price2num($this->total_tva,
'MT');
414 $sql .=
", '".$this->db->idate($this->date_debut).
"'";
415 $sql .=
", '".$this->db->idate($this->date_fin).
"'";
416 $sql .=
", '".$this->db->idate($now).
"'";
417 $sql .=
", ".((int) $user->id);
418 $sql .=
", ".((int) $fuserid);
419 $sql .=
", ".($this->fk_user_validator > 0 ? ((int) $this->fk_user_validator) :
"null");
420 $sql .=
", ".($this->fk_user_approve > 0 ? ((int) $this->fk_user_approve) :
"null");
421 $sql .=
", ".($this->fk_user_modif > 0 ? ((int) $this->fk_user_modif) :
"null");
422 $sql .=
", ".($this->fk_statut > 1 ? ((int) $this->fk_statut) : 0);
423 $sql .=
", ".($this->modepaymentid ? ((int) $this->modepaymentid) :
"null");
425 $sql .=
", ".($this->note_public ?
"'".$this->db->escape($this->note_public).
"'" :
"null");
426 $sql .=
", ".($this->note_private ?
"'".$this->db->escape($this->note_private).
"'" :
"null");
427 $sql .=
", ".((int) $conf->entity);
430 $result = $this->db->query($sql);
432 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
433 $this->
ref =
'(PROV'.$this->id.
')';
435 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
" SET ref='".$this->db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
436 $resql = $this->db->query($sql);
438 $this->error = $this->db->lasterror();
443 if (is_array($this->lines) && count($this->lines) > 0) {
444 foreach ($this->lines as $line) {
447 if (!is_object($line)) {
448 $line = (object) $line;
450 $newndfline->fk_expensereport = $line->fk_expensereport;
451 $newndfline->fk_c_type_fees = $line->fk_c_type_fees;
452 $newndfline->fk_project = $line->fk_project;
453 $newndfline->vatrate = $line->vatrate;
454 $newndfline->vat_src_code = $line->vat_src_code;
455 $newndfline->localtax1_tx = $line->localtax1_tx;
456 $newndfline->localtax2_tx = $line->localtax2_tx;
457 $newndfline->localtax1_type = $line->localtax1_type;
458 $newndfline->localtax2_type = $line->localtax2_type;
459 $newndfline->comments = $line->comments;
460 $newndfline->qty = $line->qty;
461 $newndfline->value_unit = $line->value_unit;
462 $newndfline->total_ht = $line->total_ht;
463 $newndfline->total_ttc = $line->total_ttc;
464 $newndfline->total_tva = $line->total_tva;
465 $newndfline->total_localtax1 = $line->total_localtax1;
466 $newndfline->total_localtax2 = $line->total_localtax2;
467 $newndfline->date = $line->date;
468 $newndfline->rule_warning_message = $line->rule_warning_message;
469 $newndfline->fk_c_exp_tax_cat = $line->fk_c_exp_tax_cat;
470 $newndfline->fk_ecm_files = $line->fk_ecm_files;
475 $newndfline->fk_expensereport = $this->id;
476 $result = $newndfline->insert();
478 $this->error = $newndfline->error;
479 $this->errors = $newndfline->errors;
499 $result = $this->
call_trigger(
'EXPENSE_REPORT_CREATE', $user);
511 $this->db->rollback();
515 $this->db->rollback();
519 dol_syslog(get_class($this).
"::create error ".$this->error, LOG_ERR);
520 $this->db->rollback();
524 $this->error = $this->db->lasterror().
" sql=".$sql;
525 $this->db->rollback();
543 if (empty($fk_user_author)) {
544 $fk_user_author = $user->id;
554 $objFrom = clone $this;
559 $this->fk_statut = 0;
562 $this->fk_user_creat = $user->id;
563 $this->fk_user_author = $fk_user_author;
564 $this->fk_user_valid = 0;
565 $this->date_create =
'';
566 $this->date_creation =
'';
567 $this->date_validation =
'';
570 if (is_array($this->lines) && count($this->lines) > 0) {
571 foreach ($this->lines as $key => $line) {
572 $this->lines[$key]->fk_ecm_files = 0;
577 $this->context[
'createfromclone'] =
'createfromclone';
578 $result = $this->
create($user);
585 if (is_object($hookmanager)) {
586 $parameters = array(
'objFrom' => $objFrom);
588 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
596 unset($this->context[
'createfromclone']);
603 $this->db->rollback();
617 public function update($user, $notrigger = 0, $userofexpensereport =
null)
624 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET";
625 $sql .=
" total_ht = ".((float) $this->total_ht);
626 $sql .=
" , total_ttc = ".((float) $this->total_ttc);
627 $sql .=
" , total_tva = ".((float) $this->total_tva);
628 $sql .=
" , date_debut = '".$this->db->idate($this->date_debut).
"'";
629 $sql .=
" , date_fin = '".$this->db->idate($this->date_fin).
"'";
630 if ($userofexpensereport && is_object($userofexpensereport)) {
631 $sql .=
" , fk_user_author = ".($userofexpensereport->id > 0 ? $userofexpensereport->id :
"null");
633 $sql .=
" , fk_user_validator = ".($this->fk_user_validator > 0 ? $this->fk_user_validator :
"null");
634 $sql .=
" , fk_user_valid = ".($this->fk_user_valid > 0 ? $this->fk_user_valid :
"null");
635 $sql .=
" , fk_user_approve = ".($this->fk_user_approve > 0 ? $this->fk_user_approve :
"null");
636 $sql .=
" , fk_user_modif = ".((int) $user->id);
637 $sql .=
" , fk_statut = ".($this->fk_statut >= 0 ? $this->fk_statut :
'0');
638 $sql .=
" , fk_c_paiement = ".($this->fk_c_paiement > 0 ? $this->fk_c_paiement :
"null");
639 $sql .=
" , note_public = ".(!empty($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"''");
640 $sql .=
" , note_private = ".(!empty($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"''");
641 $sql .=
" , detail_refuse = ".(!empty($this->detail_refuse) ?
"'".$this->db->escape($this->detail_refuse).
"'" :
"''");
642 $sql .=
" WHERE rowid = ".((int) $this->
id);
644 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
645 $result = $this->db->query($sql);
649 $result = $this->
call_trigger(
'EXPENSE_REPORT_MODIFY', $user);
661 $this->db->rollback();
662 $this->error = $this->db->error();
666 $this->db->rollback();
667 $this->error = $this->db->error();
679 public function fetch($id, $ref =
'')
681 $sql =
"SELECT d.rowid, d.entity, d.ref, d.note_public, d.note_private,";
682 $sql .=
" d.detail_refuse, d.detail_cancel, d.fk_user_refuse, d.fk_user_cancel,";
683 $sql .=
" d.date_refuse, d.date_cancel,";
684 $sql .=
" d.total_ht, d.total_ttc, d.total_tva,";
685 $sql .=
" d.localtax1 as total_localtax1, d.localtax2 as total_localtax2,";
686 $sql .=
" d.date_debut, d.date_fin, d.date_create, d.tms as date_modif, d.date_valid, d.date_approve,";
687 $sql .=
" d.fk_user_creat, d.fk_user_author, d.fk_user_modif, d.fk_user_validator,";
688 $sql .=
" d.fk_user_valid, d.fk_user_approve,";
689 $sql .=
" d.fk_statut as status, d.fk_c_paiement, d.paid";
690 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as d";
692 $sql .=
" WHERE d.ref = '".$this->db->escape($ref).
"'";
694 $sql .=
" WHERE d.rowid = ".((int) $id);
698 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
699 $resql = $this->db->query($sql);
701 $obj = $this->db->fetch_object($resql);
703 $this->
id = $obj->rowid;
704 $this->
ref = $obj->ref;
706 $this->entity = $obj->entity;
708 $this->total_ht = $obj->total_ht;
709 $this->total_tva = $obj->total_tva;
710 $this->total_ttc = $obj->total_ttc;
711 $this->localtax1 = $obj->total_localtax1;
712 $this->localtax2 = $obj->total_localtax2;
713 $this->total_localtax1 = $obj->total_localtax1;
714 $this->total_localtax2 = $obj->total_localtax2;
716 $this->note_public = $obj->note_public;
717 $this->note_private = $obj->note_private;
718 $this->detail_refuse = $obj->detail_refuse;
719 $this->detail_cancel = $obj->detail_cancel;
721 $this->date_debut = $this->db->jdate($obj->date_debut);
722 $this->date_fin = $this->db->jdate($obj->date_fin);
723 $this->date_valid = $this->db->jdate($obj->date_valid);
724 $this->date_approve = $this->db->jdate($obj->date_approve);
725 $this->date_create = $this->db->jdate($obj->date_create);
726 $this->date_modif = $this->db->jdate($obj->date_modif);
727 $this->date_refuse = $this->db->jdate($obj->date_refuse);
728 $this->date_cancel = $this->db->jdate($obj->date_cancel);
730 $this->fk_user_creat = $obj->fk_user_creat;
731 $this->fk_user_author = $obj->fk_user_author;
732 $this->fk_user_modif = $obj->fk_user_modif;
733 $this->fk_user_validator = $obj->fk_user_validator;
734 $this->fk_user_valid = $obj->fk_user_valid;
735 $this->fk_user_refuse = $obj->fk_user_refuse;
736 $this->fk_user_cancel = $obj->fk_user_cancel;
737 $this->fk_user_approve = $obj->fk_user_approve;
739 $user_author =
new User($this->db);
740 if ($this->fk_user_author > 0) {
741 $user_author->fetch($this->fk_user_author);
744 $this->user_author_infos =
dolGetFirstLastname($user_author->firstname, $user_author->lastname);
746 $user_approver =
new User($this->db);
747 if ($this->fk_user_approve > 0) {
748 $user_approver->fetch($this->fk_user_approve);
749 } elseif ($this->fk_user_validator > 0) {
750 $user_approver->fetch($this->fk_user_validator);
752 $this->user_validator_infos =
dolGetFirstLastname($user_approver->firstname, $user_approver->lastname);
754 $this->fk_statut = $obj->status;
755 $this->
status = $obj->status;
756 $this->fk_c_paiement = $obj->fk_c_paiement;
757 $this->paid = $obj->paid;
759 if ($this->
status == self::STATUS_APPROVED || $this->
status == self::STATUS_CLOSED) {
760 $user_valid =
new User($this->db);
761 if ($this->fk_user_valid > 0) {
762 $user_valid->fetch($this->fk_user_valid);
764 $this->user_valid_infos =
dolGetFirstLastname($user_valid->firstname, $user_valid->lastname);
776 $this->error = $this->db->lasterror();
792 public function set_paid($id, $fuser, $notrigger = 0)
795 dol_syslog(get_class($this).
"::set_paid is deprecated, use setPaid instead", LOG_NOTICE);
796 return $this->
setPaid($id, $fuser, $notrigger);
807 public function setPaid($id, $fuser, $notrigger = 0)
812 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"expensereport";
813 $sql .=
" SET fk_statut = ".self::STATUS_CLOSED.
", paid=1";
816 dol_syslog(get_class($this).
"::setPaid", LOG_DEBUG);
817 $resql = $this->db->query($sql);
819 if ($this->db->affected_rows($resql)) {
822 $result = $this->
call_trigger(
'EXPENSE_REPORT_PAID', $fuser);
834 $this->db->rollback();
835 $this->error = $this->db->error();
843 $this->db->rollback();
873 $labelStatus = $langs->transnoentitiesnoconv($this->labelStatus[$status]);
874 $labelStatusShort = $langs->transnoentitiesnoconv($this->labelStatusShort[$status]);
876 $statuslogo = array(0 =>
'status0', 2 =>
'status1', 4 =>
'status6', 5 =>
'status4', 6 =>
'status6', 99 =>
'status5');
878 $statusType = $statuslogo[$status];
880 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode);
894 $sql =
"SELECT f.rowid,";
895 $sql .=
" f.date_create as datec,";
896 $sql .=
" f.tms as date_modification,";
897 $sql .=
" f.date_valid as datev,";
898 $sql .=
" f.date_approve as datea,";
899 $sql .=
" f.fk_user_creat as fk_user_creation,";
900 $sql .=
" f.fk_user_author as fk_user_author,";
901 $sql .=
" f.fk_user_modif as fk_user_modification,";
902 $sql .=
" f.fk_user_valid,";
903 $sql .=
" f.fk_user_approve";
904 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as f";
905 $sql .=
" WHERE f.rowid = ".((int) $id);
906 $sql .=
" AND f.entity = ".$conf->entity;
910 $resql = $this->db->query($sql);
912 if ($this->db->num_rows($resql)) {
913 $obj = $this->db->fetch_object($resql);
915 $this->
id = $obj->rowid;
917 $this->date_creation = $this->db->jdate($obj->datec);
918 $this->date_modification = $this->db->jdate($obj->date_modification);
919 $this->date_validation = $this->db->jdate($obj->datev);
920 $this->date_approbation = $this->db->jdate($obj->datea);
922 $this->user_creation_id = $obj->fk_user_author;
923 $this->user_creation_id = $obj->fk_user_creation;
924 $this->user_validation_id = $obj->fk_user_valid;
925 $this->user_modification_id = $obj->fk_user_modification;
926 $this->user_approve_id = $obj->fk_user_approve;
928 $this->db->free($resql);
945 global $user, $langs;
951 $this->
ref =
'SPECIMEN';
954 $this->date_create = $now;
955 $this->date_debut = $now;
956 $this->date_fin = $now;
957 $this->date_valid = $now;
958 $this->date_approve = $now;
964 $this->fk_user_author = $user->id;
965 $this->fk_user_validator = $user->id;
966 $this->fk_user_valid = $user->id;
967 $this->fk_user_approve = $user->id;
969 $this->note_private =
'Private note';
970 $this->note_public =
'SPECIMEN';
973 while ($xnbp < $nbp) {
975 $line->comments = $langs->trans(
"Comment").
" ".$xnbp;
976 $line->date = ($now - 3600 * (1 + $xnbp));
977 $line->total_ht = 100;
978 $line->total_tva = 20;
979 $line->total_ttc = 120;
982 $line->value_unit = 120;
983 $line->fk_expensereport = 0;
984 $line->type_fees_code =
'TRA';
985 $line->fk_c_type_fees = $type_fees_id;
987 $line->projet_ref =
'ABC';
989 $this->lines[$xnbp] = $line;
992 $this->total_ht += $line->total_ht;
993 $this->total_tva += $line->total_tva;
994 $this->total_ttc += $line->total_ttc;
1013 $langs->load(
'trips');
1015 if ($user->hasRight(
'expensereport',
'lire')) {
1016 $sql =
"SELECT de.fk_expensereport, de.date, de.comments, de.total_ht, de.total_ttc";
1017 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport_det as de";
1018 $sql .=
" WHERE de.fk_projet = ".((int) $projectid);
1020 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1021 $result = $this->db->query($sql);
1023 $num = $this->db->num_rows($result);
1029 $objp = $this->db->fetch_object($result);
1031 $sql2 =
"SELECT d.rowid, d.fk_user_author, d.ref, d.fk_statut as status";
1032 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as d";
1033 $sql2 .=
" WHERE d.rowid = ".((int) $objp->fk_expensereport);
1035 $result2 = $this->db->query($sql2);
1036 $obj = $this->db->fetch_object($result2);
1038 $objp->fk_user_author = $obj->fk_user_author;
1039 $objp->ref = $obj->ref;
1040 $objp->fk_c_expensereport_status = $obj->status;
1041 $objp->rowid = $obj->rowid;
1043 $total_HT += $objp->total_ht;
1044 $total_TTC += $objp->total_ttc;
1045 $author =
new User($this->db);
1046 $author->fetch($objp->fk_user_author);
1049 print
'<td><a href="'.DOL_URL_ROOT.
'/expensereport/card.php?id='.$objp->rowid.
'">'.$objp->ref_num.
'</a></td>';
1050 print
'<td class="center">'.dol_print_date($objp->date,
'day').
'</td>';
1051 print
'<td>'.$author->getNomUrl(1).
'</td>';
1052 print
'<td>'.$objp->comments.
'</td>';
1053 print
'<td class="right">'.price($objp->total_ht).
'</td>';
1054 print
'<td class="right">'.price($objp->total_ttc).
'</td>';
1055 print
'<td class="right">';
1057 switch ($objp->fk_c_expensereport_status) {
1059 print
img_picto($langs->trans(
'StatusOrderCanceled'),
'statut5');
1062 print $langs->trans(
'Draft').
' '.
img_picto($langs->trans(
'Draft'),
'statut0');
1065 print $langs->trans(
'TripForValid').
' '.
img_picto($langs->trans(
'TripForValid'),
'statut3');
1068 print $langs->trans(
'TripForPaid').
' '.
img_picto($langs->trans(
'TripForPaid'),
'statut3');
1071 print $langs->trans(
'TripPaid').
' '.
img_picto($langs->trans(
'TripPaid'),
'statut4');
1088 print
'<tr class="liste_total"><td colspan="4">'.$langs->trans(
"Number").
': '.$i.
'</td>';
1089 print
'<td class="right" width="100">'.$langs->trans(
"TotalHT").
' : '.
price($total_HT).
'</td>';
1090 print
'<td class="right" width="100">'.$langs->trans(
"TotalTTC").
' : '.
price($total_TTC).
'</td>';
1091 print
'<td> </td>';
1094 $this->error = $this->db->lasterror();
1111 $this->lines = array();
1113 $sql =
' SELECT de.rowid, de.comments, de.qty, de.value_unit, de.date, de.rang,';
1114 $sql .=
" de.".$this->fk_element.
", de.fk_c_type_fees, de.fk_c_exp_tax_cat, de.fk_projet as fk_project,";
1115 $sql .=
' de.tva_tx, de.vat_src_code,';
1116 $sql .=
' de.localtax1_tx, de.localtax2_tx, de.localtax1_type, de.localtax2_type,';
1117 $sql .=
' de.fk_ecm_files,';
1118 $sql .=
' de.total_ht, de.total_tva, de.total_ttc,';
1119 $sql .=
' de.total_localtax1, de.total_localtax2, de.rule_warning_message,';
1120 $sql .=
' ctf.code as code_type_fees, ctf.label as label_type_fees, ctf.accountancy_code as accountancy_code_type_fees,';
1121 $sql .=
' p.ref as ref_projet, p.title as title_projet';
1122 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element_line.
' as de';
1123 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_type_fees as ctf ON de.fk_c_type_fees = ctf.id';
1124 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'projet as p ON de.fk_projet = p.rowid';
1125 $sql .=
" WHERE de.".$this->fk_element.
" = ".((int) $this->
id);
1127 $sql .=
' ORDER BY de.rang ASC, de.rowid ASC';
1129 $sql .=
' ORDER BY de.rang ASC, de.date ASC';
1132 $resql = $this->db->query($sql);
1134 $num = $this->db->num_rows($resql);
1137 $objp = $this->db->fetch_object($resql);
1141 $deplig->rowid = $objp->rowid;
1142 $deplig->id = $objp->rowid;
1143 $deplig->comments = $objp->comments;
1144 $deplig->qty = $objp->qty;
1145 $deplig->value_unit = $objp->value_unit;
1146 $deplig->date = $objp->date;
1147 $deplig->dates = $this->db->jdate($objp->date);
1149 $deplig->fk_expensereport = $objp->fk_expensereport;
1150 $deplig->fk_c_type_fees = $objp->fk_c_type_fees;
1151 $deplig->fk_c_exp_tax_cat = $objp->fk_c_exp_tax_cat;
1152 $deplig->fk_projet = $objp->fk_project;
1153 $deplig->fk_project = $objp->fk_project;
1154 $deplig->fk_ecm_files = $objp->fk_ecm_files;
1156 $deplig->total_ht = $objp->total_ht;
1157 $deplig->total_tva = $objp->total_tva;
1158 $deplig->total_ttc = $objp->total_ttc;
1159 $deplig->total_localtax1 = $objp->total_localtax1;
1160 $deplig->total_localtax2 = $objp->total_localtax2;
1162 $deplig->type_fees_code = empty($objp->code_type_fees) ?
'TF_OTHER' : $objp->code_type_fees;
1163 $deplig->type_fees_libelle = $objp->label_type_fees;
1164 $deplig->type_fees_accountancy_code = $objp->accountancy_code_type_fees;
1166 $deplig->tva_tx = $objp->tva_tx;
1167 $deplig->vatrate = $objp->tva_tx;
1168 $deplig->vat_src_code = $objp->vat_src_code;
1169 $deplig->localtax1_tx = $objp->localtax1_tx;
1170 $deplig->localtax2_tx = $objp->localtax2_tx;
1171 $deplig->localtax1_type = $objp->localtax1_type;
1172 $deplig->localtax2_type = $objp->localtax2_type;
1174 $deplig->projet_ref = $objp->ref_projet;
1175 $deplig->projet_title = $objp->title_projet;
1177 $deplig->rule_warning_message = $objp->rule_warning_message;
1179 $deplig->rang = $objp->rang;
1181 $this->lines[$i] = $deplig;
1185 $this->db->free($resql);
1188 $this->error = $this->db->lasterror();
1189 dol_syslog(get_class($this).
"::fetch_lines: Error ".$this->error, LOG_ERR);
1202 public function delete($user =
null, $notrigger = 0)
1205 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1213 $result = $this->
call_trigger(
'EXPENSE_REPORT_DELETE', $user);
1221 if (!$error && !empty($this->table_element_line)) {
1222 $tabletodelete = $this->table_element_line;
1224 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
1225 if (!$this->db->query($sql)) {
1227 $this->error = $this->db->lasterror();
1228 $this->errors[] = $this->error;
1229 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
1254 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
1260 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$this->table_element.
" WHERE rowid = ".((int) $this->
id);
1261 $res = $this->db->query($sql);
1264 $this->error = $this->db->lasterror();
1265 $this->errors[] = $this->error;
1266 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
1282 if ($conf->expensereport->multidir_output[$this->entity] && !empty($this->
ref)) {
1283 $dir = $conf->expensereport->multidir_output[$this->entity].
"/".$ref;
1284 $file = $dir.
"/".$ref.
".pdf";
1285 if (file_exists($file)) {
1289 $this->error =
'ErrorFailToDeleteFile';
1290 $this->errors[] = $this->error;
1291 $this->db->rollback();
1295 if (file_exists($dir)) {
1298 $this->error =
'ErrorFailToDeleteDir';
1299 $this->errors[] = $this->error;
1300 $this->db->rollback();
1308 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
1309 $this->db->commit();
1312 $this->db->rollback();
1326 global $conf, $langs, $user;
1332 if ($this->
status == self::STATUS_VALIDATED) {
1333 dol_syslog(get_class($this).
"::valid action abandoned: already validated", LOG_WARNING);
1337 $this->date_valid = $now;
1340 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
1345 if (empty($num) || $num < 0) {
1354 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1355 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1356 $sql .=
" fk_statut = ".self::STATUS_VALIDATED.
",";
1357 $sql .=
" date_valid = '".$this->db->idate($this->date_valid).
"',";
1358 $sql .=
" fk_user_valid = ".((int) $user->id);
1359 $sql .=
" WHERE rowid = ".((int) $this->
id);
1361 $resql = $this->db->query($sql);
1363 if (!$error && !$notrigger) {
1365 $result = $this->
call_trigger(
'EXPENSE_REPORT_VALIDATE', $fuser);
1373 $this->oldref = $this->ref;
1376 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1377 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1380 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'expensereport/".$this->db->escape($this->newref).
"'";
1381 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'expensereport/".$this->db->escape($this->
ref).
"' AND entity = ".((int) $this->entity);
1382 $resql = $this->db->query($sql);
1385 $this->error = $this->db->lasterror();
1387 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'expensereport/".$this->db->escape($this->newref).
"'";
1388 $sql .=
" WHERE filepath = 'expensereport/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1389 $resql = $this->db->query($sql);
1392 $this->error = $this->db->lasterror();
1398 $dirsource = $conf->expensereport->multidir_output[$this->entity].
'/'.$oldref;
1399 $dirdest = $conf->expensereport->multidir_output[$this->entity].
'/'.$newref;
1400 if (!$error && file_exists($dirsource)) {
1401 dol_syslog(get_class($this).
"::setValidate() rename dir ".$dirsource.
" into ".$dirdest);
1403 if (@rename($dirsource, $dirdest)) {
1406 $listoffiles =
dol_dir_list($dirdest,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1407 foreach ($listoffiles as $fileentry) {
1408 $dirsource = $fileentry[
'name'];
1409 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1410 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1411 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1412 @rename($dirsource, $dirdest);
1425 if (empty($error)) {
1426 $this->db->commit();
1429 $this->db->rollback();
1430 $this->error = $this->db->error();
1434 $this->db->rollback();
1435 $this->error = $this->db->lasterror();
1451 $sql =
'SELECT date_debut';
1452 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element;
1453 $sql .=
" WHERE rowid = ".((int) $this->
id);
1455 $result = $this->db->query($sql);
1457 $objp = $this->db->fetch_object($result);
1459 $this->date_debut = $this->db->jdate($objp->date_debut);
1461 if ($this->
status != self::STATUS_VALIDATED) {
1462 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1463 $sql .=
" SET fk_statut = ".self::STATUS_VALIDATED;
1464 $sql .=
" WHERE rowid = ".((int) $this->
id);
1466 dol_syslog(get_class($this).
"::set_save_from_refuse", LOG_DEBUG);
1468 if ($this->db->query($sql)) {
1471 $this->error = $this->db->lasterror();
1475 dol_syslog(get_class($this).
"::set_save_from_refuse expensereport already with save status", LOG_WARNING);
1494 $this->date_approve = $now;
1495 if ($this->
status != self::STATUS_APPROVED) {
1498 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1499 $sql .=
" SET ref = '".$this->db->escape($this->
ref).
"', fk_statut = ".self::STATUS_APPROVED.
", fk_user_approve = ".((int) $fuser->id).
",";
1500 $sql .=
" date_approve='".$this->db->idate($this->date_approve).
"'";
1501 $sql .=
" WHERE rowid = ".((int) $this->
id);
1502 if ($this->db->query($sql)) {
1505 $result = $this->
call_trigger(
'EXPENSE_REPORT_APPROVE', $fuser);
1513 if (empty($error)) {
1514 $this->db->commit();
1517 $this->db->rollback();
1518 $this->error = $this->db->error();
1522 $this->db->rollback();
1523 $this->error = $this->db->lasterror();
1527 dol_syslog(get_class($this).
"::setApproved expensereport already with approve status", LOG_WARNING);
1541 public function setDeny($fuser, $details, $notrigger = 0)
1547 if ($this->
status != self::STATUS_REFUSED) {
1548 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1549 $sql .=
" SET ref = '".$this->db->escape($this->
ref).
"', fk_statut = ".self::STATUS_REFUSED.
", fk_user_refuse = ".((int) $fuser->id).
",";
1550 $sql .=
" date_refuse='".$this->db->idate($now).
"',";
1551 $sql .=
" detail_refuse='".$this->db->escape($details).
"',";
1552 $sql .=
" fk_user_approve = NULL";
1553 $sql .=
" WHERE rowid = ".((int) $this->
id);
1554 if ($this->db->query($sql)) {
1555 $this->fk_statut = 99;
1557 $this->fk_user_refuse = $fuser->id;
1558 $this->detail_refuse = $details;
1559 $this->date_refuse = $now;
1563 $result = $this->
call_trigger(
'EXPENSE_REPORT_DENY', $fuser);
1571 if (empty($error)) {
1572 $this->db->commit();
1575 $this->db->rollback();
1576 $this->error = $this->db->error();
1580 $this->db->rollback();
1581 $this->error = $this->db->lasterror();
1585 dol_syslog(get_class($this).
"::setDeny expensereport already with refuse status", LOG_WARNING);
1604 dol_syslog(get_class($this).
"::set_unpaid is deprecated, use setUnpaid instead", LOG_NOTICE);
1605 return $this->
setUnpaid($fuser, $notrigger);
1622 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1623 $sql .=
" SET paid = 0, fk_statut = ".self::STATUS_APPROVED;
1624 $sql .=
" WHERE rowid = ".((int) $this->
id);
1626 dol_syslog(get_class($this).
"::set_unpaid", LOG_DEBUG);
1628 if ($this->db->query($sql)) {
1631 $result = $this->
call_trigger(
'EXPENSE_REPORT_UNPAID', $fuser);
1639 if (empty($error)) {
1640 $this->db->commit();
1643 $this->db->rollback();
1644 $this->error = $this->db->error();
1648 $this->db->rollback();
1649 $this->error = $this->db->error();
1653 dol_syslog(get_class($this).
"::set_unpaid expensereport already with unpaid status", LOG_WARNING);
1672 $this->date_cancel = $this->db->idate(
dol_now());
1673 if ($this->
status != self::STATUS_CANCELED) {
1676 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1677 $sql .=
" SET fk_statut = ".self::STATUS_CANCELED.
", fk_user_cancel = ".((int) $fuser->id);
1678 $sql .=
", date_cancel='".$this->db->idate($this->date_cancel).
"'";
1679 $sql .=
", detail_cancel='".$this->db->escape($detail).
"'";
1680 $sql .=
" WHERE rowid = ".((int) $this->
id);
1682 dol_syslog(get_class($this).
"::set_cancel", LOG_DEBUG);
1684 if ($this->db->query($sql)) {
1687 $result = $this->
call_trigger(
'EXPENSE_REPORT_CANCEL', $fuser);
1695 if (empty($error)) {
1696 $this->db->commit();
1699 $this->db->rollback();
1700 $this->error = $this->db->error();
1704 $this->db->rollback();
1705 $this->error = $this->db->error();
1709 dol_syslog(get_class($this).
"::set_cancel expensereport already with cancel status", LOG_WARNING);
1721 global $langs, $conf;
1722 $langs->load(
"trips");
1731 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
1732 foreach ($dirmodels as $reldir) {
1733 $dir =
dol_buildpath($reldir.
"core/modules/expensereport/");
1736 $mybool = ((bool) @include_once $dir.$file) || $mybool;
1744 $obj =
new $classname();
1745 '@phan-var-force ModeleNumRefExpenseReport $obj';
1746 $numref = $obj->getNextValue($this);
1748 if ($numref !=
"") {
1751 $this->error = $obj->error;
1752 $this->errors = $obj->errors;
1757 $this->error =
"Error_EXPENSEREPORT_ADDON_NotDefined";
1770 global $conf, $langs;
1772 $langs->load(
'trips');
1774 $nofetch = !empty($params[
'nofetch']);
1775 $moretitle = $params[
'moretitle'] ??
'';
1778 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"ExpenseReport").
'</u>';
1779 if (isset($this->
status)) {
1780 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
1783 $datas[
'picto'] .=
' - '.$moretitle;
1785 if (!empty($this->
ref)) {
1786 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1788 if (!empty($this->total_ht)) {
1789 $datas[
'total_ht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
1791 if (!empty($this->total_tva)) {
1792 $datas[
'total_tva'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
1794 if (!empty($this->total_ttc)) {
1795 $datas[
'total_ttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
1813 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $moretitle =
'', $notooltip = 0, $save_lastsearch_value = -1)
1815 global $langs, $hookmanager;
1819 $url = DOL_URL_ROOT.
'/expensereport/card.php?id='.$this->id;
1827 'objecttype' => $this->element,
1828 'option' => $option,
1829 'moretitle' => $moretitle,
1832 $classfortooltip =
'classfortooltip';
1835 $classfortooltip =
'classforajaxtooltip';
1836 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
1842 if ($option !=
'nolink') {
1844 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1845 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1846 $add_save_lastsearch_values = 1;
1848 if ($add_save_lastsearch_values) {
1849 $url .=
'&save_lastsearch_values=1';
1859 if (empty($notooltip)) {
1861 $label = $langs->trans(
"ShowExpenseReport");
1862 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
1864 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
1865 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
1868 $linkstart =
'<a href="'.$url.
'"';
1869 $linkstart .= $linkclose.
'>';
1872 $result .= $linkstart;
1874 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'"'), 0, 0, $notooltip ? 0 : 1);
1876 if ($withpicto != 2) {
1877 $result .= ($max ?
dol_trunc($ref, $max) : $ref);
1879 $result .= $linkend;
1882 $hookmanager->initHooks(array($this->element .
'dao'));
1883 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1884 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1886 $result = $hookmanager->resPrint;
1888 $result .= $hookmanager->resPrint;
1904 $this->total_ht += (float) $ligne_total_ht;
1905 $this->total_tva += (float) $ligne_total_tva;
1906 $this->total_ttc += $this->total_tva;
1908 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET";
1909 $sql .=
" total_ht = ".((float) $this->total_ht);
1910 $sql .=
" , total_ttc = ".((float) $this->total_ttc);
1911 $sql .=
" , total_tva = ".((float) $this->total_tva);
1912 $sql .=
" WHERE rowid = ".((int) $this->
id);
1914 $result = $this->db->query($sql);
1918 $this->error = $this->db->error();
1938 public function addline($qty = 0, $up = 0, $fk_c_type_fees = 0, $vatrate = 0, $date =
'', $comments =
'', $fk_project = 0, $fk_c_exp_tax_cat = 0, $type = 0, $fk_ecm_files = 0)
1940 global $langs, $mysoc;
1942 dol_syslog(get_class($this).
"::addline qty=$qty, up=$up, fk_c_type_fees=$fk_c_type_fees, vatrate=$vatrate, date=$date, fk_project=$fk_project, type=$type, comments=$comments", LOG_DEBUG);
1944 if ($this->
status == self::STATUS_DRAFT) {
1948 if (empty($fk_c_type_fees) || $fk_c_type_fees < 0) {
1949 $fk_c_type_fees = 0;
1951 if (empty($fk_c_exp_tax_cat) || $fk_c_exp_tax_cat < 0) {
1952 $fk_c_exp_tax_cat = 0;
1954 if (empty($vatrate) || $vatrate < 0) {
1960 if (empty($fk_project)) {
1965 if (!preg_match(
'/\s*\((.*)\)/', $vatrate)) {
1976 $seller->tva_assuj = 1;
1977 $buyer =
new Societe($this->db);
1983 if (preg_match(
'/\s*\((.*)\)/', $vatrate, $reg)) {
1984 $vat_src_code = $reg[1];
1985 $vatrate = preg_replace(
'/\s*\(.*\)/',
'', $vatrate);
1987 $vatrate = preg_replace(
'/\*/',
'', $vatrate);
1989 $tmp =
calcul_price_total($qty, $up, 0, (
float)
price2num($vatrate), -1, -1, 0,
'TTC', 0, $type, $seller, $localtaxes_type);
1991 $this->line->value_unit = $up;
1993 $this->line->vat_src_code = $vat_src_code;
1994 $this->line->vatrate =
price2num($vatrate);
1995 $this->line->localtax1_tx = $localtaxes_type[1];
1996 $this->line->localtax2_tx = $localtaxes_type[3];
1997 $this->line->localtax1_type = $localtaxes_type[0];
1998 $this->line->localtax2_type = $localtaxes_type[2];
2000 $this->line->total_ttc = $tmp[2];
2001 $this->line->total_ht = $tmp[0];
2002 $this->line->total_tva = $tmp[1];
2003 $this->line->total_localtax1 = $tmp[9];
2004 $this->line->total_localtax2 = $tmp[10];
2006 $this->line->fk_expensereport = $this->id;
2007 $this->line->qty = $qty;
2008 $this->line->date = $date;
2009 $this->line->fk_c_type_fees = $fk_c_type_fees;
2010 $this->line->fk_c_exp_tax_cat = $fk_c_exp_tax_cat;
2011 $this->line->comments = $comments;
2012 $this->line->fk_projet = $fk_project;
2013 $this->line->fk_project = $fk_project;
2015 $this->line->fk_ecm_files = $fk_ecm_files;
2020 $result = $this->line->insert(0,
true);
2024 $this->db->commit();
2025 return $this->line->id;
2027 $this->db->rollback();
2031 $this->error = $this->line->error;
2032 dol_syslog(get_class($this).
"::addline error=".$this->error, LOG_ERR);
2033 $this->db->rollback();
2037 dol_syslog(get_class($this).
"::addline status of expense report must be Draft to allow use of ->addline()", LOG_ERR);
2038 $this->error =
'ErrorExpenseNotDraft';
2052 global $conf, $db, $langs, $mysoc;
2054 $langs->load(
'trips');
2057 if (!is_object($seller)) {
2059 $seller->tva_assuj = 1;
2063 $rulestocheck = $expensereportrule->getAllRule($this->line->fk_c_type_fees, $this->line->date, $this->fk_user_author);
2066 $rule_warning_message_tab = array();
2068 $current_total_ttc = $this->line->total_ttc;
2069 $new_current_total_ttc = $this->line->total_ttc;
2072 foreach ($rulestocheck as $rule) {
2073 if (in_array($rule->code_expense_rules_type, array(
'EX_DAY',
'EX_MON',
'EX_YEA'))) {
2074 $amount_to_test = $this->line->getExpAmount($rule, $this->fk_user_author, $rule->code_expense_rules_type);
2076 $amount_to_test = $current_total_ttc;
2079 $amount_to_test = $amount_to_test - $current_total_ttc + $new_current_total_ttc;
2081 if ($amount_to_test > $rule->amount) {
2084 if ($rule->restrictive) {
2085 $this->error =
'ExpenseReportConstraintViolationError';
2086 $this->errors[] = $this->error;
2088 $new_current_total_ttc -= $amount_to_test - $rule->amount;
2089 $rule_warning_message_tab[] = $langs->trans(
'ExpenseReportConstraintViolationError', $rule->id,
price($amount_to_test, 0, $langs, 1, -1, -1, $conf->currency),
price($rule->amount, 0, $langs, 1, -1, -1, $conf->currency));
2091 $this->error =
'ExpenseReportConstraintViolationWarning';
2092 $this->errors[] = $this->error;
2094 $rule_warning_message_tab[] = $langs->trans(
'ExpenseReportConstraintViolationWarning', $rule->id,
price($amount_to_test, 0, $langs, 1, -1, -1, $conf->currency),
price($rule->amount, 0, $langs, 1, -1, -1, $conf->currency));
2101 $this->line->rule_warning_message = implode(
'\n', $rule_warning_message_tab);
2103 if ($violation > 0) {
2104 $tmp =
calcul_price_total($this->line->qty, $new_current_total_ttc / $this->line->qty, 0, $this->line->vatrate, 0, 0, 0,
'TTC', 0, $type, $seller);
2106 $this->line->value_unit = $tmp[5];
2107 $this->line->total_ttc = $tmp[2];
2108 $this->line->total_ht = $tmp[0];
2109 $this->line->total_tva = $tmp[1];
2110 $this->line->total_localtax1 = $tmp[9];
2111 $this->line->total_localtax2 = $tmp[10];
2134 $userauthor =
new User($this->db);
2135 if ($userauthor->fetch($this->fk_user_author) <= 0) {
2136 $this->error =
'ErrorCantFetchUser';
2137 $this->errors[] =
'ErrorCantFetchUser';
2142 if (!is_object($seller)) {
2144 $seller->tva_assuj = 1;
2148 $range = $expenseik->getRangeByUser($userauthor, $this->line->fk_c_exp_tax_cat);
2150 if (empty($range)) {
2151 $this->error =
'ErrorNoRangeAvailable';
2152 $this->errors[] =
'ErrorNoRangeAvailable';
2157 $ikoffset = $range->ikoffset;
2159 $ikoffset = $range->ikoffset / 12;
2164 $new_up = $range->coef + ($ikoffset / $this->line->qty);
2165 $tmp =
calcul_price_total($this->line->qty, $new_up, 0, $this->line->vatrate, 0, 0, 0,
'TTC', 0, $type, $seller);
2167 $this->line->value_unit = $tmp[5];
2168 $this->line->total_ttc = $tmp[2];
2169 $this->line->total_ht = $tmp[0];
2170 $this->line->total_tva = $tmp[1];
2171 $this->line->total_localtax1 = $tmp[9];
2172 $this->line->total_localtax2 = $tmp[10];
2187 $sql =
'SELECT e.rowid FROM '.MAIN_DB_PREFIX.
'expensereport e';
2188 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"expensereport_det d ON (e.rowid = d.fk_expensereport)";
2189 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"c_type_fees f ON (d.fk_c_type_fees = f.id AND f.code = 'EX_KME')";
2190 $sql .=
" WHERE e.fk_user_author = ".(int) $this->fk_user_author;
2191 $sql .=
" AND YEAR(d.date) = '".dol_print_date($this->line->date,
'%Y').
"' AND MONTH(d.date) = '".
dol_print_date($this->line->date,
'%m').
"'";
2192 if (!empty($this->line->id)) {
2193 $sql .=
' AND d.rowid <> '.((int) $this->line->id);
2196 dol_syslog(get_class($this).
"::offsetAlreadyGiven");
2197 $resql = $this->db->query($sql);
2199 $num = $this->db->num_rows($resql);
2227 public function updateline($rowid, $type_fees_id, $projet_id, $vatrate, $comments, $qty, $value_unit, $date, $expensereport_id, $fk_c_exp_tax_cat = 0, $fk_ecm_files = 0, $notrigger = 0)
2229 global $user, $mysoc;
2231 if ($this->
status == self::STATUS_DRAFT || $this->
status == self::STATUS_REFUSED) {
2239 $seller->tva_assuj = 1;
2240 $seller->localtax1_assuj = $mysoc->localtax1_assuj;
2241 $seller->localtax2_assuj = $mysoc->localtax1_assuj;
2242 $buyer =
new Societe($this->db);
2249 if (preg_match(
'/\((.*)\)/', (
string) $vatrate, $reg)) {
2250 $vat_src_code = $reg[1];
2251 $vatrate = preg_replace(
'/\s*\(.*\)/',
'', (
string) $vatrate);
2253 $vatrate = preg_replace(
'/\*/',
'', $vatrate);
2255 $tmp =
calcul_price_total($qty, $value_unit, 0, (
float)
price2num($vatrate), -1, -1, 0,
'TTC', 0, $type, $seller, $localtaxes_type);
2259 $tx_tva = 1 + (float) $vatrate / 100;
2262 $this->line->comments = $comments;
2263 $this->line->qty = $qty;
2264 $this->line->value_unit = $value_unit;
2265 $this->line->date = $date;
2267 $this->line->fk_expensereport = $expensereport_id;
2268 $this->line->fk_c_type_fees = $type_fees_id;
2269 $this->line->fk_c_exp_tax_cat = $fk_c_exp_tax_cat;
2270 $this->line->fk_projet = $projet_id;
2271 $this->line->fk_project = $projet_id;
2273 $this->line->vat_src_code = $vat_src_code;
2274 $this->line->vatrate =
price2num($vatrate);
2275 $this->line->localtax1_tx = $localtaxes_type[1];
2276 $this->line->localtax2_tx = $localtaxes_type[3];
2277 $this->line->localtax1_type = $localtaxes_type[0];
2278 $this->line->localtax2_type = $localtaxes_type[2];
2280 $this->line->total_ttc = $tmp[2];
2281 $this->line->total_ht = $tmp[0];
2282 $this->line->total_tva = $tmp[1];
2283 $this->line->total_localtax1 = $tmp[9];
2284 $this->line->total_localtax2 = $tmp[10];
2286 $this->line->fk_ecm_files = $fk_ecm_files;
2288 $this->line->id = ((int) $rowid);
2291 $sql =
"SELECT c.code as code_type_fees, c.label as label_type_fees";
2292 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_type_fees as c";
2293 $sql .=
" WHERE c.id = ".((int) $type_fees_id);
2294 $resql = $this->db->query($sql);
2296 $objp_fees = $this->db->fetch_object($resql);
2297 $this->line->type_fees_code = $objp_fees->code_type_fees;
2298 $this->line->type_fees_libelle = $objp_fees->label_type_fees;
2299 $this->db->free($resql);
2303 $sql =
"SELECT p.ref as ref_projet, p.title as title_projet";
2304 $sql .=
" FROM ".MAIN_DB_PREFIX.
"projet as p";
2305 $sql .=
" WHERE p.rowid = ".((int) $projet_id);
2306 $resql = $this->db->query($sql);
2308 $objp_projet = $this->db->fetch_object($resql);
2309 $this->line->projet_ref = $objp_projet->ref_projet;
2310 $this->line->projet_title = $objp_projet->title_projet;
2311 $this->db->free($resql);
2317 $result = $this->line->update($user, $notrigger);
2323 $this->db->commit();
2326 $this->error = $this->line->error;
2327 $this->errors = $this->line->errors;
2328 $this->db->rollback();
2352 $result = $this->
call_trigger(
'EXPENSE_REPORT_DET_DELETE', $fuser);
2359 $sql =
' DELETE FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2360 $sql .=
' WHERE rowid = '.((int) $rowid);
2362 dol_syslog(get_class($this).
"::deleteline sql=".$sql);
2363 $result = $this->db->query($sql);
2365 if (!$result || $error > 0) {
2366 $this->error = $this->db->error();
2367 dol_syslog(get_class($this).
"::deleteline Error ".$this->error, LOG_ERR);
2368 $this->db->rollback();
2374 $this->db->commit();
2393 $sql =
"SELECT rowid, date_debut, date_fin";
2394 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element;
2395 $sql .=
" WHERE entity = ".((int) $conf->entity);
2396 $sql .=
" AND fk_user_author = ".((int) $fuser->id);
2398 dol_syslog(get_class($this).
"::periode_existe sql=".$sql);
2399 $result = $this->db->query($sql);
2401 $num_rows = $this->db->num_rows($result);
2404 if ($num_rows > 0) {
2405 $date_d_form = $date_debut;
2406 $date_f_form = $date_fin;
2408 while ($i < $num_rows) {
2409 $objp = $this->db->fetch_object($result);
2411 $date_d_req = $this->db->jdate($objp->date_debut);
2412 $date_f_req = $this->db->jdate($objp->date_fin);
2414 if (!($date_f_form < $date_d_req || $date_d_form > $date_f_req)) {
2415 return $objp->rowid;
2426 $this->error = $this->db->lasterror();
2427 dol_syslog(get_class($this).
"::periode_existe Error ".$this->error, LOG_ERR);
2443 $users_validator = array();
2445 $sql =
"SELECT DISTINCT ur.fk_user";
2446 $sql .=
" FROM ".MAIN_DB_PREFIX.
"user_rights as ur, ".MAIN_DB_PREFIX.
"rights_def as rd";
2447 $sql .=
" WHERE ur.fk_id = rd.id and rd.module = 'expensereport' AND rd.perms = 'approve'";
2449 $sql .=
" SELECT DISTINCT ugu.fk_user";
2450 $sql .=
" FROM ".MAIN_DB_PREFIX.
"usergroup_user as ugu, ".MAIN_DB_PREFIX.
"usergroup_rights as ur, ".MAIN_DB_PREFIX.
"rights_def as rd";
2451 $sql .=
" WHERE ugu.fk_usergroup = ur.fk_usergroup AND ur.fk_id = rd.id and rd.module = 'expensereport' AND rd.perms = 'approve'";
2454 dol_syslog(get_class($this).
"::fetch_users_approver_expensereport sql=".$sql);
2455 $result = $this->db->query($sql);
2457 $num_rows = $this->db->num_rows($result);
2459 while ($i < $num_rows) {
2460 $objp = $this->db->fetch_object($result);
2461 array_push($users_validator, $objp->fk_user);
2464 return $users_validator;
2466 $this->error = $this->db->lasterror();
2467 dol_syslog(get_class($this).
"::fetch_users_approver_expensereport Error ".$this->error, LOG_ERR);
2483 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2485 $outputlangs->load(
"trips");
2488 if (!empty($this->model_pdf)) {
2489 $modele = $this->model_pdf;
2495 if (!empty($modele)) {
2496 $modelpath =
"core/modules/expensereport/doc/";
2498 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2514 $sql =
"SELECT id, code, label";
2515 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_type_fees";
2516 $sql .=
" WHERE active = ".((int) $active);
2517 dol_syslog(get_class($this).
"::listOfTypes", LOG_DEBUG);
2518 $result = $this->db->query($sql);
2520 $num = $this->db->num_rows($result);
2523 $obj = $this->db->fetch_object($result);
2524 $ret[$obj->code] = (($langs->transnoentitiesnoconv($obj->code) != $obj->code) ? $langs->transnoentitiesnoconv($obj->code) : $obj->label);
2542 $this->nb = array();
2544 $sql =
"SELECT count(ex.rowid) as nb";
2545 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as ex";
2546 $sql .=
" WHERE ex.fk_statut > 0";
2547 $sql .=
" AND ex.entity IN (".getEntity(
'expensereport').
")";
2548 if (!$user->hasRight(
'expensereport',
'readall')) {
2549 $userchildids = $user->getAllChildIds(1);
2550 $sql .=
" AND (ex.fk_user_author IN (".$this->db->sanitize(implode(
',', $userchildids)).
")";
2551 $sql .=
" OR ex.fk_user_validator IN (".$this->db->sanitize(implode(
',', $userchildids)).
"))";
2554 $resql = $this->db->query($sql);
2556 while ($obj = $this->db->fetch_object($resql)) {
2557 $this->nb[
"expensereports"] = $obj->nb;
2559 $this->db->free($resql);
2563 $this->error = $this->db->error();
2579 global $conf, $langs;
2587 $sql =
"SELECT ex.rowid, ex.date_valid";
2588 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as ex";
2589 if ($option ==
'toapprove') {
2590 $sql .=
" WHERE ex.fk_statut = ".self::STATUS_VALIDATED;
2592 $sql .=
" WHERE ex.fk_statut = ".self::STATUS_APPROVED;
2594 $sql .=
" AND ex.entity IN (".getEntity(
'expensereport').
")";
2595 if (!$user->hasRight(
'expensereport',
'readall')) {
2596 $userchildids = $user->getAllChildIds(1);
2597 $sql .=
" AND (ex.fk_user_author IN (".$this->db->sanitize(implode(
',', $userchildids)).
")";
2598 $sql .=
" OR ex.fk_user_validator IN (".$this->db->sanitize(implode(
',', $userchildids)).
"))";
2601 $resql = $this->db->query($sql);
2603 $langs->load(
"trips");
2606 if ($option ==
'toapprove') {
2607 $response->warning_delay = $conf->expensereport->approve->warning_delay / 60 / 60 / 24;
2608 $response->label = $langs->trans(
"ExpenseReportsToApprove");
2609 $response->labelShort = $langs->trans(
"ToApprove");
2612 $response->warning_delay = $conf->expensereport->payment->warning_delay / 60 / 60 / 24;
2613 $response->label = $langs->trans(
"ExpenseReportsToPay");
2614 $response->labelShort = $langs->trans(
"StatusToPay");
2615 $response->url = DOL_URL_ROOT.
'/expensereport/list.php?mainmenu=hrm&statut='.
self::STATUS_APPROVED;
2619 while ($obj = $this->db->fetch_object($resql)) {
2620 $response->nbtodo++;
2622 if ($option ==
'toapprove') {
2623 if ($this->db->jdate($obj->date_valid) < ($now - $conf->expensereport->approve->warning_delay)) {
2624 $response->nbtodolate++;
2627 if ($this->db->jdate($obj->date_valid) < ($now - $conf->expensereport->payment->warning_delay)) {
2628 $response->nbtodolate++;
2636 $this->error = $this->db->error();
2652 if ($option ==
'toapprove' && $this->
status != 2) {
2655 if ($option ==
'topay' && $this->
status != 5) {
2660 if ($option ==
'toapprove') {
2661 return (!empty($this->datevalid) ? $this->datevalid : $this->date_valid) < ($now - $conf->expensereport->approve->warning_delay);
2663 return (!empty($this->datevalid) ? $this->datevalid : $this->date_valid) < ($now - $conf->expensereport->payment->warning_delay);
2674 $alreadydispatched = 0;
2676 $type =
'expense_report';
2678 $sql =
" SELECT COUNT(ab.rowid) as nb FROM ".MAIN_DB_PREFIX.
"accounting_bookkeeping as ab WHERE ab.doc_type='".$this->db->escape($type).
"' AND ab.fk_doc = ".((int) $this->
id);
2679 $resql = $this->db->query($sql);
2681 $obj = $this->db->fetch_object($resql);
2683 $alreadydispatched = $obj->nb;
2686 $this->error = $this->db->lasterror();
2690 if ($alreadydispatched) {
2703 $table =
'payment_expensereport';
2704 $field =
'fk_expensereport';
2706 $sql =
'SELECT sum(amount) as amount';
2707 $sql .=
' FROM '.MAIN_DB_PREFIX.$table;
2708 $sql .=
" WHERE ".$field.
" = ".((int) $this->
id);
2710 dol_syslog(get_class($this).
"::getSumPayments", LOG_DEBUG);
2711 $resql = $this->db->query($sql);
2713 $obj = $this->db->fetch_object($resql);
2714 $this->db->free($resql);
2715 return (empty($obj->amount) ? 0 : $obj->amount);
2717 $this->error = $this->db->lasterror();
2732 global $langs, $db, $conf;
2740 $this->error = $langs->trans(
'ErrorBadParameterCat');
2745 $this->error = $langs->trans(
'ErrorBadParameterQty');
2749 $currentUser =
new User($db);
2750 $currentUser->fetch($this->fk_user);
2751 $currentUser->loadRights(
'expensereport');
2755 $sql =
" SELECT r.range_ik, t.ikoffset, t.coef";
2756 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport_ik t";
2757 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_exp_tax_range r ON r.rowid = t.fk_range";
2758 $sql .=
" WHERE t.fk_c_exp_tax_cat = ".(int) $fk_cat;
2759 $sql .=
" ORDER BY r.range_ik ASC";
2761 dol_syslog(
"expenseReport::computeTotalkm sql=".$sql, LOG_DEBUG);
2763 $result = $this->db->query($sql);
2766 if ($conf->global->EXPENSEREPORT_CALCULATE_MILEAGE_EXPENSE_COEFFICIENT_ON_CURRENT_YEAR) {
2768 $sql =
" SELECT count(n.qty) as cumul FROM ".MAIN_DB_PREFIX.
"expensereport_det n";
2769 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"expensereport e ON e.rowid = n.fk_expensereport";
2770 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_type_fees tf ON tf.id = n.fk_c_type_fees";
2771 $sql .=
" WHERE e.fk_user_author = ".(int) $this->fk_user_author;
2772 $sql .=
" AND YEAR(n.date) = ".(int) $arrayDate[
'year'];
2773 $sql .=
" AND tf.code = 'EX_KME' ";
2776 $resql = $this->db->query($sql);
2779 $obj = $this->db->fetch_object($resql);
2780 $cumulYearQty = $obj->cumul;
2783 $qty += (float) $cumulYearQty;
2786 $num = $this->db->num_rows($result);
2789 for ($i = 0; $i < $num; $i++) {
2790 $obj = $this->db->fetch_object($result);
2794 '@phan-var-force Object[] $ranges';
2796 for ($i = 0; $i < $num; $i++) {
2797 if ($i < ($num - 1)) {
2799 if ($qty > $ranges[$i]->range_ik && $qty < $ranges[$i + 1]->range_ik) {
2800 $coef = $ranges[$i]->coef;
2801 $offset = $ranges[$i]->ikoffset;
2804 if ($qty > $ranges[$i]->range_ik) {
2805 $coef = $ranges[$i]->coef;
2806 $offset = $ranges[$i]->ikoffset;
2813 $this->error = $langs->trans(
'TaxUndefinedForThisCategory');
2817 $this->error = $this->db->error().
" sql=".$sql;
2834 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
2836 $return =
'<div class="box-flex-item box-flex-grow-zero">';
2837 $return .=
'<div class="info-box info-box-sm">';
2838 $return .=
'<span class="info-box-icon bg-infobox-action">';
2840 $return .=
'</span>';
2841 $return .=
'<div class="info-box-content">';
2842 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl(1) : $this->ref).
'</span>';
2843 if ($selected >= 0) {
2844 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
2846 if (array_key_exists(
'userauthor', $arraydata) && $arraydata[
'userauthor'] instanceof
User) {
2847 $return .=
'<br><span class="info-box-label">'.$arraydata[
'userauthor']->getNomUrl(-1).
'</span>';
2849 if (property_exists($this,
'date_debut') && property_exists($this,
'date_fin')) {
2850 $return .=
'<br><span class="info-box-label">'.dol_print_date($this->date_debut,
'day').
'</span>';
2851 $return .=
' <span class="opacitymedium">'.$langs->trans(
"To").
'</span> ';
2852 $return .=
'<span class="info-box-label">'.dol_print_date($this->date_fin,
'day').
'</span>';
2854 if (method_exists($this,
'getLibStatut')) {
2855 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
2857 $return .=
'</div>';
2858 $return .=
'</div>';
2859 $return .=
'</div>';
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
deleteEcmFiles($mode=0)
Delete related files of object in database.
update_price($exclspec=0, $roundingadjust='auto', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
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
deleteExtraFields()
Delete all extra fields values for the current object.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
delete_linked_contact($source='', $code='')
Delete all links between an object $this and all its contacts in llx_element_contact.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage Trips and Expenses.
setPaid($id, $fuser, $notrigger=0)
Classify the expense report as paid.
loadStateBoard()
Load the indicators this->nb for the state board.
__construct($db)
Constructor.
checkRules($type=0, $seller='')
Check constraint of rules and update price if needed.
updateline($rowid, $type_fees_id, $projet_id, $vatrate, $comments, $qty, $value_unit, $date, $expensereport_id, $fk_c_exp_tax_cat=0, $fk_ecm_files=0, $notrigger=0)
Update an expense report line.
getNextNumRef()
Return next reference of expense report not already used.
createFromClone(User $user, $fk_user_author)
Load an object from its id and create a new one in database.
addline($qty=0, $up=0, $fk_c_type_fees=0, $vatrate=0, $date='', $comments='', $fk_project=0, $fk_c_exp_tax_cat=0, $type=0, $fk_ecm_files=0)
Add expense report line.
const STATUS_DRAFT
Draft status.
computeTotalKm($fk_cat, $qty, $tva)
Compute the cost of the kilometers expense based on the number of kilometers and the vehicle category...
offsetAlreadyGiven()
If the sql find any rows then the ikoffset is already given (ikoffset is applied at the first expense...
listOfTypes($active=1)
List of types.
const STATUS_APPROVED
Classified approved.
set_save_from_refuse($fuser)
set_save_from_refuse
periode_existe($fuser, $date_debut, $date_fin)
periode_existe
setValidate($fuser, $notrigger=0)
Set to status validate.
getSumPayments()
Return amount of payments already done.
getLibStatut($mode=0)
Returns the label status.
set_cancel($fuser, $detail, $notrigger=0)
set_cancel
getNomUrl($withpicto=0, $option='', $max=0, $short=0, $moretitle='', $notooltip=0, $save_lastsearch_value=-1)
Return clickable name (with picto eventually)
set_unpaid($fuser, $notrigger=0)
set_unpaid
info($id)
Load information on object.
getTooltipContentArray($params)
getTooltipContentArray
hasDelay($option)
Return if an expense report is late or not.
applyOffset($type=0, $seller='')
Method to apply the offset if needed.
const STATUS_CANCELED
Classified canceled.
const STATUS_CLOSED
Classified paid.
const STATUS_REFUSED
Classified refused.
deleteLine($rowid, $fuser='', $notrigger=0)
deleteline
setDeny($fuser, $details, $notrigger=0)
setDeny
getVentilExportCompta()
Return if object was dispatched into bookkeeping.
getKanbanView($option='', $arraydata=null)
Return clickable link of object (with optional picto)
update($user, $notrigger=0, $userofexpensereport=null)
update
const STATUS_VALIDATED
Validated (need to be paid)
create($user, $notrigger=0)
Create object in database.
load_board($user, $option='topay')
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
set_paid($id, $fuser, $notrigger=0)
Classify the expense report as paid.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
initAsSpecimen()
Initialise an instance with random values.
fetch_users_approver_expensereport()
Return list of people with permission to validate expense reports.
setApproved($fuser, $notrigger=0)
Set status to approved.
LibStatut($status, $mode=0)
Returns the label of a status.
setUnpaid($fuser, $notrigger=0)
set_unpaid
fetch_line_by_project($projectid, $user)
fetch_line_by_project
update_totaux_add($ligne_total_ht, $ligne_total_tva)
Update total of an expense report when you add a line.
Class to manage inventories.
Class of expense report details lines.
Class to manage inventories.
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...
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)
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_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.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
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.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller='', $localtaxes_array=[], $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.