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 =
'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=".(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 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 $entity = $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 (".((int) $entity).
')';
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] ?? 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 = ($type ==
'bank-transfer') ?
'CREDIT_TRANSFER_ORDER_CREATE' :
'DIRECT_DEBIT_ORDER_CREATE';
1602 $this->
amount = $this->total;
1605 $result = $this->call_trigger($triggerName, $user);
1613 $this->db->commit();
1614 return count($factures_prev);
1616 $this->db->rollback();
1632 public function delete($user, $notrigger = 0)
1637 $resql1 = $resql2 = $resql3 = $resql4 = 0;
1640 $triggername =
'DIRECT_DEBIT_ORDER_DELETE';
1641 if ($this->
type ==
'bank-transfer') {
1642 $triggername =
'PAYMENTBYBANKTRANFER_DELETE';
1645 $result = $this->call_trigger($triggername, $user);
1653 $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) .
")";
1654 $resql1 = $this->db->query($sql);
1661 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"prelevement_lignes WHERE fk_prelevement_bons = " . ((int) $this->
id);
1662 $resql2 = $this->db->query($sql);
1669 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"prelevement_bons WHERE rowid = " . ((int) $this->
id);
1670 $resql3 = $this->db->query($sql);
1677 $sql =
"UPDATE " . MAIN_DB_PREFIX .
"prelevement_demande SET fk_prelevement_bons = NULL, traite = 0 WHERE fk_prelevement_bons = " . ((int) $this->
id);
1678 $resql4 = $this->db->query($sql);
1684 if ($resql1 && $resql2 && $resql3 && $resql4 && !$error) {
1685 $this->db->commit();
1688 $this->db->rollback();
1704 public function getNomUrl($withpicto = 0, $option =
'', $notooltip = 0, $morecss =
'', $save_lastsearch_value = -1)
1706 global
$conf, $langs, $hookmanager;
1708 if (!empty(
$conf->dol_no_mouse_hover)) {
1714 $labeltoshow =
'PaymentByDirectDebit';
1715 $labelforclosedate =
'CreditDate';
1716 if (!empty($this->
type) && $this->
type ==
'bank-transfer') {
1717 $labeltoshow =
'PaymentByBankTransfer';
1718 $labelforclosedate =
'ClosedOn';
1721 $label =
img_picto(
'', $this->picto) .
' <u>' . $langs->trans($labeltoshow) .
'</u> ' . $this->
getLibStatut(5);
1723 $label .=
'<b>' . $langs->trans(
'Ref') .
':</b> ' . $this->ref;
1724 if (isset($this->
amount)) {
1725 $label .=
'<br><b>' . $langs->trans(
"Amount") .
':</b> <span class="amount">' .
price($this->
amount).
'</span>';
1727 if (isset($this->date_creation)) {
1728 $label .=
'<br><b>'.$langs->trans(
"DateCreation").
":</b> ".
dol_print_date($this->date_creation,
'dayhour',
'tzuserrel');
1730 if (isset($this->date_trans)) {
1731 $label .=
'<br><b>' . $langs->trans(
"TransData") .
":</b> " .
dol_print_date($this->date_trans,
'dayhour',
'tzuserrel');
1733 if (isset($this->date_credit)) {
1734 $label .=
'<br><b>'.$langs->trans($labelforclosedate).
":</b> ".
dol_print_date($this->date_credit,
'dayhour',
'tzuserrel');
1737 $url = DOL_URL_ROOT .
'/compta/prelevement/card.php?id=' . $this->id;
1738 if (!empty($this->
type) && $this->
type ==
'bank-transfer') {
1739 $url = DOL_URL_ROOT .
'/compta/prelevement/card.php?id=' . $this->id;
1742 if ($option !=
'nolink') {
1744 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1745 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1746 $add_save_lastsearch_values = 1;
1748 if ($add_save_lastsearch_values) {
1749 $url .=
'&save_lastsearch_values=1';
1754 if (empty($notooltip)) {
1756 $label = $langs->trans(
"ShowMyObject");
1760 $linkclose .=
' class="classfortooltip' . ($morecss ?
' ' . $morecss :
'') .
'"';
1762 $linkclose = ($morecss ?
' class="' . $morecss .
'"' :
'');
1765 $linkstart =
'<a href="' . $url .
'"';
1766 $linkstart .= $linkclose .
'>';
1769 $result .= $linkstart;
1771 $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);
1773 if ($withpicto != 2) {
1774 $result .= $this->ref;
1776 $result .= $linkend;
1778 global $action, $hookmanager;
1779 $hookmanager->initHooks(array(
'banktransferdao'));
1780 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
1781 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1783 $result = $hookmanager->resPrint;
1785 $result .= $hookmanager->resPrint;
1800 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"notify_def";
1801 $sql .=
" WHERE rowid = " . ((int) $rowid);
1803 if ($this->db->query($sql)) {
1819 if (is_object($user)) {
1820 $userid = $user->id;
1825 $sql =
"DELETE FROM " . MAIN_DB_PREFIX .
"notify_def";
1826 $sql .=
" WHERE fk_user = " . ((int) $userid) .
" AND fk_action = " . ((int) $action);
1828 if ($this->db->query($sql)) {
1849 if (is_object($user)) {
1850 $userid = $user->id;
1858 $sql =
"INSERT INTO " . MAIN_DB_PREFIX .
"notify_def (datec, fk_user, fk_soc, fk_contact, fk_action)";
1859 $sql .=
" VALUES ('" . $this->db->idate($now) .
"', " . ((int) $userid) .
", NULL, NULL, " . ((int) $action) .
")";
1862 if ($this->db->query($sql)) {
1866 dol_syslog(get_class($this) .
"::addNotification Error $result");
1889 public function generate(
string $format =
'ALL',
int $executiondate = 0,
string $type =
'direct-debit',
int $fk_bank_account = 0,
int $forsalary = 0,
int $thirdpartyBANId = 0)
1896 if (empty($fk_bank_account)) {
1897 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
1902 dol_syslog(get_class($this) .
"::generate build file=" . $this->filename .
" type=" . $type);
1904 $this->file = fopen($this->filename,
"w");
1905 if ($this->file ==
false) {
1906 $this->error = $langs->trans(
'ErrorFailedToOpenFile', $this->filename);
1914 if (
$mysoc->isInSEPA()) {
1917 if ($type !=
'bank-transfer') {
1929 if (!empty($executiondate)) {
1930 $date_actu = $executiondate;
1935 $fileDebiteurSection =
'';
1936 $fileEmetteurSection =
'';
1943 $sql =
"SELECT soc.rowid as socid, soc.code_client as code, soc.address, soc.zip, soc.town, c.code as country_code,";
1945 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
1946 $sql .=
" f.ref as reffac,";
1947 $sql .=
" p.fk_facture as idfac, p.rowid as pid,";
1948 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, rib.rum, rib.date_rum";
1950 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
1951 $sql .=
" " . MAIN_DB_PREFIX .
"facture as f,";
1952 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
1953 $sql .=
" " . MAIN_DB_PREFIX .
"societe as soc,";
1954 $sql .=
" " . MAIN_DB_PREFIX .
"c_country as c,";
1955 $sql .=
" " . MAIN_DB_PREFIX .
"societe_rib as rib";
1956 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
1957 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
1958 $sql .=
" AND p.fk_facture = f.rowid";
1959 $sql .=
" AND f.fk_soc = soc.rowid";
1960 $sql .=
" AND soc.fk_pays = c.rowid";
1961 $sql .=
" AND rib.fk_soc = f.fk_soc";
1962 if (!empty($thirdpartyBANId)) {
1963 $sql .=
" AND rib.rowid = " . ((int) $thirdpartyBANId);
1965 $sql .=
" AND rib.default_rib = 1";
1967 $sql .=
" AND rib.type = 'ban'";
1970 $resql = $this->db->query($sql);
1971 $nbtotalDrctDbtTxInf = -1;
1973 $cachearraytotestduplicate = array();
1975 $num = $this->db->num_rows($resql);
1977 $obj = $this->db->fetch_object($resql);
1979 if (!empty($cachearraytotestduplicate[$obj->idfac])) {
1980 $this->error = $langs->trans(
'ErrorCompanyHasDuplicateDefaultBAN', $obj->socid);
1981 $this->invoice_in_error[$obj->idfac] = $this->error;
1985 $cachearraytotestduplicate[$obj->idfac] = $obj->rowid;
1988 $daterum = (!empty($obj->date_rum)) ? $this->db->jdate($obj->date_rum) : $this->db->jdate($obj->datec);
1995 if (!empty($obj->fk_prelevement_demande)) {
1996 $companybankaccountid = 0;
1998 $sqltmp =
"SELECT fk_societe_rib FROM ".MAIN_DB_PREFIX.
"prelevement_demande";
1999 $sqltmp .=
" WHERE rowid = ".((int) $obj->fk_prelevement_demande);
2001 $resqltmp = $this->db->query($sqltmp);
2003 $objtmp = $this->db->fetch_object($resqltmp);
2005 $companybankaccountid = (int) $objtmp->fk_societe_rib;
2009 $bankaccount->fetch($companybankaccountid);
2010 if ($bankaccount->id > 0) {
2011 $daterum = $bankaccount->date_rum;
2012 $iban = $bankaccount->iban;
2013 $bic = $bankaccount->bic;
2014 $drum = $bankaccount->id;
2015 $rum = $bankaccount->rum;
2019 $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);
2021 $this->total += $obj->somme;
2024 $nbtotalDrctDbtTxInf = $i;
2026 $this->error = $this->db->lasterror();
2027 fwrite($this->file,
'ERROR DEBITOR ' . $sql . $CrLf);
2032 if ($result != -2) {
2033 $fileEmetteurSection .= $this->
EnregEmetteurSEPA($conf, $date_actu, $nbtotalDrctDbtTxInf, $this->total, $CrLf, $format, $type, $fk_bank_account);
2037 $this->total = number_format((
float)
price2num($this->total,
'MT'), 2,
".",
"");
2044 fwrite($this->file,
'<' .
'?xml version="1.0" encoding="UTF-8" standalone="yes"?' .
'>' . $CrLf);
2045 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);
2046 fwrite($this->file,
' <CstmrDrctDbtInitn>' . $CrLf);
2048 fwrite($this->file,
' <GrpHdr>' . $CrLf);
2049 fwrite($this->file,
' <MsgId>' . (
'DOL/' . $dateTime_YMD .
'/DD' . $this->
id) .
'</MsgId>' . $CrLf);
2050 fwrite($this->file,
' <CreDtTm>' . $dateTime_ECMA .
'</CreDtTm>' . $CrLf);
2051 fwrite($this->file,
' <NbOfTxs>' . $i .
'</NbOfTxs>' . $CrLf);
2052 fwrite($this->file,
' <CtrlSum>' . $this->total .
'</CtrlSum>' . $CrLf);
2053 fwrite($this->file,
' <InitgPty>' . $CrLf);
2055 fwrite($this->file,
' <Id>' . $CrLf);
2056 fwrite($this->file,
' <PrvtId>' . $CrLf);
2057 fwrite($this->file,
' <Othr>' . $CrLf);
2058 fwrite($this->file,
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf);
2059 fwrite($this->file,
' </Othr>' . $CrLf);
2060 fwrite($this->file,
' </PrvtId>' . $CrLf);
2061 fwrite($this->file,
' </Id>' . $CrLf);
2062 fwrite($this->file,
' </InitgPty>' . $CrLf);
2063 fwrite($this->file,
' </GrpHdr>' . $CrLf);
2065 if ($result != -2) {
2066 fwrite($this->file, $fileEmetteurSection);
2069 if ($result != -2) {
2070 fwrite($this->file, $fileDebiteurSection);
2073 fwrite($this->file,
' </PmtInf>' . $CrLf);
2074 fwrite($this->file,
' </CstmrDrctDbtInitn>' . $CrLf);
2075 fwrite($this->file,
'</Document>' . $CrLf);
2088 if (!empty($executiondate)) {
2089 $date_actu = $executiondate;
2094 $fileCrediteurSection =
'';
2095 $fileEmetteurSection =
'';
2101 if (!empty($forsalary)) {
2102 $sql =
"SELECT u.rowid as userId, u.address, u.zip, u.town, c.code as country_code, CONCAT(u.firstname,' ',u.lastname) as nom,";
2104 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
2105 $sql .=
" s.ref as reffac,";
2106 $sql .=
" p.fk_salary as idfac,";
2107 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, '' as rum, '' as date_rum";
2109 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2110 $sql .=
" " . MAIN_DB_PREFIX .
"salary as s,";
2111 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
2112 $sql .=
" " . MAIN_DB_PREFIX .
"user as u";
2113 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_country as c ON u.fk_country = c.rowid,";
2114 $sql .=
" " . MAIN_DB_PREFIX .
"user_rib as rib";
2115 $sql .=
" WHERE pl.fk_prelevement_bons=" . ((int) $this->
id);
2116 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2117 $sql .=
" AND p.fk_salary = s.rowid";
2118 $sql .=
" AND s.fk_user = u.rowid";
2119 $sql .=
" AND rib.fk_user = s.fk_user";
2121 $sql =
"SELECT soc.rowid as socid, soc.code_client as code, soc.address, soc.zip, soc.town, c.code as country_code,";
2123 $sql .=
" pl.client_nom as nom, pl.amount as somme, pl.fk_prelevement_demande,";
2124 $sql .=
" f.ref as reffac, f.ref_supplier as fac_ref_supplier,";
2125 $sql .=
" p.fk_facture_fourn as idfac,";
2126 $sql .=
" rib.rowid, rib.datec, rib.iban_prefix as iban, rib.bic as bic, rib.rowid as drum, rib.rum, rib.date_rum";
2128 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2129 $sql .=
" " . MAIN_DB_PREFIX .
"facture_fourn as f,";
2130 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p,";
2131 $sql .=
" " . MAIN_DB_PREFIX .
"societe as soc";
2132 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_country as c ON soc.fk_pays = c.rowid,";
2133 $sql .=
" " . MAIN_DB_PREFIX .
"societe_rib as rib";
2134 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2135 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2136 $sql .=
" AND p.fk_facture_fourn = f.rowid";
2137 $sql .=
" AND f.fk_soc = soc.rowid";
2138 $sql .=
" AND rib.fk_soc = f.fk_soc";
2139 if (!empty($thirdpartyBANId)) {
2140 $sql .=
" AND rib.rowid = " . ((int) $thirdpartyBANId);
2142 $sql .=
" AND rib.default_rib = 1";
2144 $sql .=
" AND rib.type = 'ban'";
2147 $nbtotalDrctDbtTxInf = -1;
2149 require_once DOL_DOCUMENT_ROOT .
'/societe/class/companybankaccount.class.php';
2151 $resql = $this->db->query($sql);
2153 $cachearraytotestduplicate = array();
2155 $num = $this->db->num_rows($resql);
2157 $obj = $this->db->fetch_object($resql);
2160 if (!empty($cachearraytotestduplicate[$obj->idfac])) {
2161 $this->error = $langs->trans(
'ErrorCompanyHasDuplicateDefaultBAN', $obj->socid);
2162 $this->invoice_in_error[$obj->idfac] = $this->error;
2167 $cachearraytotestduplicate[$obj->idfac] = $obj->rowid;
2170 $daterum = (!empty($obj->date_rum)) ? $this->db->jdate($obj->date_rum) : $this->db->jdate($obj->datec);
2177 if (!empty($obj->fk_prelevement_demande)) {
2178 $companybankaccountid = 0;
2180 $sqltmp =
"SELECT fk_societe_rib FROM ".MAIN_DB_PREFIX.
"prelevement_demande";
2181 $sqltmp .=
" WHERE rowid = ".((int) $obj->fk_prelevement_demande);
2183 $resqltmp = $this->db->query($sqltmp);
2185 $objtmp = $this->db->fetch_object($resqltmp);
2187 $companybankaccountid = (int) $objtmp->fk_societe_rib;
2191 $bankaccount->fetch($companybankaccountid);
2192 if ($bankaccount->id > 0) {
2193 $daterum = $bankaccount->date_rum;
2194 $iban = $bankaccount->iban;
2195 $bic = $bankaccount->bic;
2196 $drum = $bankaccount->id;
2197 $rum = $bankaccount->rum;
2201 $refobj = $obj->reffac;
2202 if (empty($refobj) && !empty($forsalary)) {
2203 $refobj =
"SAL" . $obj->idfac;
2206 $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);
2208 $this->total += $obj->somme;
2211 $nbtotalDrctDbtTxInf = $i;
2213 $this->error = $this->db->lasterror();
2214 fwrite($this->file,
'ERROR CREDITOR ' . $sql . $CrLf);
2218 if ($result != -2) {
2219 $fileEmetteurSection .= $this->
EnregEmetteurSEPA($conf, $date_actu, $nbtotalDrctDbtTxInf, $this->total, $CrLf, $format, $type);
2223 $this->total = number_format((
float)
price2num($this->total,
'MT'), 2,
".",
"");
2230 fwrite($this->file,
'<' .
'?xml version="1.0" encoding="UTF-8" standalone="yes"?' .
'>' . $CrLf);
2231 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);
2232 fwrite($this->file,
' <CstmrCdtTrfInitn>' . $CrLf);
2234 fwrite($this->file,
' <GrpHdr>' . $CrLf);
2235 fwrite($this->file,
' <MsgId>' . (
'DOL/' . $dateTime_YMD .
'/CT' . $this->
id) .
'</MsgId>' . $CrLf);
2236 fwrite($this->file,
' <CreDtTm>' . $dateTime_ECMA .
'</CreDtTm>' . $CrLf);
2237 fwrite($this->file,
' <NbOfTxs>' . $i .
'</NbOfTxs>' . $CrLf);
2238 fwrite($this->file,
' <CtrlSum>' . $this->total .
'</CtrlSum>' . $CrLf);
2239 fwrite($this->file,
' <InitgPty>' . $CrLf);
2241 fwrite($this->file,
' <Id>' . $CrLf);
2242 fwrite($this->file,
' <PrvtId>' . $CrLf);
2243 fwrite($this->file,
' <Othr>' . $CrLf);
2244 fwrite($this->file,
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf);
2245 fwrite($this->file,
' </Othr>' . $CrLf);
2246 fwrite($this->file,
' </PrvtId>' . $CrLf);
2247 fwrite($this->file,
' </Id>' . $CrLf);
2248 fwrite($this->file,
' </InitgPty>' . $CrLf);
2249 fwrite($this->file,
' </GrpHdr>' . $CrLf);
2251 if ($result != -2) {
2252 fwrite($this->file, $fileEmetteurSection);
2255 if ($result != -2) {
2256 fwrite($this->file, $fileCrediteurSection);
2259 fwrite($this->file,
' </PmtInf>' . $CrLf);
2260 fwrite($this->file,
' </CstmrCdtTrfInitn>' . $CrLf);
2261 fwrite($this->file,
'</Document>' . $CrLf);
2267 if ($type !=
'bank-transfer') {
2268 $sql =
"SELECT pl.amount";
2270 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2271 $sql .=
" " . MAIN_DB_PREFIX .
"facture as f,";
2272 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p";
2273 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2274 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2275 $sql .=
" AND p.fk_facture = f.rowid";
2279 $resql = $this->db->query($sql);
2281 $num = $this->db->num_rows($resql);
2284 $obj = $this->db->fetch_object($resql);
2285 $this->total += $obj->amount;
2294 $sql =
"SELECT pl.amount";
2296 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement_lignes as pl,";
2297 $sql .=
" " . MAIN_DB_PREFIX .
"facture_fourn as f,";
2298 $sql .=
" " . MAIN_DB_PREFIX .
"prelevement as p";
2299 $sql .=
" WHERE pl.fk_prelevement_bons = " . ((int) $this->
id);
2300 $sql .=
" AND pl.rowid = p.fk_prelevement_lignes";
2301 $sql .=
" AND p.fk_facture_fourn = f.rowid";
2304 $resql = $this->db->query($sql);
2306 $num = $this->db->num_rows($resql);
2309 $obj = $this->db->fetch_object($resql);
2310 $this->total += $obj->amount;
2320 $langs->load(
'withdrawals');
2323 fwrite($this->file, $langs->transnoentitiesnoconv(
'WithdrawalFileNotCapable',
$mysoc->country_code));
2326 fclose($this->file);
2348 return $pre .
'-' .
dol_print_date($row_datec,
'dayhourlogsmall') .
'-' .
dol_trunc((
string) $row_drum . ($row_code_client ?
'-' . $row_code_client :
''), 17,
'right',
'UTF-8', 1);
2369 public function EnregDestinataire($rowid, $client_nom, $rib_banque, $rib_guichet, $rib_number, $amount, $ref, $facid, $rib_dom =
'', $type =
'direct-debit')
2372 fwrite($this->file,
"06");
2373 fwrite($this->file,
"08");
2375 fwrite($this->file,
" ");
2377 fwrite($this->file, $this->emetteur_ics);
2381 fwrite($this->file,
" ");
2382 fwrite($this->file,
dol_print_date($this->date_echeance,
"%d%m",
'gmt'));
2383 fwrite($this->file, substr(
dol_print_date($this->date_echeance,
"%y",
'gmt'), 1));
2387 fwrite($this->file, substr(strtoupper($client_nom) .
" ", 0, 24));
2390 $address = strtr($rib_dom, array(
" " =>
"-", chr(13) =>
" ", chr(10) =>
""));
2391 fwrite($this->file, substr($address .
" ", 0, 24));
2395 fwrite($this->file, substr(
" ", 0, 8));
2399 fwrite($this->file, $rib_guichet);
2403 fwrite($this->file, substr(
"000000000000000" . $rib_number, -11));
2407 $montant = (round($amount, 2) * 100);
2409 fwrite($this->file, substr(
"000000000000000" . $montant, -16));
2413 fwrite($this->file, substr(
"*_" . $ref .
"_RDVnet" . $rowid .
" ", 0, 31));
2417 fwrite($this->file, $rib_banque);
2421 fwrite($this->file, substr(
" ", 0, 5));
2423 fwrite($this->file,
"\n");
2453 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 =
'')
2459 $row_somme = number_format((
float)
price2num($row_somme,
'MT'), 2,
".",
"");
2461 $row_somme = round((
float) $row_somme, 2);
2464 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
2467 $Rowing = sprintf(
"%010d", $row_idfac);
2471 $Rum = (empty($row_rum) ? $this->
buildRumNumber($row_code_client, $row_datec, $row_drum) : $row_rum);
2477 if (!is_object($hookmanager)) {
2478 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
2481 $hookmanager->initHooks(array(
'bonprelevementdao'));
2482 $parameters = array(
2483 'row_code_client' => &$row_code_client,
'row_nom' => &$row_nom,
'row_address' => &$row_address,
'row_zip' => &$row_zip,
'row_town' => &$row_town,
2484 'row_country_code' => &$row_country_code,
'row_cb' => &$row_cb,
'row_cg' => &$row_cg,
'row_cc' => &$row_cc,
'row_somme' => &$row_somme,
2485 'row_ref' => &$row_ref,
'row_idfac' => &$row_idfac,
'row_iban' => &$row_iban,
'row_bic' => &$row_bic,
'row_datec' => &$row_datec,
2486 'row_drum' => &$row_drum,
'row_rum' => &$row_rum,
'type' => &$type,
'row_comment' => &$row_comment,
2487 'crlf' => &$CrLf,
'rowing' => &$Rowing,
'rum' => &$Rum,
'dtofsgntr' => &$DtOfSgntr,
2489 $reshook = $hookmanager->executeHooks(
'enregDestinataireSEPA', $parameters, $this);
2490 if (empty($reshook)) {
2491 if ($type !=
'bank-transfer') {
2494 $XML_DEBITOR .=
' <DrctDbtTxInf>' . $CrLf;
2495 $XML_DEBITOR .=
' <PmtId>' . $CrLf;
2497 $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;
2498 $XML_DEBITOR .=
' </PmtId>' . $CrLf;
2499 $XML_DEBITOR .=
' <InstdAmt Ccy="EUR">' . $row_somme .
'</InstdAmt>' . $CrLf;
2500 $XML_DEBITOR .=
' <DrctDbtTx>' . $CrLf;
2501 $XML_DEBITOR .=
' <MndtRltdInf>' . $CrLf;
2502 $XML_DEBITOR .=
' <MndtId>' . $Rum .
'</MndtId>' . $CrLf;
2503 $XML_DEBITOR .=
' <DtOfSgntr>' . $DtOfSgntr .
'</DtOfSgntr>' . $CrLf;
2504 $XML_DEBITOR .=
' <AmdmntInd>false</AmdmntInd>' . $CrLf;
2505 $XML_DEBITOR .=
' </MndtRltdInf>' . $CrLf;
2506 $XML_DEBITOR .=
' </DrctDbtTx>' . $CrLf;
2507 $XML_DEBITOR .=
' <DbtrAgt>' . $CrLf;
2508 $XML_DEBITOR .=
' <FinInstnId>' . $CrLf;
2510 $XML_DEBITOR .=
' <BIC>' . $row_bic .
'</BIC>' . $CrLf;
2512 $XML_DEBITOR .=
' </FinInstnId>' . $CrLf;
2513 $XML_DEBITOR .=
' </DbtrAgt>' . $CrLf;
2514 $XML_DEBITOR .=
' <Dbtr>' . $CrLf;
2516 $XML_DEBITOR .=
' <PstlAdr>' . $CrLf;
2517 $XML_DEBITOR .=
' <Ctry>' . $row_country_code .
'</Ctry>' . $CrLf;
2518 $addressline1 = strtr($row_address, array(chr(13) =>
", ", chr(10) =>
""));
2519 $addressline2 = strtr($row_zip . (($row_zip && $row_town) ?
' ' :
'') . (
string) $row_town, array(chr(13) =>
", ", chr(10) =>
""));
2520 if (trim($addressline1)) {
2523 if (trim($addressline2)) {
2526 $XML_DEBITOR .=
' </PstlAdr>' . $CrLf;
2527 $XML_DEBITOR .=
' </Dbtr>' . $CrLf;
2528 $XML_DEBITOR .=
' <DbtrAcct>' . $CrLf;
2529 $XML_DEBITOR .=
' <Id>' . $CrLf;
2530 $XML_DEBITOR .=
' <IBAN>' . preg_replace(
'/\s/',
'', $row_iban) .
'</IBAN>' . $CrLf;
2531 $XML_DEBITOR .=
' </Id>' . $CrLf;
2532 $XML_DEBITOR .=
' </DbtrAcct>' . $CrLf;
2533 $XML_DEBITOR .=
' <RmtInf>' . $CrLf;
2537 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions_be.lib.php';
2539 $invoicestatic =
new Facture($this->db);
2540 $invoicestatic->fetch($row_idfac);
2543 $XML_DEBITOR .=
' <strd>' . $invoicePaymentKey .
'</strd>' . $CrLf;
2548 $XML_DEBITOR .=
' </RmtInf>' . $CrLf;
2549 $XML_DEBITOR .=
' </DrctDbtTxInf>' . $CrLf;
2551 $XML_RESULT = $XML_DEBITOR;
2555 $XML_CREDITOR .=
' <CdtTrfTxInf>' . $CrLf;
2556 $XML_CREDITOR .=
' <PmtId>' . $CrLf;
2558 $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;
2559 $XML_CREDITOR .=
' </PmtId>' . $CrLf;
2560 if (!empty($this->sepa_xml_pti_in_ctti)) {
2561 $XML_CREDITOR .=
' <PmtTpInf>' . $CrLf;
2565 $instrprty =
'HIGH';
2567 $instrprty =
'NORM';
2571 $categoryPurpose =
getDolGlobalString(
'PAYMENTBYBANKTRANSFER_CUSTOM_CATEGORY_PURPOSE',
'CORE');
2573 $XML_CREDITOR .=
' <InstrPrty>' . $instrprty .
'</InstrPrty>' . $CrLf;
2574 $XML_CREDITOR .=
' <SvcLvl>' . $CrLf;
2575 $XML_CREDITOR .=
' <Cd>SEPA</Cd>' . $CrLf;
2576 $XML_CREDITOR .=
' </SvcLvl>' . $CrLf;
2577 $XML_CREDITOR .=
' <CtgyPurp>' . $CrLf;
2578 $XML_CREDITOR .=
' <Cd>' . $categoryPurpose .
'</Cd>' . $CrLf;
2579 $XML_CREDITOR .=
' </CtgyPurp>' . $CrLf;
2580 $XML_CREDITOR .=
' </PmtTpInf>' . $CrLf;
2582 $XML_CREDITOR .=
' <Amt>' . $CrLf;
2583 $XML_CREDITOR .=
' <InstdAmt Ccy="EUR">' . round((
float) $row_somme, 2) .
'</InstdAmt>' . $CrLf;
2584 $XML_CREDITOR .=
' </Amt>' . $CrLf;
2595 $XML_CREDITOR .=
' <CdtrAgt>' . $CrLf;
2596 $XML_CREDITOR .=
' <FinInstnId>' . $CrLf;
2597 $XML_CREDITOR .=
' <BIC>' . $row_bic .
'</BIC>' . $CrLf;
2598 $XML_CREDITOR .=
' </FinInstnId>' . $CrLf;
2599 $XML_CREDITOR .=
' </CdtrAgt>' . $CrLf;
2600 $XML_CREDITOR .=
' <Cdtr>' . $CrLf;
2602 $XML_CREDITOR .=
' <PstlAdr>' . $CrLf;
2603 $XML_CREDITOR .=
' <Ctry>' . $row_country_code .
'</Ctry>' . $CrLf;
2604 $addressline1 = strtr($row_address, array(chr(13) =>
", ", chr(10) =>
""));
2605 $addressline2 = strtr($row_zip . (($row_zip && $row_town) ?
' ' :
'') . (
string) $row_town, array(chr(13) =>
", ", chr(10) =>
""));
2606 if (trim($addressline1)) {
2609 if (trim($addressline2)) {
2612 $XML_CREDITOR .=
' </PstlAdr>' . $CrLf;
2613 $XML_CREDITOR .=
' </Cdtr>' . $CrLf;
2614 $XML_CREDITOR .=
' <CdtrAcct>' . $CrLf;
2615 $XML_CREDITOR .=
' <Id>' . $CrLf;
2616 $XML_CREDITOR .=
' <IBAN>' . preg_replace(
'/\s/',
'', $row_iban) .
'</IBAN>' . $CrLf;
2617 $XML_CREDITOR .=
' </Id>' . $CrLf;
2618 $XML_CREDITOR .=
' </CdtrAcct>' . $CrLf;
2619 $XML_CREDITOR .=
' <RmtInf>' . $CrLf;
2622 $XML_CREDITOR .=
' </RmtInf>' . $CrLf;
2623 $XML_CREDITOR .=
' </CdtTrfTxInf>' . $CrLf;
2625 $XML_RESULT = $XML_CREDITOR;
2627 } elseif ($reshook > 0) {
2628 $XML_RESULT = $hookmanager->resPrint;
2630 $XML_RESULT .= $hookmanager->resPrint;
2648 fwrite($this->file,
"03");
2649 fwrite($this->file,
"08");
2651 fwrite($this->file,
" ");
2653 fwrite($this->file, $this->emetteur_ics);
2657 fwrite($this->file,
" ");
2658 fwrite($this->file,
dol_print_date($this->date_echeance,
"%d%m",
'gmt'));
2659 fwrite($this->file, substr(
dol_print_date($this->date_echeance,
"%y",
'gmt'), 1));
2663 fwrite($this->file, substr($this->raison_sociale .
" ", 0, 24));
2667 fwrite($this->file, substr($this->reference_remise .
" ", 0, 7));
2671 fwrite($this->file, substr(
" ", 0, 17));
2675 fwrite($this->file, substr(
" ", 0, 2));
2676 fwrite($this->file,
"E");
2677 fwrite($this->file, substr(
" ", 0, 5));
2681 fwrite($this->file, $this->emetteur_code_guichet);
2685 fwrite($this->file, substr(
"000000000000000" . $this->emetteur_numero_compte, -11));
2689 fwrite($this->file, substr(
" ", 0, 16));
2693 fwrite($this->file, substr(
" ", 0, 31));
2697 fwrite($this->file, $this->emetteur_code_banque);
2701 fwrite($this->file, substr(
" ", 0, 5));
2703 fwrite($this->file,
"\n");
2722 public function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf =
'\n', $format =
'FRST', $type =
'direct-debit', $fk_bank_account = 0)
2732 if (empty($fk_bank_account)) {
2733 $fk_bank_account = ($type ==
'bank-transfer' ?
getDolGlobalInt(
'PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT') :
getDolGlobalInt(
'PRELEVEMENT_ID_BANKACCOUNT'));
2737 $account =
new Account($this->db);
2738 if ($account->fetch($fk_bank_account) > 0) {
2739 $this->emetteur_code_banque = $account->code_banque;
2740 $this->emetteur_code_guichet = $account->code_guichet;
2741 $this->emetteur_numero_compte = $account->number;
2742 $this->emetteur_number_key = $account->cle_rib;
2743 $this->sepa_xml_pti_in_ctti = (bool) $account->pti_in_ctti;
2744 $this->emetteur_iban = $account->iban;
2745 $this->emetteur_bic = $account->bic;
2747 $this->emetteur_ics = (($type ==
'bank-transfer' &&
getDolGlobalString(
"SEPA_USE_IDS")) ? $account->ics_transfer : $account->ics);
2749 $this->raison_sociale = $account->owner_name;
2753 $sql =
"SELECT rowid, ref";
2754 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as pb";
2755 $sql .=
" WHERE pb.rowid = " . ((int) $this->
id);
2757 $resql = $this->db->query($sql);
2759 $obj = $this->db->fetch_object($resql);
2762 $IdBon = sprintf(
"%05d", $obj->rowid);
2763 $RefBon = $obj->ref;
2764 $localInstrument =
getDolGlobalString(
'PAYMENTBYBANKTRANSFER_CUSTOM_LOCAL_INSTRUMENT',
'CORE');
2767 $total = number_format((
float)
price2num($total,
'MT'), 2,
".",
"");
2770 if ($type !=
'bank-transfer') {
2772 $XML_SEPA_INFO =
'';
2773 $XML_SEPA_INFO .=
' <PmtInf>' . $CrLf;
2774 $XML_SEPA_INFO .=
' <PmtInfId>' . (
'DOL/' . $dateTime_YMD .
'/DD' . $IdBon .
'-' . $RefBon) .
'</PmtInfId>' . $CrLf;
2775 $XML_SEPA_INFO .=
' <PmtMtd>DD</PmtMtd>' . $CrLf;
2776 $XML_SEPA_INFO .=
' <NbOfTxs>' . $nombre .
'</NbOfTxs>' . $CrLf;
2777 $XML_SEPA_INFO .=
' <CtrlSum>' . $total .
'</CtrlSum>' . $CrLf;
2778 $XML_SEPA_INFO .=
' <PmtTpInf>' . $CrLf;
2779 $XML_SEPA_INFO .=
' <SvcLvl>' . $CrLf;
2780 $XML_SEPA_INFO .=
' <Cd>SEPA</Cd>' . $CrLf;
2781 $XML_SEPA_INFO .=
' </SvcLvl>' . $CrLf;
2782 $XML_SEPA_INFO .=
' <LclInstrm>' . $CrLf;
2783 $XML_SEPA_INFO .=
' <Cd>' . $localInstrument .
'</Cd>' . $CrLf;
2784 $XML_SEPA_INFO .=
' </LclInstrm>' . $CrLf;
2785 $XML_SEPA_INFO .=
' <SeqTp>' . $format .
'</SeqTp>' . $CrLf;
2786 $XML_SEPA_INFO .=
' </PmtTpInf>' . $CrLf;
2787 $XML_SEPA_INFO .=
' <ReqdColltnDt>' . $dateTime_ETAD .
'</ReqdColltnDt>' . $CrLf;
2788 $XML_SEPA_INFO .=
' <Cdtr>' . $CrLf;
2790 $XML_SEPA_INFO .=
' <PstlAdr>' . $CrLf;
2791 $XML_SEPA_INFO .=
' <Ctry>' . $country[1] .
'</Ctry>' . $CrLf;
2792 $addressline1 = strtr(
getDolGlobalString(
'MAIN_INFO_SOCIETE_ADDRESS'), array(chr(13) =>
", ", chr(10) =>
""));
2794 if ($addressline1) {
2797 if ($addressline2) {
2800 $XML_SEPA_INFO .=
' </PstlAdr>' . $CrLf;
2801 $XML_SEPA_INFO .=
' </Cdtr>' . $CrLf;
2802 $XML_SEPA_INFO .=
' <CdtrAcct>' . $CrLf;
2803 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2804 $XML_SEPA_INFO .=
' <IBAN>' . preg_replace(
'/\s/',
'', $this->emetteur_iban) .
'</IBAN>' . $CrLf;
2805 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2806 $XML_SEPA_INFO .=
' </CdtrAcct>' . $CrLf;
2807 $XML_SEPA_INFO .=
' <CdtrAgt>' . $CrLf;
2808 $XML_SEPA_INFO .=
' <FinInstnId>' . $CrLf;
2809 $XML_SEPA_INFO .=
' <BIC>' . $this->emetteur_bic .
'</BIC>' . $CrLf;
2810 $XML_SEPA_INFO .=
' </FinInstnId>' . $CrLf;
2811 $XML_SEPA_INFO .=
' </CdtrAgt>' . $CrLf;
2820 $XML_SEPA_INFO .=
' <ChrgBr>SLEV</ChrgBr>' . $CrLf;
2821 $XML_SEPA_INFO .=
' <CdtrSchmeId>' . $CrLf;
2822 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2823 $XML_SEPA_INFO .=
' <PrvtId>' . $CrLf;
2824 $XML_SEPA_INFO .=
' <Othr>' . $CrLf;
2825 $XML_SEPA_INFO .=
' <Id>' . $this->emetteur_ics .
'</Id>' . $CrLf;
2826 $XML_SEPA_INFO .=
' <SchmeNm>' . $CrLf;
2827 $XML_SEPA_INFO .=
' <Prtry>SEPA</Prtry>' . $CrLf;
2828 $XML_SEPA_INFO .=
' </SchmeNm>' . $CrLf;
2829 $XML_SEPA_INFO .=
' </Othr>' . $CrLf;
2830 $XML_SEPA_INFO .=
' </PrvtId>' . $CrLf;
2831 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2832 $XML_SEPA_INFO .=
' </CdtrSchmeId>' . $CrLf;
2835 $XML_SEPA_INFO =
'';
2836 $XML_SEPA_INFO .=
' <PmtInf>' . $CrLf;
2837 $XML_SEPA_INFO .=
' <PmtInfId>' . (
'DOL/' . $dateTime_YMD .
'/CT' . $IdBon .
'-' . $RefBon) .
'</PmtInfId>' . $CrLf;
2838 $XML_SEPA_INFO .=
' <PmtMtd>TRF</PmtMtd>' . $CrLf;
2840 $XML_SEPA_INFO .=
' <NbOfTxs>' . $nombre .
'</NbOfTxs>' . $CrLf;
2841 $XML_SEPA_INFO .=
' <CtrlSum>' . $total .
'</CtrlSum>' . $CrLf;
2842 if (!empty($this->sepa_xml_pti_in_ctti) && !empty($format)) {
2843 $XML_SEPA_INFO .=
' <PmtTpInf>' . $CrLf;
2844 $XML_SEPA_INFO .=
' <SvcLvl>' . $CrLf;
2845 $XML_SEPA_INFO .=
' <Cd>SEPA</Cd>' . $CrLf;
2846 $XML_SEPA_INFO .=
' </SvcLvl>' . $CrLf;
2847 $XML_SEPA_INFO .=
' <LclInstrm>' . $CrLf;
2848 $XML_SEPA_INFO .=
' <Cd>' . $localInstrument .
'</Cd>' . $CrLf;
2849 $XML_SEPA_INFO .=
' </LclInstrm>' . $CrLf;
2850 $XML_SEPA_INFO .=
' <SeqTp>' . $format .
'</SeqTp>' . $CrLf;
2851 $XML_SEPA_INFO .=
' </PmtTpInf>' . $CrLf;
2853 $XML_SEPA_INFO .=
' <ReqdExctnDt>' .
dol_print_date($dateTime_ETAD,
'dayrfc') .
'</ReqdExctnDt>' . $CrLf;
2854 $XML_SEPA_INFO .=
' <Dbtr>' . $CrLf;
2856 $XML_SEPA_INFO .=
' <PstlAdr>' . $CrLf;
2857 $XML_SEPA_INFO .=
' <Ctry>' . $country[1] .
'</Ctry>' . $CrLf;
2858 $addressline1 = strtr(
getDolGlobalString(
'MAIN_INFO_SOCIETE_ADDRESS'), array(chr(13) =>
", ", chr(10) =>
""));
2860 if ($addressline1) {
2863 if ($addressline2) {
2866 $XML_SEPA_INFO .=
' </PstlAdr>' . $CrLf;
2867 $XML_SEPA_INFO .=
' </Dbtr>' . $CrLf;
2868 $XML_SEPA_INFO .=
' <DbtrAcct>' . $CrLf;
2869 $XML_SEPA_INFO .=
' <Id>' . $CrLf;
2870 $XML_SEPA_INFO .=
' <IBAN>' . preg_replace(
'/\s/',
'', $this->emetteur_iban) .
'</IBAN>' . $CrLf;
2871 $XML_SEPA_INFO .=
' </Id>' . $CrLf;
2872 $XML_SEPA_INFO .=
' </DbtrAcct>' . $CrLf;
2873 $XML_SEPA_INFO .=
' <DbtrAgt>' . $CrLf;
2874 $XML_SEPA_INFO .=
' <FinInstnId>' . $CrLf;
2875 $XML_SEPA_INFO .=
' <BIC>' . $this->emetteur_bic .
'</BIC>' . $CrLf;
2876 $XML_SEPA_INFO .=
' </FinInstnId>' . $CrLf;
2877 $XML_SEPA_INFO .=
' </DbtrAgt>' . $CrLf;
2886 $XML_SEPA_INFO .=
' <ChrgBr>SLEV</ChrgBr>' . $CrLf;
2901 fwrite($this->file,
'INCORRECT EMETTEUR ' . $this->raison_sociale . $CrLf);
2902 $XML_SEPA_INFO =
'';
2904 return $XML_SEPA_INFO;
2917 fwrite($this->file,
"08");
2918 fwrite($this->file,
"08");
2920 fwrite($this->file,
" ");
2922 fwrite($this->file, $this->emetteur_ics);
2926 fwrite($this->file, substr(
" ", 0, 12));
2931 fwrite($this->file, substr(
" ", 0, 24));
2935 fwrite($this->file, substr(
" ", 0, 24));
2939 fwrite($this->file, substr(
" ", 0, 8));
2943 fwrite($this->file, substr(
" ", 0, 5));
2947 fwrite($this->file, substr(
" ", 0, 11));
2951 $montant = ($total * 100);
2953 fwrite($this->file, substr(
"000000000000000" . $montant, -16));
2957 fwrite($this->file, substr(
" ", 0, 31));
2961 fwrite($this->file, substr(
" ", 0, 5));
2965 fwrite($this->file, substr(
" ", 0, 5));
2967 fwrite($this->file,
"\n");
2992 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2995 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'StatusWaiting');
2996 $this->labelStatus[self::STATUS_TRANSFERED] = $langs->transnoentitiesnoconv(
'StatusTrans');
2997 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
'StatusWaiting');
2998 $this->labelStatusShort[self::STATUS_TRANSFERED] = $langs->transnoentitiesnoconv(
'StatusTrans');
2999 if ($this->
type ==
'bank-transfer') {
3000 $this->labelStatus[self::STATUS_DEBITED] = $langs->transnoentitiesnoconv(
'StatusDebited');
3001 $this->labelStatusShort[self::STATUS_DEBITED] = $langs->transnoentitiesnoconv(
'StatusDebited');
3003 $this->labelStatus[self::STATUS_CREDITED] = $langs->transnoentitiesnoconv(
'StatusCredited');
3004 $this->labelStatusShort[self::STATUS_CREDITED] = $langs->transnoentitiesnoconv(
'StatusCredited');
3006 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
3007 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv(
'Canceled');
3010 $statusType =
'status1';
3011 if ($status == self::STATUS_TRANSFERED) {
3012 $statusType =
'status3';
3014 if ($status == self::STATUS_CREDITED || $status == self::STATUS_DEBITED) {
3015 $statusType =
'status6';
3017 if ($status == self::STATUS_CANCELED) {
3018 $statusType =
'status9';
3021 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
3035 global
$conf, $langs;
3041 if ($mode ==
'direct-debit') {
3042 $sql =
"SELECT p.rowid, p.date_trans as date_trans, p.date_credit as date_credit";
3043 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as p";
3044 $sql .=
" WHERE p.entity IN (" .
getEntity(
'prelevement_bons') .
")";
3045 $sql .=
" AND (p.type = 'debit-order' OR p.type = 'direct-debit')";
3046 $sql .=
" AND p.statut < ".((int) BonPrelevement::STATUS_DEBITED);
3048 $sql =
"SELECT p.rowid, p.date_trans as date_trans, p.date_credit as date_credit";
3049 $sql .=
" FROM " . MAIN_DB_PREFIX .
"prelevement_bons as p";
3050 $sql .=
" WHERE p.entity IN (" .
getEntity(
'prelevement_bons') .
")";
3051 $sql .=
" AND (p.type = 'bank-transfer' OR p.type = 'credit-transfer')";
3052 $sql .=
" AND p.statut < ".((int) BonPrelevement::STATUS_CREDITED);
3055 $resql = $this->db->query($sql);
3057 $langs->load(
"banks");
3061 if ($mode ==
'direct-debit') {
3062 $response->warning_delay =
$conf->warning_delays[
'bank_direct_debit'] / 60 / 60 / 24;
3063 $response->label = $langs->trans(
"PendingDirectDebitToComplete");
3064 $response->labelShort = $langs->trans(
"PendingDirectDebitToCompleteShort");
3065 $response->url = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&search_status=0,1';
3066 $response->url_late = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&search_status=0,1';
3068 $response->warning_delay =
$conf->warning_delays[
'bank_credit_transfer'] / 60 / 60 / 24;
3069 $response->label = $langs->trans(
"PendingCreditTransferToComplete");
3070 $response->labelShort = $langs->trans(
"PendingCreditTransferToCompleteShort");
3071 $response->url = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&type=bank-transfer&search_status=0,1';
3072 $response->url_late = DOL_URL_ROOT .
'/compta/prelevement/orders_list.php?leftmenu=checks&mainmenu=bank&type=bank-transfer&search_status=0,1';
3076 $response->nbtodo = 0;
3077 $response->nbtodolate = 0;
3079 while ($obj = $this->db->fetch_object($resql)) {
3080 $response->nbtodo++;
3082 if ($this->db->jdate($obj->date_trans) < ($now - $response->warning_delay)) {
3083 $response->nbtodolate++;
3095 $this->error = $this->db->error();
3111 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3113 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3114 $return .=
'<div class="info-box info-box-sm">';
3115 $return .=
'<span class="info-box-icon bg-infobox-action">';
3117 $return .=
'</span>';
3118 $return .=
'<div class="info-box-content">';
3119 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">' . $this->
getNomUrl(1) .
'</span>';
3120 if ($selected >= 0) {
3121 $return .=
'<input id="cb' . $this->
id .
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="' . $this->
id .
'"' . ($selected ?
' checked="checked"' :
'') .
'>';
3134 if (isset($this->
amount)) {
3135 $return .=
'<br><span class="opacitymedium">' . $langs->trans(
"Amount") .
'</span> : <span class="amount">' .
price($this->
amount) .
'</span>';
3137 $return .=
'<br><div class="info-box-status">' . $this->
getLibStatut(3) .
'</div>';
3138 $return .=
'</div>';
3139 $return .=
'</div>';
3140 $return .=
'</div>';
3151 if (!empty($this->
id)) {
3156 $sql =
"SELECT COUNT(*) AS nb FROM " . MAIN_DB_PREFIX .
"prelevement_lignes";
3157 $sql .=
" WHERE fk_prelevement_bons = " . ((int) $id);
3158 $sql .=
" AND fk_soc = 0";
3159 $sql .=
" AND fk_user IS NOT NULL";
3162 $resql = $this->db->query($sql);
3164 $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.