FIX Debug module direct debit order. Solve conflict with credit transfer

This commit is contained in:
Laurent Destailleur 2020-08-03 20:16:33 +02:00
parent b6a3938921
commit f62717a16a
8 changed files with 195 additions and 139 deletions

View File

@ -146,11 +146,9 @@ if (empty($reshook))
$dt = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int'));
$error = $object->set_infocredit($user, $dt);
if ($error)
{
header("Location: card.php?id=".$id."&error=$error");
exit;
setEventMessages($object->error, $object->errors, 'errors');
}
}
}

View File

@ -32,6 +32,7 @@ require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php';
@ -67,6 +68,9 @@ class BonPrelevement extends CommonObject
public $emetteur_bic;
public $emetteur_ics;
public $date_trans;
public $user_trans;
public $total;
public $fetched;
public $statut; // 0-Wait, 1-Trans, 2-Done
@ -425,7 +429,7 @@ class BonPrelevement extends CommonObject
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Set direct debit order to "credited" status.
* Set direct debit or credit transfer order to "paid" status.
*
* @param User $user Id of user
* @param int $date date of action
@ -440,128 +444,158 @@ class BonPrelevement extends CommonObject
if ($this->fetched == 1)
{
if ($date >= $this->date_trans)
if ($date < $this->date_trans)
{
if ($this->db->begin())
$this->error = 'DateOfMovementLowerThanDateOfFileTransmission';
dol_syslog("bon-prelevment::set_infocredit 1027 ".$this->error);
return -1027;
}
$this->db->begin();
$sql = " UPDATE ".MAIN_DB_PREFIX."prelevement_bons ";
$sql .= " SET fk_user_credit = ".$user->id;
$sql .= ", statut = ".self::STATUS_CREDITED;
$sql .= ", date_credit = '".$this->db->idate($date)."'";
$sql .= " WHERE rowid=".$this->id;
$sql .= " AND entity = ".$conf->entity;
$sql .= " AND statut = ".self::STATUS_TRANSFERED;
$resql = $this->db->query($sql);
if ($resql)
{
$langs->load('withdrawals');
$subject = $langs->trans("InfoCreditSubject", $this->ref);
$message = $langs->trans("InfoCreditMessage", $this->ref, dol_print_date($date, 'dayhour'));
//Add payment of withdrawal into bank
$bankaccount = $conf->global->PRELEVEMENT_ID_BANKACCOUNT;
$facs = array();
$amounts = array();
$amountsperthirdparty = array();
$facs = $this->getListInvoices(1);
// Loop on each invoice. $facs=array(0=>id, 1=>amount requested)
$num = count($facs);
for ($i = 0; $i < $num; $i++)
{
$sql = " UPDATE ".MAIN_DB_PREFIX."prelevement_bons ";
$sql .= " SET fk_user_credit = ".$user->id;
$sql .= ", statut = ".self::STATUS_CREDITED;
$sql .= ", date_credit = '".$this->db->idate($date)."'";
$sql .= " WHERE rowid=".$this->id;
$sql .= " AND entity = ".$conf->entity;
$sql .= " AND statut = ".self::STATUS_TRANSFERED;
if ($this->db->query($sql))
{
$langs->load('withdrawals');
$subject = $langs->trans("InfoCreditSubject", $this->ref);
$message = $langs->trans("InfoCreditMessage", $this->ref, dol_print_date($date, 'dayhour'));
//Add payment of withdrawal into bank
$bankaccount = $conf->global->PRELEVEMENT_ID_BANKACCOUNT;
$facs = array();
$amounts = array();
$amountsperthirdparty = array();
$facs = $this->getListInvoices(1);
// Loop on each invoice. $facs=array(0=>id, 1=>amount requested)
$num = count($facs);
for ($i = 0; $i < $num; $i++)
{
$fac = new Facture($this->db);
$fac->fetch($facs[$i][0]);
$amounts[$fac->id] = $facs[$i][1];
$amountsperthirdparty[$fac->socid][$fac->id] = $facs[$i][1];
$totalpaye = $fac->getSommePaiement();
$totalcreditnotes = $fac->getSumCreditNotesUsed();
$totaldeposits = $fac->getSumDepositsUsed();
$alreadypayed = $totalpaye + $totalcreditnotes + $totaldeposits;
if (price2num($alreadypayed + $facs[$i][1], 'MT') == $fac->total_ttc) {
$result = $fac->set_paid($user);
}
}
// Make one payment per customer
foreach ($amountsperthirdparty as $thirdpartyid => $cursoramounts)
{
$paiement = new Paiement($this->db);
$paiement->datepaye = $date;
$paiement->amounts = $cursoramounts; // Array with detail of dispatching of payments for each invoice
$paiement->paiementid = 3; //
$paiement->num_payment = $this->ref; // Set ref of direct debit note
$paiement->num_paiement = $this->ref; // For backward compatibility
$paiement->id_prelevement = $this->id;
$paiement_id = $paiement->create($user);
if ($paiement_id < 0)
{
dol_syslog(get_class($this)."::set_infocredit AddPayment Error");
$error++;
}
else
{
$result = $paiement->addPaymentToBank($user, 'payment', '(WithdrawalPayment)', $bankaccount, '', '');
if ($result < 0)
{
dol_syslog(get_class($this)."::set_infocredit AddPaymentToBank Error");
$error++;
}
}
//var_dump($paiement->amounts);
//var_dump($thirdpartyid);
//var_dump($cursoramounts);
}
// Update withdrawal line
// TODO: Translate to ligneprelevement.class.php
$sql = " UPDATE ".MAIN_DB_PREFIX."prelevement_lignes";
$sql .= " SET statut = 2";
$sql .= " WHERE fk_prelevement_bons = ".$this->id;
if (!$this->db->query($sql))
{
dol_syslog(get_class($this)."::set_infocredit Update lines Error");
$error++;
}
}
else
{
dol_syslog(get_class($this)."::set_infocredit Update Bons Error");
$error++;
if ($this->type == 'bank-transfer') {
$fac = new FactureFournisseur($this->db);
} else {
$fac = new Facture($this->db);
}
/*
* End of procedure
*/
if ($error == 0)
{
$this->date_credit = $date;
$this->statut = self::STATUS_CREDITED;
$result = $fac->fetch($facs[$i][0]);
$this->db->commit();
return 0;
}
else
{
$this->db->rollback();
dol_syslog("bon-prelevment::set_infocredit ROLLBACK ");
return -1;
$amounts[$fac->id] = $facs[$i][1];
$amountsperthirdparty[$fac->socid][$fac->id] = $facs[$i][1];
$totalpaye = $fac->getSommePaiement();
$totalcreditnotes = $fac->getSumCreditNotesUsed();
$totaldeposits = $fac->getSumDepositsUsed();
$alreadypayed = $totalpaye + $totalcreditnotes + $totaldeposits;
// @TODO Move this after creation of payment
if (price2num($alreadypayed + $facs[$i][1], 'MT') == $fac->total_ttc) {
$result = $fac->set_paid($user);
if ($result < 0) {
$this->error = $fac->error;
$this->errors = $fac->errors;
}
}
}
else
//var_dump($amountsperthirdparty);exit;
// Make one payment per customer
foreach ($amountsperthirdparty as $thirdpartyid => $cursoramounts)
{
dol_syslog(get_class($this)."::set_infocredit 1025 Open SQL transaction impossible ");
return -1025;
if ($this->type == 'bank-transfer') {
$paiement = new PaiementFourn($this->db);
} else {
$paiement = new Paiement($this->db);
}
$paiement->datepaye = $date;
$paiement->amounts = $cursoramounts; // Array with detail of dispatching of payments for each invoice
if ($this->type == 'bank-transfer') {
$paiement->paiementid = 2;
$paiement->paiementcode = 'VIR';
} else {
$paiement->paiementid = 3;
$paiement->paiementcode = 'PRE';
}
$paiement->num_payment = $this->ref; // Set ref of direct debit note
$paiement->num_paiement = $this->ref; // For backward compatibility
$paiement->id_prelevement = $this->id;
$paiement_id = $paiement->create($user); // This use ->paiementid, that is ID of payment mode
if ($paiement_id < 0)
{
$error++;
$this->error = $paiement->error;
$this->errors = $paiement->errors;
dol_syslog(get_class($this)."::set_infocredit AddPayment Error ".$this->error);
}
else
{
if ($this->type == 'bank-transfer') {
$modeforaddpayment = 'payment_supplier';
} else {
$modeforaddpayment = 'payment';
}
$result = $paiement->addPaymentToBank($user, $modeforaddpayment, '(WithdrawalPayment)', $bankaccount, '', '');
if ($result < 0)
{
$error++;
$this->error = $paiement->error;
$this->errors = $paiement->errors;
dol_syslog(get_class($this)."::set_infocredit AddPaymentToBank Error ".$this->error);
}
}
//var_dump($paiement->amounts);
//var_dump($thirdpartyid);
//var_dump($cursoramounts);
}
// Update withdrawal line
// TODO: Translate to ligneprelevement.class.php
if (! $error) {
$sql = " UPDATE ".MAIN_DB_PREFIX."prelevement_lignes";
$sql .= " SET statut = 2";
$sql .= " WHERE fk_prelevement_bons = ".$this->id;
if (!$this->db->query($sql))
{
dol_syslog(get_class($this)."::set_infocredit Update lines Error");
$error++;
}
}
}
else
{
dol_syslog("bon-prelevment::set_infocredit 1027 Date de credit < Date de trans ");
return -1027;
$this->error = $this->db->lasterror();
dol_syslog(get_class($this)."::set_infocredit Update Bons Error");
$error++;
}
/*
* End of procedure
*/
if ($error == 0)
{
$this->date_credit = $date;
$this->statut = self::STATUS_CREDITED;
$this->db->commit();
return 0;
}
else
{
$this->db->rollback();
return -1;
}
}
else
@ -593,7 +627,7 @@ class BonPrelevement extends CommonObject
$sql .= " SET fk_user_trans = ".$user->id;
$sql .= " , date_trans = '".$this->db->idate($date)."'";
$sql .= " , method_trans = ".$method;
$sql .= " , statut = 1";
$sql .= " , statut = ".self::STATUS_TRANSFERED;
$sql .= " WHERE rowid = ".$this->id;
$sql .= " AND entity = ".$conf->entity;
$sql .= " AND statut = 0";
@ -617,6 +651,7 @@ class BonPrelevement extends CommonObject
{
$this->date_trans = $date;
$this->statut = 1;
$this->user_trans = $user->id;
$this->db->commit();
return 0;
@ -651,7 +686,12 @@ class BonPrelevement extends CommonObject
/*
* Returns all invoices presented within same order
*/
$sql = "SELECT fk_facture";
$sql = "SELECT ";
if ($this->type == 'bank-transfer') {
$sql .= " pf.fk_facture_fourn";
} else {
$sql .= " pf.fk_facture";
}
if ($amounts) $sql .= ", SUM(pl.amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p";
$sql .= " , ".MAIN_DB_PREFIX."prelevement_lignes as pl";
@ -660,7 +700,13 @@ class BonPrelevement extends CommonObject
$sql .= " AND pl.fk_prelevement_bons = p.rowid";
$sql .= " AND p.rowid = ".$this->id;
$sql .= " AND p.entity = ".$conf->entity;
if ($amounts) $sql .= " GROUP BY fk_facture";
if ($amounts) {
if ($this->type == 'bank-transfer') {
$sql .= " GROUP BY fk_facture_fourn";
} else {
$sql .= " GROUP BY fk_facture";
}
}
$resql = $this->db->query($sql);
if ($resql)

View File

@ -59,7 +59,7 @@ class LignePrelevement
$langs->load("withdrawals");
$this->statuts[0] = $langs->trans("StatusWaiting");
$this->statuts[2] = $langs->trans("StatusCredited");
$this->statuts[2] = $langs->trans("StatusPaid");
$this->statuts[3] = $langs->trans("StatusRefused");
}

View File

@ -105,7 +105,7 @@ if ($id > 0 || $ref)
print '<tr><td>'.$langs->trans("TransData").'</td><td>';
print dol_print_date($object->date_trans, 'day');
print ' '.$langs->trans("By").' '.$muser->getFullName($langs).'</td></tr>';
print ' <span class="opacitymedium">'.$langs->trans("By").'</span> '.$muser->getFullName($langs).'</td></tr>';
print '<tr><td>'.$langs->trans("TransMetod").'</td><td>';
print $object->methodes_trans[$object->method_trans];
print '</td></tr>';
@ -160,7 +160,7 @@ if ($id > 0 || $ref)
// List of invoices
$sql = "SELECT pf.rowid,";
$sql = "SELECT pf.rowid, p.type,";
$sql .= " f.rowid as facid, f.ref as ref, f.total_ttc,";
$sql .= " s.rowid as socid, s.nom as name, pl.statut, pl.amount as amount_requested";
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons as p";
@ -193,8 +193,8 @@ $sql .= $db->order($sortfield, $sortorder);
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
{
$result = $db->query($sql);
$nbtotalofrecords = $db->num_rows($result);
$resql = $db->query($sql);
$nbtotalofrecords = $db->num_rows($resql);
if (($page * $limit) > $nbtotalofrecords) // if total resultset is smaller then paging size (filtering), goto and load page 0
{
$page = 0;
@ -204,10 +204,10 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
$sql .= $db->plimit($limit + 1, $offset);
$result = $db->query($sql);
if ($result)
$resql = $db->query($sql);
if ($resql)
{
$num = $db->num_rows($result);
$num = $db->num_rows($resql);
$i = 0;
$param = "&id=".$id;
@ -236,22 +236,28 @@ if ($result)
print_liste_field_titre("ThirdParty", $_SERVER["PHP_SELF"], "s.nom", '', $param, '', $sortfield, $sortorder);
print_liste_field_titre("AmountInvoice", $_SERVER["PHP_SELF"], "f.total_ttc", "", $param, 'class="right"', $sortfield, $sortorder);
print_liste_field_titre("AmountRequested", $_SERVER["PHP_SELF"], "pl.amount", "", $param, 'class="right"', $sortfield, $sortorder);
print_liste_field_titre("StatusDebitCredit", $_SERVER["PHP_SELF"], "", "", $param, 'align="center"', $sortfield, $sortorder);
print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "", "", $param, 'align="center"', $sortfield, $sortorder);
print_liste_field_titre('');
print "</tr>\n";
$totalinvoices = 0;
$totalamount_requested = 0;
$invoicetmpcustomer = new Facture($db);
$invoicetmpsupplier = new FactureFournisseur($db);
while ($i < min($num, $limit))
{
$obj = $db->fetch_object($result);
$obj = $db->fetch_object($resql);
$invoicetmp->id = $obj->facid;
$invoicetmp->ref = $obj->ref;
if ($obj->type == 'bank-transfer') {
$invoicetmp = $invoicetmpsupplier;
} else {
$invoicetmp = $invoicetmpcustomer;
}
$invoicetmp->fetch($obj->facid);
$thirdpartytmp->id = $obj->socid;
$thirdpartytmp->name = $obj->name;
$thirdpartytmp->fetch($obj->socid);
print '<tr class="oddeven">';
@ -278,7 +284,11 @@ if ($result)
}
elseif ($obj->statut == 2)
{
print $langs->trans("StatusCredited");
if ($obj->type == 'bank-transfer') {
print $langs->trans("StatusDebited");
} else {
print $langs->trans("StatusCredited");
}
}
elseif ($obj->statut == 3)
{
@ -317,7 +327,7 @@ if ($result)
print "</table>";
print '</div>';
$db->free($result);
$db->free($resql);
}
else
{

View File

@ -99,7 +99,7 @@ if ($prev_id > 0 || $ref)
print '<tr><td>'.$langs->trans("TransData").'</td><td>';
print dol_print_date($object->date_trans, 'day');
print ' '.$langs->trans("By").' '.$muser->getFullName($langs).'</td></tr>';
print ' <span class="opacitymedium">'.$langs->trans("By").'</span> '.$muser->getFullName($langs).'</td></tr>';
print '<tr><td>'.$langs->trans("TransMetod").'</td><td>';
print $object->methodes_trans[$object->method_trans];
print '</td></tr>';
@ -234,7 +234,7 @@ if ($resql)
}
else
{
print '<tr><td colspan="5" class="opacitymedium">'.$langs->trans("None").'</td></tr>';
print '<tr><td colspan="6" class="opacitymedium">'.$langs->trans("None").'</td></tr>';
}
if ($num > 0)

View File

@ -98,7 +98,7 @@ if ($prev_id > 0 || $ref)
print '<tr><td>'.$langs->trans("TransData").'</td><td>';
print dol_print_date($object->date_trans, 'day');
print ' '.$langs->trans("By").' '.$muser->getFullName($langs).'</td></tr>';
print ' <span class="opacitymedium">'.$langs->trans("By").'</span> '.$muser->getFullName($langs).'</td></tr>';
print '<tr><td>'.$langs->trans("TransMetod").'</td><td>';
print $object->methodes_trans[$object->method_trans];
print '</td></tr>';

View File

@ -1290,7 +1290,7 @@ class FactureFournisseur extends CommonInvoice
$this->db->begin();
$sql = 'UPDATE '.MAIN_DB_PREFIX.'facture_fourn';
$sql .= ' SET paye = 1, fk_statut=2';
$sql .= ' SET paye = 1, fk_statut = '.self::STATUS_CLOSED;
$sql .= ' WHERE rowid = '.$this->id;
dol_syslog("FactureFournisseur::set_paid", LOG_DEBUG);

View File

@ -63,7 +63,9 @@ InvoiceRefused=Invoice refused (Charge the rejection to customer)
StatusDebitCredit=Status debit/credit
StatusWaiting=Waiting
StatusTrans=Sent
StatusDebited=Debited
StatusCredited=Credited
StatusPaid=Paid
StatusRefused=Refused
StatusMotif0=Unspecified
StatusMotif1=Insufficient funds
@ -82,8 +84,8 @@ CreateSepaFileForPaymentByBankTransfer=Create credit transfer file (SEPA)
CreateGuichet=Only office
CreateBanque=Only bank
OrderWaiting=Waiting for treatment
NotifyTransmision=File transmission
NotifyCredit=Withdrawal Credit
NotifyTransmision=Record file transmission of order
NotifyCredit=Record credit of order
NumeroNationalEmetter=National Transmitter Number
WithBankUsingRIB=For bank accounts using RIB
WithBankUsingBANBIC=For bank accounts using IBAN/BIC/SWIFT