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 (";
464 $sql .= ((int) $this->
id);
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 =
'FRST', $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=".(is_array($dids) ? implode(
',', $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 $format = strtoupper($format);
1110 if (empty($format)) {
1111 $this->error =
'ErrorBadParametersForDirectDebitFileCreate';
1114 if ($mode ===
'real' && !in_array($format, array(
'FRST',
'RCUR',
'OOFF',
'FNAL'),
true)) {
1115 $this->error =
'ErrorBadParametersForDirectDebitFileCreate';
1120 if (!is_int($dids) && !is_array($dids)) {
1121 $this->error =
'ErrorBadParametersForDirectDebitFileCreateDids';
1126 if (empty($fk_bank_account)) {
1127 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
1129 if (is_int($dids)) {
1130 $dids = array($dids);
1135 if ($sourcetype !=
'salary') {
1136 $entity = $type !=
'bank-transfer' ?
getEntity(
'invoice', 1) :
getEntity(
'supplier_invoice', 1);
1137 $sqlTable = $type !=
'bank-transfer' ?
"facture" :
"facture_fourn";
1138 $socOrUser =
'fk_soc';
1139 $societeOrUser =
'societe';
1142 $sqlTable =
'salary';
1143 $socOrUser =
'fk_user';
1144 $societeOrUser =
'user';
1175 $datetimeprev =
dol_now(
'gmt');
1177 if (!empty($executiondate)) {
1178 $datetimeprev = $executiondate;
1184 $this->invoice_in_error = array();
1185 $this->thirdparty_in_error = array();
1188 $factures = array();
1189 $factures_prev = array();
1190 $factures_prev_id = array();
1192 dol_syslog(__METHOD__ .
" Read invoices/salaries for dids=" . implode(
', ', $dids), LOG_DEBUG);
1194 $sql =
"SELECT f.rowid, pd.rowid as pfdrowid";
1195 $sql .=
", f.".$this->db->sanitize($socOrUser);
1196 $sql .=
", pd.code_banque, pd.code_guichet, pd.number, pd.cle_rib";
1197 $sql .=
", pd.amount";
1198 if ($sourcetype !=
'salary') {
1199 $sql .=
", s.nom as name";
1201 $sql .=
", sr.bic, sr.iban_prefix, sr.frstrecur, sr.default_rib, sr.rum";
1203 $sql .=
", CONCAT(s.firstname, ' ', s.lastname) as name";
1205 $sql .=
", sr.bic, sr.iban_prefix, 'FRST' as frstrecur, sr.default_rib, '' as rum";
1207 $sql .=
", pd.fk_societe_rib as soc_rib_id";
1208 $sql .=
" FROM " . $this->db->prefix() . $sqlTable .
" as f";
1209 $sql .=
" INNER JOIN " . $this->db->prefix() .
"prelevement_demande as pd ON f.rowid = pd.fk_".$this->db->sanitize($sqlTable);
1210 $sql .=
" LEFT JOIN " . $this->db->prefix() . $this->db->sanitize($societeOrUser).
" as s ON s.rowid = f.".$this->db->sanitize($socOrUser);
1211 $sql .=
" LEFT JOIN " . $this->db->prefix() . $this->db->sanitize($societeOrUser.
"_rib").
" as sr ON s.rowid = sr.".$this->db->sanitize($socOrUser);
1212 if ($sourcetype !=
'salary') {
1213 $sql .=
" AND sr.default_rib = 1";
1214 $sql .=
" AND sr.type = 'ban'";
1222 $sql .=
" WHERE f.entity IN (".((int) $entity).
')';
1223 if ($sourcetype !=
'salary') {
1224 $sql .=
" AND f.fk_statut = ".Facture::STATUS_VALIDATED;
1225 $sql .=
" AND f.paye = 0";
1226 $sql .=
" AND f.total_ttc > 0";
1232 $sql .=
" AND f.paye = 0";
1233 $sql .=
" AND f.amount > 0";
1235 $sql .=
" AND pd.traite = 0";
1236 $sql .=
" AND pd.ext_payment_id IS NULL";
1237 if ($dids !== [0] && !empty($dids)) {
1238 $sql .=
" AND pd.rowid IN (".$this->db->sanitize(implode(
',', $dids)).
")";
1241 $resql = $this->db->query($sql);
1243 $num = $this->db->num_rows($resql);
1247 $row = $this->db->fetch_row($resql);
1248 '@phan-var-force array<int<0,12>,string> $row';
1255 $factures[$i] = $row;
1258 $factures[$i][11] =
dolDecrypt($factures[$i][11]);
1262 dol_syslog(__METHOD__ .
" Read invoices/salaries error Found a null amount", LOG_WARNING);
1263 $this->invoice_in_error[$row[0]] =
"Error for invoice or salary id " . $row[0] .
", found a null amount";
1269 $this->db->free($resql);
1270 dol_syslog(__METHOD__ .
" Read invoices/salaries, " . $i .
" invoices/salaries to withdraw", LOG_DEBUG);
1272 $this->error = $this->db->lasterror();
1273 dol_syslog(__METHOD__ .
" Read invoices/salaries error " . $this->db->lasterror(), LOG_ERR);
1279 require_once DOL_DOCUMENT_ROOT .
'/societe/class/societe.class.php';
1280 require_once DOL_DOCUMENT_ROOT .
'/user/class/user.class.php';
1281 require_once DOL_DOCUMENT_ROOT .
'/societe/class/companybankaccount.class.php';
1282 require_once DOL_DOCUMENT_ROOT .
'/core/lib/bank.lib.php';
1284 $tmpsoc =
new Societe($this->db);
1285 $tmpuser =
new User($this->db);
1289 dol_syslog(__METHOD__ .
" Check BAN for each invoices or salaries", LOG_DEBUG);
1291 if (count($factures) > 0) {
1292 foreach ($factures as $key => $fac) {
1296 if ($fac[8] !=
null) {
1297 if ($type !=
'bank-transfer') {
1298 if ($format ==
'FRST' && $fac[12] && $fac[12] !=
'FRST') {
1301 if ($format ==
'RCUR' && $fac[12] && $fac[12] !=
'RCUR') {
1308 if (!empty($fac[15])) {
1310 $bankaccount->fetch((
int) $fac[15]);
1311 if ($bankaccount->id > 0) {
1312 $fac[3] = $bankaccount->code_banque;
1313 $fac[4] = $bankaccount->code_guichet;
1314 $fac[5] = $bankaccount->number;
1315 $fac[6] = $bankaccount->cle_rib;
1316 $fac[10] = $bankaccount->bic;
1317 $fac[11] = $bankaccount->iban;
1318 $fac[14] = $bankaccount->rum;
1323 $bicinloop = $fac[10];
1324 $baninloop = $fac[11];
1328 if ($verif || (empty($fac[10]) &&
getDolGlobalInt(
"WITHDRAWAL_WITHOUT_BIC"))) {
1329 dol_syslog(__METHOD__.
" now call checkIbanForAccount(null, ".$baninloop.
")");
1334 $factures_prev[$i] = $fac;
1336 $factures_prev_id[$i] = $fac[0];
1340 if ($type !=
'bank-transfer') {
1341 $tmpsoc->id = (int) $fac[2];
1342 $tmpsoc->name = $fac[8];
1343 $invoice_url =
"<a href='" . DOL_URL_ROOT .
'/compta/facture/card.php?facid=' . $fac[0] .
"'>" . $fac[9] .
"</a>";
1344 $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);
1345 $this->thirdparty_in_error[$tmpsoc->id] =
"Error on default bank number IBAN/BIC for invoice " . $invoice_url .
" for thirdparty " . $tmpsoc->getNomUrl(0);
1348 if ($type ==
'bank-transfer' && $sourcetype !=
'salary') {
1349 $tmpsoc->id = (int) $fac[2];
1350 $tmpsoc->name = $fac[8];
1351 $invoice_url =
"<a href='" . DOL_URL_ROOT .
'/fourn/facture/card.php?facid=' . $fac[0] .
"'>" . $fac[9] .
"</a>";
1352 $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);
1353 $this->thirdparty_in_error[$tmpsoc->id] =
"Error on default bank number IBAN/BIC for invoice " . $invoice_url .
" for thirdparty " . $tmpsoc->getNomUrl(0);
1356 if ($type ==
'bank-transfer' && $sourcetype ==
'salary') {
1357 $tmpuser->id = (int) $fac[2];
1358 $tmpuser->firstname = $fac[8];
1359 $salary_url =
"<a href='" . DOL_URL_ROOT .
'/salaries/card.php?id=' . $fac[0] .
"'>" . $fac[0] .
"</a>";
1360 $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);
1361 $this->thirdparty_in_error[$tmpuser->id] =
"Error on default bank number IBAN/BIC for salary " . $salary_url .
" for employee " . $tmpuser->getNomUrl(0);
1364 dol_syslog(__METHOD__ .
" Check BAN Error on default bank number IBAN/BIC reported by verif(): " . implode(
', ', $fac), LOG_WARNING);
1367 dol_syslog(__METHOD__ .
" Check BAN Failed to read company", LOG_WARNING);
1376 dol_syslog(__METHOD__ .
" Check BAN No invoice to process", LOG_WARNING);
1383 $out = count($factures_prev) .
" invoices or salaries will be included.";
1388 if (count($factures_prev) > 0) {
1389 if ($mode ==
'real') {
1392 print $langs->trans(
"ModeWarning");
1409 $ref = substr($year, -2) . $month;
1414 $sql =
"SELECT SUBSTRING(ref, 6) AS refnumber";
1415 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons";
1416 $sql .=
" WHERE ref LIKE '" . $this->db->escape($prefixt . $ref) .
"%'";
1417 $sql .=
" AND entity = " . ((int)
$conf->entity);
1418 $sql .=
" ORDER BY LENGTH(ref) DESC, ref DESC";
1421 dol_syslog(get_class($this) .
" get next free number", LOG_DEBUG);
1423 $resql = $this->db->query($sql);
1426 $row = $this->db->fetch_row($resql);
1429 $ref = $prefixt . $ref . sprintf(
"%03d", (intval($row[0] ?? 0) + 1));
1435 if ($type !=
'bank-transfer') {
1436 $dir =
$conf->prelevement->dir_output .
'/receipts';
1438 $dir =
$conf->paymentbybanktransfer->dir_output .
'/receipts';
1440 if (!is_dir($dir)) {
1445 $labelentity =
$conf->entity;
1446 $this->filename = $dir .
'/' . $ref .
'-' . $labelentity .
'.xml';
1448 $this->filename = $dir .
'/' . $ref .
'.xml';
1452 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"prelevement_bons (";
1453 $sql .=
"ref, entity, datec, type, fk_bank_account";
1454 $sql .=
") VALUES (";
1455 $sql .=
"'" . $this->db->escape($ref) .
"'";
1456 $sql .=
", " . ((int)
$conf->entity);
1457 $sql .=
", '" . $this->db->idate($now) .
"'";
1458 $sql .=
", '" . ($type ==
'bank-transfer' ?
'bank-transfer' :
'debit-order') .
"'";
1459 $sql .=
", " . ((int) $fk_bank_account);
1462 $resql = $this->db->query($sql);
1465 $prev_id = $this->db->last_insert_id(MAIN_DB_PREFIX .
"prelevement_bons");
1466 $this->
id = $prev_id;
1470 $this->errors[] = $this->db->lasterror();
1471 dol_syslog(__METHOD__ .
" Create withdraw receipt " . $this->db->lasterror(), LOG_ERR);
1475 $this->errors[] = $this->db->lasterror();
1476 dol_syslog(__METHOD__ .
" Get last withdraw receipt " . $this->db->lasterror(), LOG_ERR);
1481 dol_syslog(__METHOD__ .
" Now loop on each document to insert them in llx_prelevement_demande");
1484 if (count($factures_prev) > 0) {
1485 foreach ($factures_prev as $fac) {
1529 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_demande";
1530 $sql .=
" SET traite = 1";
1531 $sql .=
", date_traite = '" . $this->db->idate($now) .
"'";
1532 $sql .=
", fk_prelevement_bons = " . ((int) $this->
id);
1533 $sql .=
" WHERE rowid = " . ((int) $fac[1]);
1535 $resql = $this->db->query($sql);
1538 $this->errors[] = $this->db->lasterror();
1539 dol_syslog(__METHOD__ .
" Update Error=" . $this->db->lasterror(), LOG_ERR);
1550 dol_syslog(__METHOD__ .
" Init direct debit or credit transfer file for " . count($factures_prev) .
" invoices", LOG_DEBUG);
1552 if (count($factures_prev) > 0) {
1553 $this->date_echeance = $datetimeprev;
1554 $this->reference_remise = $ref;
1556 $account =
new Account($this->db);
1557 if ($account->fetch($fk_bank_account) > 0) {
1558 $this->emetteur_code_banque = $account->code_banque;
1559 $this->emetteur_code_guichet = $account->code_guichet;
1560 $this->emetteur_numero_compte = $account->number;
1561 $this->emetteur_number_key = $account->cle_rib;
1562 $this->sepa_xml_pti_in_ctti = (bool) $account->pti_in_ctti;
1563 $this->emetteur_iban = $account->iban;
1564 $this->emetteur_bic = $account->bic;
1566 $this->emetteur_ics = (($type ==
'bank-transfer' &&
getDolGlobalString(
"SEPA_USE_IDS")) ? $account->ics_transfer : $account->ics);
1568 $this->raison_sociale = $account->owner_name;
1570 $this->factures = $factures_prev_id;
1571 $this->context[
'factures_prev'] = $factures_prev;
1575 if ($sourcetype ==
'salary') {
1576 $userid = $this->context[
'factures_prev'][0][2];
1578 $result = $this->
generate($format, $executiondate, $type, $fk_bank_account, $userid, 0);
1585 dol_syslog(__METHOD__ .
" Bank order file has been generated under filename " . $this->filename, LOG_DEBUG);
1593 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_bons";
1594 $sql .=
" SET amount = " .
price2num($this->total);
1595 $sql .=
" WHERE rowid = " . ((int) $this->
id);
1596 $sql .=
" AND entity = " . ((int)
$conf->entity);
1597 $resql = $this->db->query($sql);
1601 dol_syslog(__METHOD__ .
" Error update total: " . $this->db->error(), LOG_ERR);
1605 if (!$error && !$notrigger) {
1606 $triggerName = ($type ==
'bank-transfer') ?
'CREDIT_TRANSFER_ORDER_CREATE' :
'DIRECT_DEBIT_ORDER_CREATE';
1607 $this->
amount = $this->total;
1610 $result = $this->call_trigger($triggerName, $user);
1618 $this->db->commit();
1619 return count($factures_prev);
1621 $this->db->rollback();
1637 public function delete($user, $notrigger = 0)
1642 $resql1 = $resql2 = $resql3 = $resql4 = 0;
1645 $triggername =
'DIRECT_DEBIT_ORDER_DELETE';
1646 if ($this->
type ==
'bank-transfer') {
1647 $triggername =
'PAYMENTBYBANKTRANFER_DELETE';
1650 $result = $this->call_trigger($triggername, $user);
1658 $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) .
")";
1659 $resql1 = $this->db->query($sql);
1666 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"prelevement_lignes WHERE fk_prelevement_bons = " . ((int) $this->
id);
1667 $resql2 = $this->db->query($sql);
1674 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"prelevement_bons WHERE rowid = " . ((int) $this->
id);
1675 $resql3 = $this->db->query($sql);
1682 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_demande SET fk_prelevement_bons = NULL, traite = 0 WHERE fk_prelevement_bons = " . ((int) $this->
id);
1683 $resql4 = $this->db->query($sql);
1689 if ($resql1 && $resql2 && $resql3 && $resql4 && !$error) {
1690 $this->db->commit();
1693 $this->db->rollback();
1709 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
1711 global
$conf, $langs, $hookmanager;
1713 if (!empty(
$conf->dol_no_mouse_hover)) {
1719 $labeltoshow =
'PaymentByDirectDebit';
1720 $labelforclosedate =
'CreditDate';
1721 if (!empty($this->
type) && $this->
type ==
'bank-transfer') {
1722 $labeltoshow =
'PaymentByBankTransfer';
1723 $labelforclosedate =
'ClosedOn';
1726 $label =
img_picto(
'', $this->picto) .
' <u>' . $langs->trans($labeltoshow) .
'</u> ' . $this->
getLibStatut(5);
1728 $label .=
'<b>' . $langs->trans(
'Ref') .
':</b> ' . $this->ref;
1729 if (isset($this->
amount)) {
1730 $label .=
'<br><b>' . $langs->trans(
"Amount") .
':</b> <span class="amount">' .
price($this->
amount).
'</span>';
1732 if (isset($this->date_creation)) {
1733 $label .=
'<br><b>'.$langs->trans(
"DateCreation").
":</b> ".
dol_print_date($this->date_creation,
'dayhour',
'tzuserrel');
1735 if (isset($this->date_trans)) {
1736 $label .=
'<br><b>' . $langs->trans(
"TransData") .
":</b> " .
dol_print_date($this->date_trans,
'dayhour',
'tzuserrel');
1738 if (isset($this->date_credit)) {
1739 $label .=
'<br><b>'.$langs->trans($labelforclosedate).
":</b> ".
dol_print_date($this->date_credit,
'dayhour',
'tzuserrel');
1742 $url = DOL_URL_ROOT .
'/compta/prelevement/card.php?id=' . $this->id;
1743 if (!empty($this->
type) && $this->
type ==
'bank-transfer') {
1744 $url = DOL_URL_ROOT .
'/compta/prelevement/card.php?id=' . $this->id;
1747 if ($option !=
'nolink') {
1749 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1750 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1751 $add_save_lastsearch_values = 1;
1753 if ($add_save_lastsearch_values) {
1754 $url .=
'&save_lastsearch_values=1';
1759 if (empty($notooltip)) {
1761 $label = $langs->trans(
"ShowMyObject");
1765 $linkclose .=
' class="classfortooltip' . ($morecss ?
' ' . $morecss :
'') .
'"';
1767 $linkclose = ($morecss ?
' class="' . $morecss .
'"' :
'');
1770 $linkstart =
'<a href="' . $url .
'"';
1771 $linkstart .= $linkclose .
'>';
1774 $result .= $linkstart;
1776 $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);
1778 if ($withpicto != 2) {
1779 $result .= $this->ref;
1781 $result .= $linkend;
1783 global $action, $hookmanager;
1784 $hookmanager->initHooks(array(
'banktransferdao'));
1785 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1786 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1788 $result = $hookmanager->resPrint;
1790 $result .= $hookmanager->resPrint;
1805 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"notify_def";
1806 $sql .=
" WHERE rowid = " . ((int) $rowid);
1808 if ($this->db->query($sql)) {
1824 if (is_object($user)) {
1825 $userid = $user->id;
1830 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"notify_def";
1831 $sql .=
" WHERE fk_user = " . ((int) $userid) .
" AND fk_action = " . ((int) $action);
1833 if ($this->db->query($sql)) {
1854 if (is_object($user)) {
1855 $userid = $user->id;
1863 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"notify_def (datec, fk_user, fk_soc, fk_contact, fk_action)";
1864 $sql .=
" VALUES ('" . $this->db->idate($now) .
"', " . ((int) $userid) .
", NULL, NULL, " . ((int) $action) .
")";
1867 if ($this->db->query($sql)) {
1871 dol_syslog(get_class($this) .
"::addNotification Error $result");
1894 public function generate(
string $format =
'FRST',
int $executiondate = 0,
string $type =
'direct-debit',
int $fk_bank_account = 0,
int $forsalary = 0,
int $thirdpartyBANId = 0)
1898 if ($type !==
'bank-transfer') {
1899 $format = strtoupper($format);
1900 if (!in_array($format, array(
'FRST',
'RCUR',
'OOFF',
'FNAL'),
true)) {
1901 $this->error =
'ErrorBadParametersForDirectDebitFileCreate';
1909 if (empty($fk_bank_account)) {
1910 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
1915 dol_syslog(get_class($this) .
"::generate build file=" . $this->filename .
" type=" . $type);
1917 $this->file = fopen($this->filename,
"w");
1918 if ($this->file ==
false) {
1919 $this->error = $langs->trans(
'ErrorFailedToOpenFile', $this->filename);
1927 if (
$mysoc->isInSEPA()) {
1930 if ($type !=
'bank-transfer') {
1942 if (!empty($executiondate)) {
1943 $date_actu = $executiondate;
1948 $fileDebiteurSection =
'';
1949 $fileEmetteurSection =
'';
1956 $sql =
"SELECT soc.rowid as socid, soc.code_client as code, soc.address, soc.zip, soc.town, c.code as country_code,";
1958 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
1959 $sql .=
" f.ref as reffac,";
1960 $sql .=
" p.fk_facture as idfac, p.rowid as pid,";
1961 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, rib.rum, rib.date_rum";
1963 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
1964 $sql .=
" " . MAIN_DB_PREFIX .
"facture as f,";
1965 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
1966 $sql .=
" " . MAIN_DB_PREFIX .
"societe as soc,";
1967 $sql .=
" " . MAIN_DB_PREFIX .
"c_country as c,";
1968 $sql .=
" " . MAIN_DB_PREFIX .
"societe_rib as rib";
1969 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
1970 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
1971 $sql .=
" AND p.fk_facture = f.rowid";
1972 $sql .=
" AND f.fk_soc = soc.rowid";
1973 $sql .=
" AND soc.fk_pays = c.rowid";
1974 $sql .=
" AND rib.fk_soc = f.fk_soc";
1975 if (!empty($thirdpartyBANId)) {
1976 $sql .=
" AND rib.rowid = " . ((int) $thirdpartyBANId);
1978 $sql .=
" AND rib.default_rib = 1";
1980 $sql .=
" AND rib.type = 'ban'";
1983 $resql = $this->db->query($sql);
1984 $nbtotalDrctDbtTxInf = -1;
1986 $cachearraytotestduplicate = array();
1988 $num = $this->db->num_rows($resql);
1990 $obj = $this->db->fetch_object($resql);
1992 if (!empty($cachearraytotestduplicate[$obj->idfac])) {
1993 $this->error = $langs->trans(
'ErrorCompanyHasDuplicateDefaultBAN', $obj->socid);
1994 $this->invoice_in_error[$obj->idfac] = $this->error;
1998 $cachearraytotestduplicate[$obj->idfac] = $obj->rowid;
2001 $daterum = (!empty($obj->date_rum)) ? $this->db->jdate($obj->date_rum) : $this->db->jdate($obj->datec);
2008 if (!empty($obj->fk_prelevement_demande)) {
2009 $companybankaccountid = 0;
2011 $sqltmp =
"SELECT fk_societe_rib FROM ".MAIN_DB_PREFIX.
"prelevement_demande";
2012 $sqltmp .=
" WHERE rowid = ".((int) $obj->fk_prelevement_demande);
2014 $resqltmp = $this->db->query($sqltmp);
2016 $objtmp = $this->db->fetch_object($resqltmp);
2018 $companybankaccountid = (int) $objtmp->fk_societe_rib;
2022 $bankaccount->fetch($companybankaccountid);
2023 if ($bankaccount->id > 0) {
2024 $daterum = $bankaccount->date_rum;
2025 $iban = $bankaccount->iban;
2026 $bic = $bankaccount->bic;
2027 $drum = $bankaccount->id;
2028 $rum = $bankaccount->rum;
2032 $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);
2034 $this->total += $obj->somme;
2037 $nbtotalDrctDbtTxInf = $i;
2039 $this->error = $this->db->lasterror();
2040 fwrite($this->file,
'ERROR DEBITOR ' . $sql . $CrLf);
2045 if ($result != -2) {
2046 $fileEmetteurSection .= $this->
EnregEmetteurSEPA($conf, $date_actu, $nbtotalDrctDbtTxInf, $this->total, $CrLf, $format, $type, $fk_bank_account);
2050 $this->total = number_format((
float)
price2num($this->total,
'MT'), 2,
".",
"");
2057 fwrite($this->file,
'<' .
'?xml version="1.0" encoding="UTF-8" standalone="yes"?' .
'>' . $CrLf);
2058 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);
2059 fwrite($this->file,
' <CstmrDrctDbtInitn>' . $CrLf);
2061 fwrite($this->file,
' <GrpHdr>' . $CrLf);
2062 fwrite($this->file,
' <MsgId>' . (
'DOL/' . $dateTime_YMD .
'/DD' . $this->
id) .
'</MsgId>' . $CrLf);
2063 fwrite($this->file,
' <CreDtTm>' . $dateTime_ECMA .
'</CreDtTm>' . $CrLf);
2064 fwrite($this->file,
' <NbOfTxs>' . $i .
'</NbOfTxs>' . $CrLf);
2065 fwrite($this->file,
' <CtrlSum>' . $this->total .
'</CtrlSum>' . $CrLf);
2066 fwrite($this->file,
' <InitgPty>' . $CrLf);
2068 fwrite($this->file,
' <Id>' . $CrLf);
2069 fwrite($this->file,
' <PrvtId>' . $CrLf);
2070 fwrite($this->file,
' <Othr>' . $CrLf);
2071 fwrite($this->file,
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf);
2072 fwrite($this->file,
' </Othr>' . $CrLf);
2073 fwrite($this->file,
' </PrvtId>' . $CrLf);
2074 fwrite($this->file,
' </Id>' . $CrLf);
2075 fwrite($this->file,
' </InitgPty>' . $CrLf);
2076 fwrite($this->file,
' </GrpHdr>' . $CrLf);
2078 if ($result != -2) {
2079 fwrite($this->file, $fileEmetteurSection);
2082 if ($result != -2) {
2083 fwrite($this->file, $fileDebiteurSection);
2086 fwrite($this->file,
' </PmtInf>' . $CrLf);
2087 fwrite($this->file,
' </CstmrDrctDbtInitn>' . $CrLf);
2088 fwrite($this->file,
'</Document>' . $CrLf);
2101 if (!empty($executiondate)) {
2102 $date_actu = $executiondate;
2107 $fileCrediteurSection =
'';
2108 $fileEmetteurSection =
'';
2114 if (!empty($forsalary)) {
2115 $sql =
"SELECT u.rowid as userId, u.address, u.zip, u.town, c.code as country_code, CONCAT(u.firstname,' ',u.lastname) as nom,";
2117 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
2118 $sql .=
" s.ref as reffac,";
2119 $sql .=
" p.fk_salary as idfac,";
2120 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, '' as rum, '' as date_rum";
2122 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2123 $sql .=
" " . MAIN_DB_PREFIX .
"salary as s,";
2124 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
2125 $sql .=
" " . MAIN_DB_PREFIX .
"user as u";
2126 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_country as c ON u.fk_country = c.rowid,";
2127 $sql .=
" " . MAIN_DB_PREFIX .
"user_rib as rib";
2128 $sql .=
" WHERE pl.fk_prelevement_bons=" . ((int) $this->
id);
2129 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2130 $sql .=
" AND p.fk_salary = s.rowid";
2131 $sql .=
" AND s.fk_user = u.rowid";
2132 $sql .=
" AND rib.fk_user = s.fk_user";
2134 $sql =
"SELECT soc.rowid as socid, soc.code_client as code, soc.address, soc.zip, soc.town, c.code as country_code,";
2136 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
2137 $sql .=
" f.ref as reffac, f.ref_supplier as fac_ref_supplier,";
2138 $sql .=
" p.fk_facture_fourn as idfac,";
2139 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, rib.rum, rib.date_rum";
2141 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2142 $sql .=
" " . MAIN_DB_PREFIX .
"facture_fourn as f,";
2143 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
2144 $sql .=
" " . MAIN_DB_PREFIX .
"societe as soc";
2145 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_country as c ON soc.fk_pays = c.rowid,";
2146 $sql .=
" " . MAIN_DB_PREFIX .
"societe_rib as rib";
2147 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2148 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2149 $sql .=
" AND p.fk_facture_fourn = f.rowid";
2150 $sql .=
" AND f.fk_soc = soc.rowid";
2151 $sql .=
" AND rib.fk_soc = f.fk_soc";
2152 if (!empty($thirdpartyBANId)) {
2153 $sql .=
" AND rib.rowid = " . ((int) $thirdpartyBANId);
2155 $sql .=
" AND rib.default_rib = 1";
2157 $sql .=
" AND rib.type = 'ban'";
2160 $nbtotalDrctDbtTxInf = -1;
2162 require_once DOL_DOCUMENT_ROOT .
'/societe/class/companybankaccount.class.php';
2164 $resql = $this->db->query($sql);
2166 $cachearraytotestduplicate = array();
2168 $num = $this->db->num_rows($resql);
2170 $obj = $this->db->fetch_object($resql);
2173 if (!empty($cachearraytotestduplicate[$obj->idfac])) {
2174 $this->error = $langs->trans(
'ErrorCompanyHasDuplicateDefaultBAN', $obj->socid);
2175 $this->invoice_in_error[$obj->idfac] = $this->error;
2180 $cachearraytotestduplicate[$obj->idfac] = $obj->rowid;
2183 $daterum = (!empty($obj->date_rum)) ? $this->db->jdate($obj->date_rum) : $this->db->jdate($obj->datec);
2190 if (!empty($obj->fk_prelevement_demande)) {
2191 $companybankaccountid = 0;
2193 $sqltmp =
"SELECT fk_societe_rib FROM ".MAIN_DB_PREFIX.
"prelevement_demande";
2194 $sqltmp .=
" WHERE rowid = ".((int) $obj->fk_prelevement_demande);
2196 $resqltmp = $this->db->query($sqltmp);
2198 $objtmp = $this->db->fetch_object($resqltmp);
2200 $companybankaccountid = (int) $objtmp->fk_societe_rib;
2204 $bankaccount->fetch($companybankaccountid);
2205 if ($bankaccount->id > 0) {
2206 $daterum = $bankaccount->date_rum;
2207 $iban = $bankaccount->iban;
2208 $bic = $bankaccount->bic;
2209 $drum = $bankaccount->id;
2210 $rum = $bankaccount->rum;
2214 $refobj = $obj->reffac;
2215 if (empty($refobj) && !empty($forsalary)) {
2216 $refobj =
"SAL" . $obj->idfac;
2219 $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);
2221 $this->total += $obj->somme;
2224 $nbtotalDrctDbtTxInf = $i;
2226 $this->error = $this->db->lasterror();
2227 fwrite($this->file,
'ERROR CREDITOR ' . $sql . $CrLf);
2231 if ($result != -2) {
2232 $fileEmetteurSection .= $this->
EnregEmetteurSEPA($conf, $date_actu, $nbtotalDrctDbtTxInf, $this->total, $CrLf, $format, $type);
2236 $this->total = number_format((
float)
price2num($this->total,
'MT'), 2,
".",
"");
2243 fwrite($this->file,
'<' .
'?xml version="1.0" encoding="UTF-8" standalone="yes"?' .
'>' . $CrLf);
2244 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);
2245 fwrite($this->file,
' <CstmrCdtTrfInitn>' . $CrLf);
2247 fwrite($this->file,
' <GrpHdr>' . $CrLf);
2248 fwrite($this->file,
' <MsgId>' . (
'DOL/' . $dateTime_YMD .
'/CT' . $this->
id) .
'</MsgId>' . $CrLf);
2249 fwrite($this->file,
' <CreDtTm>' . $dateTime_ECMA .
'</CreDtTm>' . $CrLf);
2250 fwrite($this->file,
' <NbOfTxs>' . $i .
'</NbOfTxs>' . $CrLf);
2251 fwrite($this->file,
' <CtrlSum>' . $this->total .
'</CtrlSum>' . $CrLf);
2252 fwrite($this->file,
' <InitgPty>' . $CrLf);
2254 fwrite($this->file,
' <Id>' . $CrLf);
2255 fwrite($this->file,
' <PrvtId>' . $CrLf);
2256 fwrite($this->file,
' <Othr>' . $CrLf);
2257 fwrite($this->file,
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf);
2258 fwrite($this->file,
' </Othr>' . $CrLf);
2259 fwrite($this->file,
' </PrvtId>' . $CrLf);
2260 fwrite($this->file,
' </Id>' . $CrLf);
2261 fwrite($this->file,
' </InitgPty>' . $CrLf);
2262 fwrite($this->file,
' </GrpHdr>' . $CrLf);
2264 if ($result != -2) {
2265 fwrite($this->file, $fileEmetteurSection);
2268 if ($result != -2) {
2269 fwrite($this->file, $fileCrediteurSection);
2272 fwrite($this->file,
' </PmtInf>' . $CrLf);
2273 fwrite($this->file,
' </CstmrCdtTrfInitn>' . $CrLf);
2274 fwrite($this->file,
'</Document>' . $CrLf);
2280 if ($type !=
'bank-transfer') {
2281 $sql =
"SELECT pl.amount";
2283 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2284 $sql .=
" " . MAIN_DB_PREFIX .
"facture as f,";
2285 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p";
2286 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2287 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2288 $sql .=
" AND p.fk_facture = f.rowid";
2292 $resql = $this->db->query($sql);
2294 $num = $this->db->num_rows($resql);
2297 $obj = $this->db->fetch_object($resql);
2298 $this->total += $obj->amount;
2307 $sql =
"SELECT pl.amount";
2309 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2310 $sql .=
" " . MAIN_DB_PREFIX .
"facture_fourn as f,";
2311 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p";
2312 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2313 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2314 $sql .=
" AND p.fk_facture_fourn = f.rowid";
2317 $resql = $this->db->query($sql);
2319 $num = $this->db->num_rows($resql);
2322 $obj = $this->db->fetch_object($resql);
2323 $this->total += $obj->amount;
2333 $langs->load(
'withdrawals');
2336 fwrite($this->file, $langs->transnoentitiesnoconv(
'WithdrawalFileNotCapable',
$mysoc->country_code));
2339 fclose($this->file);
2361 return $pre .
'-' .
dol_print_date($row_datec,
'dayhourlogsmall') .
'-' .
dol_trunc((
string) $row_drum . ($row_code_client ?
'-' . $row_code_client :
''), 17,
'right',
'UTF-8', 1);
2382 public function EnregDestinataire($rowid, $client_nom, $rib_banque, $rib_guichet, $rib_number, $amount, $ref, $facid, $rib_dom =
'', $type =
'direct-debit')
2385 fwrite($this->file,
"06");
2386 fwrite($this->file,
"08");
2388 fwrite($this->file,
" ");
2390 fwrite($this->file, $this->emetteur_ics);
2394 fwrite($this->file,
" ");
2395 fwrite($this->file,
dol_print_date($this->date_echeance,
"%d%m",
'gmt'));
2396 fwrite($this->file, substr(
dol_print_date($this->date_echeance,
"%y",
'gmt'), 1));
2400 fwrite($this->file, substr(strtoupper($client_nom) .
" ", 0, 24));
2403 $address = strtr($rib_dom, array(
" " =>
"-", chr(13) =>
" ", chr(10) =>
""));
2404 fwrite($this->file, substr($address .
" ", 0, 24));
2408 fwrite($this->file, substr(
" ", 0, 8));
2412 fwrite($this->file, $rib_guichet);
2416 fwrite($this->file, substr(
"000000000000000" . $rib_number, -11));
2420 $montant = (round($amount, 2) * 100);
2422 fwrite($this->file, substr(
"000000000000000" . $montant, -16));
2426 fwrite($this->file, substr(
"*_" . $ref .
"_RDVnet" . $rowid .
" ", 0, 31));
2430 fwrite($this->file, $rib_banque);
2434 fwrite($this->file, substr(
" ", 0, 5));
2436 fwrite($this->file,
"\n");
2466 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 =
'')
2472 $row_somme = number_format((
float)
price2num($row_somme,
'MT'), 2,
".",
"");
2474 $row_somme = round((
float) $row_somme, 2);
2477 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
2480 $Rowing = sprintf(
"%010d", $row_idfac);
2484 $Rum = (empty($row_rum) ? $this->
buildRumNumber($row_code_client, $row_datec, $row_drum) : $row_rum);
2490 if (!is_object($hookmanager)) {
2491 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
2494 $hookmanager->initHooks(array(
'bonprelevementdao'));
2495 $parameters = array(
2496 'row_code_client' => &$row_code_client,
'row_nom' => &$row_nom,
'row_address' => &$row_address,
'row_zip' => &$row_zip,
'row_town' => &$row_town,
2497 'row_country_code' => &$row_country_code,
'row_cb' => &$row_cb,
'row_cg' => &$row_cg,
'row_cc' => &$row_cc,
'row_somme' => &$row_somme,
2498 'row_ref' => &$row_ref,
'row_idfac' => &$row_idfac,
'row_iban' => &$row_iban,
'row_bic' => &$row_bic,
'row_datec' => &$row_datec,
2499 'row_drum' => &$row_drum,
'row_rum' => &$row_rum,
'type' => &$type,
'row_comment' => &$row_comment,
2500 'crlf' => &$CrLf,
'rowing' => &$Rowing,
'rum' => &$Rum,
'dtofsgntr' => &$DtOfSgntr,
2502 $reshook = $hookmanager->executeHooks(
'enregDestinataireSEPA', $parameters, $this);
2503 if (empty($reshook)) {
2504 if ($type !=
'bank-transfer') {
2507 $XML_DEBITOR .=
' <DrctDbtTxInf>' . $CrLf;
2508 $XML_DEBITOR .=
' <PmtId>' . $CrLf;
2510 $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;
2511 $XML_DEBITOR .=
' </PmtId>' . $CrLf;
2512 $XML_DEBITOR .=
' <InstdAmt Ccy="EUR">' . $row_somme .
'</InstdAmt>' . $CrLf;
2513 $XML_DEBITOR .=
' <DrctDbtTx>' . $CrLf;
2514 $XML_DEBITOR .=
' <MndtRltdInf>' . $CrLf;
2515 $XML_DEBITOR .=
' <MndtId>' . $Rum .
'</MndtId>' . $CrLf;
2516 $XML_DEBITOR .=
' <DtOfSgntr>' . $DtOfSgntr .
'</DtOfSgntr>' . $CrLf;
2517 $XML_DEBITOR .=
' <AmdmntInd>false</AmdmntInd>' . $CrLf;
2518 $XML_DEBITOR .=
' </MndtRltdInf>' . $CrLf;
2519 $XML_DEBITOR .=
' </DrctDbtTx>' . $CrLf;
2520 $XML_DEBITOR .=
' <DbtrAgt>' . $CrLf;
2521 $XML_DEBITOR .=
' <FinInstnId>' . $CrLf;
2523 $XML_DEBITOR .=
' <BIC>' . $row_bic .
'</BIC>' . $CrLf;
2525 $XML_DEBITOR .=
' </FinInstnId>' . $CrLf;
2526 $XML_DEBITOR .=
' </DbtrAgt>' . $CrLf;
2527 $XML_DEBITOR .=
' <Dbtr>' . $CrLf;
2529 $XML_DEBITOR .=
' <PstlAdr>' . $CrLf;
2530 $XML_DEBITOR .=
' <Ctry>' . $row_country_code .
'</Ctry>' . $CrLf;
2531 $addressline1 = strtr($row_address, array(chr(13) =>
", ", chr(10) =>
""));
2532 $addressline2 = strtr($row_zip . (($row_zip && $row_town) ?
' ' :
'') . (
string) $row_town, array(chr(13) =>
", ", chr(10) =>
""));
2533 if (trim($addressline1)) {
2536 if (trim($addressline2)) {
2539 $XML_DEBITOR .=
' </PstlAdr>' . $CrLf;
2540 $XML_DEBITOR .=
' </Dbtr>' . $CrLf;
2541 $XML_DEBITOR .=
' <DbtrAcct>' . $CrLf;
2542 $XML_DEBITOR .=
' <Id>' . $CrLf;
2543 $XML_DEBITOR .=
' <IBAN>' . preg_replace(
'/\s/',
'', $row_iban) .
'</IBAN>' . $CrLf;
2544 $XML_DEBITOR .=
' </Id>' . $CrLf;
2545 $XML_DEBITOR .=
' </DbtrAcct>' . $CrLf;
2546 $XML_DEBITOR .=
' <RmtInf>' . $CrLf;
2550 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions_be.lib.php';
2552 $invoicestatic =
new Facture($this->db);
2553 $invoicestatic->fetch($row_idfac);
2556 $XML_DEBITOR .=
' <strd>' . $invoicePaymentKey .
'</strd>' . $CrLf;
2561 $XML_DEBITOR .=
' </RmtInf>' . $CrLf;
2562 $XML_DEBITOR .=
' </DrctDbtTxInf>' . $CrLf;
2564 $XML_RESULT = $XML_DEBITOR;
2568 $XML_CREDITOR .=
' <CdtTrfTxInf>' . $CrLf;
2569 $XML_CREDITOR .=
' <PmtId>' . $CrLf;
2571 $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;
2572 $XML_CREDITOR .=
' </PmtId>' . $CrLf;
2573 if (!empty($this->sepa_xml_pti_in_ctti)) {
2574 $XML_CREDITOR .=
' <PmtTpInf>' . $CrLf;
2578 $instrprty =
'HIGH';
2580 $instrprty =
'NORM';
2584 $categoryPurpose =
getDolGlobalString(
'PAYMENTBYBANKTRANSFER_CUSTOM_CATEGORY_PURPOSE',
'CORE');
2586 $XML_CREDITOR .=
' <InstrPrty>' . $instrprty .
'</InstrPrty>' . $CrLf;
2587 $XML_CREDITOR .=
' <SvcLvl>' . $CrLf;
2588 $XML_CREDITOR .=
' <Cd>SEPA</Cd>' . $CrLf;
2589 $XML_CREDITOR .=
' </SvcLvl>' . $CrLf;
2590 $XML_CREDITOR .=
' <CtgyPurp>' . $CrLf;
2591 $XML_CREDITOR .=
' <Cd>' . $categoryPurpose .
'</Cd>' . $CrLf;
2592 $XML_CREDITOR .=
' </CtgyPurp>' . $CrLf;
2593 $XML_CREDITOR .=
' </PmtTpInf>' . $CrLf;
2595 $XML_CREDITOR .=
' <Amt>' . $CrLf;
2596 $XML_CREDITOR .=
' <InstdAmt Ccy="EUR">' . round((
float) $row_somme, 2) .
'</InstdAmt>' . $CrLf;
2597 $XML_CREDITOR .=
' </Amt>' . $CrLf;
2608 $XML_CREDITOR .=
' <CdtrAgt>' . $CrLf;
2609 $XML_CREDITOR .=
' <FinInstnId>' . $CrLf;
2610 $XML_CREDITOR .=
' <BIC>' . $row_bic .
'</BIC>' . $CrLf;
2611 $XML_CREDITOR .=
' </FinInstnId>' . $CrLf;
2612 $XML_CREDITOR .=
' </CdtrAgt>' . $CrLf;
2613 $XML_CREDITOR .=
' <Cdtr>' . $CrLf;
2615 $XML_CREDITOR .=
' <PstlAdr>' . $CrLf;
2616 $XML_CREDITOR .=
' <Ctry>' . $row_country_code .
'</Ctry>' . $CrLf;
2617 $addressline1 = strtr($row_address, array(chr(13) =>
", ", chr(10) =>
""));
2618 $addressline2 = strtr($row_zip . (($row_zip && $row_town) ?
' ' :
'') . (
string) $row_town, array(chr(13) =>
", ", chr(10) =>
""));
2619 if (trim($addressline1)) {
2622 if (trim($addressline2)) {
2625 $XML_CREDITOR .=
' </PstlAdr>' . $CrLf;
2626 $XML_CREDITOR .=
' </Cdtr>' . $CrLf;
2627 $XML_CREDITOR .=
' <CdtrAcct>' . $CrLf;
2628 $XML_CREDITOR .=
' <Id>' . $CrLf;
2629 $XML_CREDITOR .=
' <IBAN>' . preg_replace(
'/\s/',
'', $row_iban) .
'</IBAN>' . $CrLf;
2630 $XML_CREDITOR .=
' </Id>' . $CrLf;
2631 $XML_CREDITOR .=
' </CdtrAcct>' . $CrLf;
2632 $XML_CREDITOR .=
' <RmtInf>' . $CrLf;
2635 $XML_CREDITOR .=
' </RmtInf>' . $CrLf;
2636 $XML_CREDITOR .=
' </CdtTrfTxInf>' . $CrLf;
2638 $XML_RESULT = $XML_CREDITOR;
2640 } elseif ($reshook > 0) {
2641 $XML_RESULT = $hookmanager->resPrint;
2643 $XML_RESULT .= $hookmanager->resPrint;
2661 fwrite($this->file,
"03");
2662 fwrite($this->file,
"08");
2664 fwrite($this->file,
" ");
2666 fwrite($this->file, $this->emetteur_ics);
2670 fwrite($this->file,
" ");
2671 fwrite($this->file,
dol_print_date($this->date_echeance,
"%d%m",
'gmt'));
2672 fwrite($this->file, substr(
dol_print_date($this->date_echeance,
"%y",
'gmt'), 1));
2676 fwrite($this->file, substr($this->raison_sociale .
" ", 0, 24));
2680 fwrite($this->file, substr($this->reference_remise .
" ", 0, 7));
2684 fwrite($this->file, substr(
" ", 0, 17));
2688 fwrite($this->file, substr(
" ", 0, 2));
2689 fwrite($this->file,
"E");
2690 fwrite($this->file, substr(
" ", 0, 5));
2694 fwrite($this->file, $this->emetteur_code_guichet);
2698 fwrite($this->file, substr(
"000000000000000" . $this->emetteur_numero_compte, -11));
2702 fwrite($this->file, substr(
" ", 0, 16));
2706 fwrite($this->file, substr(
" ", 0, 31));
2710 fwrite($this->file, $this->emetteur_code_banque);
2714 fwrite($this->file, substr(
" ", 0, 5));
2716 fwrite($this->file,
"\n");
2735 public function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf =
'\n', $format =
'FRST', $type =
'direct-debit', $fk_bank_account = 0)
2745 if (empty($fk_bank_account)) {
2746 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
2750 $account =
new Account($this->db);
2751 if ($account->fetch($fk_bank_account) > 0) {
2752 $this->emetteur_code_banque = $account->code_banque;
2753 $this->emetteur_code_guichet = $account->code_guichet;
2754 $this->emetteur_numero_compte = $account->number;
2755 $this->emetteur_number_key = $account->cle_rib;
2756 $this->sepa_xml_pti_in_ctti = (bool) $account->pti_in_ctti;
2757 $this->emetteur_iban = $account->iban;
2758 $this->emetteur_bic = $account->bic;
2760 $this->emetteur_ics = (($type ==
'bank-transfer' &&
getDolGlobalString(
"SEPA_USE_IDS")) ? $account->ics_transfer : $account->ics);
2762 $this->raison_sociale = $account->owner_name;
2766 $sql =
"SELECT rowid, ref";
2767 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as pb";
2768 $sql .=
" WHERE pb.rowid = " . ((int) $this->
id);
2770 $resql = $this->db->query($sql);
2772 $obj = $this->db->fetch_object($resql);
2775 $IdBon = sprintf(
"%05d", $obj->rowid);
2776 $RefBon = $obj->ref;
2777 $localInstrument =
getDolGlobalString(
'PAYMENTBYBANKTRANSFER_CUSTOM_LOCAL_INSTRUMENT',
'CORE');
2780 $total = number_format((
float)
price2num($total,
'MT'), 2,
".",
"");
2783 if ($type !=
'bank-transfer') {
2785 $XML_SEPA_INFO =
'';
2786 $XML_SEPA_INFO .=
' <PmtInf>' . $CrLf;
2787 $XML_SEPA_INFO .=
' <PmtInfId>' . (
'DOL/' . $dateTime_YMD .
'/DD' . $IdBon .
'-' . $RefBon) .
'</PmtInfId>' . $CrLf;
2788 $XML_SEPA_INFO .=
' <PmtMtd>DD</PmtMtd>' . $CrLf;
2789 $XML_SEPA_INFO .=
' <NbOfTxs>' . $nombre .
'</NbOfTxs>' . $CrLf;
2790 $XML_SEPA_INFO .=
' <CtrlSum>' . $total .
'</CtrlSum>' . $CrLf;
2791 $XML_SEPA_INFO .=
' <PmtTpInf>' . $CrLf;
2792 $XML_SEPA_INFO .=
' <SvcLvl>' . $CrLf;
2793 $XML_SEPA_INFO .=
' <Cd>SEPA</Cd>' . $CrLf;
2794 $XML_SEPA_INFO .=
' </SvcLvl>' . $CrLf;
2795 $XML_SEPA_INFO .=
' <LclInstrm>' . $CrLf;
2796 $XML_SEPA_INFO .=
' <Cd>' . $localInstrument .
'</Cd>' . $CrLf;
2797 $XML_SEPA_INFO .=
' </LclInstrm>' . $CrLf;
2798 $XML_SEPA_INFO .=
' <SeqTp>' . $format .
'</SeqTp>' . $CrLf;
2799 $XML_SEPA_INFO .=
' </PmtTpInf>' . $CrLf;
2800 $XML_SEPA_INFO .=
' <ReqdColltnDt>' . $dateTime_ETAD .
'</ReqdColltnDt>' . $CrLf;
2801 $XML_SEPA_INFO .=
' <Cdtr>' . $CrLf;
2803 $XML_SEPA_INFO .=
' <PstlAdr>' . $CrLf;
2804 $XML_SEPA_INFO .=
' <Ctry>' . $country[1] .
'</Ctry>' . $CrLf;
2805 $addressline1 = strtr(
getDolGlobalString(
'MAIN_INFO_SOCIETE_ADDRESS'), array(chr(13) =>
", ", chr(10) =>
""));
2807 if ($addressline1) {
2810 if ($addressline2) {
2813 $XML_SEPA_INFO .=
' </PstlAdr>' . $CrLf;
2814 $XML_SEPA_INFO .=
' </Cdtr>' . $CrLf;
2815 $XML_SEPA_INFO .=
' <CdtrAcct>' . $CrLf;
2816 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2817 $XML_SEPA_INFO .=
' <IBAN>' . preg_replace(
'/\s/',
'', $this->emetteur_iban) .
'</IBAN>' . $CrLf;
2818 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2819 $XML_SEPA_INFO .=
' </CdtrAcct>' . $CrLf;
2820 $XML_SEPA_INFO .=
' <CdtrAgt>' . $CrLf;
2821 $XML_SEPA_INFO .=
' <FinInstnId>' . $CrLf;
2822 $XML_SEPA_INFO .=
' <BIC>' . $this->emetteur_bic .
'</BIC>' . $CrLf;
2823 $XML_SEPA_INFO .=
' </FinInstnId>' . $CrLf;
2824 $XML_SEPA_INFO .=
' </CdtrAgt>' . $CrLf;
2833 $XML_SEPA_INFO .=
' <ChrgBr>SLEV</ChrgBr>' . $CrLf;
2834 $XML_SEPA_INFO .=
' <CdtrSchmeId>' . $CrLf;
2835 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2836 $XML_SEPA_INFO .=
' <PrvtId>' . $CrLf;
2837 $XML_SEPA_INFO .=
' <Othr>' . $CrLf;
2838 $XML_SEPA_INFO .=
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf;
2839 $XML_SEPA_INFO .=
' <SchmeNm>' . $CrLf;
2840 $XML_SEPA_INFO .=
' <Prtry>SEPA</Prtry>' . $CrLf;
2841 $XML_SEPA_INFO .=
' </SchmeNm>' . $CrLf;
2842 $XML_SEPA_INFO .=
' </Othr>' . $CrLf;
2843 $XML_SEPA_INFO .=
' </PrvtId>' . $CrLf;
2844 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2845 $XML_SEPA_INFO .=
' </CdtrSchmeId>' . $CrLf;
2848 $XML_SEPA_INFO =
'';
2849 $XML_SEPA_INFO .=
' <PmtInf>' . $CrLf;
2850 $XML_SEPA_INFO .=
' <PmtInfId>' . (
'DOL/' . $dateTime_YMD .
'/CT' . $IdBon .
'-' . $RefBon) .
'</PmtInfId>' . $CrLf;
2851 $XML_SEPA_INFO .=
' <PmtMtd>TRF</PmtMtd>' . $CrLf;
2853 $XML_SEPA_INFO .=
' <NbOfTxs>' . $nombre .
'</NbOfTxs>' . $CrLf;
2854 $XML_SEPA_INFO .=
' <CtrlSum>' . $total .
'</CtrlSum>' . $CrLf;
2855 if (!empty($this->sepa_xml_pti_in_ctti) && !empty($format)) {
2856 $XML_SEPA_INFO .=
' <PmtTpInf>' . $CrLf;
2857 $XML_SEPA_INFO .=
' <SvcLvl>' . $CrLf;
2858 $XML_SEPA_INFO .=
' <Cd>SEPA</Cd>' . $CrLf;
2859 $XML_SEPA_INFO .=
' </SvcLvl>' . $CrLf;
2860 $XML_SEPA_INFO .=
' <LclInstrm>' . $CrLf;
2861 $XML_SEPA_INFO .=
' <Cd>' . $localInstrument .
'</Cd>' . $CrLf;
2862 $XML_SEPA_INFO .=
' </LclInstrm>' . $CrLf;
2863 $XML_SEPA_INFO .=
' <SeqTp>' . $format .
'</SeqTp>' . $CrLf;
2864 $XML_SEPA_INFO .=
' </PmtTpInf>' . $CrLf;
2866 $XML_SEPA_INFO .=
' <ReqdExctnDt>' .
dol_print_date($dateTime_ETAD,
'dayrfc') .
'</ReqdExctnDt>' . $CrLf;
2867 $XML_SEPA_INFO .=
' <Dbtr>' . $CrLf;
2869 $XML_SEPA_INFO .=
' <PstlAdr>' . $CrLf;
2870 $XML_SEPA_INFO .=
' <Ctry>' . $country[1] .
'</Ctry>' . $CrLf;
2871 $addressline1 = strtr(
getDolGlobalString(
'MAIN_INFO_SOCIETE_ADDRESS'), array(chr(13) =>
", ", chr(10) =>
""));
2873 if ($addressline1) {
2876 if ($addressline2) {
2879 $XML_SEPA_INFO .=
' </PstlAdr>' . $CrLf;
2880 $XML_SEPA_INFO .=
' </Dbtr>' . $CrLf;
2881 $XML_SEPA_INFO .=
' <DbtrAcct>' . $CrLf;
2882 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2883 $XML_SEPA_INFO .=
' <IBAN>' . preg_replace(
'/\s/',
'', $this->emetteur_iban) .
'</IBAN>' . $CrLf;
2884 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2885 $XML_SEPA_INFO .=
' </DbtrAcct>' . $CrLf;
2886 $XML_SEPA_INFO .=
' <DbtrAgt>' . $CrLf;
2887 $XML_SEPA_INFO .=
' <FinInstnId>' . $CrLf;
2888 $XML_SEPA_INFO .=
' <BIC>' . $this->emetteur_bic .
'</BIC>' . $CrLf;
2889 $XML_SEPA_INFO .=
' </FinInstnId>' . $CrLf;
2890 $XML_SEPA_INFO .=
' </DbtrAgt>' . $CrLf;
2899 $XML_SEPA_INFO .=
' <ChrgBr>SLEV</ChrgBr>' . $CrLf;
2914 fwrite($this->file,
'INCORRECT EMETTEUR ' . $this->raison_sociale . $CrLf);
2915 $XML_SEPA_INFO =
'';
2917 return $XML_SEPA_INFO;
2930 fwrite($this->file,
"08");
2931 fwrite($this->file,
"08");
2933 fwrite($this->file,
" ");
2935 fwrite($this->file, $this->emetteur_ics);
2939 fwrite($this->file, substr(
" ", 0, 12));
2944 fwrite($this->file, substr(
" ", 0, 24));
2948 fwrite($this->file, substr(
" ", 0, 24));
2952 fwrite($this->file, substr(
" ", 0, 8));
2956 fwrite($this->file, substr(
" ", 0, 5));
2960 fwrite($this->file, substr(
" ", 0, 11));
2964 $montant = ($total * 100);
2966 fwrite($this->file, substr(
"000000000000000" . $montant, -16));
2970 fwrite($this->file, substr(
" ", 0, 31));
2974 fwrite($this->file, substr(
" ", 0, 5));
2978 fwrite($this->file, substr(
" ", 0, 5));
2980 fwrite($this->file,
"\n");
3005 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
3008 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'StatusWaiting');
3009 $this->labelStatus[self::STATUS_TRANSFERED] = $langs->transnoentitiesnoconv(
'StatusTrans');
3010 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'StatusWaiting');
3011 $this->labelStatusShort[self::STATUS_TRANSFERED] = $langs->transnoentitiesnoconv(
'StatusTrans');
3012 if ($this->
type ==
'bank-transfer') {
3013 $this->labelStatus[self::STATUS_DEBITED] = $langs->transnoentitiesnoconv(
'StatusDebited');
3014 $this->labelStatusShort[self::STATUS_DEBITED] = $langs->transnoentitiesnoconv(
'StatusDebited');
3016 $this->labelStatus[self::STATUS_CREDITED] = $langs->transnoentitiesnoconv(
'StatusCredited');
3017 $this->labelStatusShort[self::STATUS_CREDITED] = $langs->transnoentitiesnoconv(
'StatusCredited');
3019 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
3020 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
3023 $statusType =
'status1';
3024 if ($status == self::STATUS_TRANSFERED) {
3025 $statusType =
'status3';
3027 if ($status == self::STATUS_CREDITED || $status == self::STATUS_DEBITED) {
3028 $statusType =
'status6';
3030 if ($status == self::STATUS_CANCELED) {
3031 $statusType =
'status9';
3034 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
3048 global
$conf, $langs;
3054 if ($mode ==
'direct-debit') {
3055 $sql =
"SELECT p.rowid, p.date_trans as date_trans, p.date_credit as date_credit";
3056 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as p";
3057 $sql .=
" WHERE p.entity IN (" .
getEntity(
'prelevement_bons') .
")";
3058 $sql .=
" AND (p.type = 'debit-order' OR p.type = 'direct-debit')";
3059 $sql .=
" AND p.statut < ".((int) BonPrelevement::STATUS_DEBITED);
3061 $sql =
"SELECT p.rowid, p.date_trans as date_trans, p.date_credit as date_credit";
3062 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as p";
3063 $sql .=
" WHERE p.entity IN (" .
getEntity(
'prelevement_bons') .
")";
3064 $sql .=
" AND (p.type = 'bank-transfer' OR p.type = 'credit-transfer')";
3065 $sql .=
" AND p.statut < ".((int) BonPrelevement::STATUS_CREDITED);
3068 $resql = $this->db->query($sql);
3070 $langs->load(
"banks");
3074 if ($mode ==
'direct-debit') {
3075 $response->warning_delay =
$conf->warning_delays[
'bank_direct_debit'] / 60 / 60 / 24;
3076 $response->label = $langs->trans(
"PendingDirectDebitToComplete");
3077 $response->labelShort = $langs->trans(
"PendingDirectDebitToCompleteShort");
3078 $response->url = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&search_status=0,1';
3079 $response->url_late = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&search_status=0,1';
3081 $response->warning_delay =
$conf->warning_delays[
'bank_credit_transfer'] / 60 / 60 / 24;
3082 $response->label = $langs->trans(
"PendingCreditTransferToComplete");
3083 $response->labelShort = $langs->trans(
"PendingCreditTransferToCompleteShort");
3084 $response->url = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&type=bank-transfer&search_status=0,1';
3085 $response->url_late = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&type=bank-transfer&search_status=0,1';
3089 $response->nbtodo = 0;
3090 $response->nbtodolate = 0;
3092 while ($obj = $this->db->fetch_object($resql)) {
3093 $response->nbtodo++;
3095 if ($this->db->jdate($obj->date_trans) < ($now - $response->warning_delay)) {
3096 $response->nbtodolate++;
3108 $this->error = $this->db->error();
3124 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3126 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3127 $return .=
'<div class="info-box info-box-sm">';
3128 $return .=
'<span class="info-box-icon bg-infobox-action">';
3130 $return .=
'</span>';
3131 $return .=
'<div class="info-box-content">';
3132 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">' . $this->
getNomUrl(1) .
'</span>';
3133 if ($selected >= 0) {
3134 $return .=
'<input id="cb' . $this->
id .
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="' . $this->
id .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
3147 if (isset($this->
amount)) {
3148 $return .=
'<br><span class="opacitymedium">' . $langs->trans(
"Amount") .
'</span> : <span class="amount">' .
price($this->
amount) .
'</span>';
3150 $return .=
'<br><div class="info-box-status">' . $this->
getLibStatut(3) .
'</div>';
3151 $return .=
'</div>';
3152 $return .=
'</div>';
3153 $return .=
'</div>';
3164 if (!empty($this->
id)) {
3169 $sql =
"SELECT COUNT(*) AS nb FROM " . MAIN_DB_PREFIX .
"prelevement_lignes";
3170 $sql .=
" WHERE fk_prelevement_bons = " . ((int) $id);
3171 $sql .=
" AND fk_soc = 0";
3172 $sql .=
" AND fk_user IS NOT NULL";
3175 $resql = $this->db->query($sql);
3177 $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.
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.
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.