32require_once DOL_DOCUMENT_ROOT .
'/core/class/commonobject.class.php';
33require_once DOL_DOCUMENT_ROOT .
'/core/lib/bank.lib.php';
34require_once DOL_DOCUMENT_ROOT .
'/compta/bank/class/account.class.php';
35require_once DOL_DOCUMENT_ROOT .
'/compta/facture/class/facture.class.php';
36require_once DOL_DOCUMENT_ROOT .
'/compta/paiement/class/paiement.class.php';
37require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.facture.class.php';
38require_once DOL_DOCUMENT_ROOT .
'/fourn/class/paiementfourn.class.php';
39require_once DOL_DOCUMENT_ROOT .
'/salaries/class/salary.class.php';
40require_once DOL_DOCUMENT_ROOT .
'/salaries/class/paymentsalary.class.php';
41require_once DOL_DOCUMENT_ROOT .
'/societe/class/societe.class.php';
42require_once DOL_DOCUMENT_ROOT .
'/user/class/userbankaccount.class.php';
53 public $element =
'widthdraw';
58 public $table_element =
'prelevement_bons';
63 public $picto =
'payment';
68 public $date_echeance;
72 public $raison_sociale;
76 public $reference_remise;
80 public $emetteur_code_guichet;
84 public $emetteur_numero_compte;
88 public $emetteur_code_banque;
92 public $emetteur_number_key;
96 public $sepa_xml_pti_in_ctti;
101 public $emetteur_iban;
105 public $emetteur_bic;
109 public $emetteur_ics;
130 public $labelStatus = array();
135 public $factures = array();
140 public $methodes_trans = array();
145 public $invoice_in_error = array();
150 public $thirdparty_in_error = array();
162 const STATUS_DRAFT = 0;
163 const STATUS_TRANSFERED = 1;
164 const STATUS_CREDITED = 2;
165 const STATUS_DEBITED = 2;
166 const STATUS_CANCELED = 9;
212 public $fields = array(
213 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'position' => 10,
'notnull' => 1,
'visible' => 0,),
214 'ref' => array(
'type' =>
'varchar(12)',
'label' =>
'Ref',
'enabled' => 1,
'position' => 15,
'notnull' => 0,
'visible' => -1,
'csslist' =>
'tdoverflowmax150',
'showoncombobox' => 1,),
215 'datec' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'position' => 25,
'notnull' => 0,
'visible' => -1,),
216 'amount' => array(
'type' =>
'double(24,8)',
'label' =>
'Amount',
'enabled' => 1,
'position' => 30,
'notnull' => 0,
'visible' => -1,),
217 'statut' => array(
'type' =>
'smallint(6)',
'label' =>
'Statut',
'enabled' => 1,
'position' => 500,
'notnull' => 0,
'visible' => -1,
'arrayofkeyval' => array(0 =>
'Wait', 1 =>
'Transfered', 2 =>
'Credited')),
218 'credite' => array(
'type' =>
'smallint(6)',
'label' =>
'Credite',
'enabled' => 1,
'position' => 40,
'notnull' => 0,
'visible' => -1,),
219 'note' => array(
'type' =>
'text',
'label' =>
'Note',
'enabled' => 1,
'position' => 45,
'notnull' => 0,
'visible' => -1,),
220 'date_trans' => array(
'type' =>
'datetime',
'label' =>
'TransData',
'enabled' => 1,
'position' => 50,
'notnull' => 0,
'visible' => -1,),
221 'method_trans' => array(
'type' =>
'smallint(6)',
'label' =>
'Methodtrans',
'enabled' => 1,
'position' => 55,
'notnull' => 0,
'visible' => -1,),
222 'fk_user_trans' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'Fkusertrans',
'enabled' => 1,
'position' => 60,
'notnull' => 0,
'visible' => -1,
'css' =>
'maxwidth500 widthcentpercentminusxx',
'csslist' =>
'tdoverflowmax150',),
223 'date_credit' => array(
'type' =>
'datetime',
'label' =>
'CreditDate',
'enabled' => 1,
'position' => 65,
'notnull' => 0,
'visible' => -1,),
224 'fk_user_credit' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'Fkusercredit',
'enabled' => 1,
'position' => 70,
'notnull' => 0,
'visible' => -1,
'css' =>
'maxwidth500 widthcentpercentminusxx',
'csslist' =>
'tdoverflowmax150',),
225 'type' => array(
'type' =>
'varchar(16)',
'label' =>
'Type',
'enabled' => 1,
'position' => 75,
'notnull' => 0,
'visible' => -1,),
226 'fk_bank_account' => array(
'type' =>
'integer',
'label' =>
'Fkbankaccount',
'enabled' => 1,
'position' => 80,
'notnull' => 0,
'visible' => -1,
'css' =>
'maxwidth500 widthcentpercentminusxx',),
270 public $note_private;
279 public $method_trans;
283 public $fk_user_trans;
291 public $fk_user_credit;
299 public $fk_bank_account;
313 $this->filename =
'';
315 $this->date_echeance =
dol_now();
316 $this->raison_sociale =
"";
317 $this->reference_remise =
"";
319 $this->emetteur_code_guichet =
"";
320 $this->emetteur_numero_compte =
"";
321 $this->emetteur_code_banque =
"";
322 $this->emetteur_number_key =
"";
323 $this->sepa_xml_pti_in_ctti =
false;
325 $this->emetteur_iban =
"";
326 $this->emetteur_bic =
"";
327 $this->emetteur_ics =
"";
329 $this->factures = array();
331 $this->methodes_trans = array(0 =>
'Internet', 2 =>
'Email', 3 =>
'Api');
356 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)
365 $result = $this->
addline($line_id, $client_id, $client_nom, $amount, $code_banque, $code_guichet, $number, $number_key, $sourcetype, $bic, $iban, $rum, $id_prelevement_demande);
370 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"prelevement (";
371 if ($type !=
'bank-transfer') {
372 $sql .=
"fk_facture";
374 if ($sourcetype ==
'salary') {
377 $sql .=
"fk_facture_fourn";
380 $sql .=
",fk_prelevement_lignes";
381 $sql .=
") VALUES (";
382 $sql .= ((int) $invoice_id);
383 $sql .=
", " . ((int) $line_id);
386 if ($this->db->query($sql)) {
390 $this->errors[] = get_class($this) .
"::addWithdrawDetail " . $this->db->lasterror;
391 dol_syslog(get_class($this) .
"::addWithdrawDetail Error $result");
395 $this->errors[] = get_class($this) .
"::addWithdrawDetail linedid Empty";
396 dol_syslog(get_class($this) .
"::addWithdrawDetail Error $result");
400 dol_syslog(get_class($this) .
"::addWithdrawDetail Error $result");
424 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)
434 $sql =
"SELECT rowid";
435 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_lignes";
436 $sql .=
" WHERE fk_prelevement_bons = " . ((int) $this->
id);
437 if ($sourcetype ==
'salary') {
438 $sql .=
" AND fk_soc = " . ((int) $client_id);
440 $sql .=
" AND fk_user = " . ((int) $client_id);
442 $sql .=
" AND code_banque = '" . $this->db->escape($code_banque) .
"'";
443 $sql .=
" AND code_guichet = '" . $this->db->escape($code_guichet) .
"'";
444 $sql .=
" AND number = '" . $this->db->escape($number) .
"'";
446 $resql = $this->db->query($sql);
448 $num = $this->db->num_rows($resql);
456 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"prelevement_lignes (";
457 $sql .=
"fk_prelevement_bons";
459 $sql .=
", client_nom";
461 $sql .=
", fk_prelevement_demande";
462 $sql .= ($sourcetype ==
'salary' ?
", fk_user" :
"");
463 $sql .=
") VALUES (";
465 $sql .=
", " . (($sourcetype !=
'salary') ? ((
int) $client_id) :
"0");
466 $sql .=
", '" . $this->db->escape($client_nom) .
"'";
467 $sql .=
", " . ((float)
price2num($amount));
468 $sql .=
", " . ((int) $id_prelevement_demande);
469 $sql .= (($sourcetype ==
'salary') ?
", " . ((
int) $client_id) :
'');
471 if ($this->db->query($sql)) {
472 $line_id = $this->db->last_insert_id(MAIN_DB_PREFIX .
"prelevement_lignes");
475 $this->errors[] = get_class($this) .
"::addline Error -2 " . $this->db->lasterror;
476 dol_syslog(get_class($this) .
"::addline Error -2");
496 $errors[1027] = $langs->trans(
"DateInvalid");
498 return $errors[abs($error)] ??
'unknown error code';
508 public function fetch($rowid, $ref =
'')
510 $sql =
"SELECT p.rowid, p.ref, p.amount, p.note";
511 $sql .=
", p.datec as dc";
512 $sql .=
", p.date_trans as date_trans";
513 $sql .=
", p.method_trans, p.fk_user_trans";
514 $sql .=
", p.date_credit as date_credit";
515 $sql .=
", p.fk_user_credit";
517 $sql .=
", p.fk_bank_account";
518 $sql .=
", p.statut as status";
519 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as p";
520 $sql .=
" WHERE p.entity IN (" .
getEntity(
'invoice') .
")";
522 $sql .=
" AND p.rowid = " . ((int) $rowid);
524 $sql .=
" AND p.ref = '" . $this->db->escape($ref) .
"'";
527 dol_syslog(get_class($this) .
"::fetch", LOG_DEBUG);
528 $result = $this->db->query($sql);
530 if ($this->db->num_rows($result)) {
531 $obj = $this->db->fetch_object($result);
533 $this->
id = $obj->rowid;
534 $this->
ref = $obj->ref;
535 $this->
amount = $obj->amount;
536 $this->note = $obj->note;
537 $this->note_private = $obj->note;
538 $this->datec = $this->db->jdate($obj->dc);
540 $this->date_trans = $this->db->jdate($obj->date_trans);
541 $this->method_trans = $obj->method_trans;
542 $this->user_trans = $obj->fk_user_trans;
544 $this->date_credit = $this->db->jdate($obj->date_credit);
545 $this->user_credit = $obj->fk_user_credit;
547 $this->
type = $obj->type;
548 $this->fk_bank_account = $obj->fk_bank_account;
550 $this->
status = $obj->status;
551 if (empty($this->
status)) {
554 $this->statut = $this->status;
560 dol_syslog(get_class($this) .
"::Fetch no record found");
593 global
$conf, $langs;
597 if ($this->fetched == 1) {
598 if ($date < $this->date_trans) {
599 $langs->load(
"errors");
600 $this->error = $langs->trans(
'ErrorDateOfMovementLowerThanDateOfFileTransmission');
601 dol_syslog(
"bon-prelevment::set_infocredit 1027 " . $this->error);
607 $sql =
" UPDATE " . MAIN_DB_PREFIX .
"prelevement_bons";
608 $sql .=
" SET fk_user_credit = " . ((int) $user->id);
609 $sql .=
", statut = " . self::STATUS_CREDITED;
610 $sql .=
", date_credit = '" . $this->db->idate($date) .
"'";
611 $sql .=
" WHERE rowid = " . ((int) $this->
id);
612 $sql .=
" AND entity = " . ((int)
$conf->entity);
613 $sql .=
" AND statut = " . self::STATUS_TRANSFERED;
615 $resql = $this->db->query($sql);
617 $langs->load(
'withdrawals');
618 $subject = $langs->trans(
"InfoCreditSubject", $this->
ref);
619 $message = $langs->trans(
"InfoCreditMessage", $this->
ref,
dol_print_date($date,
'dayhour'));
622 $fk_bank_account = $this->fk_bank_account;
623 if (empty($fk_bank_account)) {
628 $amountsperthirdparty = array();
638 for ($i = 0; $i < $num; $i++) {
639 if ($this->
type ==
'bank-transfer') {
640 if ($type ==
'salary') {
641 $fac =
new Salary($this->db);
649 $result = $fac->fetch($facs[$i][0]);
651 $amounts[$fac->id] = $facs[$i][1];
652 if ($this->
type ==
'bank-transfer') {
653 if ($type ==
'salary') {
654 $amountsperthirdparty[$fac->fk_user][$fac->id] = $facs[$i][1];
656 $amountsperthirdparty[$fac->socid][$fac->id] = $facs[$i][1];
659 $amountsperthirdparty[$fac->socid][$fac->id] = $facs[$i][1];
662 $totalpaid = $fac->getSommePaiement();
663 $totalcreditnotes = 0;
664 if (method_exists($fac,
'getSumCreditNotesUsed')) {
665 $totalcreditnotes = $fac->getSumCreditNotesUsed();
668 if (method_exists($fac,
'getSumDepositsUsed')) {
669 $totaldeposits = $fac->getSumDepositsUsed();
671 $alreadypayed = $totalpaid + $totalcreditnotes + $totaldeposits;
675 $amountofdocument = $fac->total_ttc;
676 if ($type ==
'salary') {
677 $amountofdocument = $fac->amount;
679 if (
price2num($alreadypayed + $facs[$i][1],
'MT') ==
price2num($amountofdocument,
'MT')) {
680 $result = $fac->setPaid($user);
682 $this->error = $fac->error;
683 $this->errors = $fac->errors;
689 foreach ($amountsperthirdparty as $thirdpartyid => $cursoramounts) {
690 if ($this->
type ==
'bank-transfer') {
691 if ($type ==
'salary') {
697 $paiement =
new Paiement($this->db);
699 $paiement->datepaye = $date;
700 $paiement->amounts = $cursoramounts;
702 if ($this->
type ==
'bank-transfer') {
703 if ($type ==
'salary') {
704 $paiement->datep = $date;
706 $paiement->paiementid = 2;
707 $paiement->fk_typepayment = 2;
708 $paiement->paiementcode =
'VIR';
710 $paiement->paiementid = 2;
711 $paiement->paiementcode =
'VIR';
714 $paiement->paiementid = 3;
715 $paiement->paiementcode =
'PRE';
718 $paiement->num_payment = $this->ref;
719 $paiement->id_prelevement = $this->id;
721 $result = $paiement->create($user, 1);
725 $this->error = $paiement->error;
726 $this->errors = $paiement->errors;
727 dol_syslog(get_class($this) .
"::set_infocredit AddPayment Error " . $this->error);
729 if ($this->
type ==
'bank-transfer') {
730 if ($type ==
'salary') {
731 $modeforaddpayment =
'payment_salary';
732 $labelforaddpayment =
'(SalaryPayment)';
733 $addbankurl =
'credit-transfer';
735 $modeforaddpayment =
'payment_supplier';
736 $labelforaddpayment =
'(SupplierInvoicePayment)';
737 $addbankurl =
'credit-transfer';
740 $modeforaddpayment =
'payment';
741 $labelforaddpayment =
'(CustomerInvoicePayment)';
742 $addbankurl =
'direct-debit';
748 $result = $paiement->addPaymentToBank($user, $modeforaddpayment, $labelforaddpayment, $fk_bank_account,
'',
'');
750 $result = $paiement->addPaymentToBank($user, $modeforaddpayment, $labelforaddpayment, $fk_bank_account,
'',
'', 0,
'', $addbankurl);
755 $this->error = $paiement->error;
756 $this->errors = $paiement->errors;
757 dol_syslog(get_class($this) .
"::set_infocredit AddPaymentToBank Error " . $this->error);
765 $sql =
" UPDATE " . MAIN_DB_PREFIX .
"prelevement_lignes";
766 $sql .=
" SET statut = 2";
767 $sql .=
" WHERE fk_prelevement_bons = " . ((int) $this->
id);
769 if (!$this->db->query($sql)) {
770 dol_syslog(get_class($this) .
"::set_infocredit Update lines Error");
775 $this->error = $this->db->lasterror();
776 dol_syslog(get_class($this) .
"::set_infocredit Update Bons Error");
782 $this->date_credit = $date;
783 $this->statut = self::STATUS_CREDITED;
784 $this->
status = self::STATUS_CREDITED;
789 $this->db->rollback();
809 global
$conf, $langs;
813 dol_syslog(get_class($this) .
"::set_infotrans Start", LOG_INFO);
815 if ($this->db->begin()) {
816 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_bons ";
817 $sql .=
" SET fk_user_trans = " . ((int) $user->id);
818 $sql .=
" , date_trans = '" . $this->db->idate($date) .
"'";
819 $sql .=
" , method_trans = " . ((int) $method);
820 $sql .=
" , statut = " . self::STATUS_TRANSFERED;
821 $sql .=
" WHERE rowid = " . ((int) $this->
id);
822 $sql .=
" AND entity = " . ((int)
$conf->entity);
823 $sql .=
" AND statut = " . self::STATUS_DRAFT;
825 if ($this->db->query($sql)) {
826 $this->method_trans = $method;
827 $langs->load(
'withdrawals');
828 $subject = $langs->trans(
"InfoTransSubject", $this->
ref);
829 $message = $langs->trans(
"InfoTransMessage", $this->
ref,
dolGetFirstLastname($user->firstname, $user->lastname));
830 $message .= $langs->trans(
"InfoTransData",
price($this->
amount), $this->methodes_trans[$this->method_trans],
dol_print_date($date,
'day'));
838 $this->date_trans = $date;
839 $this->statut = self::STATUS_TRANSFERED;
840 $this->
status = self::STATUS_TRANSFERED;
841 $this->user_trans = $user->id;
847 $this->db->rollback();
848 dol_syslog(get_class($this) .
"::set_infotrans ROLLBACK", LOG_ERR);
853 dol_syslog(get_class($this) .
"::set_infotrans Ouverture transaction SQL impossible", LOG_CRIT);
872 dol_syslog(get_class($this) .
"::getListInvoices");
876 if ($this->
type ==
'bank-transfer') {
877 if ($type ==
'salary') {
878 $sql .=
" p.fk_salary";
880 $sql .=
" p.fk_facture_fourn";
883 $sql .=
" p.fk_facture";
886 $sql .=
", SUM(pl.amount)";
888 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as pb,";
889 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
890 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p";
891 $sql .=
" WHERE p.fk_prelevement_lignes = pl.rowid";
892 $sql .=
" AND pl.fk_prelevement_bons = pb.rowid";
893 $sql .=
" AND pb.rowid = " . ((int) $this->
id);
894 $sql .=
" AND pb.entity = " . ((int)
$conf->entity);
896 if ($this->
type ==
'bank-transfer') {
897 if ($type ==
'salary') {
898 $sql .=
" GROUP BY p.fk_salary";
900 $sql .=
" GROUP BY p.fk_facture_fourn";
903 $sql .=
" GROUP BY p.fk_facture";
907 $resql = $this->db->query($sql);
909 $num = $this->db->num_rows($resql);
914 $row = $this->db->fetch_row($resql);
926 $this->db->free($resql);
928 $this->error = $this->db->lasterror();
945 $sql =
"SELECT sum(pd.amount) as nb";
946 if ($type !==
'salary') {
947 if ($mode !=
'bank-transfer') {
948 $sql .=
" FROM " . MAIN_DB_PREFIX .
"facture as f,";
950 $sql .=
" FROM " . MAIN_DB_PREFIX .
"facture_fourn as f,";
953 $sql .=
" FROM " . MAIN_DB_PREFIX .
"salary as s,";
955 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_demande as pd";
956 $sql .= ($type !==
'salary' ?
" WHERE f.entity IN (" .
getEntity(
'invoice') .
")" :
" WHERE s.entity IN (" .
getEntity(
'salary') .
")");
958 $sql .= ($type !==
'salary' ?
" AND f.fk_statut = " .
Facture::STATUS_VALIDATED :
" AND s.paye = " . Salary::STATUS_UNPAID);
960 if ($type !==
'salary') {
961 if ($mode !=
'bank-transfer') {
962 $sql .=
" AND f.rowid = pd.fk_facture";
964 $sql .=
" AND f.rowid = pd.fk_facture_fourn";
967 $sql .=
" AND s.rowid = pd.fk_salary";
969 $sql .= ($type !==
'salary' ?
" AND f.paye = 0" :
"");
970 $sql .=
" AND pd.traite = 0";
971 $sql .=
" AND pd.ext_payment_id IS NULL";
972 $sql .= ($type !==
'salary' ?
" AND f.total_ttc > 0" :
"");
974 $resql = $this->db->query($sql);
976 $obj = $this->db->fetch_object($resql);
978 $this->db->free($resql);
983 dol_syslog(get_class($this) .
"::SommeAPrelever Erreur -1");
999 if ($type ===
'salary') {
1017 if ($forsalary == 1) {
1018 $sql =
"SELECT count(s.rowid) as nb";
1019 $sql .=
" FROM " . MAIN_DB_PREFIX .
"salary as s";
1021 $sql =
"SELECT count(f.rowid) as nb";
1023 if ($type ==
'bank-transfer') {
1024 $sql .=
" FROM " . MAIN_DB_PREFIX .
"facture_fourn as f";
1026 $sql .=
" FROM " . MAIN_DB_PREFIX .
"facture as f";
1029 $sql .=
", " . MAIN_DB_PREFIX .
"prelevement_demande as pd";
1030 if ($forsalary == 1) {
1031 $sql .=
" WHERE s.entity IN (" .
getEntity(
'invoice') .
")";
1033 $sql .=
" AND s.paye = 0";
1036 $sql .=
" WHERE f.entity IN (" .
getEntity(
'invoice') .
")";
1041 if ($forsalary == 1) {
1042 $sql .=
" AND s.rowid = pd.fk_salary";
1044 if ($type ==
'bank-transfer') {
1045 $sql .=
" AND f.rowid = pd.fk_facture_fourn";
1047 $sql .=
" AND f.rowid = pd.fk_facture";
1050 $sql .=
" AND pd.traite = 0";
1051 $sql .=
" AND pd.ext_payment_id IS NULL";
1052 if (!$forsalary == 1) {
1053 $sql .=
" AND f.total_ttc > 0";
1055 $sql .=
" AND s.paye = 0";
1058 dol_syslog(get_class($this) .
"::NbFactureAPrelever");
1059 $resql = $this->db->query($sql);
1062 $obj = $this->db->fetch_object($resql);
1063 $this->db->free($resql);
1067 $this->error = get_class($this) .
"::NbFactureAPrelever Erreur -1 sql=" . $this->db->error();
1097 public function create($banque =
'', $agence =
'', $mode =
'real', $format =
'ALL', $executiondate = 0, $notrigger = 0, $type =
'direct-debit', $dids = 0, $fk_bank_account = 0, $sourcetype =
'invoice')
1100 global
$conf, $langs, $user;
1102 dol_syslog(__METHOD__ .
" mode=".$mode.
" format=".$format.
" type=".$type.
" dids=".$dids.
" fk_bank_account=".$fk_bank_account.
" sourcetype=".$sourcetype, LOG_DEBUG);
1104 require_once DOL_DOCUMENT_ROOT .
"/compta/facture/class/facture.class.php";
1105 require_once DOL_DOCUMENT_ROOT .
"/societe/class/societe.class.php";
1108 if ($type !=
'bank-transfer') {
1109 if (empty($format)) {
1110 $this->error =
'ErrorBadParametersForDirectDebitFileCreate';
1115 if (!is_int($dids) && !is_array($dids)) {
1116 $this->error =
'ErrorBadParametersForDirectDebitFileCreateDids';
1121 if (empty($fk_bank_account)) {
1122 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
1124 if (is_int($dids)) {
1125 $dids = array($dids);
1130 if ($sourcetype !=
'salary') {
1131 $entities = $type !=
'bank-transfer' ?
getEntity(
'invoice', 1) :
getEntity(
'supplier_invoice', 1);
1132 $sqlTable = $type !=
'bank-transfer' ?
"facture" :
"facture_fourn";
1133 $socOrUser =
'fk_soc';
1134 $societeOrUser =
'societe';
1137 $sqlTable =
'salary';
1138 $socOrUser =
'fk_user';
1139 $societeOrUser =
'user';
1170 $datetimeprev =
dol_now(
'gmt');
1172 if (!empty($executiondate)) {
1173 $datetimeprev = $executiondate;
1179 $this->invoice_in_error = array();
1180 $this->thirdparty_in_error = array();
1183 $factures = array();
1184 $factures_prev = array();
1185 $factures_prev_id = array();
1187 dol_syslog(__METHOD__ .
" Read invoices/salaries for dids=" . implode(
', ', $dids), LOG_DEBUG);
1189 $sql =
"SELECT f.rowid, pd.rowid as pfdrowid";
1190 $sql .=
", f.".$this->db->sanitize($socOrUser);
1191 $sql .=
", pd.code_banque, pd.code_guichet, pd.number, pd.cle_rib";
1192 $sql .=
", pd.amount";
1193 if ($sourcetype !=
'salary') {
1194 $sql .=
", s.nom as name";
1196 $sql .=
", sr.bic, sr.iban_prefix, sr.frstrecur, sr.default_rib, sr.rum";
1198 $sql .=
", CONCAT(s.firstname, ' ', s.lastname) as name";
1200 $sql .=
", sr.bic, sr.iban_prefix, 'FRST' as frstrecur, sr.default_rib, '' as rum";
1202 $sql .=
", pd.fk_societe_rib as soc_rib_id";
1203 $sql .=
" FROM " . $this->db->prefix() . $sqlTable .
" as f";
1204 $sql .=
" INNER JOIN " . $this->db->prefix() .
"prelevement_demande as pd ON f.rowid = pd.fk_".$this->db->sanitize($sqlTable);
1205 $sql .=
" LEFT JOIN " . $this->db->prefix() . $this->db->sanitize($societeOrUser).
" as s ON s.rowid = f.".$this->db->sanitize($socOrUser);
1206 $sql .=
" LEFT JOIN " . $this->db->prefix() . $this->db->sanitize($societeOrUser.
"_rib").
" as sr ON s.rowid = sr.".$this->db->sanitize($socOrUser);
1207 if ($sourcetype !=
'salary') {
1208 $sql .=
" AND sr.default_rib = 1";
1209 $sql .=
" AND sr.type = 'ban'";
1217 $sql .=
" WHERE f.entity IN (".$this->db->escape($entities).
')';
1218 if ($sourcetype !=
'salary') {
1219 $sql .=
" AND f.fk_statut = ".Facture::STATUS_VALIDATED;
1220 $sql .=
" AND f.paye = 0";
1221 $sql .=
" AND f.total_ttc > 0";
1227 $sql .=
" AND f.paye = 0";
1228 $sql .=
" AND f.amount > 0";
1230 $sql .=
" AND pd.traite = 0";
1231 $sql .=
" AND pd.ext_payment_id IS NULL";
1232 if ($dids !== [0] && !empty($dids)) {
1233 $sql .=
" AND pd.rowid IN (".$this->db->sanitize(implode(
',', $dids)).
")";
1236 $resql = $this->db->query($sql);
1238 $num = $this->db->num_rows($resql);
1242 $row = $this->db->fetch_row($resql);
1243 '@phan-var-force array<int<0,12>,string> $row';
1250 $factures[$i] = $row;
1253 $factures[$i][11] =
dolDecrypt($factures[$i][11]);
1257 dol_syslog(__METHOD__ .
" Read invoices/salaries error Found a null amount", LOG_WARNING);
1258 $this->invoice_in_error[$row[0]] =
"Error for invoice or salary id " . $row[0] .
", found a null amount";
1264 $this->db->free($resql);
1265 dol_syslog(__METHOD__ .
" Read invoices/salaries, " . $i .
" invoices/salaries to withdraw", LOG_DEBUG);
1267 $this->error = $this->db->lasterror();
1268 dol_syslog(__METHOD__ .
" Read invoices/salaries error " . $this->db->lasterror(), LOG_ERR);
1274 require_once DOL_DOCUMENT_ROOT .
'/societe/class/societe.class.php';
1275 require_once DOL_DOCUMENT_ROOT .
'/user/class/user.class.php';
1276 require_once DOL_DOCUMENT_ROOT .
'/societe/class/companybankaccount.class.php';
1277 require_once DOL_DOCUMENT_ROOT .
'/core/lib/bank.lib.php';
1279 $tmpsoc =
new Societe($this->db);
1280 $tmpuser =
new User($this->db);
1284 dol_syslog(__METHOD__ .
" Check BAN for each invoices or salaries", LOG_DEBUG);
1286 if (count($factures) > 0) {
1287 foreach ($factures as $key => $fac) {
1291 if ($fac[8] !=
null) {
1292 if ($type !=
'bank-transfer') {
1293 if ($format ==
'FRST' && $fac[12] && $fac[12] !=
'FRST') {
1296 if ($format ==
'RCUR' && $fac[12] && $fac[12] !=
'RCUR') {
1303 if (!empty($fac[15])) {
1305 $bankaccount->fetch((
int) $fac[15]);
1306 if ($bankaccount->id > 0) {
1307 $fac[3] = $bankaccount->code_banque;
1308 $fac[4] = $bankaccount->code_guichet;
1309 $fac[5] = $bankaccount->number;
1310 $fac[6] = $bankaccount->cle_rib;
1311 $fac[10] = $bankaccount->bic;
1312 $fac[11] = $bankaccount->iban;
1313 $fac[14] = $bankaccount->rum;
1318 $bicinloop = $fac[10];
1319 $baninloop = $fac[11];
1323 if ($verif || (empty($fac[10]) &&
getDolGlobalInt(
"WITHDRAWAL_WITHOUT_BIC"))) {
1324 dol_syslog(__METHOD__.
" now call checkIbanForAccount(null, ".$baninloop.
")");
1329 $factures_prev[$i] = $fac;
1331 $factures_prev_id[$i] = $fac[0];
1335 if ($type !=
'bank-transfer') {
1336 $tmpsoc->id = (int) $fac[2];
1337 $tmpsoc->name = $fac[8];
1338 $invoice_url =
"<a href='" . DOL_URL_ROOT .
'/compta/facture/card.php?facid=' . $fac[0] .
"'>" . $fac[9] .
"</a>";
1339 $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);
1340 $this->thirdparty_in_error[$tmpsoc->id] =
"Error on default bank number IBAN/BIC for invoice " . $invoice_url .
" for thirdparty " . $tmpsoc->getNomUrl(0);
1343 if ($type ==
'bank-transfer' && $sourcetype !=
'salary') {
1344 $tmpsoc->id = (int) $fac[2];
1345 $tmpsoc->name = $fac[8];
1346 $invoice_url =
"<a href='" . DOL_URL_ROOT .
'/fourn/facture/card.php?facid=' . $fac[0] .
"'>" . $fac[9] .
"</a>";
1347 $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);
1348 $this->thirdparty_in_error[$tmpsoc->id] =
"Error on default bank number IBAN/BIC for invoice " . $invoice_url .
" for thirdparty " . $tmpsoc->getNomUrl(0);
1351 if ($type ==
'bank-transfer' && $sourcetype ==
'salary') {
1352 $tmpuser->id = (int) $fac[2];
1353 $tmpuser->firstname = $fac[8];
1354 $salary_url =
"<a href='" . DOL_URL_ROOT .
'/salaries/card.php?id=' . $fac[0] .
"'>" . $fac[0] .
"</a>";
1355 $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);
1356 $this->thirdparty_in_error[$tmpuser->id] =
"Error on default bank number IBAN/BIC for salary " . $salary_url .
" for employee " . $tmpuser->getNomUrl(0);
1359 dol_syslog(__METHOD__ .
" Check BAN Error on default bank number IBAN/BIC reported by verif(): " . implode(
', ', $fac), LOG_WARNING);
1362 dol_syslog(__METHOD__ .
" Check BAN Failed to read company", LOG_WARNING);
1371 dol_syslog(__METHOD__ .
" Check BAN No invoice to process", LOG_WARNING);
1378 $out = count($factures_prev) .
" invoices or salaries will be included.";
1383 if (count($factures_prev) > 0) {
1384 if ($mode ==
'real') {
1387 print $langs->trans(
"ModeWarning");
1404 $ref = substr($year, -2) . $month;
1409 $sql =
"SELECT SUBSTRING(ref, 6) AS refnumber";
1410 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons";
1411 $sql .=
" WHERE ref LIKE '" . $this->db->escape($prefixt . $ref) .
"%'";
1412 $sql .=
" AND entity = " . ((int)
$conf->entity);
1413 $sql .=
" ORDER BY LENGTH(ref) DESC, ref DESC";
1416 dol_syslog(get_class($this) .
" get next free number", LOG_DEBUG);
1418 $resql = $this->db->query($sql);
1421 $row = $this->db->fetch_row($resql);
1424 $ref = $prefixt . $ref . sprintf(
"%03d", (intval($row[0]) + 1));
1430 if ($type !=
'bank-transfer') {
1431 $dir =
$conf->prelevement->dir_output .
'/receipts';
1433 $dir =
$conf->paymentbybanktransfer->dir_output .
'/receipts';
1435 if (!is_dir($dir)) {
1440 $labelentity =
$conf->entity;
1441 $this->filename = $dir .
'/' . $ref .
'-' . $labelentity .
'.xml';
1443 $this->filename = $dir .
'/' . $ref .
'.xml';
1447 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"prelevement_bons (";
1448 $sql .=
"ref, entity, datec, type, fk_bank_account";
1449 $sql .=
") VALUES (";
1450 $sql .=
"'" . $this->db->escape($ref) .
"'";
1451 $sql .=
", " . ((int)
$conf->entity);
1452 $sql .=
", '" . $this->db->idate($now) .
"'";
1453 $sql .=
", '" . ($type ==
'bank-transfer' ?
'bank-transfer' :
'debit-order') .
"'";
1454 $sql .=
", " . ((int) $fk_bank_account);
1457 $resql = $this->db->query($sql);
1460 $prev_id = $this->db->last_insert_id(MAIN_DB_PREFIX .
"prelevement_bons");
1461 $this->
id = $prev_id;
1465 $this->errors[] = $this->db->lasterror();
1466 dol_syslog(__METHOD__ .
" Create withdraw receipt " . $this->db->lasterror(), LOG_ERR);
1470 $this->errors[] = $this->db->lasterror();
1471 dol_syslog(__METHOD__ .
" Get last withdraw receipt " . $this->db->lasterror(), LOG_ERR);
1476 dol_syslog(__METHOD__ .
" Now loop on each document to insert them in llx_prelevement_demande");
1479 if (count($factures_prev) > 0) {
1480 foreach ($factures_prev as $fac) {
1524 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_demande";
1525 $sql .=
" SET traite = 1";
1526 $sql .=
", date_traite = '" . $this->db->idate($now) .
"'";
1527 $sql .=
", fk_prelevement_bons = " . ((int) $this->
id);
1528 $sql .=
" WHERE rowid = " . ((int) $fac[1]);
1530 $resql = $this->db->query($sql);
1533 $this->errors[] = $this->db->lasterror();
1534 dol_syslog(__METHOD__ .
" Update Error=" . $this->db->lasterror(), LOG_ERR);
1545 dol_syslog(__METHOD__ .
" Init direct debit or credit transfer file for " . count($factures_prev) .
" invoices", LOG_DEBUG);
1547 if (count($factures_prev) > 0) {
1548 $this->date_echeance = $datetimeprev;
1549 $this->reference_remise = $ref;
1551 $account =
new Account($this->db);
1552 if ($account->fetch($fk_bank_account) > 0) {
1553 $this->emetteur_code_banque = $account->code_banque;
1554 $this->emetteur_code_guichet = $account->code_guichet;
1555 $this->emetteur_numero_compte = $account->number;
1556 $this->emetteur_number_key = $account->cle_rib;
1557 $this->sepa_xml_pti_in_ctti = (bool) $account->pti_in_ctti;
1558 $this->emetteur_iban = $account->iban;
1559 $this->emetteur_bic = $account->bic;
1561 $this->emetteur_ics = (($type ==
'bank-transfer' &&
getDolGlobalString(
"SEPA_USE_IDS")) ? $account->ics_transfer : $account->ics);
1563 $this->raison_sociale = $account->owner_name;
1565 $this->factures = $factures_prev_id;
1566 $this->context[
'factures_prev'] = $factures_prev;
1570 if ($sourcetype ==
'salary') {
1571 $userid = $this->context[
'factures_prev'][0][2];
1573 $result = $this->
generate($format, $executiondate, $type, $fk_bank_account, $userid, 0);
1580 dol_syslog(__METHOD__ .
" Bank order file has been generated under filename " . $this->filename, LOG_DEBUG);
1588 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_bons";
1589 $sql .=
" SET amount = " .
price2num($this->total);
1590 $sql .=
" WHERE rowid = " . ((int) $this->
id);
1591 $sql .=
" AND entity = " . ((int)
$conf->entity);
1592 $resql = $this->db->query($sql);
1596 dol_syslog(__METHOD__ .
" Error update total: " . $this->db->error(), LOG_ERR);
1600 if (!$error && !$notrigger) {
1601 $triggerName =
'DIRECT_DEBIT_ORDER_CREATE';
1602 if ($type !=
'bank-transfer') {
1603 $triggerName =
'CREDIT_TRANSFER_ORDER_CREATE';
1607 $result = $this->call_trigger($triggerName, $user);
1615 $this->db->commit();
1616 return count($factures_prev);
1618 $this->db->rollback();
1634 public function delete($user, $notrigger = 0)
1639 $resql1 = $resql2 = $resql3 = $resql4 = 0;
1642 $triggername =
'DIRECT_DEBIT_ORDER_DELETE';
1643 if ($this->
type ==
'bank-transfer') {
1644 $triggername =
'PAYMENTBYBANKTRANFER_DELETE';
1647 $result = $this->call_trigger($triggername, $user);
1655 $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) .
")";
1656 $resql1 = $this->db->query($sql);
1663 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"prelevement_lignes WHERE fk_prelevement_bons = " . ((int) $this->
id);
1664 $resql2 = $this->db->query($sql);
1671 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"prelevement_bons WHERE rowid = " . ((int) $this->
id);
1672 $resql3 = $this->db->query($sql);
1679 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_demande SET fk_prelevement_bons = NULL, traite = 0 WHERE fk_prelevement_bons = " . ((int) $this->
id);
1680 $resql4 = $this->db->query($sql);
1686 if ($resql1 && $resql2 && $resql3 && $resql4 && !$error) {
1687 $this->db->commit();
1690 $this->db->rollback();
1706 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
1708 global
$conf, $langs, $hookmanager;
1710 if (!empty(
$conf->dol_no_mouse_hover)) {
1716 $labeltoshow =
'PaymentByDirectDebit';
1717 $labelforclosedate =
'CreditDate';
1718 if (!empty($this->
type) && $this->
type ==
'bank-transfer') {
1719 $labeltoshow =
'PaymentByBankTransfer';
1720 $labelforclosedate =
'ClosedOn';
1723 $label =
img_picto(
'', $this->picto) .
' <u>' . $langs->trans($labeltoshow) .
'</u> ' . $this->
getLibStatut(5);
1725 $label .=
'<b>' . $langs->trans(
'Ref') .
':</b> ' . $this->ref;
1726 if (isset($this->
amount)) {
1727 $label .=
'<br><b>' . $langs->trans(
"Amount") .
':</b> <span class="amount">' .
price($this->
amount).
'</span>';
1729 if (isset($this->date_creation)) {
1730 $label .=
'<br><b>'.$langs->trans(
"DateCreation").
":</b> ".
dol_print_date($this->date_creation,
'dayhour',
'tzuserrel');
1732 if (isset($this->date_trans)) {
1733 $label .=
'<br><b>' . $langs->trans(
"TransData") .
":</b> " .
dol_print_date($this->date_trans,
'dayhour',
'tzuserrel');
1735 if (isset($this->date_credit)) {
1736 $label .=
'<br><b>'.$langs->trans($labelforclosedate).
":</b> ".
dol_print_date($this->date_credit,
'dayhour',
'tzuserrel');
1739 $url = DOL_URL_ROOT .
'/compta/prelevement/card.php?id=' . $this->id;
1740 if (!empty($this->
type) && $this->
type ==
'bank-transfer') {
1741 $url = DOL_URL_ROOT .
'/compta/prelevement/card.php?id=' . $this->id;
1744 if ($option !=
'nolink') {
1746 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1747 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1748 $add_save_lastsearch_values = 1;
1750 if ($add_save_lastsearch_values) {
1751 $url .=
'&save_lastsearch_values=1';
1756 if (empty($notooltip)) {
1758 $label = $langs->trans(
"ShowMyObject");
1762 $linkclose .=
' class="classfortooltip' . ($morecss ?
' ' . $morecss :
'') .
'"';
1764 $linkclose = ($morecss ?
' class="' . $morecss .
'"' :
'');
1767 $linkstart =
'<a href="' . $url .
'"';
1768 $linkstart .= $linkclose .
'>';
1771 $result .= $linkstart;
1773 $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);
1775 if ($withpicto != 2) {
1776 $result .= $this->ref;
1778 $result .= $linkend;
1780 global $action, $hookmanager;
1781 $hookmanager->initHooks(array(
'banktransferdao'));
1782 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1783 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1785 $result = $hookmanager->resPrint;
1787 $result .= $hookmanager->resPrint;
1802 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"notify_def";
1803 $sql .=
" WHERE rowid = " . ((int) $rowid);
1805 if ($this->db->query($sql)) {
1821 if (is_object($user)) {
1822 $userid = $user->id;
1827 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"notify_def";
1828 $sql .=
" WHERE fk_user=" . ((int) $userid) .
" AND fk_action='" . $this->db->escape($action) .
"'";
1830 if ($this->db->query($sql)) {
1851 if (is_object($user)) {
1852 $userid = $user->id;
1860 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"notify_def (datec,fk_user, fk_soc, fk_contact, fk_action)";
1861 $sql .=
" VALUES ('" . $this->db->idate($now) .
"', " . ((int) $userid) .
", 'NULL', 'NULL', '" . $this->db->escape($action) .
"')";
1864 if ($this->db->query($sql)) {
1868 dol_syslog(get_class($this) .
"::addNotification Error $result");
1891 public function generate(
string $format =
'ALL',
int $executiondate = 0,
string $type =
'direct-debit',
int $fk_bank_account = 0,
int $forsalary = 0,
int $thirdpartyBANId = 0)
1898 if (empty($fk_bank_account)) {
1899 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
1904 dol_syslog(get_class($this) .
"::generate build file=" . $this->filename .
" type=" . $type);
1906 $this->file = fopen($this->filename,
"w");
1907 if ($this->file ==
false) {
1908 $this->error = $langs->trans(
'ErrorFailedToOpenFile', $this->filename);
1916 if (
$mysoc->isInSEPA()) {
1919 if ($type !=
'bank-transfer') {
1931 if (!empty($executiondate)) {
1932 $date_actu = $executiondate;
1937 $fileDebiteurSection =
'';
1938 $fileEmetteurSection =
'';
1945 $sql =
"SELECT soc.rowid as socid, soc.code_client as code, soc.address, soc.zip, soc.town, c.code as country_code,";
1947 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
1948 $sql .=
" f.ref as reffac,";
1949 $sql .=
" p.fk_facture as idfac, p.rowid as pid,";
1950 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, rib.rum, rib.date_rum";
1952 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
1953 $sql .=
" " . MAIN_DB_PREFIX .
"facture as f,";
1954 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
1955 $sql .=
" " . MAIN_DB_PREFIX .
"societe as soc,";
1956 $sql .=
" " . MAIN_DB_PREFIX .
"c_country as c,";
1957 $sql .=
" " . MAIN_DB_PREFIX .
"societe_rib as rib";
1958 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
1959 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
1960 $sql .=
" AND p.fk_facture = f.rowid";
1961 $sql .=
" AND f.fk_soc = soc.rowid";
1962 $sql .=
" AND soc.fk_pays = c.rowid";
1963 $sql .=
" AND rib.fk_soc = f.fk_soc";
1964 if (!empty($thirdpartyBANId)) {
1965 $sql .=
" AND rib.rowid = " . ((int) $thirdpartyBANId);
1967 $sql .=
" AND rib.default_rib = 1";
1969 $sql .=
" AND rib.type = 'ban'";
1972 $resql = $this->db->query($sql);
1973 $nbtotalDrctDbtTxInf = -1;
1975 $cachearraytotestduplicate = array();
1977 $num = $this->db->num_rows($resql);
1979 $obj = $this->db->fetch_object($resql);
1981 if (!empty($cachearraytotestduplicate[$obj->idfac])) {
1982 $this->error = $langs->trans(
'ErrorCompanyHasDuplicateDefaultBAN', $obj->socid);
1983 $this->invoice_in_error[$obj->idfac] = $this->error;
1987 $cachearraytotestduplicate[$obj->idfac] = $obj->rowid;
1989 $daterum = (!empty($obj->date_rum)) ? $this->db->jdate($obj->date_rum) : $this->db->jdate($obj->datec);
1992 $fileDebiteurSection .= $this->
EnregDestinataireSEPA($obj->code, $obj->nom, $obj->address, $obj->zip, $obj->town, $obj->country_code,
'',
'',
'', $obj->somme, $obj->reffac, $obj->idfac, $iban, $obj->bic, $daterum, (
string) $obj->drum, $obj->rum, $type);
1994 $this->total += $obj->somme;
1997 $nbtotalDrctDbtTxInf = $i;
1999 $this->error = $this->db->lasterror();
2000 fwrite($this->file,
'ERROR DEBITOR ' . $sql . $CrLf);
2005 if ($result != -2) {
2006 $fileEmetteurSection .= $this->
EnregEmetteurSEPA($conf, $date_actu, $nbtotalDrctDbtTxInf, $this->total, $CrLf, $format, $type, $fk_bank_account);
2010 $this->total = number_format((
float)
price2num($this->total,
'MT'), 2,
".",
"");
2017 fwrite($this->file,
'<' .
'?xml version="1.0" encoding="UTF-8" standalone="yes"?' .
'>' . $CrLf);
2018 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);
2019 fwrite($this->file,
' <CstmrDrctDbtInitn>' . $CrLf);
2021 fwrite($this->file,
' <GrpHdr>' . $CrLf);
2022 fwrite($this->file,
' <MsgId>' . (
'DOL/' . $dateTime_YMD .
'/DD' . $this->
id) .
'</MsgId>' . $CrLf);
2023 fwrite($this->file,
' <CreDtTm>' . $dateTime_ECMA .
'</CreDtTm>' . $CrLf);
2024 fwrite($this->file,
' <NbOfTxs>' . $i .
'</NbOfTxs>' . $CrLf);
2025 fwrite($this->file,
' <CtrlSum>' . $this->total .
'</CtrlSum>' . $CrLf);
2026 fwrite($this->file,
' <InitgPty>' . $CrLf);
2028 fwrite($this->file,
' <Id>' . $CrLf);
2029 fwrite($this->file,
' <PrvtId>' . $CrLf);
2030 fwrite($this->file,
' <Othr>' . $CrLf);
2031 fwrite($this->file,
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf);
2032 fwrite($this->file,
' </Othr>' . $CrLf);
2033 fwrite($this->file,
' </PrvtId>' . $CrLf);
2034 fwrite($this->file,
' </Id>' . $CrLf);
2035 fwrite($this->file,
' </InitgPty>' . $CrLf);
2036 fwrite($this->file,
' </GrpHdr>' . $CrLf);
2038 if ($result != -2) {
2039 fwrite($this->file, $fileEmetteurSection);
2042 if ($result != -2) {
2043 fwrite($this->file, $fileDebiteurSection);
2046 fwrite($this->file,
' </PmtInf>' . $CrLf);
2047 fwrite($this->file,
' </CstmrDrctDbtInitn>' . $CrLf);
2048 fwrite($this->file,
'</Document>' . $CrLf);
2061 if (!empty($executiondate)) {
2062 $date_actu = $executiondate;
2067 $fileCrediteurSection =
'';
2068 $fileEmetteurSection =
'';
2074 if (!empty($forsalary)) {
2075 $sql =
"SELECT u.rowid as userId, u.address, u.zip, u.town, c.code as country_code, CONCAT(u.firstname,' ',u.lastname) as nom,";
2077 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
2078 $sql .=
" s.ref as reffac,";
2079 $sql .=
" p.fk_salary as idfac,";
2080 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, '' as rum, '' as date_rum";
2082 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2083 $sql .=
" " . MAIN_DB_PREFIX .
"salary as s,";
2084 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
2085 $sql .=
" " . MAIN_DB_PREFIX .
"user as u";
2086 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_country as c ON u.fk_country = c.rowid,";
2087 $sql .=
" " . MAIN_DB_PREFIX .
"user_rib as rib";
2088 $sql .=
" WHERE pl.fk_prelevement_bons=" . ((int) $this->
id);
2089 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2090 $sql .=
" AND p.fk_salary = s.rowid";
2091 $sql .=
" AND s.fk_user = u.rowid";
2092 $sql .=
" AND rib.fk_user = s.fk_user";
2094 $sql =
"SELECT soc.rowid as socid, soc.code_client as code, soc.address, soc.zip, soc.town, c.code as country_code,";
2096 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
2097 $sql .=
" f.ref as reffac, f.ref_supplier as fac_ref_supplier,";
2098 $sql .=
" p.fk_facture_fourn as idfac,";
2099 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, rib.rum, rib.date_rum";
2101 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2102 $sql .=
" " . MAIN_DB_PREFIX .
"facture_fourn as f,";
2103 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
2104 $sql .=
" " . MAIN_DB_PREFIX .
"societe as soc";
2105 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_country as c ON soc.fk_pays = c.rowid,";
2106 $sql .=
" " . MAIN_DB_PREFIX .
"societe_rib as rib";
2107 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2108 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2109 $sql .=
" AND p.fk_facture_fourn = f.rowid";
2110 $sql .=
" AND f.fk_soc = soc.rowid";
2111 $sql .=
" AND rib.fk_soc = f.fk_soc";
2112 if (!empty($thirdpartyBANId)) {
2113 $sql .=
" AND rib.rowid = " . ((int) $thirdpartyBANId);
2115 $sql .=
" AND rib.default_rib = 1";
2117 $sql .=
" AND rib.type = 'ban'";
2120 $nbtotalDrctDbtTxInf = -1;
2122 require_once DOL_DOCUMENT_ROOT .
'/societe/class/companybankaccount.class.php';
2124 $resql = $this->db->query($sql);
2126 $cachearraytotestduplicate = array();
2128 $num = $this->db->num_rows($resql);
2130 $obj = $this->db->fetch_object($resql);
2133 if (!empty($cachearraytotestduplicate[$obj->idfac])) {
2134 $this->error = $langs->trans(
'ErrorCompanyHasDuplicateDefaultBAN', $obj->socid);
2135 $this->invoice_in_error[$obj->idfac] = $this->error;
2140 $cachearraytotestduplicate[$obj->idfac] = $obj->rowid;
2143 $daterum = (!empty($obj->date_rum)) ? $this->db->jdate($obj->date_rum) : $this->db->jdate($obj->datec);
2150 if (!empty($obj->fk_prelevement_demande)) {
2151 $companybankaccountid = 0;
2153 $sqltmp =
"SELECT fk_societe_rib FROM ".MAIN_DB_PREFIX.
"prelevement_demande";
2154 $sqltmp .=
" WHERE rowid = ".((int) $obj->fk_prelevement_demande);
2156 $resqltmp = $this->db->query($sqltmp);
2158 $objtmp = $this->db->fetch_object($resqltmp);
2160 $companybankaccountid = (int) $objtmp->fk_societe_rib;
2164 $bankaccount->fetch($companybankaccountid);
2165 if ($bankaccount->id > 0) {
2166 $daterum = $bankaccount->date_rum;
2167 $iban = $bankaccount->iban;
2168 $bic = $bankaccount->bic;
2169 $drum = $bankaccount->id;
2170 $rum = $bankaccount->rum;
2174 $refobj = $obj->reffac;
2175 if (empty($refobj) && !empty($forsalary)) {
2176 $refobj =
"SAL" . $obj->idfac;
2179 $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);
2181 $this->total += $obj->somme;
2184 $nbtotalDrctDbtTxInf = $i;
2186 $this->error = $this->db->lasterror();
2187 fwrite($this->file,
'ERROR CREDITOR ' . $sql . $CrLf);
2191 if ($result != -2) {
2192 $fileEmetteurSection .= $this->
EnregEmetteurSEPA($conf, $date_actu, $nbtotalDrctDbtTxInf, $this->total, $CrLf, $format, $type);
2196 $this->total = number_format((
float)
price2num($this->total,
'MT'), 2,
".",
"");
2203 fwrite($this->file,
'<' .
'?xml version="1.0" encoding="UTF-8" standalone="yes"?' .
'>' . $CrLf);
2204 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);
2205 fwrite($this->file,
' <CstmrCdtTrfInitn>' . $CrLf);
2207 fwrite($this->file,
' <GrpHdr>' . $CrLf);
2208 fwrite($this->file,
' <MsgId>' . (
'DOL/' . $dateTime_YMD .
'/CT' . $this->
id) .
'</MsgId>' . $CrLf);
2209 fwrite($this->file,
' <CreDtTm>' . $dateTime_ECMA .
'</CreDtTm>' . $CrLf);
2210 fwrite($this->file,
' <NbOfTxs>' . $i .
'</NbOfTxs>' . $CrLf);
2211 fwrite($this->file,
' <CtrlSum>' . $this->total .
'</CtrlSum>' . $CrLf);
2212 fwrite($this->file,
' <InitgPty>' . $CrLf);
2214 fwrite($this->file,
' <Id>' . $CrLf);
2215 fwrite($this->file,
' <PrvtId>' . $CrLf);
2216 fwrite($this->file,
' <Othr>' . $CrLf);
2217 fwrite($this->file,
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf);
2218 fwrite($this->file,
' </Othr>' . $CrLf);
2219 fwrite($this->file,
' </PrvtId>' . $CrLf);
2220 fwrite($this->file,
' </Id>' . $CrLf);
2221 fwrite($this->file,
' </InitgPty>' . $CrLf);
2222 fwrite($this->file,
' </GrpHdr>' . $CrLf);
2224 if ($result != -2) {
2225 fwrite($this->file, $fileEmetteurSection);
2228 if ($result != -2) {
2229 fwrite($this->file, $fileCrediteurSection);
2232 fwrite($this->file,
' </PmtInf>' . $CrLf);
2233 fwrite($this->file,
' </CstmrCdtTrfInitn>' . $CrLf);
2234 fwrite($this->file,
'</Document>' . $CrLf);
2240 if ($type !=
'bank-transfer') {
2241 $sql =
"SELECT pl.amount";
2243 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2244 $sql .=
" " . MAIN_DB_PREFIX .
"facture as f,";
2245 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p";
2246 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2247 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2248 $sql .=
" AND p.fk_facture = f.rowid";
2252 $resql = $this->db->query($sql);
2254 $num = $this->db->num_rows($resql);
2257 $obj = $this->db->fetch_object($resql);
2258 $this->total += $obj->amount;
2267 $sql =
"SELECT pl.amount";
2269 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2270 $sql .=
" " . MAIN_DB_PREFIX .
"facture_fourn as f,";
2271 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p";
2272 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2273 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2274 $sql .=
" AND p.fk_facture_fourn = f.rowid";
2277 $resql = $this->db->query($sql);
2279 $num = $this->db->num_rows($resql);
2282 $obj = $this->db->fetch_object($resql);
2283 $this->total += $obj->amount;
2293 $langs->load(
'withdrawals');
2296 fwrite($this->file, $langs->transnoentitiesnoconv(
'WithdrawalFileNotCapable',
$mysoc->country_code));
2299 fclose($this->file);
2321 return $pre .
'-' .
dol_print_date($row_datec,
'dayhourlogsmall') .
'-' .
dol_trunc((
string) $row_drum . ($row_code_client ?
'-' . $row_code_client :
''), 17,
'right',
'UTF-8', 1);
2342 public function EnregDestinataire($rowid, $client_nom, $rib_banque, $rib_guichet, $rib_number, $amount, $ref, $facid, $rib_dom =
'', $type =
'direct-debit')
2345 fwrite($this->file,
"06");
2346 fwrite($this->file,
"08");
2348 fwrite($this->file,
" ");
2350 fwrite($this->file, $this->emetteur_ics);
2354 fwrite($this->file,
" ");
2355 fwrite($this->file,
dol_print_date($this->date_echeance,
"%d%m",
'gmt'));
2356 fwrite($this->file, substr(
dol_print_date($this->date_echeance,
"%y",
'gmt'), 1));
2360 fwrite($this->file, substr(strtoupper($client_nom) .
" ", 0, 24));
2363 $address = strtr($rib_dom, array(
" " =>
"-", chr(13) =>
" ", chr(10) =>
""));
2364 fwrite($this->file, substr($address .
" ", 0, 24));
2368 fwrite($this->file, substr(
" ", 0, 8));
2372 fwrite($this->file, $rib_guichet);
2376 fwrite($this->file, substr(
"000000000000000" . $rib_number, -11));
2380 $montant = (round($amount, 2) * 100);
2382 fwrite($this->file, substr(
"000000000000000" . $montant, -16));
2386 fwrite($this->file, substr(
"*_" . $ref .
"_RDVnet" . $rowid .
" ", 0, 31));
2390 fwrite($this->file, $rib_banque);
2394 fwrite($this->file, substr(
" ", 0, 5));
2396 fwrite($this->file,
"\n");
2426 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 =
'')
2432 $row_somme = number_format((
float)
price2num($row_somme,
'MT'), 2,
".",
"");
2434 $row_somme = round((
float) $row_somme, 2);
2437 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
2440 $Rowing = sprintf(
"%010d", $row_idfac);
2444 $Rum = (empty($row_rum) ? $this->
buildRumNumber($row_code_client, $row_datec, $row_drum) : $row_rum);
2450 if (!is_object($hookmanager)) {
2451 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
2454 $hookmanager->initHooks(array(
'bonprelevementdao'));
2455 $parameters = array(
2456 'row_code_client' => &$row_code_client,
'row_nom' => &$row_nom,
'row_address' => &$row_address,
'row_zip' => &$row_zip,
'row_town' => &$row_town,
2457 'row_country_code' => &$row_country_code,
'row_cb' => &$row_cb,
'row_cg' => &$row_cg,
'row_cc' => &$row_cc,
'row_somme' => &$row_somme,
2458 'row_ref' => &$row_ref,
'row_idfac' => &$row_idfac,
'row_iban' => &$row_iban,
'row_bic' => &$row_bic,
'row_datec' => &$row_datec,
2459 'row_drum' => &$row_drum,
'row_rum' => &$row_rum,
'type' => &$type,
'row_comment' => &$row_comment,
2460 'crlf' => &$CrLf,
'rowing' => &$Rowing,
'rum' => &$Rum,
'dtofsgntr' => &$DtOfSgntr,
2462 $reshook = $hookmanager->executeHooks(
'enregDestinataireSEPA', $parameters, $this);
2463 if (empty($reshook)) {
2464 if ($type !=
'bank-transfer') {
2467 $XML_DEBITOR .=
' <DrctDbtTxInf>' . $CrLf;
2468 $XML_DEBITOR .=
' <PmtId>' . $CrLf;
2470 $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;
2471 $XML_DEBITOR .=
' </PmtId>' . $CrLf;
2472 $XML_DEBITOR .=
' <InstdAmt Ccy="EUR">' . $row_somme .
'</InstdAmt>' . $CrLf;
2473 $XML_DEBITOR .=
' <DrctDbtTx>' . $CrLf;
2474 $XML_DEBITOR .=
' <MndtRltdInf>' . $CrLf;
2475 $XML_DEBITOR .=
' <MndtId>' . $Rum .
'</MndtId>' . $CrLf;
2476 $XML_DEBITOR .=
' <DtOfSgntr>' . $DtOfSgntr .
'</DtOfSgntr>' . $CrLf;
2477 $XML_DEBITOR .=
' <AmdmntInd>false</AmdmntInd>' . $CrLf;
2478 $XML_DEBITOR .=
' </MndtRltdInf>' . $CrLf;
2479 $XML_DEBITOR .=
' </DrctDbtTx>' . $CrLf;
2480 $XML_DEBITOR .=
' <DbtrAgt>' . $CrLf;
2481 $XML_DEBITOR .=
' <FinInstnId>' . $CrLf;
2483 $XML_DEBITOR .=
' <BIC>' . $row_bic .
'</BIC>' . $CrLf;
2485 $XML_DEBITOR .=
' </FinInstnId>' . $CrLf;
2486 $XML_DEBITOR .=
' </DbtrAgt>' . $CrLf;
2487 $XML_DEBITOR .=
' <Dbtr>' . $CrLf;
2489 $XML_DEBITOR .=
' <PstlAdr>' . $CrLf;
2490 $XML_DEBITOR .=
' <Ctry>' . $row_country_code .
'</Ctry>' . $CrLf;
2491 $addressline1 = strtr($row_address, array(chr(13) =>
", ", chr(10) =>
""));
2492 $addressline2 = strtr($row_zip . (($row_zip && $row_town) ?
' ' :
'') . (
string) $row_town, array(chr(13) =>
", ", chr(10) =>
""));
2493 if (trim($addressline1)) {
2496 if (trim($addressline2)) {
2499 $XML_DEBITOR .=
' </PstlAdr>' . $CrLf;
2500 $XML_DEBITOR .=
' </Dbtr>' . $CrLf;
2501 $XML_DEBITOR .=
' <DbtrAcct>' . $CrLf;
2502 $XML_DEBITOR .=
' <Id>' . $CrLf;
2503 $XML_DEBITOR .=
' <IBAN>' . preg_replace(
'/\s/',
'', $row_iban) .
'</IBAN>' . $CrLf;
2504 $XML_DEBITOR .=
' </Id>' . $CrLf;
2505 $XML_DEBITOR .=
' </DbtrAcct>' . $CrLf;
2506 $XML_DEBITOR .=
' <RmtInf>' . $CrLf;
2510 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions_be.lib.php';
2512 $invoicestatic =
new Facture($this->db);
2513 $invoicestatic->fetch($row_idfac);
2516 $XML_DEBITOR .=
' <strd>' . $invoicePaymentKey .
'</strd>' . $CrLf;
2521 $XML_DEBITOR .=
' </RmtInf>' . $CrLf;
2522 $XML_DEBITOR .=
' </DrctDbtTxInf>' . $CrLf;
2524 $XML_RESULT = $XML_DEBITOR;
2528 $XML_CREDITOR .=
' <CdtTrfTxInf>' . $CrLf;
2529 $XML_CREDITOR .=
' <PmtId>' . $CrLf;
2531 $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;
2532 $XML_CREDITOR .=
' </PmtId>' . $CrLf;
2533 if (!empty($this->sepa_xml_pti_in_ctti)) {
2534 $XML_CREDITOR .=
' <PmtTpInf>' . $CrLf;
2538 $instrprty =
'HIGH';
2540 $instrprty =
'NORM';
2544 $categoryPurpose =
getDolGlobalString(
'PAYMENTBYBANKTRANSFER_CUSTOM_CATEGORY_PURPOSE',
'CORE');
2546 $XML_CREDITOR .=
' <InstrPrty>' . $instrprty .
'</InstrPrty>' . $CrLf;
2547 $XML_CREDITOR .=
' <SvcLvl>' . $CrLf;
2548 $XML_CREDITOR .=
' <Cd>SEPA</Cd>' . $CrLf;
2549 $XML_CREDITOR .=
' </SvcLvl>' . $CrLf;
2550 $XML_CREDITOR .=
' <CtgyPurp>' . $CrLf;
2551 $XML_CREDITOR .=
' <Cd>' . $categoryPurpose .
'</Cd>' . $CrLf;
2552 $XML_CREDITOR .=
' </CtgyPurp>' . $CrLf;
2553 $XML_CREDITOR .=
' </PmtTpInf>' . $CrLf;
2555 $XML_CREDITOR .=
' <Amt>' . $CrLf;
2556 $XML_CREDITOR .=
' <InstdAmt Ccy="EUR">' . round((
float) $row_somme, 2) .
'</InstdAmt>' . $CrLf;
2557 $XML_CREDITOR .=
' </Amt>' . $CrLf;
2568 $XML_CREDITOR .=
' <CdtrAgt>' . $CrLf;
2569 $XML_CREDITOR .=
' <FinInstnId>' . $CrLf;
2570 $XML_CREDITOR .=
' <BIC>' . $row_bic .
'</BIC>' . $CrLf;
2571 $XML_CREDITOR .=
' </FinInstnId>' . $CrLf;
2572 $XML_CREDITOR .=
' </CdtrAgt>' . $CrLf;
2573 $XML_CREDITOR .=
' <Cdtr>' . $CrLf;
2575 $XML_CREDITOR .=
' <PstlAdr>' . $CrLf;
2576 $XML_CREDITOR .=
' <Ctry>' . $row_country_code .
'</Ctry>' . $CrLf;
2577 $addressline1 = strtr($row_address, array(chr(13) =>
", ", chr(10) =>
""));
2578 $addressline2 = strtr($row_zip . (($row_zip && $row_town) ?
' ' :
'') . (
string) $row_town, array(chr(13) =>
", ", chr(10) =>
""));
2579 if (trim($addressline1)) {
2582 if (trim($addressline2)) {
2585 $XML_CREDITOR .=
' </PstlAdr>' . $CrLf;
2586 $XML_CREDITOR .=
' </Cdtr>' . $CrLf;
2587 $XML_CREDITOR .=
' <CdtrAcct>' . $CrLf;
2588 $XML_CREDITOR .=
' <Id>' . $CrLf;
2589 $XML_CREDITOR .=
' <IBAN>' . preg_replace(
'/\s/',
'', $row_iban) .
'</IBAN>' . $CrLf;
2590 $XML_CREDITOR .=
' </Id>' . $CrLf;
2591 $XML_CREDITOR .=
' </CdtrAcct>' . $CrLf;
2592 $XML_CREDITOR .=
' <RmtInf>' . $CrLf;
2595 $XML_CREDITOR .=
' </RmtInf>' . $CrLf;
2596 $XML_CREDITOR .=
' </CdtTrfTxInf>' . $CrLf;
2598 $XML_RESULT = $XML_CREDITOR;
2600 } elseif ($reshook > 0) {
2601 $XML_RESULT = $hookmanager->resPrint;
2603 $XML_RESULT .= $hookmanager->resPrint;
2621 fwrite($this->file,
"03");
2622 fwrite($this->file,
"08");
2624 fwrite($this->file,
" ");
2626 fwrite($this->file, $this->emetteur_ics);
2630 fwrite($this->file,
" ");
2631 fwrite($this->file,
dol_print_date($this->date_echeance,
"%d%m",
'gmt'));
2632 fwrite($this->file, substr(
dol_print_date($this->date_echeance,
"%y",
'gmt'), 1));
2636 fwrite($this->file, substr($this->raison_sociale .
" ", 0, 24));
2640 fwrite($this->file, substr($this->reference_remise .
" ", 0, 7));
2644 fwrite($this->file, substr(
" ", 0, 17));
2648 fwrite($this->file, substr(
" ", 0, 2));
2649 fwrite($this->file,
"E");
2650 fwrite($this->file, substr(
" ", 0, 5));
2654 fwrite($this->file, $this->emetteur_code_guichet);
2658 fwrite($this->file, substr(
"000000000000000" . $this->emetteur_numero_compte, -11));
2662 fwrite($this->file, substr(
" ", 0, 16));
2666 fwrite($this->file, substr(
" ", 0, 31));
2670 fwrite($this->file, $this->emetteur_code_banque);
2674 fwrite($this->file, substr(
" ", 0, 5));
2676 fwrite($this->file,
"\n");
2695 public function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf =
'\n', $format =
'FRST', $type =
'direct-debit', $fk_bank_account = 0)
2705 if (empty($fk_bank_account)) {
2706 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
2710 $account =
new Account($this->db);
2711 if ($account->fetch($fk_bank_account) > 0) {
2712 $this->emetteur_code_banque = $account->code_banque;
2713 $this->emetteur_code_guichet = $account->code_guichet;
2714 $this->emetteur_numero_compte = $account->number;
2715 $this->emetteur_number_key = $account->cle_rib;
2716 $this->sepa_xml_pti_in_ctti = (bool) $account->pti_in_ctti;
2717 $this->emetteur_iban = $account->iban;
2718 $this->emetteur_bic = $account->bic;
2720 $this->emetteur_ics = (($type ==
'bank-transfer' &&
getDolGlobalString(
"SEPA_USE_IDS")) ? $account->ics_transfer : $account->ics);
2722 $this->raison_sociale = $account->owner_name;
2726 $sql =
"SELECT rowid, ref";
2727 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as pb";
2728 $sql .=
" WHERE pb.rowid = " . ((int) $this->
id);
2730 $resql = $this->db->query($sql);
2732 $obj = $this->db->fetch_object($resql);
2735 $IdBon = sprintf(
"%05d", $obj->rowid);
2736 $RefBon = $obj->ref;
2737 $localInstrument =
getDolGlobalString(
'PAYMENTBYBANKTRANSFER_CUSTOM_LOCAL_INSTRUMENT',
'CORE');
2740 $total = number_format((
float)
price2num($total,
'MT'), 2,
".",
"");
2743 if ($type !=
'bank-transfer') {
2745 $XML_SEPA_INFO =
'';
2746 $XML_SEPA_INFO .=
' <PmtInf>' . $CrLf;
2747 $XML_SEPA_INFO .=
' <PmtInfId>' . (
'DOL/' . $dateTime_YMD .
'/DD' . $IdBon .
'-' . $RefBon) .
'</PmtInfId>' . $CrLf;
2748 $XML_SEPA_INFO .=
' <PmtMtd>DD</PmtMtd>' . $CrLf;
2749 $XML_SEPA_INFO .=
' <NbOfTxs>' . $nombre .
'</NbOfTxs>' . $CrLf;
2750 $XML_SEPA_INFO .=
' <CtrlSum>' . $total .
'</CtrlSum>' . $CrLf;
2751 $XML_SEPA_INFO .=
' <PmtTpInf>' . $CrLf;
2752 $XML_SEPA_INFO .=
' <SvcLvl>' . $CrLf;
2753 $XML_SEPA_INFO .=
' <Cd>SEPA</Cd>' . $CrLf;
2754 $XML_SEPA_INFO .=
' </SvcLvl>' . $CrLf;
2755 $XML_SEPA_INFO .=
' <LclInstrm>' . $CrLf;
2756 $XML_SEPA_INFO .=
' <Cd>' . $localInstrument .
'</Cd>' . $CrLf;
2757 $XML_SEPA_INFO .=
' </LclInstrm>' . $CrLf;
2758 $XML_SEPA_INFO .=
' <SeqTp>' . $format .
'</SeqTp>' . $CrLf;
2759 $XML_SEPA_INFO .=
' </PmtTpInf>' . $CrLf;
2760 $XML_SEPA_INFO .=
' <ReqdColltnDt>' . $dateTime_ETAD .
'</ReqdColltnDt>' . $CrLf;
2761 $XML_SEPA_INFO .=
' <Cdtr>' . $CrLf;
2763 $XML_SEPA_INFO .=
' <PstlAdr>' . $CrLf;
2764 $XML_SEPA_INFO .=
' <Ctry>' . $country[1] .
'</Ctry>' . $CrLf;
2765 $addressline1 = strtr(
getDolGlobalString(
'MAIN_INFO_SOCIETE_ADDRESS'), array(chr(13) =>
", ", chr(10) =>
""));
2767 if ($addressline1) {
2770 if ($addressline2) {
2773 $XML_SEPA_INFO .=
' </PstlAdr>' . $CrLf;
2774 $XML_SEPA_INFO .=
' </Cdtr>' . $CrLf;
2775 $XML_SEPA_INFO .=
' <CdtrAcct>' . $CrLf;
2776 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2777 $XML_SEPA_INFO .=
' <IBAN>' . preg_replace(
'/\s/',
'', $this->emetteur_iban) .
'</IBAN>' . $CrLf;
2778 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2779 $XML_SEPA_INFO .=
' </CdtrAcct>' . $CrLf;
2780 $XML_SEPA_INFO .=
' <CdtrAgt>' . $CrLf;
2781 $XML_SEPA_INFO .=
' <FinInstnId>' . $CrLf;
2782 $XML_SEPA_INFO .=
' <BIC>' . $this->emetteur_bic .
'</BIC>' . $CrLf;
2783 $XML_SEPA_INFO .=
' </FinInstnId>' . $CrLf;
2784 $XML_SEPA_INFO .=
' </CdtrAgt>' . $CrLf;
2793 $XML_SEPA_INFO .=
' <ChrgBr>SLEV</ChrgBr>' . $CrLf;
2794 $XML_SEPA_INFO .=
' <CdtrSchmeId>' . $CrLf;
2795 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2796 $XML_SEPA_INFO .=
' <PrvtId>' . $CrLf;
2797 $XML_SEPA_INFO .=
' <Othr>' . $CrLf;
2798 $XML_SEPA_INFO .=
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf;
2799 $XML_SEPA_INFO .=
' <SchmeNm>' . $CrLf;
2800 $XML_SEPA_INFO .=
' <Prtry>SEPA</Prtry>' . $CrLf;
2801 $XML_SEPA_INFO .=
' </SchmeNm>' . $CrLf;
2802 $XML_SEPA_INFO .=
' </Othr>' . $CrLf;
2803 $XML_SEPA_INFO .=
' </PrvtId>' . $CrLf;
2804 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2805 $XML_SEPA_INFO .=
' </CdtrSchmeId>' . $CrLf;
2808 $XML_SEPA_INFO =
'';
2809 $XML_SEPA_INFO .=
' <PmtInf>' . $CrLf;
2810 $XML_SEPA_INFO .=
' <PmtInfId>' . (
'DOL/' . $dateTime_YMD .
'/CT' . $IdBon .
'-' . $RefBon) .
'</PmtInfId>' . $CrLf;
2811 $XML_SEPA_INFO .=
' <PmtMtd>TRF</PmtMtd>' . $CrLf;
2813 $XML_SEPA_INFO .=
' <NbOfTxs>' . $nombre .
'</NbOfTxs>' . $CrLf;
2814 $XML_SEPA_INFO .=
' <CtrlSum>' . $total .
'</CtrlSum>' . $CrLf;
2815 if (!empty($this->sepa_xml_pti_in_ctti) && !empty($format)) {
2816 $XML_SEPA_INFO .=
' <PmtTpInf>' . $CrLf;
2817 $XML_SEPA_INFO .=
' <SvcLvl>' . $CrLf;
2818 $XML_SEPA_INFO .=
' <Cd>SEPA</Cd>' . $CrLf;
2819 $XML_SEPA_INFO .=
' </SvcLvl>' . $CrLf;
2820 $XML_SEPA_INFO .=
' <LclInstrm>' . $CrLf;
2821 $XML_SEPA_INFO .=
' <Cd>' . $localInstrument .
'</Cd>' . $CrLf;
2822 $XML_SEPA_INFO .=
' </LclInstrm>' . $CrLf;
2823 $XML_SEPA_INFO .=
' <SeqTp>' . $format .
'</SeqTp>' . $CrLf;
2824 $XML_SEPA_INFO .=
' </PmtTpInf>' . $CrLf;
2826 $XML_SEPA_INFO .=
' <ReqdExctnDt>' .
dol_print_date($dateTime_ETAD,
'dayrfc') .
'</ReqdExctnDt>' . $CrLf;
2827 $XML_SEPA_INFO .=
' <Dbtr>' . $CrLf;
2829 $XML_SEPA_INFO .=
' <PstlAdr>' . $CrLf;
2830 $XML_SEPA_INFO .=
' <Ctry>' . $country[1] .
'</Ctry>' . $CrLf;
2831 $addressline1 = strtr(
getDolGlobalString(
'MAIN_INFO_SOCIETE_ADDRESS'), array(chr(13) =>
", ", chr(10) =>
""));
2833 if ($addressline1) {
2836 if ($addressline2) {
2839 $XML_SEPA_INFO .=
' </PstlAdr>' . $CrLf;
2840 $XML_SEPA_INFO .=
' </Dbtr>' . $CrLf;
2841 $XML_SEPA_INFO .=
' <DbtrAcct>' . $CrLf;
2842 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2843 $XML_SEPA_INFO .=
' <IBAN>' . preg_replace(
'/\s/',
'', $this->emetteur_iban) .
'</IBAN>' . $CrLf;
2844 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2845 $XML_SEPA_INFO .=
' </DbtrAcct>' . $CrLf;
2846 $XML_SEPA_INFO .=
' <DbtrAgt>' . $CrLf;
2847 $XML_SEPA_INFO .=
' <FinInstnId>' . $CrLf;
2848 $XML_SEPA_INFO .=
' <BIC>' . $this->emetteur_bic .
'</BIC>' . $CrLf;
2849 $XML_SEPA_INFO .=
' </FinInstnId>' . $CrLf;
2850 $XML_SEPA_INFO .=
' </DbtrAgt>' . $CrLf;
2859 $XML_SEPA_INFO .=
' <ChrgBr>SLEV</ChrgBr>' . $CrLf;
2874 fwrite($this->file,
'INCORRECT EMETTEUR ' . $this->raison_sociale . $CrLf);
2875 $XML_SEPA_INFO =
'';
2877 return $XML_SEPA_INFO;
2890 fwrite($this->file,
"08");
2891 fwrite($this->file,
"08");
2893 fwrite($this->file,
" ");
2895 fwrite($this->file, $this->emetteur_ics);
2899 fwrite($this->file, substr(
" ", 0, 12));
2904 fwrite($this->file, substr(
" ", 0, 24));
2908 fwrite($this->file, substr(
" ", 0, 24));
2912 fwrite($this->file, substr(
" ", 0, 8));
2916 fwrite($this->file, substr(
" ", 0, 5));
2920 fwrite($this->file, substr(
" ", 0, 11));
2924 $montant = ($total * 100);
2926 fwrite($this->file, substr(
"000000000000000" . $montant, -16));
2930 fwrite($this->file, substr(
" ", 0, 31));
2934 fwrite($this->file, substr(
" ", 0, 5));
2938 fwrite($this->file, substr(
" ", 0, 5));
2940 fwrite($this->file,
"\n");
2965 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2968 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'StatusWaiting');
2969 $this->labelStatus[self::STATUS_TRANSFERED] = $langs->transnoentitiesnoconv(
'StatusTrans');
2970 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'StatusWaiting');
2971 $this->labelStatusShort[self::STATUS_TRANSFERED] = $langs->transnoentitiesnoconv(
'StatusTrans');
2972 if ($this->
type ==
'bank-transfer') {
2973 $this->labelStatus[self::STATUS_DEBITED] = $langs->transnoentitiesnoconv(
'StatusDebited');
2974 $this->labelStatusShort[self::STATUS_DEBITED] = $langs->transnoentitiesnoconv(
'StatusDebited');
2976 $this->labelStatus[self::STATUS_CREDITED] = $langs->transnoentitiesnoconv(
'StatusCredited');
2977 $this->labelStatusShort[self::STATUS_CREDITED] = $langs->transnoentitiesnoconv(
'StatusCredited');
2979 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
2980 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
2983 $statusType =
'status1';
2984 if ($status == self::STATUS_TRANSFERED) {
2985 $statusType =
'status3';
2987 if ($status == self::STATUS_CREDITED || $status == self::STATUS_DEBITED) {
2988 $statusType =
'status6';
2990 if ($status == self::STATUS_CANCELED) {
2991 $statusType =
'status9';
2994 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
3008 global
$conf, $langs;
3014 if ($mode ==
'direct-debit') {
3015 $sql =
"SELECT p.rowid, p.date_trans as date_trans, p.date_credit as date_credit";
3016 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as p";
3017 $sql .=
" WHERE p.entity IN (" .
getEntity(
'prelevement_bons') .
")";
3018 $sql .=
" AND (p.type = 'debit-order' OR p.type = 'direct-debit')";
3019 $sql .=
" AND p.statut < ".((int) BonPrelevement::STATUS_DEBITED);
3021 $sql =
"SELECT p.rowid, p.date_trans as date_trans, p.date_credit as date_credit";
3022 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as p";
3023 $sql .=
" WHERE p.entity IN (" .
getEntity(
'prelevement_bons') .
")";
3024 $sql .=
" AND (p.type = 'bank-transfer' OR p.type = 'credit-transfer')";
3025 $sql .=
" AND p.statut < ".((int) BonPrelevement::STATUS_CREDITED);
3028 $resql = $this->db->query($sql);
3030 $langs->load(
"banks");
3034 if ($mode ==
'direct-debit') {
3035 $response->warning_delay =
$conf->warning_delays[
'bank_direct_debit'] / 60 / 60 / 24;
3036 $response->label = $langs->trans(
"PendingDirectDebitToComplete");
3037 $response->labelShort = $langs->trans(
"PendingDirectDebitToCompleteShort");
3038 $response->url = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&search_status=0,1';
3039 $response->url_late = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&search_status=0,1';
3041 $response->warning_delay =
$conf->warning_delays[
'bank_credit_transfer'] / 60 / 60 / 24;
3042 $response->label = $langs->trans(
"PendingCreditTransferToComplete");
3043 $response->labelShort = $langs->trans(
"PendingCreditTransferToCompleteShort");
3044 $response->url = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&type=bank-transfer&search_status=0,1';
3045 $response->url_late = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&type=bank-transfer&search_status=0,1';
3049 $response->nbtodo = 0;
3050 $response->nbtodolate = 0;
3052 while ($obj = $this->db->fetch_object($resql)) {
3053 $response->nbtodo++;
3055 if ($this->db->jdate($obj->date_trans) < ($now - $response->warning_delay)) {
3056 $response->nbtodolate++;
3068 $this->error = $this->db->error();
3084 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3086 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3087 $return .=
'<div class="info-box info-box-sm">';
3088 $return .=
'<span class="info-box-icon bg-infobox-action">';
3090 $return .=
'</span>';
3091 $return .=
'<div class="info-box-content">';
3092 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">' . $this->
getNomUrl(1) .
'</span>';
3093 if ($selected >= 0) {
3094 $return .=
'<input id="cb' . $this->
id .
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="' . $this->
id .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
3107 if (isset($this->
amount)) {
3108 $return .=
'<br><span class="opacitymedium">' . $langs->trans(
"Amount") .
'</span> : <span class="amount">' .
price($this->
amount) .
'</span>';
3110 $return .=
'<br><div class="info-box-status">' . $this->
getLibStatut(3) .
'</div>';
3111 $return .=
'</div>';
3112 $return .=
'</div>';
3113 $return .=
'</div>';
3124 if (!empty($this->
id)) {
3129 $sql =
"SELECT COUNT(*) AS nb FROM " . MAIN_DB_PREFIX .
"prelevement_lignes";
3130 $sql .=
" WHERE fk_prelevement_bons = " . ((int) $id);
3131 $sql .=
" AND fk_soc = 0";
3132 $sql .=
" AND fk_user IS NOT NULL";
3135 $resql = $this->db->query($sql);
3137 $obj = $this->db->fetch_object($resql);
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.
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.
generate(string $format='ALL', 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.
deleteNotification($user, $action)
Delete a notification.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
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.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
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.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
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.
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
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_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.
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)
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
dolBECalculateStructuredCommunication($invoice_number, $invoice_type)
Calculate Structured Communication / BE Bank payment reference number.
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
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...
dolDecrypt($chain, $key='', $patterntotest='')
Decode a string with a symmetric encryption.