dolibarr  17.0.4
rejetprelevement.class.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
4  * Copyright (C) 2010-2013 Juanjo Menent <jmenent@2byte.es>
5  * Copyright (C) 2021 OpenDsi <support@open-dsi.fr>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <https://www.gnu.org/licenses/>.
19  */
20 
32 {
36  public $id;
37 
41  public $db;
42 
43  public $type; //prelevement or bank transfer
44 
45 
53  public function __construct($db, $user, $type)
54  {
55  global $langs;
56 
57  $this->db = $db;
58  $this->user = $user;
59  $this->type = $type;
60 
61  $this->motifs = array();
62  $this->facturer = array();
63 
64  $this->motifs[0] = ""; //$langs->trans("StatusMotif0");
65  $this->motifs[1] = $langs->trans("StatusMotif1");
66  $this->motifs[2] = $langs->trans("StatusMotif2");
67  $this->motifs[3] = $langs->trans("StatusMotif3");
68  $this->motifs[4] = $langs->trans("StatusMotif4");
69  $this->motifs[5] = $langs->trans("StatusMotif5");
70  $this->motifs[6] = $langs->trans("StatusMotif6");
71  $this->motifs[7] = $langs->trans("StatusMotif7");
72  $this->motifs[8] = $langs->trans("StatusMotif8");
73 
74  $this->facturer[0] = $langs->trans("NoInvoiceRefused");
75  $this->facturer[1] = $langs->trans("InvoiceRefused");
76  }
77 
89  public function create($user, $id, $motif, $date_rejet, $bonid, $facturation = 0)
90  {
91  global $langs, $conf;
92 
93  $error = 0;
94  $this->id = $id;
95  $this->bon_id = $bonid;
96  $now = dol_now();
97 
98  dol_syslog("RejetPrelevement::Create id $id");
99  $bankaccount = ($this->type == 'bank-transfer' ? $conf->global->PAYMENTBYBANKTRANSFER_ID_BANKACCOUNT : $conf->global->PRELEVEMENT_ID_BANKACCOUNT);
100  $facs = $this->getListInvoices(1);
101 
102  require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/ligneprelevement.class.php';
103  $lipre = new LignePrelevement($this->db);
104  $lipre->fetch($id);
105 
106  $this->db->begin();
107 
108  // Insert refused line into database
109  $sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_rejet (";
110  $sql .= "fk_prelevement_lignes";
111  $sql .= ", date_rejet";
112  $sql .= ", motif";
113  $sql .= ", fk_user_creation";
114  $sql .= ", date_creation";
115  $sql .= ", afacturer";
116  $sql .= ") VALUES (";
117  $sql .= ((int) $id);
118  $sql .= ", '".$this->db->idate($date_rejet)."'";
119  $sql .= ", ".((int) $motif);
120  $sql .= ", ".((int) $user->id);
121  $sql .= ", '".$this->db->idate($now)."'";
122  $sql .= ", ".((int) $facturation);
123  $sql .= ")";
124 
125  $result = $this->db->query($sql);
126 
127  if (!$result) {
128  dol_syslog("RejetPrelevement::create Erreur 4");
129  dol_syslog("RejetPrelevement::create Erreur 4 $sql");
130  $error++;
131  }
132 
133  // Tag the line to refused
134  $sql = " UPDATE ".MAIN_DB_PREFIX."prelevement_lignes ";
135  $sql .= " SET statut = 3";
136  $sql .= " WHERE rowid = ".((int) $id);
137 
138  if (!$this->db->query($sql)) {
139  dol_syslog("RejetPrelevement::create Erreur 5");
140  $error++;
141  }
142 
143  $num = count($facs);
144  for ($i = 0; $i < $num; $i++) {
145  if ($this->type == 'bank-transfer') {
146  $fac = new FactureFournisseur($this->db);
147  $pai = new PaiementFourn($this->db);
148  } else {
149  $fac = new Facture($this->db);
150  $pai = new Paiement($this->db);
151  }
152 
153  $fac->fetch($facs[$i][0]);
154 
155  // Make a negative payment
156  //$pai = new Paiement($this->db);
157 
158  $pai->amounts = array();
159 
160  /*
161  * We replace the comma with a point otherwise some
162  * PHP installs sends only the part integer negative
163  */
164 
165  $pai->amounts[$facs[$i][0]] = price2num($facs[$i][1] * ($this->type == 'bank-transfer' ? 1 : -1));
166  $pai->datepaye = $date_rejet;
167  $pai->paiementid = 3; // type of payment: withdrawal
168  $pai->num_paiement = $fac->ref;
169  $pai->num_payment = $fac->ref;
170  $pai->id_prelevement = $this->bon_id;
171  $pai->num_prelevement = $lipre->bon_ref;
172 
173  if ($pai->create($this->user) < 0) {
174  // we call with no_commit
175  $error++;
176  dol_syslog("RejetPrelevement::Create Error creation payment invoice ".$facs[$i][0]);
177  } else {
178  $result = $pai->addPaymentToBank($user, 'payment', '(InvoiceRefused)', $bankaccount, '', '');
179  if ($result < 0) {
180  dol_syslog("RejetPrelevement::Create AddPaymentToBan Error");
181  $error++;
182  }
183 
184  // Payment validation
185  if ($pai->validate($user) < 0) {
186  $error++;
187  dol_syslog("RejetPrelevement::Create Error payment validation");
188  }
189  }
190  //Tag invoice as unpaid
191  dol_syslog("RejetPrelevement::Create set_unpaid fac ".$fac->ref);
192 
193  $fac->setUnpaid($user);
194 
195  //TODO: Must be managed by notifications module
196  // Send email to sender of the standing order request
197  $this->_send_email($fac);
198  }
199 
200  if ($error == 0) {
201  dol_syslog("RejetPrelevement::Create Commit");
202  $this->db->commit();
203  } else {
204  dol_syslog("RejetPrelevement::Create Rollback");
205  $this->db->rollback();
206  }
207  }
208 
209  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
216  private function _send_email($fac)
217  {
218  // phpcs:enable
219  global $langs;
220 
221  $userid = 0;
222 
223  $sql = "SELECT fk_user_demande";
224  $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
225  $sql .= " WHERE pfd.fk_prelevement_bons = ".((int) $this->bon_id);
226  $sql .= " AND pfd.fk_facture".($this->type == 'bank-transfer' ? '_fourn' : '').' = '.((int) $fac->id);
227 
228  $resql = $this->db->query($sql);
229  if ($resql) {
230  $num = $this->db->num_rows($resql);
231  if ($num > 0) {
232  $row = $this->db->fetch_row($resql);
233  $userid = $row[0];
234  }
235  } else {
236  dol_syslog("RejetPrelevement::_send_email Erreur lecture user");
237  }
238 
239  if ($userid > 0) {
240  $emuser = new User($this->db);
241  $emuser->fetch($userid);
242 
243  $soc = new Societe($this->db);
244  $soc->fetch($fac->socid);
245 
246  require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
247 
248  $subject = $langs->transnoentities("InfoRejectSubject");
249  $sendto = $emuser->getFullName($langs)." <".$emuser->email.">";
250  $from = $this->user->getFullName($langs)." <".$this->user->email.">";
251  $msgishtml = 1;
252  $trackid = 'use'.$emuser->id;
253 
254  $arr_file = array();
255  $arr_mime = array();
256  $arr_name = array();
257  $facref = $fac->ref;
258  $socname = $soc->name;
259  $amount = price($fac->total_ttc);
260  $userinfo = $this->user->getFullName($langs);
261 
262  $message = $langs->trans("InfoRejectMessage", $facref, $socname, $amount, $userinfo);
263 
264  $mailfile = new CMailFile($subject, $sendto, $from, $message, $arr_file, $arr_mime, $arr_name, '', '', 0, $msgishtml, $this->user->email, '', $trackid);
265 
266  $result = $mailfile->sendfile();
267  if ($result) {
268  dol_syslog("RejetPrelevement::_send_email email envoye");
269  } else {
270  dol_syslog("RejetPrelevement::_send_email Erreur envoi email");
271  }
272  } else {
273  dol_syslog("RejetPrelevement::_send_email Userid invalide");
274  }
275  }
276 
284  private function getListInvoices($amounts = 0)
285  {
286  global $conf;
287 
288  $arr = array();
289 
290  //Returns all invoices of a withdrawal
291  $sql = "SELECT f.rowid as facid, pl.amount";
292  $sql .= " FROM ".MAIN_DB_PREFIX."prelevement as pf";
293  if ($this->type == 'bank-transfer') {
294  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture_fourn as f ON (pf.fk_facture_fourn = f.rowid)";
295  } else {
296  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture as f ON (pf.fk_facture = f.rowid)";
297  }
298  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."prelevement_lignes as pl ON (pf.fk_prelevement_lignes = pl.rowid)";
299  $sql .= " WHERE pf.fk_prelevement_lignes = ".((int) $this->id);
300  $sql .= " AND f.entity IN (".getEntity('invoice').")";
301 
302  $resql = $this->db->query($sql);
303  if ($resql) {
304  $num = $this->db->num_rows($resql);
305 
306  if ($num) {
307  $i = 0;
308  while ($i < $num) {
309  $row = $this->db->fetch_row($resql);
310  if (!$amounts) {
311  $arr[$i] = $row[0];
312  } else {
313  $arr[$i] = array(
314  $row[0],
315  $row[1]
316  );
317  }
318  $i++;
319  }
320  }
321  $this->db->free($resql);
322  } else {
323  dol_syslog("getListInvoices", LOG_ERR);
324  }
325 
326  return $arr;
327  }
328 
335  public function fetch($rowid)
336  {
337 
338  $sql = "SELECT pr.date_rejet as dr, motif, afacturer";
339  $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_rejet as pr";
340  $sql .= " WHERE pr.fk_prelevement_lignes =".((int) $rowid);
341 
342  $resql = $this->db->query($sql);
343  if ($resql) {
344  if ($this->db->num_rows($resql)) {
345  $obj = $this->db->fetch_object($resql);
346 
347  $this->id = $rowid;
348  $this->date_rejet = $this->db->jdate($obj->dr);
349  $this->motif = $this->motifs[$obj->motif];
350  $this->invoicing = $this->facturer[$obj->afacturer];
351 
352  $this->db->free($resql);
353 
354  return 0;
355  } else {
356  dol_syslog("RejetPrelevement::Fetch Erreur rowid=".$rowid." numrows=0");
357  return -1;
358  }
359  } else {
360  dol_syslog("RejetPrelevement::Fetch Erreur rowid=".$rowid);
361  return -2;
362  }
363  }
364 }
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
Class to manage suppliers invoices.
Class to manage invoices.
Class to manage withdrawals.
Class to manage payments for supplier invoices.
Class to manage payments of customer invoices.
Class to manage standing orders rejects.
_send_email($fac)
Send email to all users that has asked the withdraw request.
getListInvoices($amounts=0)
Retrieve the list of invoices.
__construct($db, $user, $type)
Constructor.
create($user, $id, $motif, $date_rejet, $bonid, $facturation=0)
Create.
fetch($rowid)
Retrieve withdrawal object.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
Definition: user.class.php:47
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
dol_now($mode='auto')
Return date for now.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition: repair.php:119
$conf db user
Definition: repair.php:123
$conf db
API class for accounts.
Definition: inc.php:41