dolibarr 21.0.0-alpha
paiement.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2003-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
4 * Copyright (C) 2004-2020 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2004 Christophe Combelles <ccomb@free.fr>
6 * Copyright (C) 2005 Marc Barilley / Ocebo <marc@ocebo.com>
7 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
8 * Copyright (C) 2014 Teddy Andreotti <125155@supinfo.com>
9 * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
10 * Copyright (C) 2015 Juanjo Menent <jmenent@2byte.es>
11 * Copyright (C) 2017 Alexandre Spangaro <aspangaro@open-dsi.fr>
12 * Copyright (C) 2018-2024 Frédéric France <frederic.france@free.fr>
13 * Copyright (C) 2021 Charlene Benke <charlene@patas-monkey.com>
14 * Copyright (C) 2022 Udo Tamm <dev@dolibit.de>
15 * Copyright (C) 2023 Sylvain Legrand <technique@infras.fr>
16 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
17 *
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation; either version 3 of the License, or
21 * (at your option) any later version.
22 *
23 * This program is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
27 *
28 * You should have received a copy of the GNU General Public License
29 * along with this program. If not, see <https://www.gnu.org/licenses/>.
30 */
31
38// Load Dolibarr environment
39require '../../main.inc.php';
40require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
41require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
42require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php';
43require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
44require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
45require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
46
47// Load translation files required by the page
48$langs->loadLangs(array('companies', 'bills', 'banks', 'compta'));
49
50$action = GETPOST('action', 'alpha');
51$confirm = GETPOST('confirm', 'alpha');
52$optioncss = GETPOST('optioncss', 'alpha');
53$cancel = GETPOST('cancel', 'alpha');
54$backtopage = GETPOST('backtopage', 'alpha');
55$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
56
57$facid = GETPOSTINT('facid');
58$socid = GETPOSTINT('socid');
59$accountid = GETPOSTINT('accountid');
60$day = GETPOSTINT('day');
61$month = GETPOSTINT('month');
62$year = GETPOSTINT('year');
63
64$search_ref = GETPOST('search_ref', 'alpha');
65$search_account = GETPOST('search_account', 'alpha');
66$search_paymenttype = GETPOST('search_paymenttype');
67$search_amount = GETPOST('search_amount', 'alpha'); // alpha because we must be able to search on "< x"
68$search_company = GETPOST('search_company', 'alpha');
69$search_payment_num = GETPOST('search_payment_num', 'alpha');
70
71$limit = GETPOSTINT('limit') ? GETPOST('limit') : $conf->liste_limit;
72$sortfield = GETPOST('sortfield', 'aZ09comma');
73$sortorder = GETPOST('sortorder', 'aZ09comma');
74$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
75if (empty($page) || $page == -1) {
76 $page = 0;
77} // If $page is not defined, or '' or -1
78$offset = $limit * $page;
79$pageprev = $page - 1;
80$pagenext = $page + 1;
81if (!$sortorder) {
82 $sortorder = "DESC";
83}
84if (!$sortfield) {
85 $sortfield = "p.rowid";
86}
87
88$amounts = array();
89$amountsresttopay = array();
90$addwarning = 0;
91
92$multicurrency_amounts = array();
93$multicurrency_amountsresttopay = array();
94
95// Security check
96if ($user->socid > 0) {
97 $socid = $user->socid;
98}
99
100$object = new PaiementFourn($db);
101
102// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
103$hookmanager->initHooks(array('paymentsupplierlist'));
104$extrafields = new ExtraFields($db);
105
106// fetch optionals attributes and labels
107$extrafields->fetch_name_optionals_label($object->table_element);
108
109$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
110
111$arrayfields = array();
112
113$permissiontoadd = ($user->hasRight("fournisseur", "facture", "creer") || $user->hasRight("supplier_invoice", "creer"));
114
115
116/*
117 * Actions
118 */
119
120if ($cancel) {
121 if (!empty($backtopageforcancel)) {
122 header("Location: ".$backtopageforcancel);
123 exit;
124 } elseif (!empty($backtopage)) {
125 header("Location: ".$backtopage);
126 exit;
127 }
128 header("Location: ".DOL_URL_ROOT.'/fourn/facture/list.php');
129 exit;
130}
131
132if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
133 $search_ref = "";
134 $search_account = "";
135 $search_amount = "";
136 $search_paymenttype = "";
137 $search_payment_num = "";
138 $search_company = "";
139 $day = '';
140 $year = '';
141 $month = '';
142 $search_array_options = array();
143}
144
145$parameters = array('socid' => $socid);
146$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
147if ($reshook < 0) {
148 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
149}
150
151if (empty($reshook)) {
152 if (($action == 'add_paiement' || ($action == 'confirm_paiement' && $confirm == 'yes')) && $permissiontoadd) {
153 $error = 0;
154
155 $datepaye = dol_mktime(12, 0, 0, GETPOST('remonth'), GETPOST('reday'), GETPOST('reyear'));
156 $paiement_id = 0;
157 $totalpayment = 0;
158 $atleastonepaymentnotnull = 0;
159 $multicurrency_totalpayment = 0;
160 $formquestion = array();
161
162 // Generate payment array and check if there is payment higher than invoice and payment date before invoice date
163 $tmpinvoice = new FactureFournisseur($db);
164 foreach ($_POST as $key => $value) {
165 if (substr($key, 0, 7) == 'amount_') {
166 $cursorfacid = substr($key, 7);
167 $amounts[$cursorfacid] = price2num(GETPOST($key));
168 if (!empty($amounts[$cursorfacid])) {
169 $atleastonepaymentnotnull++;
170 if (is_numeric($amounts[$cursorfacid])) {
171 $totalpayment += (float) $amounts[$cursorfacid];
172 } else {
173 setEventMessages($langs->transnoentities("InputValueIsNotAnNumber", GETPOST($key)), null, 'warnings');
174 }
175 }
176 $result = $tmpinvoice->fetch($cursorfacid);
177 if ($result <= 0) {
178 dol_print_error($db);
179 }
180 $amountsresttopay[$cursorfacid] = price2num($tmpinvoice->total_ttc - $tmpinvoice->getSommePaiement());
181 if ($amounts[$cursorfacid]) {
182 // Check amount
183 if ($amounts[$cursorfacid] && (abs((float) $amounts[$cursorfacid]) > abs((float) $amountsresttopay[$cursorfacid]))) {
184 $addwarning = 1;
185 $formquestion['text'] = img_warning($langs->trans("PaymentHigherThanReminderToPaySupplier")).' '.$langs->trans("HelpPaymentHigherThanReminderToPaySupplier");
186 }
187 // Check date
188 if ($datepaye && ($datepaye < $tmpinvoice->date)) {
189 $langs->load("errors");
190 //$error++;
191 setEventMessages($langs->transnoentities("WarningPaymentDateLowerThanInvoiceDate", dol_print_date($datepaye, 'day'), dol_print_date($tmpinvoice->date, 'day'), $tmpinvoice->ref), null, 'warnings');
192 }
193 }
194
195 $formquestion[$i++] = array('type' => 'hidden', 'name' => $key, 'value' => GETPOST($key));
196 } elseif (substr($key, 0, 21) == 'multicurrency_amount_') {
197 $cursorfacid = substr($key, 21);
198 $multicurrency_amounts[$cursorfacid] = (GETPOST($key) ? price2num(GETPOST($key)) : 0);
199 $multicurrency_totalpayment += $multicurrency_amounts[$cursorfacid];
200 if (!empty($multicurrency_amounts[$cursorfacid])) {
201 $atleastonepaymentnotnull++;
202 }
203 $result = $tmpinvoice->fetch($cursorfacid);
204 if ($result <= 0) {
205 dol_print_error($db);
206 }
207 $multicurrency_amountsresttopay[$cursorfacid] = price2num($tmpinvoice->multicurrency_total_ttc - $tmpinvoice->getSommePaiement(1));
208 if ($multicurrency_amounts[$cursorfacid]) {
209 // Check amount
210 if ($multicurrency_amounts[$cursorfacid] && (abs((float) $multicurrency_amounts[$cursorfacid]) > abs((float) $multicurrency_amountsresttopay[$cursorfacid]))) {
211 $addwarning = 1;
212 $formquestion['text'] = img_warning($langs->trans("PaymentHigherThanReminderToPaySupplier")).' '.$langs->trans("HelpPaymentHigherThanReminderToPaySupplier");
213 }
214 // Check date
215 if ($datepaye && ($datepaye < $tmpinvoice->date)) {
216 $langs->load("errors");
217 //$error++;
218 setEventMessages($langs->transnoentities("WarningPaymentDateLowerThanInvoiceDate", dol_print_date($datepaye, 'day'), dol_print_date($tmpinvoice->date, 'day'), $tmpinvoice->ref), null, 'warnings');
219 }
220 }
221
222 $formquestion[$i++] = array('type' => 'hidden', 'name' => $key, 'value' => GETPOSTINT($key));
223 }
224 }
225
226 // Check parameters
227 if (GETPOST('paiementid') <= 0) {
228 setEventMessages($langs->transnoentities('ErrorFieldRequired', $langs->transnoentities('PaymentMode')), null, 'errors');
229 $error++;
230 }
231
232 if (isModEnabled("bank")) {
233 // If bank module is on, account is required to enter a payment
234 if (GETPOST('accountid') <= 0) {
235 setEventMessages($langs->transnoentities('ErrorFieldRequired', $langs->transnoentities('AccountToCredit')), null, 'errors');
236 $error++;
237 }
238 }
239
240 if (empty($totalpayment) && empty($multicurrency_totalpayment) && empty($atleastonepaymentnotnull)) {
241 setEventMessages($langs->transnoentities('ErrorFieldRequired', $langs->trans('PaymentAmount')), null, 'errors');
242 $error++;
243 }
244
245 if (empty($datepaye)) {
246 setEventMessages($langs->transnoentities('ErrorFieldRequired', $langs->transnoentities('Date')), null, 'errors');
247 $error++;
248 }
249
250 // Check if payments in both currency
251 if ($totalpayment > 0 && $multicurrency_totalpayment > 0) {
252 setEventMessages($langs->transnoentities('ErrorPaymentInBothCurrency'), null, 'errors');
253 $error++;
254 }
255 }
256
257 /*
258 * Action add_paiement
259 */
260 if ($action == 'add_paiement') {
261 if ($error) {
262 $action = 'create';
263 }
264 // All the next of this action is displayed at the page's bottom.
265 }
266
267
268 /*
269 * Action confirm_paiement
270 */
271 if ($action == 'confirm_paiement' && $confirm == 'yes') {
272 $error = 0;
273
274 $datepaye = dol_mktime(12, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
275
276 $multicurrency_code = array();
277 $multicurrency_tx = array();
278
279 // Clean parameters amount if payment is for a credit note
280 foreach ($amounts as $key => $value) { // How payment is dispatched
281 $tmpinvoice = new FactureFournisseur($db);
282 $tmpinvoice->fetch($key);
283 if ($tmpinvoice->type == FactureFournisseur::TYPE_CREDIT_NOTE) {
284 $newvalue = price2num($value, 'MT');
285 $amounts[$key] = - abs((float) $newvalue);
286 }
287 $multicurrency_code[$key] = $tmpinvoice->multicurrency_code;
288 $multicurrency_tx[$key] = $tmpinvoice->multicurrency_tx;
289 }
290
291 foreach ($multicurrency_amounts as $key => $value) { // How payment is dispatched
292 $tmpinvoice = new FactureFournisseur($db);
293 $tmpinvoice->fetch($key);
294 if ($tmpinvoice->type == FactureFournisseur::TYPE_CREDIT_NOTE) {
295 $newvalue = price2num($value, 'MT');
296 $multicurrency_amounts[$key] = - abs((float) $newvalue);
297 }
298 $multicurrency_code[$key] = $tmpinvoice->multicurrency_code;
299 $multicurrency_tx[$key] = $tmpinvoice->multicurrency_tx;
300 }
301
302 //var_dump($amounts);
303 //var_dump($multicurrency_amounts);
304 //exit;
305
306 if (!$error) {
307 $db->begin();
308
309 $thirdparty = new Societe($db);
310 if ($socid > 0) {
311 $thirdparty->fetch($socid);
312 }
313
314 // Creation of payment line
315 $paiement = new PaiementFourn($db);
316 $paiement->datepaye = $datepaye;
317
318 $correctedAmounts = [];
319 foreach ($amounts as $key => $value) {
320 $correctedAmounts[$key] = (float) $value;
321 }
322
323 $paiement->amounts = $correctedAmounts; // Array of amounts
324 $paiement->multicurrency_amounts = $multicurrency_amounts;
325 $paiement->multicurrency_code = $multicurrency_code; // Array with all currency of payments dispatching
326 $paiement->multicurrency_tx = $multicurrency_tx; // Array with all currency tx of payments dispatching
327 $paiement->paiementid = GETPOSTINT('paiementid');
328 $paiement->num_payment = GETPOST('num_paiement', 'alphanohtml');
329 $paiement->note_private = GETPOST('comment', 'alpha');
330 $paiement->fk_account = GETPOSTINT('accountid');
331
332 if (!$error) {
333 // Create payment and update this->multicurrency_amounts if this->amounts filled or
334 // this->amounts if this->multicurrency_amounts filled.
335 // This also set ->amount and ->multicurrency_amount
336 $paiement_id = $paiement->create($user, (GETPOST('closepaidinvoices') == 'on' ? 1 : 0), $thirdparty);
337 if ($paiement_id < 0) {
338 setEventMessages($paiement->error, $paiement->errors, 'errors');
339 $error++;
340 }
341 }
342
343 if (!$error) {
344 $result = $paiement->addPaymentToBank($user, 'payment_supplier', '(SupplierInvoicePayment)', $accountid, GETPOST('chqemetteur'), GETPOST('chqbank'));
345 if ($result < 0) {
346 setEventMessages($paiement->error, $paiement->errors, 'errors');
347 $error++;
348 }
349 }
350
351 if (!$error) {
352 $db->commit();
353
354 // If payment dispatching on more than one invoice, we stay on summary page, otherwise go on invoice card
355 $invoiceid = 0;
356 foreach ($paiement->amounts as $key => $amount) {
357 $facid = $key;
358 if (is_numeric($amount) && $amount != 0) {
359 if ($invoiceid != 0) {
360 $invoiceid = -1; // There is more than one invoice paid by this payment
361 } else {
362 $invoiceid = $facid;
363 }
364 }
365 }
366 if ($invoiceid > 0) {
367 $loc = DOL_URL_ROOT.'/fourn/facture/card.php?facid='.$invoiceid;
368 } else {
369 $loc = DOL_URL_ROOT.'/fourn/paiement/card.php?id='.$paiement_id;
370 }
371 header('Location: '.$loc);
372 exit;
373 } else {
374 $db->rollback();
375 }
376 }
377 }
378}
379
380
381/*
382 * View
383 */
384
385$form = new Form($db);
386$formother = new FormOther($db);
387
388$supplierstatic = new Societe($db);
389$invoicesupplierstatic = new FactureFournisseur($db);
390
391llxHeader('', $langs->trans('ListPayment'), '', '', 0, 0, '', '', '', 'mod-fourn-facture page-paiement');
392
393if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paiement') {
394 $object = new FactureFournisseur($db);
395 $result = $object->fetch($facid);
396
397 $datefacture = dol_mktime(12, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
398 $dateinvoice = ($datefacture == '' ? (!getDolGlobalString('MAIN_AUTOFILL_DATE') ? -1 : '') : $datefacture);
399
400 $sql = 'SELECT s.nom as name, s.rowid as socid,';
401 $sql .= ' f.rowid, f.ref, f.ref_supplier, f.total_ttc as total, f.fk_mode_reglement, f.fk_account';
402 if (!$user->hasRight("societe", "client", "voir") && !$socid) {
403 $sql .= ", sc.fk_soc, sc.fk_user ";
404 }
405 $sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s, '.MAIN_DB_PREFIX.'facture_fourn as f';
406 if (!$user->hasRight("societe", "client", "voir") && !$socid) {
407 $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
408 }
409 $sql .= ' WHERE f.fk_soc = s.rowid';
410 $sql .= ' AND f.rowid = '.((int) $facid);
411 if (!$user->hasRight("societe", "client", "voir") && !$socid) {
412 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
413 }
414 $resql = $db->query($sql);
415 if ($resql) {
416 $num = $db->num_rows($resql);
417 if ($num) {
418 $obj = $db->fetch_object($resql);
419 $total = $obj->total;
420
421 print load_fiche_titre($langs->trans('DoPayment'));
422
423 // Add realtime total information
424 if (!empty($conf->use_javascript_ajax)) {
425 print "\n".'<script type="text/javascript">';
426 print '$(document).ready(function () {
427
428 function _elemToJson(selector)
429 {
430 var subJson = {};
431 $.map(selector.serializeArray(), function(n,i)
432 {
433 subJson[n["name"]] = n["value"];
434 });
435
436 return subJson;
437 }
438 function callForResult(imgId)
439 {
440 console.log("callForResult Calculate total of payment");
441 var json = {};
442 var form = $("#payment_form");
443
444 json["invoice_type"] = $("#invoice_type").val();
445 json["amountPayment"] = $("#amountpayment").attr("value");
446 json["amounts"] = _elemToJson(form.find("input.amount"));
447 json["remains"] = _elemToJson(form.find("input.remain"));
448 json["token"] = "'.currentToken().'";
449 if (imgId != null) {
450 json["imgClicked"] = imgId;
451 }
452
453 $.post("'.DOL_URL_ROOT.'/compta/ajaxpayment.php", json, function(data)
454 {
455 json = $.parseJSON(data);
456
457 form.data(json);
458
459 for (var key in json)
460 {
461 if (key == "result") {
462 if (json["makeRed"]) {
463 $("#"+key).addClass("error");
464 } else {
465 $("#"+key).removeClass("error");
466 }
467 json[key]=json["label"]+" "+json[key];
468 $("#"+key).text(json[key]);
469 } else {console.log(key);
470 form.find("input[name*=\""+key+"\"]").each(function() {
471 $(this).attr("value", json[key]);
472 });
473 }
474 }
475 });
476 }
477 callForResult();
478 $("#payment_form").find("input.amount").change(function() {
479 callForResult();
480 });
481 $("#payment_form").find("input.amount").keyup(function() {
482 callForResult();
483 });
484 ';
485
486 print ' });'."\n";
487
488 //Add js for AutoFill
489 print ' $(document).ready(function () {';
490 print ' $(".AutoFillAmount").on(\'click touchstart\', function(){
491 $("input[name="+$(this).data(\'rowname\')+"]").val($(this).data("value")).trigger("change");
492 });';
493 print ' });'."\n";
494
495 print ' </script>'."\n";
496 }
497
498 print '<form id="payment_form" name="addpaiement" action="'.$_SERVER["PHP_SELF"].'" method="POST">';
499 print '<input type="hidden" name="token" value="'.newToken().'">';
500 print '<input type="hidden" name="action" value="add_paiement">';
501 print '<input type="hidden" name="facid" value="'.$facid.'">';
502 print '<input type="hidden" name="ref_supplier" value="'.$obj->ref_supplier.'">';
503 print '<input type="hidden" name="socid" value="'.$obj->socid.'">';
504 print '<input type="hidden" name="type" id="invoice_type" value="'.$object->type.'">';
505 print '<input type="hidden" name="societe" value="'.$obj->name.'">';
506
507 print dol_get_fiche_head([]);
508
509 print '<table class="border centpercent">';
510
511 print '<tr><td class="fieldrequired titlefieldcreate">'.$langs->trans('Company').'</td><td>';
512 $supplierstatic->id = $obj->socid;
513 $supplierstatic->name = $obj->name;
514 print $supplierstatic->getNomUrl(1, 'supplier');
515 print '</td></tr>';
516
517 print '<tr><td class="fieldrequired">'.$langs->trans('Date').'</td><td>';
518 // $object is default vendor invoice
519 $adddateof = array(array('adddateof' => $object->date));
520 $adddateof[] = array('adddateof' => $object->date_echeance, 'labeladddateof' => $langs->transnoentities('DateDue'));
521 print $form->selectDate($dateinvoice, '', 0, 0, 0, "addpaiement", 1, 1, 0, '', '', $adddateof);
522 print '</td></tr>';
523 print '<tr><td class="fieldrequired">'.$langs->trans('PaymentMode').'</td><td>';
524 $form->select_types_paiements(!GETPOST('paiementid') ? $obj->fk_mode_reglement : GETPOST('paiementid'), 'paiementid');
525 print '</td>';
526 if (isModEnabled("bank")) {
527 print '<tr><td class="fieldrequired">'.$langs->trans('Account').'</td><td>';
528 print img_picto('', 'bank_account', 'class="pictofixedwidth"');
529 print $form->select_comptes(empty($accountid) ? $obj->fk_account : $accountid, 'accountid', 0, '', 2, '', 0, 'widthcentpercentminusx maxwidth500', 1);
530 print '</td></tr>';
531 } else {
532 print '<tr><td>&nbsp;</td></tr>';
533 }
534 print '<tr><td>'.$langs->trans('Numero').'</td><td><input name="num_paiement" type="text" value="'.(!GETPOST('num_paiement') ? '' : GETPOST('num_paiement')).'"></td></tr>';
535 print '<tr><td>'.$langs->trans('Comments').'</td>';
536 print '<td class="tdtop">';
537 print '<textarea name="comment" wrap="soft" class="quatrevingtpercent" rows="'.ROWS_3.'">'.(!GETPOST('comment') ? '' : GETPOST('comment')).'</textarea></td></tr>';
538 print '</table>';
539 print dol_get_fiche_end();
540
541
542 $parameters = array('facid' => $facid, 'ref' => $ref, 'objcanvas' => $objcanvas);
543 $reshook = $hookmanager->executeHooks('paymentsupplierinvoices', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
544 $error = $hookmanager->error;
545 $errors = $hookmanager->errors;
546 if (empty($reshook)) {
547 /*
548 * All unpaid supplier invoices
549 */
550 $sql = 'SELECT f.rowid as facid, f.ref, f.ref_supplier, f.type, f.total_ht, f.total_ttc,';
551 $sql .= ' f.multicurrency_code, f.multicurrency_tx, f.multicurrency_total_ht, f.multicurrency_total_tva, f.multicurrency_total_ttc,';
552 $sql .= ' f.datef as df, f.date_lim_reglement as dlr,';
553 $sql .= ' SUM(pf.amount) as am, SUM(pf.multicurrency_amount) as multicurrency_am';
554 $sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as f';
555 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf ON pf.fk_facturefourn = f.rowid';
556 $sql .= " WHERE f.entity = ".((int) $conf->entity);
557 $sql .= ' AND f.fk_soc = '.((int) $object->socid);
558 $sql .= ' AND f.paye = 0';
559 $sql .= ' AND f.fk_statut = 1'; // Status=0 => unvalidated, Status=2 => canceled
561 $sql .= ' AND f.type IN (0,1,3,5)'; // Standard invoice, replacement, deposit, situation
562 } else {
563 $sql .= ' AND f.type = 2'; // If paying back a credit note, we show all credit notes
564 }
565 // Group by because we have a total
566 $sql .= ' GROUP BY f.datef, f.ref, f.ref_supplier, f.rowid, f.type, f.total_ht, f.total_ttc,';
567 $sql .= ' f.multicurrency_code, f.multicurrency_tx, f.multicurrency_total_ht, f.multicurrency_total_tva, f.multicurrency_total_ttc,';
568 $sql .= ' f.datef, f.date_lim_reglement';
569 // Sort invoices by date and serial number: the older one comes first
570 $sql .= ' ORDER BY f.datef ASC, f.ref ASC';
571
572 $resql = $db->query($sql);
573 if ($resql) {
574 $num = $db->num_rows($resql);
575 if ($num > 0) {
576 $i = 0;
577 print '<br>';
578
579 if (!empty($conf->use_javascript_ajax)) {
580 //Add js for AutoFill
581 print "\n".'<script type="text/javascript">';
582 print ' $(document).ready(function () {';
583 print ' $(".AutoFillAmount").on(\'click touchstart\', function(){
584 $("input[name="+$(this).data(\'rowname\')+"]").val($(this).data("value"));
585 });';
586 print ' });'."\n";
587 print ' </script>'."\n";
588 }
589
590 print '<div class="div-table-responsive-no-min">';
591 print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
592
593 print '<tr class="liste_titre">';
594 print '<td>'.$langs->trans('Invoice').'</td>';
595 print '<td>'.$langs->trans('RefSupplier').'</td>';
596 print '<td class="center">'.$langs->trans('Date').'</td>';
597 print '<td class="center">'.$langs->trans('DateMaxPayment').'</td>';
598 if (isModEnabled("multicurrency")) {
599 print '<td>'.$langs->trans('Currency').'</td>';
600 print '<td class="right">'.$langs->trans('MulticurrencyAmountTTC').'</td>';
601 print '<td class="right">'.$langs->trans('MulticurrencyAlreadyPaid').'</td>';
602 print '<td class="right">'.$langs->trans('MulticurrencyRemainderToPay').'</td>';
603 print '<td class="center">'.$langs->trans('MulticurrencyPaymentAmount').'</td>';
604 }
605 print '<td class="right">'.$langs->trans('AmountTTC').'</td>';
606 print '<td class="right">'.$langs->trans('AlreadyPaid').'</td>';
607 print '<td class="right">'.$langs->trans('RemainderToPay').'</td>';
608 print '<td class="center">'.$langs->trans('PaymentAmount').'</td>';
609 print '</tr>';
610
611 $total = 0;
612 $total_ttc = 0;
613 $totalrecu = 0;
614 $totalrecucreditnote = 0; // PHP Warning: Undefined variable $totalrecucreditnote
615 $totalrecudeposits = 0; // PHP Warning: Undefined variable $totalrecudeposits
616 while ($i < $num) {
617 $objp = $db->fetch_object($resql);
618
619 $sign = 1;
620 if ($objp->type == FactureFournisseur::TYPE_CREDIT_NOTE) {
621 $sign = -1;
622 }
623
624 $invoice = new FactureFournisseur($db);
625 $invoice->fetch($objp->facid);
626
627 $invoicesupplierstatic->ref = $objp->ref;
628 $invoicesupplierstatic->id = $objp->facid;
629
630 $paiement = $invoice->getSommePaiement();
631 $creditnotes = $invoice->getSumCreditNotesUsed();
632 $deposits = $invoice->getSumDepositsUsed();
633 $alreadypayed = price2num($paiement + $creditnotes + $deposits, 'MT');
634 $remaintopay = price2num($invoice->total_ttc - $paiement - $creditnotes - $deposits, 'MT');
635
636 // Multicurrency Price
637 if (isModEnabled("multicurrency")) {
638 $multicurrency_payment = $invoice->getSommePaiement(1);
639 $multicurrency_creditnotes = $invoice->getSumCreditNotesUsed(1);
640 $multicurrency_deposits = $invoice->getSumDepositsUsed(1);
641 $multicurrency_alreadypayed = price2num($multicurrency_payment + $multicurrency_creditnotes + $multicurrency_deposits, 'MT');
642 $multicurrency_remaintopay = price2num($invoice->multicurrency_total_ttc - $multicurrency_payment - $multicurrency_creditnotes - $multicurrency_deposits, 'MT');
643 }
644
645 print '<tr class="oddeven'.(($invoice->id == $facid) ? ' highlight' : '').'">';
646
647 // Ref
648 print '<td class="nowraponall">';
649 print $invoicesupplierstatic->getNomUrl(1);
650 print '</td>';
651
652 // Ref supplier
653 print '<td>'.$objp->ref_supplier.'</td>';
654
655 // Date
656 if ($objp->df > 0) {
657 print '<td class="center nowraponall">';
658 print dol_print_date($db->jdate($objp->df), 'day').'</td>';
659 } else {
660 print '<td class="center"><b>!!!</b></td>';
661 }
662
663 // Date Max Payment
664 if ($objp->dlr > 0) {
665 print '<td class="center nowraponall">';
666 print dol_print_date($db->jdate($objp->dlr), 'day');
667
668 if ($invoice->hasDelay()) {
669 print img_warning($langs->trans('Late'));
670 }
671
672 print '</td>';
673 } else {
674 print '<td class="center"><b>--</b></td>';
675 }
676
677 // Multicurrency
678 if (isModEnabled("multicurrency")) {
679 // Currency
680 print '<td class="center">'.$objp->multicurrency_code."</td>\n";
681
682 print '<td class="right">';
683 if ($objp->multicurrency_code && $objp->multicurrency_code != $conf->currency) {
684 print price($objp->multicurrency_total_ttc);
685 }
686 print '</td>';
687
688 print '<td class="right">';
689 if ($objp->multicurrency_code && $objp->multicurrency_code != $conf->currency) {
690 print price($sign * $multicurrency_payment);
691 if ($multicurrency_creditnotes) {
692 print '+'.price($multicurrency_creditnotes);
693 }
694 if ($multicurrency_deposits) {
695 print '+'.price($multicurrency_deposits);
696 }
697 }
698 print '</td>';
699
700 print '<td class="right">';
701 if ($objp->multicurrency_code && $objp->multicurrency_code != $conf->currency) {
702 print price($sign * (float) $multicurrency_remaintopay);
703 }
704 print '</td>';
705
706 print '<td class="right">';
707 // Add remind multicurrency amount
708 $namef = 'multicurrency_amount_'.$objp->facid;
709 $nameRemain = 'multicurrency_remain_'.$objp->facid;
710 if ($objp->multicurrency_code && $objp->multicurrency_code != $conf->currency) {
711 if ($action != 'add_paiement') {
712 if (!empty($conf->use_javascript_ajax)) {
713 print img_picto("Auto fill", 'rightarrow', "class='AutoFillAmount' data-rowname='".$namef."' data-value='".($sign * (float) $multicurrency_remaintopay)."'");
714 }
715 print '<input type=hidden class="multicurrency_remain" name="'.$nameRemain.'" value="'.$multicurrency_remaintopay.'">';
716 print '<input type="text" size="8" class="multicurrency_amount" name="'.$namef.'" value="'.GETPOST($namef).'">';
717 } else {
718 print '<input type="text" size="8" name="'.$namef.'_disabled" value="'.GETPOST($namef).'" disabled>';
719 print '<input type="hidden" name="'.$namef.'" value="'.GETPOST($namef).'">';
720 }
721 }
722 print "</td>";
723 }
724
725 print '<td class="right">'.price($sign * $objp->total_ttc).'</td>';
726
727 print '<td class="right">'.price($sign * $objp->am);
728 if ($creditnotes) {
729 print '+'.price($creditnotes);
730 }
731 if ($deposits) {
732 print '+'.price($deposits);
733 }
734 print '</td>';
735
736 print '<td class="right">';
737 print price($sign * (float) $remaintopay);
738 if (isModEnabled('paymentbybanktransfer')) {
739 $numdirectdebitopen = 0;
740 $totaldirectdebit = 0;
741 $sql = "SELECT COUNT(pfd.rowid) as nb, SUM(pfd.amount) as amount";
742 $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
743 $sql .= " WHERE fk_facture_fourn = ".((int) $objp->facid);
744 $sql .= " AND pfd.traite = 0";
745 $sql .= " AND pfd.ext_payment_id IS NULL";
746
747 $result_sql = $db->query($sql);
748 if ($result_sql) {
749 $obj = $db->fetch_object($result_sql);
750 $numdirectdebitopen = $obj->nb;
751 $totaldirectdebit = $obj->amount;
752 } else {
753 dol_print_error($db);
754 }
755 if ($numdirectdebitopen) {
756 $langs->load("withdrawals");
757 print img_warning($langs->trans("WarningSomeCreditTransferAlreadyExists", $numdirectdebitopen, price(price2num($totaldirectdebit, 'MT'), 0, $langs, 1, -1, -1, $conf->currency)), '', 'classfortooltip');
758 }
759 }
760 print '</td>';
761
762 // Amount
763 print '<td class="center nowraponall">';
764
765 $namef = 'amount_'.$objp->facid;
766 $nameRemain = 'remain_'.$objp->facid;
767
768 if ($action != 'add_paiement') {
769 if (!empty($conf->use_javascript_ajax)) {
770 print img_picto("Auto fill", 'rightarrow', "class='AutoFillAmount' data-rowname='".$namef."' data-value='".($sign * (float) $remaintopay)."'");
771 }
772 print '<input type="hidden" class="remain" name="'.$nameRemain.'" value="'.$remaintopay.'">';
773 print '<input type="text" size="8" class="amount" name="'.$namef.'" value="'.dol_escape_htmltag(GETPOST($namef)).'">'; // class is required to be used by javascript callForResult();
774 } else {
775 print '<input type="text" size="8" name="'.$namef.'_disabled" value="'.dol_escape_htmltag(GETPOST($namef)).'" disabled>';
776 print '<input type="hidden" class="amount" name="'.$namef.'" value="'.dol_escape_htmltag(GETPOST($namef)).'">'; // class is required to be used by javascript callForResult();
777 }
778 print "</td>";
779
780 print "</tr>\n";
781 $total += $objp->total_ht;
782 $total_ttc += $objp->total_ttc;
783 $totalrecu += $objp->am;
784 $totalrecucreditnote += $creditnotes;
785 $totalrecudeposits += $deposits;
786 $i++;
787 }
788 if ($i > 1) {
789 // Print total
790 print '<tr class="liste_total">';
791 print '<td colspan="4" class="left">'.$langs->trans('TotalTTC').':</td>';
792 if (isModEnabled("multicurrency")) {
793 print '<td>&nbsp;</td>';
794 print '<td>&nbsp;</td>';
795 print '<td>&nbsp;</td>';
796 print '<td>&nbsp;</td>';
797 print '<td class="right" id="multicurrency_result" style="font-weight: bold;"></td>';
798 }
799 print '<td class="right"><b>'.price($sign * $total_ttc).'</b></td>';
800 print '<td class="right"><b>'.price($sign * $totalrecu);
801 if ($totalrecucreditnote) {
802 print '+'.price($totalrecucreditnote);
803 }
804 if ($totalrecudeposits) {
805 print '+'.price($totalrecudeposits);
806 }
807 print '</b></td>';
808 print '<td class="right"><b>'.price($sign * (float) price2num($total_ttc - $totalrecu - $totalrecucreditnote - $totalrecudeposits, 'MT')).'</b></td>';
809 print '<td class="center" id="result" style="font-weight: bold;"></td>'; // Autofilled
810 print "</tr>\n";
811 }
812 print "</table>\n";
813
814 print "</div>";
815 }
816 $db->free($resql);
817 } else {
818 dol_print_error($db);
819 }
820 }
821
822 // Save + Cancel Buttons
823 if ($action != 'add_paiement') {
824 print '<br><div class="center">';
825 print '<input type="checkbox" checked id="closepaidinvoices" name="closepaidinvoices"> <label for="closepaidinvoices">'.$langs->trans("ClosePaidInvoicesAutomatically").'</label><br>';
826 print '<input type="submit" class="button" value="'.$langs->trans('ToMakePayment').'">';
827 print ' &nbsp; <input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
828 print '</div>';
829 }
830
831 // Form to confirm payment
832 if ($action == 'add_paiement') {
833 $preselectedchoice = $addwarning ? 'no' : 'yes';
834
835 print '<br>';
836 if (!empty($totalpayment)) {
837 $text = $langs->trans('ConfirmSupplierPayment', price($totalpayment), $langs->transnoentitiesnoconv("Currency".$conf->currency));
838 }
839 if (!empty($multicurrency_totalpayment)) {
840 $text .= '<br>'.$langs->trans('ConfirmSupplierPayment', price($multicurrency_totalpayment), $langs->transnoentitiesnoconv("paymentInInvoiceCurrency"));
841 }
842 if (GETPOST('closepaidinvoices')) {
843 $text .= '<br>'.$langs->trans("AllCompletelyPayedInvoiceWillBeClosed");
844 print '<input type="hidden" name="closepaidinvoices" value="'.GETPOST('closepaidinvoices').'">';
845 }
846 print $form->formconfirm($_SERVER['PHP_SELF'].'?facid='.$object->id.'&socid='.$object->socid.'&type='.$object->type, $langs->trans('PayedSuppliersPayments'), $text, 'confirm_paiement', $formquestion, $preselectedchoice);
847 }
848
849 print '</form>';
850 }
851 } else {
852 dol_print_error($db);
853 }
854}
855
856// End of page
857llxFooter();
858$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:70
Class to manage standard extra fields.
Class to manage suppliers invoices.
const TYPE_CREDIT_NOTE
Credit note invoice.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation de composants html autre Only common components are here.
Class to manage payments for supplier invoices.
Class to manage third parties objects (customers, suppliers, prospects...)
llxFooter()
Footer empty.
Definition document.php:107
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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...