33require_once DOL_DOCUMENT_ROOT .
'/core/class/commonobject.class.php';
34require_once DOL_DOCUMENT_ROOT .
'/core/lib/bank.lib.php';
35require_once DOL_DOCUMENT_ROOT .
'/compta/bank/class/account.class.php';
36require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
37require_once DOL_DOCUMENT_ROOT .
'/compta/paiement/class/paiement.class.php';
38require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.facture.class.php';
39require_once DOL_DOCUMENT_ROOT .
'/fourn/class/paiementfourn.class.php';
40require_once DOL_DOCUMENT_ROOT .
'/salaries/class/salary.class.php';
41require_once DOL_DOCUMENT_ROOT .
'/salaries/class/paymentsalary.class.php';
42require_once DOL_DOCUMENT_ROOT .
'/societe/class/societe.class.php';
43require_once DOL_DOCUMENT_ROOT .
'/user/class/userbankaccount.class.php';
54 public $element =
'widthdraw';
59 public $table_element =
'prelevement_bons';
64 public $picto =
'payment';
69 public $date_echeance;
73 public $raison_sociale;
77 public $reference_remise;
81 public $emetteur_code_guichet;
85 public $emetteur_numero_compte;
89 public $emetteur_code_banque;
93 public $emetteur_number_key;
97 public $sepa_xml_pti_in_ctti;
102 public $emetteur_iban;
106 public $emetteur_bic;
110 public $emetteur_ics;
131 public $labelStatus = array();
136 public $factures = array();
141 public $methodes_trans = array();
146 public $invoice_in_error = array();
151 public $thirdparty_in_error = array();
163 const STATUS_DRAFT = 0;
164 const STATUS_TRANSFERED = 1;
165 const STATUS_CREDITED = 2;
166 const STATUS_DEBITED = 2;
167 const STATUS_CANCELED = 9;
213 public $fields = array(
214 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'position' => 10,
'notnull' => 1,
'visible' => 0,),
215 'ref' => array(
'type' =>
'varchar(12)',
'label' =>
'Ref',
'enabled' => 1,
'position' => 15,
'notnull' => 0,
'visible' => -1,
'csslist' =>
'tdoverflowmax150',
'showoncombobox' => 1,),
216 'datec' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'position' => 25,
'notnull' => 0,
'visible' => -1,),
217 'amount' => array(
'type' =>
'double(24,8)',
'label' =>
'Amount',
'enabled' => 1,
'position' => 30,
'notnull' => 0,
'visible' => -1,),
218 'statut' => array(
'type' =>
'smallint(6)',
'label' =>
'Statut',
'enabled' => 1,
'position' => 500,
'notnull' => 0,
'visible' => -1,
'arrayofkeyval' => array(0 =>
'Wait', 1 =>
'Transfered', 2 =>
'Credited')),
219 'credite' => array(
'type' =>
'smallint(6)',
'label' =>
'Credite',
'enabled' => 1,
'position' => 40,
'notnull' => 0,
'visible' => -1,),
220 'note' => array(
'type' =>
'text',
'label' =>
'Note',
'enabled' => 1,
'position' => 45,
'notnull' => 0,
'visible' => -1,),
221 'date_trans' => array(
'type' =>
'datetime',
'label' =>
'TransData',
'enabled' => 1,
'position' => 50,
'notnull' => 0,
'visible' => -1,),
222 'method_trans' => array(
'type' =>
'smallint(6)',
'label' =>
'Methodtrans',
'enabled' => 1,
'position' => 55,
'notnull' => 0,
'visible' => -1,),
223 'fk_user_trans' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserTransfer',
'enabled' => 1,
'position' => 60,
'notnull' => 0,
'visible' => -1,
'css' =>
'maxwidth500 widthcentpercentminusxx',
'csslist' =>
'tdoverflowmax150',),
224 'date_credit' => array(
'type' =>
'datetime',
'label' =>
'CreditDate',
'enabled' => 1,
'position' => 65,
'notnull' => 0,
'visible' => -1,),
225 'fk_user_credit' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserCredit',
'enabled' => 1,
'position' => 70,
'notnull' => 0,
'visible' => -1,
'css' =>
'maxwidth500 widthcentpercentminusxx',
'csslist' =>
'tdoverflowmax150',),
226 'type' => array(
'type' =>
'varchar(16)',
'label' =>
'Type',
'enabled' => 1,
'position' => 75,
'notnull' => 0,
'visible' => -1,),
227 'fk_bank_account' => array(
'type' =>
'integer',
'label' =>
'BankAccount',
'enabled' => 1,
'position' => 80,
'notnull' => 0,
'visible' => -1,
'css' =>
'maxwidth500 widthcentpercentminusxx',),
271 public $note_private;
280 public $method_trans;
284 public $fk_user_trans;
292 public $fk_user_credit;
300 public $fk_bank_account;
314 $this->filename =
'';
316 $this->date_echeance =
dol_now();
317 $this->raison_sociale =
"";
318 $this->reference_remise =
"";
320 $this->emetteur_code_guichet =
"";
321 $this->emetteur_numero_compte =
"";
322 $this->emetteur_code_banque =
"";
323 $this->emetteur_number_key =
"";
324 $this->sepa_xml_pti_in_ctti =
false;
326 $this->emetteur_iban =
"";
327 $this->emetteur_bic =
"";
328 $this->emetteur_ics =
"";
330 $this->factures = array();
332 $this->methodes_trans = array(0 =>
'Internet', 2 =>
'Email', 3 =>
'Api');
357 public function addWithdrawDetail($invoice_id, $client_id, $client_nom, $amount, $code_banque, $code_guichet, $number, $number_key, $type =
'debit-order', $sourcetype =
'', $bic =
'', $iban =
'', $rum =
'', $id_prelevement_demande = 0)
366 $result = $this->
addline($line_id, $client_id, $client_nom, $amount, $code_banque, $code_guichet, $number, $number_key, $sourcetype, $bic, $iban, $rum, $id_prelevement_demande);
371 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"prelevement (";
372 if ($type !=
'bank-transfer') {
373 $sql .=
"fk_facture";
375 if ($sourcetype ==
'salary') {
378 $sql .=
"fk_facture_fourn";
381 $sql .=
",fk_prelevement_lignes";
382 $sql .=
") VALUES (";
383 $sql .= ((int) $invoice_id);
384 $sql .=
", " . ((int) $line_id);
387 if ($this->db->query($sql)) {
391 $this->errors[] = get_class($this) .
"::addWithdrawDetail " . $this->db->lasterror;
392 dol_syslog(get_class($this) .
"::addWithdrawDetail Error $result");
396 $this->errors[] = get_class($this) .
"::addWithdrawDetail linedid Empty";
397 dol_syslog(get_class($this) .
"::addWithdrawDetail Error $result");
401 dol_syslog(get_class($this) .
"::addWithdrawDetail Error $result");
425 public function addline(&$line_id, $client_id, $client_nom, $amount, $code_banque, $code_guichet, $number, $number_key, $sourcetype =
'', $bic =
'', $iban =
'', $rum =
'', $id_prelevement_demande = 0)
435 $sql =
"SELECT rowid";
436 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_lignes";
437 $sql .=
" WHERE fk_prelevement_bons = " . ((int) $this->
id);
438 if ($sourcetype ==
'salary') {
439 $sql .=
" AND fk_soc = " . ((int) $client_id);
441 $sql .=
" AND fk_user = " . ((int) $client_id);
443 $sql .=
" AND code_banque = '" . $this->db->escape($code_banque) .
"'";
444 $sql .=
" AND code_guichet = '" . $this->db->escape($code_guichet) .
"'";
445 $sql .=
" AND number = '" . $this->db->escape($number) .
"'";
447 $resql = $this->db->query($sql);
449 $num = $this->db->num_rows($resql);
457 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"prelevement_lignes (";
458 $sql .=
"fk_prelevement_bons";
460 $sql .=
", client_nom";
462 $sql .=
", fk_prelevement_demande";
463 $sql .= ($sourcetype ==
'salary' ?
", fk_user" :
"");
464 $sql .=
") VALUES (";
465 $sql .= ((int) $this->
id);
466 $sql .=
", " . (($sourcetype !=
'salary') ? ((
int) $client_id) :
"0");
467 $sql .=
", '" . $this->db->escape($client_nom) .
"'";
468 $sql .=
", " . ((float)
price2num($amount));
469 $sql .=
", " . ((int) $id_prelevement_demande);
470 $sql .= (($sourcetype ==
'salary') ?
", " . ((
int) $client_id) :
'');
472 if ($this->db->query($sql)) {
473 $line_id = $this->db->last_insert_id(MAIN_DB_PREFIX .
"prelevement_lignes");
476 $this->errors[] = get_class($this) .
"::addline Error -2 " . $this->db->lasterror;
477 dol_syslog(get_class($this) .
"::addline Error -2");
497 $errors[1027] = $langs->trans(
"DateInvalid");
499 return $errors[abs($error)] ??
'unknown error code';
509 public function fetch($rowid, $ref =
'')
511 $sql =
"SELECT p.rowid, p.ref, p.amount, p.note";
512 $sql .=
", p.datec as dc";
513 $sql .=
", p.date_trans as date_trans";
514 $sql .=
", p.method_trans, p.fk_user_trans";
515 $sql .=
", p.date_credit as date_credit";
516 $sql .=
", p.fk_user_credit";
518 $sql .=
", p.fk_bank_account";
519 $sql .=
", p.statut as status";
520 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as p";
521 $sql .=
" WHERE p.entity IN (" .
getEntity(
'invoice') .
")";
523 $sql .=
" AND p.rowid = " . ((int) $rowid);
525 $sql .=
" AND p.ref = '" . $this->db->escape($ref) .
"'";
528 dol_syslog(get_class($this) .
"::fetch", LOG_DEBUG);
529 $result = $this->db->query($sql);
531 if ($this->db->num_rows($result)) {
532 $obj = $this->db->fetch_object($result);
534 $this->
id = $obj->rowid;
535 $this->
ref = $obj->ref;
536 $this->
amount = $obj->amount;
537 $this->note = $obj->note;
538 $this->note_private = $obj->note;
539 $this->datec = $this->db->jdate($obj->dc);
541 $this->date_trans = $this->db->jdate($obj->date_trans);
542 $this->method_trans = $obj->method_trans;
543 $this->user_trans = $obj->fk_user_trans;
545 $this->date_credit = $this->db->jdate($obj->date_credit);
546 $this->user_credit = $obj->fk_user_credit;
548 $this->
type = $obj->type;
549 $this->fk_bank_account = $obj->fk_bank_account;
551 $this->
status = $obj->status;
552 if (empty($this->
status)) {
555 $this->statut = $this->status;
561 dol_syslog(get_class($this) .
"::Fetch no record found");
594 global
$conf, $langs;
598 if ($this->fetched == 1) {
599 if ($date < $this->date_trans) {
600 $langs->load(
"errors");
601 $this->error = $langs->trans(
'ErrorDateOfMovementLowerThanDateOfFileTransmission');
602 dol_syslog(
"bon-prelevment::set_infocredit 1027 " . $this->error);
608 $sql =
" UPDATE " . MAIN_DB_PREFIX .
"prelevement_bons";
609 $sql .=
" SET fk_user_credit = " . ((int) $user->id);
610 $sql .=
", statut = " . self::STATUS_CREDITED;
611 $sql .=
", date_credit = '" . $this->db->idate($date) .
"'";
612 $sql .=
" WHERE rowid = " . ((int) $this->
id);
613 $sql .=
" AND entity = " . ((int)
$conf->entity);
614 $sql .=
" AND statut = " . self::STATUS_TRANSFERED;
616 $resql = $this->db->query($sql);
618 $langs->load(
'withdrawals');
619 $subject = $langs->trans(
"InfoCreditSubject", $this->
ref);
620 $message = $langs->trans(
"InfoCreditMessage", $this->
ref,
dol_print_date($date,
'dayhour'));
623 $fk_bank_account = $this->fk_bank_account;
624 if (empty($fk_bank_account)) {
629 $amountsperthirdparty = array();
639 for ($i = 0; $i < $num; $i++) {
640 if ($this->
type ==
'bank-transfer') {
641 if ($type ==
'salary') {
642 $fac =
new Salary($this->db);
650 $result = $fac->fetch($facs[$i][0]);
652 $amounts[$fac->id] = $facs[$i][1];
653 if ($this->
type ==
'bank-transfer') {
654 if ($type ==
'salary') {
655 $amountsperthirdparty[$fac->fk_user][$fac->id] = $facs[$i][1];
657 $amountsperthirdparty[$fac->socid][$fac->id] = $facs[$i][1];
660 $amountsperthirdparty[$fac->socid][$fac->id] = $facs[$i][1];
663 $totalpaid = $fac->getSommePaiement();
664 $totalcreditnotes = 0;
665 if (method_exists($fac,
'getSumCreditNotesUsed')) {
666 $totalcreditnotes = $fac->getSumCreditNotesUsed();
669 if (method_exists($fac,
'getSumDepositsUsed')) {
670 $totaldeposits = $fac->getSumDepositsUsed();
672 $alreadypayed = $totalpaid + $totalcreditnotes + $totaldeposits;
676 $amountofdocument = $fac->total_ttc;
677 if ($type ==
'salary') {
678 $amountofdocument = $fac->amount;
680 if (
price2num($alreadypayed + $facs[$i][1],
'MT') ==
price2num($amountofdocument,
'MT')) {
681 $result = $fac->setPaid($user);
683 $this->error = $fac->error;
684 $this->errors = $fac->errors;
690 foreach ($amountsperthirdparty as $thirdpartyid => $cursoramounts) {
691 if ($this->
type ==
'bank-transfer') {
692 if ($type ==
'salary') {
698 $paiement =
new Paiement($this->db);
700 $paiement->datepaye = $date;
701 $paiement->amounts = $cursoramounts;
703 if ($this->
type ==
'bank-transfer') {
704 if ($type ==
'salary') {
705 $paiement->datep = $date;
707 $paiement->paiementid = 2;
708 $paiement->fk_typepayment = 2;
709 $paiement->paiementcode =
'VIR';
711 $paiement->paiementid = 2;
712 $paiement->paiementcode =
'VIR';
715 $paiement->paiementid = 3;
716 $paiement->paiementcode =
'PRE';
719 $paiement->num_payment = $this->ref;
720 $paiement->id_prelevement = $this->id;
722 $result = $paiement->create($user, 1);
726 $this->error = $paiement->error;
727 $this->errors = $paiement->errors;
728 dol_syslog(get_class($this) .
"::set_infocredit AddPayment Error " . $this->error);
730 if ($this->
type ==
'bank-transfer') {
731 if ($type ==
'salary') {
732 $modeforaddpayment =
'payment_salary';
733 $labelforaddpayment =
'(SalaryPayment)';
734 $addbankurl =
'credit-transfer';
736 $modeforaddpayment =
'payment_supplier';
737 $labelforaddpayment =
'(SupplierInvoicePayment)';
738 $addbankurl =
'credit-transfer';
741 $modeforaddpayment =
'payment';
742 $labelforaddpayment =
'(CustomerInvoicePayment)';
743 $addbankurl =
'direct-debit';
749 $result = $paiement->addPaymentToBank($user, $modeforaddpayment, $labelforaddpayment, $fk_bank_account,
'',
'');
751 $result = $paiement->addPaymentToBank($user, $modeforaddpayment, $labelforaddpayment, $fk_bank_account,
'',
'', 0,
'', $addbankurl);
756 $this->error = $paiement->error;
757 $this->errors = $paiement->errors;
758 dol_syslog(get_class($this) .
"::set_infocredit AddPaymentToBank Error " . $this->error);
766 $sql =
" UPDATE " . MAIN_DB_PREFIX .
"prelevement_lignes";
767 $sql .=
" SET statut = 2";
768 $sql .=
" WHERE fk_prelevement_bons = " . ((int) $this->
id);
770 if (!$this->db->query($sql)) {
771 dol_syslog(get_class($this) .
"::set_infocredit Update lines Error");
776 $this->error = $this->db->lasterror();
777 dol_syslog(get_class($this) .
"::set_infocredit Update Bons Error");
783 $this->date_credit = $date;
784 $this->statut = self::STATUS_CREDITED;
785 $this->
status = self::STATUS_CREDITED;
790 $this->db->rollback();
810 global
$conf, $langs;
814 dol_syslog(get_class($this) .
"::set_infotrans Start", LOG_INFO);
816 if ($this->db->begin()) {
817 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_bons ";
818 $sql .=
" SET fk_user_trans = " . ((int) $user->id);
819 $sql .=
" , date_trans = '" . $this->db->idate($date) .
"'";
820 $sql .=
" , method_trans = " . ((int) $method);
821 $sql .=
" , statut = " . self::STATUS_TRANSFERED;
822 $sql .=
" WHERE rowid = " . ((int) $this->
id);
823 $sql .=
" AND entity = " . ((int)
$conf->entity);
824 $sql .=
" AND statut = " . self::STATUS_DRAFT;
826 if ($this->db->query($sql)) {
827 $this->method_trans = $method;
828 $langs->load(
'withdrawals');
829 $subject = $langs->trans(
"InfoTransSubject", $this->
ref);
830 $message = $langs->trans(
"InfoTransMessage", $this->
ref,
dolGetFirstLastname($user->firstname, $user->lastname));
831 $message .= $langs->trans(
"InfoTransData",
price($this->
amount), $this->methodes_trans[$this->method_trans],
dol_print_date($date,
'day'));
839 $this->date_trans = $date;
840 $this->statut = self::STATUS_TRANSFERED;
841 $this->
status = self::STATUS_TRANSFERED;
842 $this->user_trans = $user->id;
848 $this->db->rollback();
849 dol_syslog(get_class($this) .
"::set_infotrans ROLLBACK", LOG_ERR);
854 dol_syslog(get_class($this) .
"::set_infotrans Ouverture transaction SQL impossible", LOG_CRIT);
873 dol_syslog(get_class($this) .
"::getListInvoices");
877 if ($this->
type ==
'bank-transfer') {
878 if ($type ==
'salary') {
879 $sql .=
" p.fk_salary";
881 $sql .=
" p.fk_facture_fourn";
884 $sql .=
" p.fk_facture";
887 $sql .=
", SUM(pl.amount)";
889 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as pb,";
890 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
891 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p";
892 $sql .=
" WHERE p.fk_prelevement_lignes = pl.rowid";
893 $sql .=
" AND pl.fk_prelevement_bons = pb.rowid";
894 $sql .=
" AND pb.rowid = " . ((int) $this->
id);
895 $sql .=
" AND pb.entity = " . ((int)
$conf->entity);
897 if ($this->
type ==
'bank-transfer') {
898 if ($type ==
'salary') {
899 $sql .=
" GROUP BY p.fk_salary";
901 $sql .=
" GROUP BY p.fk_facture_fourn";
904 $sql .=
" GROUP BY p.fk_facture";
908 $resql = $this->db->query($sql);
910 $num = $this->db->num_rows($resql);
915 $row = $this->db->fetch_row($resql);
927 $this->db->free($resql);
929 $this->error = $this->db->lasterror();
946 $sql =
"SELECT sum(pd.amount) as nb";
947 if ($type !==
'salary') {
948 if ($mode !=
'bank-transfer') {
949 $sql .=
" FROM " . MAIN_DB_PREFIX .
"facture as f,";
951 $sql .=
" FROM " . MAIN_DB_PREFIX .
"facture_fourn as f,";
954 $sql .=
" FROM " . MAIN_DB_PREFIX .
"salary as s,";
956 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_demande as pd";
957 $sql .= ($type !==
'salary' ?
" WHERE f.entity IN (" .
getEntity(
'invoice') .
")" :
" WHERE s.entity IN (" .
getEntity(
'salary') .
")");
959 $sql .= ($type !==
'salary' ?
" AND f.fk_statut = " .
Facture::STATUS_VALIDATED :
" AND s.paye = " . Salary::STATUS_UNPAID);
961 if ($type !==
'salary') {
962 if ($mode !=
'bank-transfer') {
963 $sql .=
" AND f.rowid = pd.fk_facture";
965 $sql .=
" AND f.rowid = pd.fk_facture_fourn";
968 $sql .=
" AND s.rowid = pd.fk_salary";
970 $sql .= ($type !==
'salary' ?
" AND f.paye = 0" :
"");
971 $sql .=
" AND pd.traite = 0";
972 $sql .=
" AND pd.ext_payment_id IS NULL";
973 $sql .= ($type !==
'salary' ?
" AND f.total_ttc > 0" :
"");
975 $resql = $this->db->query($sql);
977 $obj = $this->db->fetch_object($resql);
979 $this->db->free($resql);
984 dol_syslog(get_class($this) .
"::SommeAPrelever Erreur -1");
1000 if ($type ===
'salary') {
1018 if ($forsalary == 1) {
1019 $sql =
"SELECT count(s.rowid) as nb";
1020 $sql .=
" FROM " . MAIN_DB_PREFIX .
"salary as s";
1022 $sql =
"SELECT count(f.rowid) as nb";
1024 if ($type ==
'bank-transfer') {
1025 $sql .=
" FROM " . MAIN_DB_PREFIX .
"facture_fourn as f";
1027 $sql .=
" FROM " . MAIN_DB_PREFIX .
"facture as f";
1030 $sql .=
", " . MAIN_DB_PREFIX .
"prelevement_demande as pd";
1031 if ($forsalary == 1) {
1032 $sql .=
" WHERE s.entity IN (" .
getEntity(
'invoice') .
")";
1034 $sql .=
" AND s.paye = 0";
1037 $sql .=
" WHERE f.entity IN (" .
getEntity(
'invoice') .
")";
1042 if ($forsalary == 1) {
1043 $sql .=
" AND s.rowid = pd.fk_salary";
1045 if ($type ==
'bank-transfer') {
1046 $sql .=
" AND f.rowid = pd.fk_facture_fourn";
1048 $sql .=
" AND f.rowid = pd.fk_facture";
1051 $sql .=
" AND pd.traite = 0";
1052 $sql .=
" AND pd.ext_payment_id IS NULL";
1053 if (!$forsalary == 1) {
1054 $sql .=
" AND f.total_ttc > 0";
1056 $sql .=
" AND s.paye = 0";
1059 dol_syslog(get_class($this) .
"::NbFactureAPrelever");
1060 $resql = $this->db->query($sql);
1063 $obj = $this->db->fetch_object($resql);
1064 $this->db->free($resql);
1068 $this->error = get_class($this) .
"::NbFactureAPrelever Erreur -1 sql=" . $this->db->error();
1098 public function create($banque =
'', $agence =
'', $mode =
'real', $format =
'FRST', $executiondate = 0, $notrigger = 0, $type =
'direct-debit', $dids = 0, $fk_bank_account = 0, $sourcetype =
'invoice')
1101 global
$conf, $langs, $user;
1103 dol_syslog(__METHOD__ .
" mode=".$mode.
" format=".$format.
" type=".$type.
" dids=".(is_array($dids) ? implode(
',', $dids) : $dids).
" fk_bank_account=".$fk_bank_account.
" sourcetype=".$sourcetype, LOG_DEBUG);
1105 require_once DOL_DOCUMENT_ROOT .
"/compta/facture/class/facture.class.php";
1106 require_once DOL_DOCUMENT_ROOT .
"/societe/class/societe.class.php";
1109 if ($type !=
'bank-transfer') {
1110 $format = strtoupper($format);
1111 if (empty($format)) {
1112 $this->error =
'ErrorBadParametersForDirectDebitFileCreate';
1115 if ($mode ===
'real' && !in_array($format, array(
'FRST',
'RCUR',
'OOFF',
'FNAL'),
true)) {
1116 $this->error =
'ErrorBadParametersForDirectDebitFileCreate';
1121 if (!is_int($dids) && !is_array($dids)) {
1122 $this->error =
'ErrorBadParametersForDirectDebitFileCreateDids';
1127 if (empty($fk_bank_account)) {
1128 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
1130 if (is_int($dids)) {
1131 $dids = array($dids);
1136 if ($sourcetype !=
'salary') {
1137 $entity = $type !=
'bank-transfer' ?
getEntity(
'invoice', 1) :
getEntity(
'supplier_invoice', 1);
1138 $sqlTable = $type !=
'bank-transfer' ?
"facture" :
"facture_fourn";
1139 $socOrUser =
'fk_soc';
1140 $societeOrUser =
'societe';
1143 $sqlTable =
'salary';
1144 $socOrUser =
'fk_user';
1145 $societeOrUser =
'user';
1176 $datetimeprev =
dol_now(
'gmt');
1178 if (!empty($executiondate)) {
1179 $datetimeprev = $executiondate;
1185 $this->invoice_in_error = array();
1186 $this->thirdparty_in_error = array();
1189 $factures = array();
1190 $factures_prev = array();
1191 $factures_prev_id = array();
1193 dol_syslog(__METHOD__ .
" Read invoices/salaries for dids=" . implode(
', ', $dids), LOG_DEBUG);
1195 $sql =
"SELECT f.rowid, pd.rowid as pfdrowid";
1196 $sql .=
", f.".$this->db->sanitize($socOrUser);
1197 $sql .=
", pd.code_banque, pd.code_guichet, pd.number, pd.cle_rib";
1198 $sql .=
", pd.amount";
1199 if ($sourcetype !=
'salary') {
1200 $sql .=
", s.nom as name";
1202 $sql .=
", sr.bic, sr.iban_prefix, sr.frstrecur, sr.default_rib, sr.rum";
1204 $sql .=
", CONCAT(s.firstname, ' ', s.lastname) as name";
1206 $sql .=
", sr.bic, sr.iban_prefix, 'FRST' as frstrecur, sr.default_rib, '' as rum";
1208 $sql .=
", pd.fk_societe_rib as soc_rib_id";
1209 $sql .=
" FROM " . $this->db->prefix() . $sqlTable .
" as f";
1210 $sql .=
" INNER JOIN " . $this->db->prefix() .
"prelevement_demande as pd ON f.rowid = pd.fk_".$this->db->sanitize($sqlTable);
1211 $sql .=
" LEFT JOIN " . $this->db->prefix() . $this->db->sanitize($societeOrUser).
" as s ON s.rowid = f.".$this->db->sanitize($socOrUser);
1212 $sql .=
" LEFT JOIN " . $this->db->prefix() . $this->db->sanitize($societeOrUser.
"_rib").
" as sr ON s.rowid = sr.".$this->db->sanitize($socOrUser);
1213 if ($sourcetype !=
'salary') {
1214 $sql .=
" AND sr.default_rib = 1";
1215 $sql .=
" AND sr.type = 'ban'";
1223 $sql .=
" WHERE f.entity IN (".((int) $entity).
')';
1224 if ($sourcetype !=
'salary') {
1225 $sql .=
" AND f.fk_statut = ".Facture::STATUS_VALIDATED;
1226 $sql .=
" AND f.paye = 0";
1227 $sql .=
" AND f.total_ttc > 0";
1233 $sql .=
" AND f.paye = 0";
1234 $sql .=
" AND f.amount > 0";
1236 $sql .=
" AND pd.traite = 0";
1237 $sql .=
" AND pd.ext_payment_id IS NULL";
1238 if ($dids !== [0] && !empty($dids)) {
1239 $sql .=
" AND pd.rowid IN (".$this->db->sanitize(implode(
',', $dids)).
")";
1242 $resql = $this->db->query($sql);
1244 $num = $this->db->num_rows($resql);
1248 $row = $this->db->fetch_row($resql);
1249 '@phan-var-force array<int<0,12>,string> $row';
1256 $factures[$i] = $row;
1259 $factures[$i][11] =
dolDecrypt($factures[$i][11]);
1263 dol_syslog(__METHOD__ .
" Read invoices/salaries error Found a null amount", LOG_WARNING);
1264 $this->invoice_in_error[$row[0]] =
"Error for invoice or salary id " . $row[0] .
", found a null amount";
1270 $this->db->free($resql);
1271 dol_syslog(__METHOD__ .
" Read invoices/salaries, " . $i .
" invoices/salaries to withdraw", LOG_DEBUG);
1273 $this->error = $this->db->lasterror();
1274 dol_syslog(__METHOD__ .
" Read invoices/salaries error " . $this->db->lasterror(), LOG_ERR);
1280 require_once DOL_DOCUMENT_ROOT .
'/societe/class/societe.class.php';
1281 require_once DOL_DOCUMENT_ROOT .
'/user/class/user.class.php';
1282 require_once DOL_DOCUMENT_ROOT .
'/societe/class/companybankaccount.class.php';
1283 require_once DOL_DOCUMENT_ROOT .
'/core/lib/bank.lib.php';
1285 $tmpsoc =
new Societe($this->db);
1286 $tmpuser =
new User($this->db);
1290 dol_syslog(__METHOD__ .
" Check BAN for each invoices or salaries", LOG_DEBUG);
1292 if (count($factures) > 0) {
1293 foreach ($factures as $key => $fac) {
1297 if ($fac[8] !=
null) {
1298 if ($type !=
'bank-transfer') {
1299 if ($format ==
'FRST' && $fac[12] && $fac[12] !=
'FRST') {
1302 if ($format ==
'RCUR' && $fac[12] && $fac[12] !=
'RCUR') {
1309 if (!empty($fac[15])) {
1311 $bankaccount->fetch((
int) $fac[15]);
1312 if ($bankaccount->id > 0) {
1313 $fac[3] = $bankaccount->code_banque;
1314 $fac[4] = $bankaccount->code_guichet;
1315 $fac[5] = $bankaccount->number;
1316 $fac[6] = $bankaccount->cle_rib;
1317 $fac[10] = $bankaccount->bic;
1318 $fac[11] = $bankaccount->iban;
1319 $fac[14] = $bankaccount->rum;
1324 $bicinloop = $fac[10];
1325 $baninloop = $fac[11];
1329 if ($verif || (empty($fac[10]) &&
getDolGlobalInt(
"WITHDRAWAL_WITHOUT_BIC"))) {
1330 dol_syslog(__METHOD__.
" now call checkIbanForAccount(null, ".$baninloop.
")");
1335 $factures_prev[$i] = $fac;
1337 $factures_prev_id[$i] = $fac[0];
1341 if ($type !=
'bank-transfer') {
1342 $tmpsoc->id = (int) $fac[2];
1343 $tmpsoc->name = $fac[8];
1344 $invoice_url =
"<a href='" . DOL_URL_ROOT .
'/compta/facture/card.php?facid=' . $fac[0] .
"'>" . $fac[9] .
"</a>";
1345 $this->invoice_in_error[$fac[0]] =
"Error incomplete properties of the default bank number ".$baninloop.
" IBAN/BIC for invoice " . $invoice_url .
" for thirdparty " . $tmpsoc->getNomUrl(0);
1346 $this->thirdparty_in_error[$tmpsoc->id] =
"Error on default bank number IBAN/BIC for invoice " . $invoice_url .
" for thirdparty " . $tmpsoc->getNomUrl(0);
1349 if ($type ==
'bank-transfer' && $sourcetype !=
'salary') {
1350 $tmpsoc->id = (int) $fac[2];
1351 $tmpsoc->name = $fac[8];
1352 $invoice_url =
"<a href='" . DOL_URL_ROOT .
'/fourn/facture/card.php?facid=' . $fac[0] .
"'>" . $fac[9] .
"</a>";
1353 $this->invoice_in_error[$fac[0]] =
"Error incomplete properties of the default bank number ".$baninloop.
" IBAN/BIC for invoice " . $invoice_url .
" for thirdparty " . $tmpsoc->getNomUrl(0);
1354 $this->thirdparty_in_error[$tmpsoc->id] =
"Error on default bank number IBAN/BIC for invoice " . $invoice_url .
" for thirdparty " . $tmpsoc->getNomUrl(0);
1357 if ($type ==
'bank-transfer' && $sourcetype ==
'salary') {
1358 $tmpuser->id = (int) $fac[2];
1359 $tmpuser->firstname = $fac[8];
1360 $salary_url =
"<a href='" . DOL_URL_ROOT .
'/salaries/card.php?id=' . $fac[0] .
"'>" . $fac[0] .
"</a>";
1361 $this->invoice_in_error[$fac[0]] =
"Error incomplete properties of the default bank number ".$baninloop.
" IBAN/BIC for salary " . $salary_url .
" for employee " . $tmpuser->getNomUrl(0);
1362 $this->thirdparty_in_error[$tmpuser->id] =
"Error on default bank number IBAN/BIC for salary " . $salary_url .
" for employee " . $tmpuser->getNomUrl(0);
1365 dol_syslog(__METHOD__ .
" Check BAN Error on default bank number IBAN/BIC reported by verif(): " . implode(
', ', $fac), LOG_WARNING);
1368 dol_syslog(__METHOD__ .
" Check BAN Failed to read company", LOG_WARNING);
1377 dol_syslog(__METHOD__ .
" Check BAN No invoice to process", LOG_WARNING);
1384 $out = count($factures_prev) .
" invoices or salaries will be included.";
1389 if (count($factures_prev) > 0) {
1390 if ($mode ==
'real') {
1393 print $langs->trans(
"ModeWarning");
1410 $ref = substr($year, -2) . $month;
1415 $sql =
"SELECT SUBSTRING(ref, 6) AS refnumber";
1416 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons";
1417 $sql .=
" WHERE ref LIKE '" . $this->db->escape($prefixt . $ref) .
"%'";
1418 $sql .=
" AND entity = " . ((int)
$conf->entity);
1419 $sql .=
" ORDER BY LENGTH(ref) DESC, ref DESC";
1422 dol_syslog(get_class($this) .
" get next free number", LOG_DEBUG);
1424 $resql = $this->db->query($sql);
1427 $row = $this->db->fetch_row($resql);
1430 $ref = $prefixt . $ref . sprintf(
"%03d", (intval($row[0] ?? 0) + 1));
1436 if ($type !=
'bank-transfer') {
1437 $dir =
$conf->prelevement->dir_output .
'/receipts';
1439 $dir =
$conf->paymentbybanktransfer->dir_output .
'/receipts';
1441 if (!is_dir($dir)) {
1446 $labelentity =
$conf->entity;
1447 $this->filename = $dir .
'/' . $ref .
'-' . $labelentity .
'.xml';
1449 $this->filename = $dir .
'/' . $ref .
'.xml';
1453 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"prelevement_bons (";
1454 $sql .=
"ref, entity, datec, type, fk_bank_account";
1455 $sql .=
") VALUES (";
1456 $sql .=
"'" . $this->db->escape($ref) .
"'";
1457 $sql .=
", " . ((int)
$conf->entity);
1458 $sql .=
", '" . $this->db->idate($now) .
"'";
1459 $sql .=
", '" . ($type ==
'bank-transfer' ?
'bank-transfer' :
'debit-order') .
"'";
1460 $sql .=
", " . ((int) $fk_bank_account);
1463 $resql = $this->db->query($sql);
1466 $prev_id = $this->db->last_insert_id(MAIN_DB_PREFIX .
"prelevement_bons");
1467 $this->
id = $prev_id;
1471 $this->errors[] = $this->db->lasterror();
1472 dol_syslog(__METHOD__ .
" Create withdraw receipt " . $this->db->lasterror(), LOG_ERR);
1476 $this->errors[] = $this->db->lasterror();
1477 dol_syslog(__METHOD__ .
" Get last withdraw receipt " . $this->db->lasterror(), LOG_ERR);
1482 dol_syslog(__METHOD__ .
" Now loop on each document to insert them in llx_prelevement_demande");
1485 if (count($factures_prev) > 0) {
1486 foreach ($factures_prev as $fac) {
1530 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_demande";
1531 $sql .=
" SET traite = 1";
1532 $sql .=
", date_traite = '" . $this->db->idate($now) .
"'";
1533 $sql .=
", fk_prelevement_bons = " . ((int) $this->
id);
1534 $sql .=
" WHERE rowid = " . ((int) $fac[1]);
1536 $resql = $this->db->query($sql);
1539 $this->errors[] = $this->db->lasterror();
1540 dol_syslog(__METHOD__ .
" Update Error=" . $this->db->lasterror(), LOG_ERR);
1551 dol_syslog(__METHOD__ .
" Init direct debit or credit transfer file for " . count($factures_prev) .
" invoices", LOG_DEBUG);
1553 if (count($factures_prev) > 0) {
1554 $this->date_echeance = $datetimeprev;
1555 $this->reference_remise = $ref;
1557 $account =
new Account($this->db);
1558 if ($account->fetch($fk_bank_account) > 0) {
1559 $this->emetteur_code_banque = $account->code_banque;
1560 $this->emetteur_code_guichet = $account->code_guichet;
1561 $this->emetteur_numero_compte = $account->number;
1562 $this->emetteur_number_key = $account->cle_rib;
1563 $this->sepa_xml_pti_in_ctti = (bool) $account->pti_in_ctti;
1564 $this->emetteur_iban = $account->iban;
1565 $this->emetteur_bic = $account->bic;
1567 $this->emetteur_ics = (($type ==
'bank-transfer' &&
getDolGlobalString(
"SEPA_USE_IDS")) ? $account->ics_transfer : $account->ics);
1569 $this->raison_sociale = $account->owner_name;
1571 $this->factures = $factures_prev_id;
1572 $this->context[
'factures_prev'] = $factures_prev;
1576 if ($sourcetype ==
'salary') {
1577 $userid = $this->context[
'factures_prev'][0][2];
1579 $result = $this->
generate($format, $executiondate, $type, $fk_bank_account, $userid, 0);
1586 dol_syslog(__METHOD__ .
" Bank order file has been generated under filename " . $this->filename, LOG_DEBUG);
1594 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_bons";
1595 $sql .=
" SET amount = " .
price2num($this->total);
1596 $sql .=
" WHERE rowid = " . ((int) $this->
id);
1597 $sql .=
" AND entity = " . ((int)
$conf->entity);
1598 $resql = $this->db->query($sql);
1602 dol_syslog(__METHOD__ .
" Error update total: " . $this->db->error(), LOG_ERR);
1606 if (!$error && !$notrigger) {
1607 $triggerName = ($type ==
'bank-transfer') ?
'CREDIT_TRANSFER_ORDER_CREATE' :
'DIRECT_DEBIT_ORDER_CREATE';
1608 $this->
amount = $this->total;
1611 $result = $this->call_trigger($triggerName, $user);
1619 $this->db->commit();
1620 return count($factures_prev);
1622 $this->db->rollback();
1638 public function delete($user, $notrigger = 0)
1643 $resql1 = $resql2 = $resql3 = $resql4 = 0;
1646 $triggername =
'DIRECT_DEBIT_ORDER_DELETE';
1647 if ($this->
type ==
'bank-transfer') {
1648 $triggername =
'PAYMENTBYBANKTRANFER_DELETE';
1651 $result = $this->call_trigger($triggername, $user);
1659 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"prelevement WHERE fk_prelevement_lignes IN (SELECT rowid FROM " . MAIN_DB_PREFIX .
"prelevement_lignes WHERE fk_prelevement_bons = " . ((int) $this->
id) .
")";
1660 $resql1 = $this->db->query($sql);
1662 dol_print_error($this->db);
1667 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"prelevement_lignes WHERE fk_prelevement_bons = " . ((int) $this->
id);
1668 $resql2 = $this->db->query($sql);
1670 dol_print_error($this->db);
1675 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"prelevement_bons WHERE rowid = " . ((int) $this->
id);
1676 $resql3 = $this->db->query($sql);
1678 dol_print_error($this->db);
1683 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_demande SET fk_prelevement_bons = NULL, traite = 0 WHERE fk_prelevement_bons = " . ((int) $this->
id);
1684 $resql4 = $this->db->query($sql);
1686 dol_print_error($this->db);
1690 if ($resql1 && $resql2 && $resql3 && $resql4 && !$error) {
1691 $this->db->commit();
1694 $this->db->rollback();
1710 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
1712 global
$conf, $langs, $hookmanager;
1714 if (!empty(
$conf->dol_no_mouse_hover)) {
1720 $labeltoshow =
'PaymentByDirectDebit';
1721 $labelforclosedate =
'CreditDate';
1722 if (!empty($this->
type) && $this->
type ==
'bank-transfer') {
1723 $labeltoshow =
'PaymentByBankTransfer';
1724 $labelforclosedate =
'ClosedOn';
1727 $label = img_picto(
'', $this->picto) .
' <u>' . $langs->trans($labeltoshow) .
'</u> ' . $this->
getLibStatut(5);
1729 $label .=
'<b>' . $langs->trans(
'Ref') .
':</b> ' . $this->ref;
1730 if (isset($this->
amount)) {
1731 $label .=
'<br><b>' . $langs->trans(
"Amount") .
':</b> <span class="amount">' .
price($this->
amount).
'</span>';
1733 if (isset($this->date_creation)) {
1734 $label .=
'<br><b>'.$langs->trans(
"DateCreation").
":</b> ".
dol_print_date($this->date_creation,
'dayhour',
'tzuserrel');
1736 if (isset($this->date_trans)) {
1737 $label .=
'<br><b>' . $langs->trans(
"TransData") .
":</b> " .
dol_print_date($this->date_trans,
'dayhour',
'tzuserrel');
1739 if (isset($this->date_credit)) {
1740 $label .=
'<br><b>'.$langs->trans($labelforclosedate).
":</b> ".
dol_print_date($this->date_credit,
'dayhour',
'tzuserrel');
1743 $url = DOL_URL_ROOT .
'/compta/prelevement/card.php?id=' . $this->id;
1744 if (!empty($this->
type) && $this->
type ==
'bank-transfer') {
1745 $url = DOL_URL_ROOT .
'/compta/prelevement/card.php?id=' . $this->id;
1748 if ($option !=
'nolink') {
1750 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1751 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1752 $add_save_lastsearch_values = 1;
1754 if ($add_save_lastsearch_values) {
1755 $url .=
'&save_lastsearch_values=1';
1760 if (empty($notooltip)) {
1762 $label = $langs->trans(
"ShowMyObject");
1766 $linkclose .=
' class="classfortooltip' . ($morecss ?
' ' . $morecss :
'') .
'"';
1768 $linkclose = ($morecss ?
' class="' . $morecss .
'"' :
'');
1771 $linkstart =
'<a href="' . $url .
'"';
1772 $linkstart .= $linkclose .
'>';
1775 $result .= $linkstart;
1777 $result .= img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="' . (($withpicto != 2) ?
'paddingright ' :
'') .
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
1779 if ($withpicto != 2) {
1780 $result .= $this->ref;
1782 $result .= $linkend;
1784 global $action, $hookmanager;
1785 $hookmanager->initHooks(array(
'banktransferdao'));
1786 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1787 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1789 $result = $hookmanager->resPrint;
1791 $result .= $hookmanager->resPrint;
1806 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"notify_def";
1807 $sql .=
" WHERE rowid = " . ((int) $rowid);
1809 if ($this->db->query($sql)) {
1825 if (is_object($user)) {
1826 $userid = $user->id;
1831 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"notify_def";
1832 $sql .=
" WHERE fk_user = " . ((int) $userid) .
" AND fk_action = " . ((int) $action);
1834 if ($this->db->query($sql)) {
1855 if (is_object($user)) {
1856 $userid = $user->id;
1864 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"notify_def (datec, fk_user, fk_soc, fk_contact, fk_action)";
1865 $sql .=
" VALUES ('" . $this->db->idate($now) .
"', " . ((int) $userid) .
", NULL, NULL, " . ((int) $action) .
")";
1868 if ($this->db->query($sql)) {
1872 dol_syslog(get_class($this) .
"::addNotification Error $result");
1895 public function generate(
string $format =
'FRST',
int $executiondate = 0,
string $type =
'direct-debit',
int $fk_bank_account = 0,
int $forsalary = 0,
int $thirdpartyBANId = 0)
1899 if ($type !==
'bank-transfer') {
1900 $format = strtoupper($format);
1901 if (!in_array($format, array(
'FRST',
'RCUR',
'OOFF',
'FNAL'),
true)) {
1902 $this->error =
'ErrorBadParametersForDirectDebitFileCreate';
1910 if (empty($fk_bank_account)) {
1911 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
1916 dol_syslog(get_class($this) .
"::generate build file=" . $this->filename .
" type=" . $type);
1918 $this->file = fopen($this->filename,
"w");
1919 if ($this->file ==
false) {
1920 $this->error = $langs->trans(
'ErrorFailedToOpenFile', $this->filename);
1928 if (
$mysoc->isInSEPA()) {
1931 if ($type !=
'bank-transfer') {
1943 if (!empty($executiondate)) {
1944 $date_actu = $executiondate;
1949 $fileDebiteurSection =
'';
1950 $fileEmetteurSection =
'';
1957 $sql =
"SELECT soc.rowid as socid, soc.code_client as code, soc.address, soc.zip, soc.town, c.code as country_code,";
1959 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
1960 $sql .=
" f.ref as reffac,";
1961 $sql .=
" p.fk_facture as idfac, p.rowid as pid,";
1962 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, rib.rum, rib.date_rum";
1964 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
1965 $sql .=
" " . MAIN_DB_PREFIX .
"facture as f,";
1966 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
1967 $sql .=
" " . MAIN_DB_PREFIX .
"societe as soc,";
1968 $sql .=
" " . MAIN_DB_PREFIX .
"c_country as c,";
1969 $sql .=
" " . MAIN_DB_PREFIX .
"societe_rib as rib";
1970 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
1971 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
1972 $sql .=
" AND p.fk_facture = f.rowid";
1973 $sql .=
" AND f.fk_soc = soc.rowid";
1974 $sql .=
" AND soc.fk_pays = c.rowid";
1975 $sql .=
" AND rib.fk_soc = f.fk_soc";
1976 if (!empty($thirdpartyBANId)) {
1977 $sql .=
" AND rib.rowid = " . ((int) $thirdpartyBANId);
1979 $sql .=
" AND rib.default_rib = 1";
1981 $sql .=
" AND rib.type = 'ban'";
1984 $resql = $this->db->query($sql);
1985 $nbtotalDrctDbtTxInf = -1;
1987 $cachearraytotestduplicate = array();
1989 $num = $this->db->num_rows($resql);
1991 $obj = $this->db->fetch_object($resql);
1993 if (!empty($cachearraytotestduplicate[$obj->idfac])) {
1994 $this->error = $langs->trans(
'ErrorCompanyHasDuplicateDefaultBAN', $obj->socid);
1995 $this->invoice_in_error[$obj->idfac] = $this->error;
1999 $cachearraytotestduplicate[$obj->idfac] = $obj->rowid;
2002 $daterum = (!empty($obj->date_rum)) ? $this->db->jdate($obj->date_rum) : $this->db->jdate($obj->datec);
2009 if (!empty($obj->fk_prelevement_demande)) {
2010 $companybankaccountid = 0;
2012 $sqltmp =
"SELECT fk_societe_rib FROM ".MAIN_DB_PREFIX.
"prelevement_demande";
2013 $sqltmp .=
" WHERE rowid = ".((int) $obj->fk_prelevement_demande);
2015 $resqltmp = $this->db->query($sqltmp);
2017 $objtmp = $this->db->fetch_object($resqltmp);
2019 $companybankaccountid = (int) $objtmp->fk_societe_rib;
2023 $bankaccount->fetch($companybankaccountid);
2024 if ($bankaccount->id > 0) {
2025 $daterum = $bankaccount->date_rum;
2026 $iban = $bankaccount->iban;
2027 $bic = $bankaccount->bic;
2028 $drum = $bankaccount->id;
2029 $rum = $bankaccount->rum;
2033 $fileDebiteurSection .= $this->
EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code,
'',
'',
'', $obj->somme, $obj->reffac, $obj->idfac, $iban, $bic, $daterum, (
string) $drum, $rum, $type);
2035 $this->total += $obj->somme;
2038 $nbtotalDrctDbtTxInf = $i;
2040 $this->error = $this->db->lasterror();
2041 fwrite($this->file,
'ERROR DEBITOR ' . $sql . $CrLf);
2046 if ($result != -2) {
2047 $fileEmetteurSection .= $this->
EnregEmetteurSEPA($conf, $date_actu, $nbtotalDrctDbtTxInf, $this->total, $CrLf, $format, $type, $fk_bank_account);
2051 $this->total = number_format((
float)
price2num($this->total,
'MT'), 2,
".",
"");
2058 fwrite($this->file,
'<' .
'?xml version="1.0" encoding="UTF-8" standalone="yes"?' .
'>' . $CrLf);
2059 fwrite($this->file,
'<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' . $CrLf);
2060 fwrite($this->file,
' <CstmrDrctDbtInitn>' . $CrLf);
2062 fwrite($this->file,
' <GrpHdr>' . $CrLf);
2063 fwrite($this->file,
' <MsgId>' . (
'DOL/' . $dateTime_YMD .
'/DD' . $this->
id) .
'</MsgId>' . $CrLf);
2064 fwrite($this->file,
' <CreDtTm>' . $dateTime_ECMA .
'</CreDtTm>' . $CrLf);
2065 fwrite($this->file,
' <NbOfTxs>' . $i .
'</NbOfTxs>' . $CrLf);
2066 fwrite($this->file,
' <CtrlSum>' . $this->total .
'</CtrlSum>' . $CrLf);
2067 fwrite($this->file,
' <InitgPty>' . $CrLf);
2069 fwrite($this->file,
' <Id>' . $CrLf);
2070 fwrite($this->file,
' <PrvtId>' . $CrLf);
2071 fwrite($this->file,
' <Othr>' . $CrLf);
2072 fwrite($this->file,
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf);
2073 fwrite($this->file,
' </Othr>' . $CrLf);
2074 fwrite($this->file,
' </PrvtId>' . $CrLf);
2075 fwrite($this->file,
' </Id>' . $CrLf);
2076 fwrite($this->file,
' </InitgPty>' . $CrLf);
2077 fwrite($this->file,
' </GrpHdr>' . $CrLf);
2079 if ($result != -2) {
2080 fwrite($this->file, $fileEmetteurSection);
2083 if ($result != -2) {
2084 fwrite($this->file, $fileDebiteurSection);
2087 fwrite($this->file,
' </PmtInf>' . $CrLf);
2088 fwrite($this->file,
' </CstmrDrctDbtInitn>' . $CrLf);
2089 fwrite($this->file,
'</Document>' . $CrLf);
2102 if (!empty($executiondate)) {
2103 $date_actu = $executiondate;
2108 $fileCrediteurSection =
'';
2109 $fileEmetteurSection =
'';
2115 if (!empty($forsalary)) {
2116 $sql =
"SELECT u.rowid as userId, u.address, u.zip, u.town, c.code as country_code, CONCAT(u.firstname,' ',u.lastname) as nom,";
2118 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
2119 $sql .=
" s.ref as reffac,";
2120 $sql .=
" p.fk_salary as idfac,";
2121 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, '' as rum, '' as date_rum";
2123 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2124 $sql .=
" " . MAIN_DB_PREFIX .
"salary as s,";
2125 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
2126 $sql .=
" " . MAIN_DB_PREFIX .
"user as u";
2127 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_country as c ON u.fk_country = c.rowid,";
2128 $sql .=
" " . MAIN_DB_PREFIX .
"user_rib as rib";
2129 $sql .=
" WHERE pl.fk_prelevement_bons=" . ((int) $this->
id);
2130 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2131 $sql .=
" AND p.fk_salary = s.rowid";
2132 $sql .=
" AND s.fk_user = u.rowid";
2133 $sql .=
" AND rib.fk_user = s.fk_user";
2135 $sql =
"SELECT soc.rowid as socid, soc.code_client as code, soc.address, soc.zip, soc.town, c.code as country_code,";
2137 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
2138 $sql .=
" f.ref as reffac, f.ref_supplier as fac_ref_supplier,";
2139 $sql .=
" p.fk_facture_fourn as idfac,";
2140 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, rib.rum, rib.date_rum";
2142 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2143 $sql .=
" " . MAIN_DB_PREFIX .
"facture_fourn as f,";
2144 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
2145 $sql .=
" " . MAIN_DB_PREFIX .
"societe as soc";
2146 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_country as c ON soc.fk_pays = c.rowid,";
2147 $sql .=
" " . MAIN_DB_PREFIX .
"societe_rib as rib";
2148 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2149 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2150 $sql .=
" AND p.fk_facture_fourn = f.rowid";
2151 $sql .=
" AND f.fk_soc = soc.rowid";
2152 $sql .=
" AND rib.fk_soc = f.fk_soc";
2153 if (!empty($thirdpartyBANId)) {
2154 $sql .=
" AND rib.rowid = " . ((int) $thirdpartyBANId);
2156 $sql .=
" AND rib.default_rib = 1";
2158 $sql .=
" AND rib.type = 'ban'";
2161 $nbtotalDrctDbtTxInf = -1;
2163 require_once DOL_DOCUMENT_ROOT .
'/societe/class/companybankaccount.class.php';
2165 $resql = $this->db->query($sql);
2167 $cachearraytotestduplicate = array();
2169 $num = $this->db->num_rows($resql);
2171 $obj = $this->db->fetch_object($resql);
2174 if (!empty($cachearraytotestduplicate[$obj->idfac])) {
2175 $this->error = $langs->trans(
'ErrorCompanyHasDuplicateDefaultBAN', $obj->socid);
2176 $this->invoice_in_error[$obj->idfac] = $this->error;
2181 $cachearraytotestduplicate[$obj->idfac] = $obj->rowid;
2184 $daterum = (!empty($obj->date_rum)) ? $this->db->jdate($obj->date_rum) : $this->db->jdate($obj->datec);
2191 if (!empty($obj->fk_prelevement_demande)) {
2192 $companybankaccountid = 0;
2194 $sqltmp =
"SELECT fk_societe_rib FROM ".MAIN_DB_PREFIX.
"prelevement_demande";
2195 $sqltmp .=
" WHERE rowid = ".((int) $obj->fk_prelevement_demande);
2197 $resqltmp = $this->db->query($sqltmp);
2199 $objtmp = $this->db->fetch_object($resqltmp);
2201 $companybankaccountid = (int) $objtmp->fk_societe_rib;
2205 $bankaccount->fetch($companybankaccountid);
2206 if ($bankaccount->id > 0) {
2207 $daterum = $bankaccount->date_rum;
2208 $iban = $bankaccount->iban;
2209 $bic = $bankaccount->bic;
2210 $drum = $bankaccount->id;
2211 $rum = $bankaccount->rum;
2215 $refobj = $obj->reffac;
2216 if (empty($refobj) && !empty($forsalary)) {
2217 $refobj =
"SAL" . $obj->idfac;
2220 $fileCrediteurSection .= $this->
EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code,
'',
'',
'', $obj->somme, $refobj, $obj->idfac, $iban, $bic, $daterum, (
string) $drum, $rum, $type, $obj->fac_ref_supplier);
2222 $this->total += $obj->somme;
2225 $nbtotalDrctDbtTxInf = $i;
2227 $this->error = $this->db->lasterror();
2228 fwrite($this->file,
'ERROR CREDITOR ' . $sql . $CrLf);
2232 if ($result != -2) {
2233 $fileEmetteurSection .= $this->
EnregEmetteurSEPA($conf, $date_actu, $nbtotalDrctDbtTxInf, $this->total, $CrLf, $format, $type);
2237 $this->total = number_format((
float)
price2num($this->total,
'MT'), 2,
".",
"");
2244 fwrite($this->file,
'<' .
'?xml version="1.0" encoding="UTF-8" standalone="yes"?' .
'>' . $CrLf);
2245 fwrite($this->file,
'<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' . $CrLf);
2246 fwrite($this->file,
' <CstmrCdtTrfInitn>' . $CrLf);
2248 fwrite($this->file,
' <GrpHdr>' . $CrLf);
2249 fwrite($this->file,
' <MsgId>' . (
'DOL/' . $dateTime_YMD .
'/CT' . $this->
id) .
'</MsgId>' . $CrLf);
2250 fwrite($this->file,
' <CreDtTm>' . $dateTime_ECMA .
'</CreDtTm>' . $CrLf);
2251 fwrite($this->file,
' <NbOfTxs>' . $i .
'</NbOfTxs>' . $CrLf);
2252 fwrite($this->file,
' <CtrlSum>' . $this->total .
'</CtrlSum>' . $CrLf);
2253 fwrite($this->file,
' <InitgPty>' . $CrLf);
2255 fwrite($this->file,
' <Id>' . $CrLf);
2256 fwrite($this->file,
' <PrvtId>' . $CrLf);
2257 fwrite($this->file,
' <Othr>' . $CrLf);
2258 fwrite($this->file,
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf);
2259 fwrite($this->file,
' </Othr>' . $CrLf);
2260 fwrite($this->file,
' </PrvtId>' . $CrLf);
2261 fwrite($this->file,
' </Id>' . $CrLf);
2262 fwrite($this->file,
' </InitgPty>' . $CrLf);
2263 fwrite($this->file,
' </GrpHdr>' . $CrLf);
2265 if ($result != -2) {
2266 fwrite($this->file, $fileEmetteurSection);
2269 if ($result != -2) {
2270 fwrite($this->file, $fileCrediteurSection);
2273 fwrite($this->file,
' </PmtInf>' . $CrLf);
2274 fwrite($this->file,
' </CstmrCdtTrfInitn>' . $CrLf);
2275 fwrite($this->file,
'</Document>' . $CrLf);
2281 if ($type !=
'bank-transfer') {
2282 $sql =
"SELECT pl.amount";
2284 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2285 $sql .=
" " . MAIN_DB_PREFIX .
"facture as f,";
2286 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p";
2287 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2288 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2289 $sql .=
" AND p.fk_facture = f.rowid";
2293 $resql = $this->db->query($sql);
2295 $num = $this->db->num_rows($resql);
2298 $obj = $this->db->fetch_object($resql);
2299 $this->total += $obj->amount;
2308 $sql =
"SELECT pl.amount";
2310 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2311 $sql .=
" " . MAIN_DB_PREFIX .
"facture_fourn as f,";
2312 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p";
2313 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2314 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2315 $sql .=
" AND p.fk_facture_fourn = f.rowid";
2318 $resql = $this->db->query($sql);
2320 $num = $this->db->num_rows($resql);
2323 $obj = $this->db->fetch_object($resql);
2324 $this->total += $obj->amount;
2334 $langs->load(
'withdrawals');
2337 fwrite($this->file, $langs->transnoentitiesnoconv(
'WithdrawalFileNotCapable',
$mysoc->country_code));
2340 fclose($this->file);
2362 return $pre .
'-' .
dol_print_date($row_datec,
'dayhourlogsmall') .
'-' .
dol_trunc((
string) $row_drum . ($row_code_client ?
'-' . $row_code_client :
''), 17,
'right',
'UTF-8', 1);
2387 $country_code = trim((
string) $country_code);
2389 $missingelements = array();
2390 if (trim($town) ==
'') {
2391 $missingelements[] =
'town';
2393 if ($country_code ==
'') {
2394 $missingelements[] =
'country code';
2396 if (count($missingelements) > 0) {
2398 dol_syslog(
'buildSEPAPostalAddressXML: PstlAdr block omitted because the '.implode(
' and the ', $missingelements).
' is empty.', LOG_WARNING);
2402 $XML_ADR = $indent .
'<PstlAdr>' . $CrLf;
2404 if (trim($zip) !=
'') {
2405 $XML_ADR .= $indent .
' <PstCd>' . dolEscapeXML(
dol_trunc($zip, 16,
'right',
'UTF-8', 1)) .
'</PstCd>' . $CrLf;
2407 $XML_ADR .= $indent .
' <TwnNm>' . dolEscapeXML(
dol_trunc($town, 35,
'right',
'UTF-8', 1)) .
'</TwnNm>' . $CrLf;
2408 $XML_ADR .= $indent .
' <Ctry>' . dolEscapeXML($country_code) .
'</Ctry>' . $CrLf;
2409 $addressline1 = strtr((
string) $address, array(chr(13) =>
", ", chr(10) =>
""));
2410 if (trim($addressline1)) {
2413 $XML_ADR .= $indent .
'</PstlAdr>' . $CrLf;
2435 public function EnregDestinataire($rowid, $client_nom, $rib_banque, $rib_guichet, $rib_number, $amount, $ref, $facid, $rib_dom =
'', $type =
'direct-debit')
2438 fwrite($this->file,
"06");
2439 fwrite($this->file,
"08");
2441 fwrite($this->file,
" ");
2443 fwrite($this->file, $this->emetteur_ics);
2447 fwrite($this->file,
" ");
2448 fwrite($this->file,
dol_print_date($this->date_echeance,
"%d%m",
'gmt'));
2449 fwrite($this->file, substr(
dol_print_date($this->date_echeance,
"%y",
'gmt'), 1));
2453 fwrite($this->file, substr(strtoupper($client_nom) .
" ", 0, 24));
2456 $address = strtr($rib_dom, array(
" " =>
"-", chr(13) =>
" ", chr(10) =>
""));
2457 fwrite($this->file, substr($address .
" ", 0, 24));
2461 fwrite($this->file, substr(
" ", 0, 8));
2465 fwrite($this->file, $rib_guichet);
2469 fwrite($this->file, substr(
"000000000000000" . $rib_number, -11));
2473 $montant = (round($amount, 2) * 100);
2475 fwrite($this->file, substr(
"000000000000000" . $montant, -16));
2479 fwrite($this->file, substr(
"*_" . $ref .
"_RDVnet" . $rowid .
" ", 0, 31));
2483 fwrite($this->file, $rib_banque);
2487 fwrite($this->file, substr(
" ", 0, 5));
2489 fwrite($this->file,
"\n");
2519 public function EnregDestinataireSEPA($row_code_client, $row_nom, $row_address, $row_zip, $row_town, $row_country_code, $row_cb, $row_cg, $row_cc, $row_somme, $row_ref, $row_idfac, $row_iban, $row_bic, $row_datec, $row_drum, $row_rum, $type =
'direct-debit', $row_comment =
'')
2525 $row_somme = number_format((
float)
price2num($row_somme,
'MT'), 2,
".",
"");
2527 $row_somme = round((
float) $row_somme, 2);
2530 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
2533 $Rowing = sprintf(
"%010d", $row_idfac);
2537 $Rum = (empty($row_rum) ? $this->
buildRumNumber($row_code_client, $row_datec, $row_drum) : $row_rum);
2543 if (!is_object($hookmanager)) {
2544 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
2547 $hookmanager->initHooks(array(
'bonprelevementdao'));
2548 $parameters = array(
2549 'row_code_client' => &$row_code_client,
'row_nom' => &$row_nom,
'row_address' => &$row_address,
'row_zip' => &$row_zip,
'row_town' => &$row_town,
2550 'row_country_code' => &$row_country_code,
'row_cb' => &$row_cb,
'row_cg' => &$row_cg,
'row_cc' => &$row_cc,
'row_somme' => &$row_somme,
2551 'row_ref' => &$row_ref,
'row_idfac' => &$row_idfac,
'row_iban' => &$row_iban,
'row_bic' => &$row_bic,
'row_datec' => &$row_datec,
2552 'row_drum' => &$row_drum,
'row_rum' => &$row_rum,
'type' => &$type,
'row_comment' => &$row_comment,
2553 'crlf' => &$CrLf,
'rowing' => &$Rowing,
'rum' => &$Rum,
'dtofsgntr' => &$DtOfSgntr,
2555 $reshook = $hookmanager->executeHooks(
'enregDestinataireSEPA', $parameters, $this);
2556 if (empty($reshook)) {
2557 if ($type !=
'bank-transfer') {
2560 $XML_DEBITOR .=
' <DrctDbtTxInf>' . $CrLf;
2561 $XML_DEBITOR .=
' <PmtId>' . $CrLf;
2563 $XML_DEBITOR .=
' <EndToEndId>' . ((
getDolGlobalString(
'PRELEVEMENT_END_TO_END') !=
"") ?
$conf->global->PRELEVEMENT_END_TO_END : (
'DD-' .
dol_trunc($row_idfac .
'-' . $row_ref, 20,
'right',
'UTF-8', 1)) .
'-' . $Rowing) .
'</EndToEndId>' . $CrLf;
2564 $XML_DEBITOR .=
' </PmtId>' . $CrLf;
2565 $XML_DEBITOR .=
' <InstdAmt Ccy="EUR">' . $row_somme .
'</InstdAmt>' . $CrLf;
2566 $XML_DEBITOR .=
' <DrctDbtTx>' . $CrLf;
2567 $XML_DEBITOR .=
' <MndtRltdInf>' . $CrLf;
2568 $XML_DEBITOR .=
' <MndtId>' . $Rum .
'</MndtId>' . $CrLf;
2569 $XML_DEBITOR .=
' <DtOfSgntr>' . $DtOfSgntr .
'</DtOfSgntr>' . $CrLf;
2570 $XML_DEBITOR .=
' <AmdmntInd>false</AmdmntInd>' . $CrLf;
2571 $XML_DEBITOR .=
' </MndtRltdInf>' . $CrLf;
2572 $XML_DEBITOR .=
' </DrctDbtTx>' . $CrLf;
2573 $XML_DEBITOR .=
' <DbtrAgt>' . $CrLf;
2574 $XML_DEBITOR .=
' <FinInstnId>' . $CrLf;
2576 $XML_DEBITOR .=
' <BIC>' . $row_bic .
'</BIC>' . $CrLf;
2578 $XML_DEBITOR .=
' </FinInstnId>' . $CrLf;
2579 $XML_DEBITOR .=
' </DbtrAgt>' . $CrLf;
2580 $XML_DEBITOR .=
' <Dbtr>' . $CrLf;
2582 $XML_DEBITOR .= $this->
buildSEPAPostalAddressXML($row_address, $row_zip, $row_town, $row_country_code,
"\t\t\t\t\t", $CrLf);
2583 $XML_DEBITOR .=
' </Dbtr>' . $CrLf;
2584 $XML_DEBITOR .=
' <DbtrAcct>' . $CrLf;
2585 $XML_DEBITOR .=
' <Id>' . $CrLf;
2586 $XML_DEBITOR .=
' <IBAN>' . preg_replace(
'/\s/',
'', $row_iban) .
'</IBAN>' . $CrLf;
2587 $XML_DEBITOR .=
' </Id>' . $CrLf;
2588 $XML_DEBITOR .=
' </DbtrAcct>' . $CrLf;
2589 $XML_DEBITOR .=
' <RmtInf>' . $CrLf;
2593 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions_be.lib.php';
2595 $invoicestatic =
new Facture($this->db);
2596 $invoicestatic->fetch($row_idfac);
2599 $XML_DEBITOR .=
' <strd>' . $invoicePaymentKey .
'</strd>' . $CrLf;
2604 $XML_DEBITOR .=
' </RmtInf>' . $CrLf;
2605 $XML_DEBITOR .=
' </DrctDbtTxInf>' . $CrLf;
2607 $XML_RESULT = $XML_DEBITOR;
2611 $XML_CREDITOR .=
' <CdtTrfTxInf>' . $CrLf;
2612 $XML_CREDITOR .=
' <PmtId>' . $CrLf;
2614 $XML_CREDITOR .=
' <EndToEndId>' . ((
getDolGlobalString(
'PRELEVEMENT_END_TO_END') !=
"") ?
getDolGlobalString(
"PRELEVEMENT_END_TO_END") : (
'CT-' .
dol_trunc($row_idfac .
'-' . $row_ref, 20,
'right',
'UTF-8', 1)) .
'-' . $Rowing) .
'</EndToEndId>' . $CrLf;
2615 $XML_CREDITOR .=
' </PmtId>' . $CrLf;
2616 if (!empty($this->sepa_xml_pti_in_ctti)) {
2617 $XML_CREDITOR .=
' <PmtTpInf>' . $CrLf;
2621 $instrprty =
'HIGH';
2623 $instrprty =
'NORM';
2627 $categoryPurpose =
getDolGlobalString(
'PAYMENTBYBANKTRANSFER_CUSTOM_CATEGORY_PURPOSE',
'CORE');
2629 $XML_CREDITOR .=
' <InstrPrty>' . $instrprty .
'</InstrPrty>' . $CrLf;
2630 $XML_CREDITOR .=
' <SvcLvl>' . $CrLf;
2631 $XML_CREDITOR .=
' <Cd>SEPA</Cd>' . $CrLf;
2632 $XML_CREDITOR .=
' </SvcLvl>' . $CrLf;
2633 $XML_CREDITOR .=
' <CtgyPurp>' . $CrLf;
2634 $XML_CREDITOR .=
' <Cd>' . $categoryPurpose .
'</Cd>' . $CrLf;
2635 $XML_CREDITOR .=
' </CtgyPurp>' . $CrLf;
2636 $XML_CREDITOR .=
' </PmtTpInf>' . $CrLf;
2638 $XML_CREDITOR .=
' <Amt>' . $CrLf;
2639 $XML_CREDITOR .=
' <InstdAmt Ccy="EUR">' . round((
float) $row_somme, 2) .
'</InstdAmt>' . $CrLf;
2640 $XML_CREDITOR .=
' </Amt>' . $CrLf;
2651 $XML_CREDITOR .=
' <CdtrAgt>' . $CrLf;
2652 $XML_CREDITOR .=
' <FinInstnId>' . $CrLf;
2653 $XML_CREDITOR .=
' <BIC>' . $row_bic .
'</BIC>' . $CrLf;
2654 $XML_CREDITOR .=
' </FinInstnId>' . $CrLf;
2655 $XML_CREDITOR .=
' </CdtrAgt>' . $CrLf;
2656 $XML_CREDITOR .=
' <Cdtr>' . $CrLf;
2658 $XML_CREDITOR .= $this->
buildSEPAPostalAddressXML($row_address, $row_zip, $row_town, $row_country_code,
"\t\t\t\t\t", $CrLf);
2659 $XML_CREDITOR .=
' </Cdtr>' . $CrLf;
2660 $XML_CREDITOR .=
' <CdtrAcct>' . $CrLf;
2661 $XML_CREDITOR .=
' <Id>' . $CrLf;
2662 $XML_CREDITOR .=
' <IBAN>' . preg_replace(
'/\s/',
'', $row_iban) .
'</IBAN>' . $CrLf;
2663 $XML_CREDITOR .=
' </Id>' . $CrLf;
2664 $XML_CREDITOR .=
' </CdtrAcct>' . $CrLf;
2665 $XML_CREDITOR .=
' <RmtInf>' . $CrLf;
2668 $XML_CREDITOR .=
' </RmtInf>' . $CrLf;
2669 $XML_CREDITOR .=
' </CdtTrfTxInf>' . $CrLf;
2671 $XML_RESULT = $XML_CREDITOR;
2673 } elseif ($reshook > 0) {
2674 $XML_RESULT = $hookmanager->resPrint;
2676 $XML_RESULT .= $hookmanager->resPrint;
2694 fwrite($this->file,
"03");
2695 fwrite($this->file,
"08");
2697 fwrite($this->file,
" ");
2699 fwrite($this->file, $this->emetteur_ics);
2703 fwrite($this->file,
" ");
2704 fwrite($this->file,
dol_print_date($this->date_echeance,
"%d%m",
'gmt'));
2705 fwrite($this->file, substr(
dol_print_date($this->date_echeance,
"%y",
'gmt'), 1));
2709 fwrite($this->file, substr($this->raison_sociale .
" ", 0, 24));
2713 fwrite($this->file, substr($this->reference_remise .
" ", 0, 7));
2717 fwrite($this->file, substr(
" ", 0, 17));
2721 fwrite($this->file, substr(
" ", 0, 2));
2722 fwrite($this->file,
"E");
2723 fwrite($this->file, substr(
" ", 0, 5));
2727 fwrite($this->file, $this->emetteur_code_guichet);
2731 fwrite($this->file, substr(
"000000000000000" . $this->emetteur_numero_compte, -11));
2735 fwrite($this->file, substr(
" ", 0, 16));
2739 fwrite($this->file, substr(
" ", 0, 31));
2743 fwrite($this->file, $this->emetteur_code_banque);
2747 fwrite($this->file, substr(
" ", 0, 5));
2749 fwrite($this->file,
"\n");
2768 public function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf =
'\n', $format =
'FRST', $type =
'direct-debit', $fk_bank_account = 0)
2778 if (empty($fk_bank_account)) {
2779 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
2783 $account =
new Account($this->db);
2784 if ($account->fetch($fk_bank_account) > 0) {
2785 $this->emetteur_code_banque = $account->code_banque;
2786 $this->emetteur_code_guichet = $account->code_guichet;
2787 $this->emetteur_numero_compte = $account->number;
2788 $this->emetteur_number_key = $account->cle_rib;
2789 $this->sepa_xml_pti_in_ctti = (bool) $account->pti_in_ctti;
2790 $this->emetteur_iban = $account->iban;
2791 $this->emetteur_bic = $account->bic;
2793 $this->emetteur_ics = (($type ==
'bank-transfer' &&
getDolGlobalString(
"SEPA_USE_IDS")) ? $account->ics_transfer : $account->ics);
2795 $this->raison_sociale = $account->owner_name;
2799 $sql =
"SELECT rowid, ref";
2800 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as pb";
2801 $sql .=
" WHERE pb.rowid = " . ((int) $this->
id);
2803 $resql = $this->db->query($sql);
2805 $obj = $this->db->fetch_object($resql);
2808 $IdBon = sprintf(
"%05d", $obj->rowid);
2809 $RefBon = $obj->ref;
2810 $localInstrument =
getDolGlobalString(
'PAYMENTBYBANKTRANSFER_CUSTOM_LOCAL_INSTRUMENT',
'CORE');
2813 $total = number_format((
float)
price2num($total,
'MT'), 2,
".",
"");
2816 if ($type !=
'bank-transfer') {
2818 $XML_SEPA_INFO =
'';
2819 $XML_SEPA_INFO .=
' <PmtInf>' . $CrLf;
2820 $XML_SEPA_INFO .=
' <PmtInfId>' . (
'DOL/' . $dateTime_YMD .
'/DD' . $IdBon .
'-' . $RefBon) .
'</PmtInfId>' . $CrLf;
2821 $XML_SEPA_INFO .=
' <PmtMtd>DD</PmtMtd>' . $CrLf;
2822 $XML_SEPA_INFO .=
' <NbOfTxs>' . $nombre .
'</NbOfTxs>' . $CrLf;
2823 $XML_SEPA_INFO .=
' <CtrlSum>' . $total .
'</CtrlSum>' . $CrLf;
2824 $XML_SEPA_INFO .=
' <PmtTpInf>' . $CrLf;
2825 $XML_SEPA_INFO .=
' <SvcLvl>' . $CrLf;
2826 $XML_SEPA_INFO .=
' <Cd>SEPA</Cd>' . $CrLf;
2827 $XML_SEPA_INFO .=
' </SvcLvl>' . $CrLf;
2828 $XML_SEPA_INFO .=
' <LclInstrm>' . $CrLf;
2829 $XML_SEPA_INFO .=
' <Cd>' . $localInstrument .
'</Cd>' . $CrLf;
2830 $XML_SEPA_INFO .=
' </LclInstrm>' . $CrLf;
2831 $XML_SEPA_INFO .=
' <SeqTp>' . $format .
'</SeqTp>' . $CrLf;
2832 $XML_SEPA_INFO .=
' </PmtTpInf>' . $CrLf;
2833 $XML_SEPA_INFO .=
' <ReqdColltnDt>' . $dateTime_ETAD .
'</ReqdColltnDt>' . $CrLf;
2834 $XML_SEPA_INFO .=
' <Cdtr>' . $CrLf;
2839 $sender_country_code = (string) ($country[1] ??
'');
2840 $XML_SEPA_INFO .= $this->
buildSEPAPostalAddressXML($sender_address, $sender_zip, $sender_town, $sender_country_code,
"\t\t\t\t", $CrLf);
2841 $XML_SEPA_INFO .=
' </Cdtr>' . $CrLf;
2842 $XML_SEPA_INFO .=
' <CdtrAcct>' . $CrLf;
2843 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2844 $XML_SEPA_INFO .=
' <IBAN>' . preg_replace(
'/\s/',
'', $this->emetteur_iban) .
'</IBAN>' . $CrLf;
2845 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2846 $XML_SEPA_INFO .=
' </CdtrAcct>' . $CrLf;
2847 $XML_SEPA_INFO .=
' <CdtrAgt>' . $CrLf;
2848 $XML_SEPA_INFO .=
' <FinInstnId>' . $CrLf;
2849 $XML_SEPA_INFO .=
' <BIC>' . $this->emetteur_bic .
'</BIC>' . $CrLf;
2850 $XML_SEPA_INFO .=
' </FinInstnId>' . $CrLf;
2851 $XML_SEPA_INFO .=
' </CdtrAgt>' . $CrLf;
2860 $XML_SEPA_INFO .=
' <ChrgBr>SLEV</ChrgBr>' . $CrLf;
2861 $XML_SEPA_INFO .=
' <CdtrSchmeId>' . $CrLf;
2862 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2863 $XML_SEPA_INFO .=
' <PrvtId>' . $CrLf;
2864 $XML_SEPA_INFO .=
' <Othr>' . $CrLf;
2865 $XML_SEPA_INFO .=
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf;
2866 $XML_SEPA_INFO .=
' <SchmeNm>' . $CrLf;
2867 $XML_SEPA_INFO .=
' <Prtry>SEPA</Prtry>' . $CrLf;
2868 $XML_SEPA_INFO .=
' </SchmeNm>' . $CrLf;
2869 $XML_SEPA_INFO .=
' </Othr>' . $CrLf;
2870 $XML_SEPA_INFO .=
' </PrvtId>' . $CrLf;
2871 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2872 $XML_SEPA_INFO .=
' </CdtrSchmeId>' . $CrLf;
2875 $XML_SEPA_INFO =
'';
2876 $XML_SEPA_INFO .=
' <PmtInf>' . $CrLf;
2877 $XML_SEPA_INFO .=
' <PmtInfId>' . (
'DOL/' . $dateTime_YMD .
'/CT' . $IdBon .
'-' . $RefBon) .
'</PmtInfId>' . $CrLf;
2878 $XML_SEPA_INFO .=
' <PmtMtd>TRF</PmtMtd>' . $CrLf;
2880 $XML_SEPA_INFO .=
' <NbOfTxs>' . $nombre .
'</NbOfTxs>' . $CrLf;
2881 $XML_SEPA_INFO .=
' <CtrlSum>' . $total .
'</CtrlSum>' . $CrLf;
2882 if (!empty($this->sepa_xml_pti_in_ctti) && !empty($format)) {
2883 $XML_SEPA_INFO .=
' <PmtTpInf>' . $CrLf;
2884 $XML_SEPA_INFO .=
' <SvcLvl>' . $CrLf;
2885 $XML_SEPA_INFO .=
' <Cd>SEPA</Cd>' . $CrLf;
2886 $XML_SEPA_INFO .=
' </SvcLvl>' . $CrLf;
2887 $XML_SEPA_INFO .=
' <LclInstrm>' . $CrLf;
2888 $XML_SEPA_INFO .=
' <Cd>' . $localInstrument .
'</Cd>' . $CrLf;
2889 $XML_SEPA_INFO .=
' </LclInstrm>' . $CrLf;
2890 $XML_SEPA_INFO .=
' <SeqTp>' . $format .
'</SeqTp>' . $CrLf;
2891 $XML_SEPA_INFO .=
' </PmtTpInf>' . $CrLf;
2893 $XML_SEPA_INFO .=
' <ReqdExctnDt>' .
dol_print_date($dateTime_ETAD,
'dayrfc') .
'</ReqdExctnDt>' . $CrLf;
2894 $XML_SEPA_INFO .=
' <Dbtr>' . $CrLf;
2899 $sender_country_code = (string) ($country[1] ??
'');
2900 $XML_SEPA_INFO .= $this->
buildSEPAPostalAddressXML($sender_address, $sender_zip, $sender_town, $sender_country_code,
"\t\t\t\t", $CrLf);
2901 $XML_SEPA_INFO .=
' </Dbtr>' . $CrLf;
2902 $XML_SEPA_INFO .=
' <DbtrAcct>' . $CrLf;
2903 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2904 $XML_SEPA_INFO .=
' <IBAN>' . preg_replace(
'/\s/',
'', $this->emetteur_iban) .
'</IBAN>' . $CrLf;
2905 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2906 $XML_SEPA_INFO .=
' </DbtrAcct>' . $CrLf;
2907 $XML_SEPA_INFO .=
' <DbtrAgt>' . $CrLf;
2908 $XML_SEPA_INFO .=
' <FinInstnId>' . $CrLf;
2909 $XML_SEPA_INFO .=
' <BIC>' . $this->emetteur_bic .
'</BIC>' . $CrLf;
2910 $XML_SEPA_INFO .=
' </FinInstnId>' . $CrLf;
2911 $XML_SEPA_INFO .=
' </DbtrAgt>' . $CrLf;
2920 $XML_SEPA_INFO .=
' <ChrgBr>SLEV</ChrgBr>' . $CrLf;
2935 fwrite($this->file,
'INCORRECT EMETTEUR ' . $this->raison_sociale . $CrLf);
2936 $XML_SEPA_INFO =
'';
2938 return $XML_SEPA_INFO;
2951 fwrite($this->file,
"08");
2952 fwrite($this->file,
"08");
2954 fwrite($this->file,
" ");
2956 fwrite($this->file, $this->emetteur_ics);
2960 fwrite($this->file, substr(
" ", 0, 12));
2965 fwrite($this->file, substr(
" ", 0, 24));
2969 fwrite($this->file, substr(
" ", 0, 24));
2973 fwrite($this->file, substr(
" ", 0, 8));
2977 fwrite($this->file, substr(
" ", 0, 5));
2981 fwrite($this->file, substr(
" ", 0, 11));
2985 $montant = ($total * 100);
2987 fwrite($this->file, substr(
"000000000000000" . $montant, -16));
2991 fwrite($this->file, substr(
" ", 0, 31));
2995 fwrite($this->file, substr(
" ", 0, 5));
2999 fwrite($this->file, substr(
" ", 0, 5));
3001 fwrite($this->file,
"\n");
3026 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
3029 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'StatusWaiting');
3030 $this->labelStatus[self::STATUS_TRANSFERED] = $langs->transnoentitiesnoconv(
'StatusTrans');
3031 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'StatusWaiting');
3032 $this->labelStatusShort[self::STATUS_TRANSFERED] = $langs->transnoentitiesnoconv(
'StatusTrans');
3033 if ($this->
type ==
'bank-transfer') {
3034 $this->labelStatus[self::STATUS_DEBITED] = $langs->transnoentitiesnoconv(
'StatusDebited');
3035 $this->labelStatusShort[self::STATUS_DEBITED] = $langs->transnoentitiesnoconv(
'StatusDebited');
3037 $this->labelStatus[self::STATUS_CREDITED] = $langs->transnoentitiesnoconv(
'StatusCredited');
3038 $this->labelStatusShort[self::STATUS_CREDITED] = $langs->transnoentitiesnoconv(
'StatusCredited');
3040 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
3041 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
3044 $statusType =
'status1';
3045 if ($status == self::STATUS_TRANSFERED) {
3046 $statusType =
'status3';
3048 if ($status == self::STATUS_CREDITED || $status == self::STATUS_DEBITED) {
3049 $statusType =
'status6';
3051 if ($status == self::STATUS_CANCELED) {
3052 $statusType =
'status9';
3055 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
3069 global
$conf, $langs;
3075 if ($mode ==
'direct-debit') {
3076 $sql =
"SELECT p.rowid, p.datec, p.date_trans as date_trans, p.date_credit as date_credit";
3077 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as p";
3078 $sql .=
" WHERE p.entity IN (" .
getEntity(
'prelevement_bons') .
")";
3079 $sql .=
" AND (p.type = 'debit-order' OR p.type = 'direct-debit')";
3080 $sql .=
" AND p.statut < ".((int) BonPrelevement::STATUS_DEBITED);
3082 $sql =
"SELECT p.rowid, p.datec, p.date_trans as date_trans, p.date_credit as date_credit";
3083 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as p";
3084 $sql .=
" WHERE p.entity IN (" .
getEntity(
'prelevement_bons') .
")";
3085 $sql .=
" AND (p.type = 'bank-transfer' OR p.type = 'credit-transfer')";
3086 $sql .=
" AND p.statut < ".((int) BonPrelevement::STATUS_CREDITED);
3089 $resql = $this->db->query($sql);
3091 $langs->load(
"banks");
3095 if ($mode ==
'direct-debit') {
3096 $warning_delay = (int)
$conf->warning_delays[
'bank_direct_debit'];
3097 $response->warning_delay = $warning_delay / 60 / 60 / 24;
3098 $response->label = $langs->trans(
"PendingDirectDebitToComplete");
3099 $response->labelShort = $langs->trans(
"PendingDirectDebitToCompleteShort");
3100 $response->url = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&search_status=0,1';
3101 $response->url_late = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&search_status=0,1';
3103 $warning_delay = (int)
$conf->warning_delays[
'bank_credit_transfer'];
3104 $response->warning_delay = $warning_delay / 60 / 60 / 24;
3105 $response->label = $langs->trans(
"PendingCreditTransferToComplete");
3106 $response->labelShort = $langs->trans(
"PendingCreditTransferToCompleteShort");
3107 $response->url = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&type=bank-transfer&search_status=0,1';
3108 $response->url_late = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&type=bank-transfer&search_status=0,1';
3110 $response->img = img_object(
'',
"payment");
3112 $response->nbtodo = 0;
3113 $response->nbtodolate = 0;
3115 while ($obj = $this->db->fetch_object($resql)) {
3116 $response->nbtodo++;
3119 $datetotest = $this->db->jdate(!empty($obj->date_trans) ? $obj->date_trans : $obj->datec);
3120 if ($datetotest && $datetotest < ($now - $warning_delay)) {
3121 $response->nbtodolate++;
3132 dol_print_error($this->db);
3133 $this->error = $this->db->error();
3149 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3151 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3152 $return .=
'<div class="info-box info-box-sm">';
3153 $return .=
'<span class="info-box-icon bg-infobox-action">';
3154 $return .= img_picto(
'', $this->picto);
3155 $return .=
'</span>';
3156 $return .=
'<div class="info-box-content">';
3157 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">' . $this->
getNomUrl(1) .
'</span>';
3158 if ($selected >= 0) {
3159 $return .=
'<input id="cb' . $this->
id .
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="' . $this->
id .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
3172 if (isset($this->
amount)) {
3173 $return .=
'<br><span class="opacitymedium">' . $langs->trans(
"Amount") .
'</span> : <span class="amount">' .
price($this->
amount) .
'</span>';
3175 $return .=
'<br><div class="info-box-status">' . $this->
getLibStatut(3) .
'</div>';
3176 $return .=
'</div>';
3177 $return .=
'</div>';
3178 $return .=
'</div>';
3189 if (!empty($this->
id)) {
3194 $sql =
"SELECT COUNT(*) AS nb FROM " . MAIN_DB_PREFIX .
"prelevement_lignes";
3195 $sql .=
" WHERE fk_prelevement_bons = " . ((int) $id);
3196 $sql .=
" AND fk_soc = 0";
3197 $sql .=
" AND fk_user IS NOT NULL";
3200 $resql = $this->db->query($sql);
3202 $obj = $this->db->fetch_object($resql);
3205 dol_print_error($this->db);
$propal type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...
checkIbanForAccount($account=null, $ibantocheck=null)
Check IBAN number information for a bank account.
checkSwiftForAccount($account=null, $swift=null)
Check SWIFT information for a bank account.
Class to manage bank accounts.
Class to manage withdrawal receipts.
addWithdrawDetail($invoice_id, $client_id, $client_nom, $amount, $code_banque, $code_guichet, $number, $number_key, $type='debit-order', $sourcetype='', $bic='', $iban='', $rum='', $id_prelevement_demande=0)
Add invoice to withdrawal.
load_board($user, $mode)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
SommeAPrelever($mode='direct-debit', $type='')
Returns amount waiting for direct debit payment or credit transfer payment.
static buildRumNumber($row_code_client, $row_datec, $row_drum)
Generate dynamically a RUM number for a customer bank account.
EnregEmetteur($type='direct-debit')
Write sender of request (me).
checkIfSalaryBonPrelevement()
Check if is bon prelevement for salary invoice.
EnregTotal($total)
Write end.
NbFactureAPrelever($type='direct-debit', $forsalary=0)
Get number of invoices to pay.
fetch($rowid, $ref='')
Get object and lines from database.
addline(&$line_id, $client_id, $client_nom, $amount, $code_banque, $code_guichet, $number, $number_key, $sourcetype='', $bic='', $iban='', $rum='', $id_prelevement_demande=0)
Add line to withdrawal.
getListInvoices($amounts=0, $type='')
Get invoice or salary list (with amount or not)
deleteNotificationById($rowid)
Delete a notification def by id.
__construct($db)
Constructor.
EnregDestinataire($rowid, $client_nom, $rib_banque, $rib_guichet, $rib_number, $amount, $ref, $facid, $rib_dom='', $type='direct-debit')
Write recipient of request (customer)
getKanbanView($option='', $arraydata=null)
Return clickable link of object (with eventually picto)
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Returns clickable name (with picto)
LibStatut($status, $mode=0)
Return status label for a status.
update(User $user, $notrigger=0)
Update object into database.
set_infotrans($user, $date, $method)
Set withdrawal to transmitted status.
buildSEPAPostalAddressXML($address, $zip, $town, $country_code, $indent, $CrLf)
Build the SEPA postal address block (<PstlAdr>) in the hybrid format required by ISO 20022 usage guid...
generate(string $format='FRST', int $executiondate=0, string $type='direct-debit', int $fk_bank_account=0, int $forsalary=0, int $thirdpartyBANId=0)
Generate a direct debit or credit transfer file.
getErrorString($error)
Return error string.
EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf='\n', $format='FRST', $type='direct-debit', $fk_bank_account=0)
Write sender of request (me).
set_infocredit($user, $date, $type='')
Set direct debit or credit transfer order to "paid" status.
getLibStatut($mode=0)
Return status label of object.
EnregDestinataireSEPA($row_code_client, $row_nom, $row_address, $row_zip, $row_town, $row_country_code, $row_cb, $row_cg, $row_cc, $row_somme, $row_ref, $row_idfac, $row_iban, $row_bic, $row_datec, $row_drum, $row_rum, $type='direct-debit', $row_comment='')
Write recipient (thirdparty concerned by request)
addNotification($db, $user, $action)
Add a notification.
nbOfInvoiceToPay($mode='direct-debit', $type='')
Get number of invoices waiting for payment.
deleteNotification($user, $action)
Delete a notification.
updateCommon(User $user, $notrigger=0)
Update object into database.
Class to manage bank accounts description of third parties.
Class to manage suppliers invoices.
Class to manage invoices.
const STATUS_VALIDATED
Validated (need to be paid)
Class to manage payments for supplier invoices.
Class to manage payments of customer invoices.
Class to manage payments of salaries.
Class to manage salary payments.
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_now($mode='gmt')
Return date for now.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_string_nospecial($str, $newstr='_', $badcharstoreplace='', $badcharstoremove='', $keepspaces=0)
Clean a string from all punctuation characters to use it as a ref or login.
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.
dolChmod($filepath, $newmask='')
Change mod of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_string_unaccent($str)
Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
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.
isModEnabled($module)
Is Dolibarr module enabled.
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.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
dolBECalculateStructuredCommunication($invoice_number, $invoice_type)
Calculate Structured Communication / BE Bank payment reference number.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
print $langs trans('Date')." left Ref Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right Paid right PaymentTypeShortLIQ right SELECT p pos_change as p datep as p p num_paiement as f pf amount as amount
dolDecrypt($chain, $key='', $patterntotest='')
Decode a string with a symmetric encryption.