dolibarr 23.0.3
bankjournal.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2007-2010 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2007-2010 Jean Heimburger <jean@tiaris.info>
4 * Copyright (C) 2011 Juanjo Menent <jmenent@2byte.es>
5 * Copyright (C) 2012 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2013 Christophe Battarel <christophe.battarel@altairis.fr>
7 * Copyright (C) 2013-2022 Open-DSI <support@open-dsi.fr>
8 * Copyright (C) 2013-2025 Alexandre Spangaro <alexandre@inovea-conseil.com>
9 * Copyright (C) 2013-2014 Florian Henry <florian.henry@open-concept.pro>
10 * Copyright (C) 2013-2014 Olivier Geffroy <jeff@jeffinfo.com>
11 * Copyright (C) 2017-2025 Frédéric France <frederic.france@free.fr>
12 * Copyright (C) 2018 Ferran Marcet <fmarcet@2byte.es>
13 * Copyright (C) 2018-2024 Eric Seigne <eric.seigne@cap-rel.fr>
14 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
15 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 3 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program. If not, see <https://www.gnu.org/licenses/>.
29 */
30
36require '../../main.inc.php';
37require_once DOL_DOCUMENT_ROOT.'/core/lib/report.lib.php';
38require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
41require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
42require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
43require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
44require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
45require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
46require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
47require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
48require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php';
49require_once DOL_DOCUMENT_ROOT.'/don/class/paymentdonation.class.php';
50require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
51require_once DOL_DOCUMENT_ROOT.'/salaries/class/paymentsalary.class.php';
52require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
53require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php';
54require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
55require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
56require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php';
57require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php';
58require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
59require_once DOL_DOCUMENT_ROOT.'/expensereport/class/paymentexpensereport.class.php';
60require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/paymentvarious.class.php';
61require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
62require_once DOL_DOCUMENT_ROOT.'/loan/class/loan.class.php';
63require_once DOL_DOCUMENT_ROOT.'/loan/class/paymentloan.class.php';
64require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php';
65
74// Load translation files required by the page
75$langs->loadLangs(array("companies", "other", "compta", "banks", "bills", "donations", "loan", "accountancy", "trips", "salaries", "hrm", "members"));
76
77// Multi journal
78$id_journal = GETPOSTINT('id_journal');
79
80$date_startmonth = GETPOSTINT('date_startmonth');
81$date_startday = GETPOSTINT('date_startday');
82$date_startyear = GETPOSTINT('date_startyear');
83$date_endmonth = GETPOSTINT('date_endmonth');
84$date_endday = GETPOSTINT('date_endday');
85$date_endyear = GETPOSTINT('date_endyear');
86$in_bookkeeping = GETPOST('in_bookkeeping', 'aZ09');
87
88$only_rappro = GETPOSTINT('only_rappro');
89if ($only_rappro == 0) {
90 //GET page for the first time, use default settings
91 $only_rappro = getDolGlobalInt('ACCOUNTING_BANK_CONCILIATED');
92}
93
94$now = dol_now();
95
96$action = GETPOST('action', 'aZ09');
97
98if ($in_bookkeeping == '') {
99 $in_bookkeeping = 'notyet';
100}
101
102
103// Security check
104if (!isModEnabled('accounting')) {
106}
107if ($user->socid > 0) {
109}
110if (!$user->hasRight('accounting', 'bind', 'write')) {
112}
113
114
115/*
116 * Actions
117 */
118
119$error = 0;
120
121$date_start = dol_mktime(0, 0, 0, $date_startmonth, $date_startday, $date_startyear);
122$date_end = dol_mktime(23, 59, 59, $date_endmonth, $date_endday, $date_endyear);
123
124$pastmonth = null; // Initialise for static analysis (could be really unseg)
125$pastmonthyear = null;
126
127if (empty($date_startmonth)) {
128 // Period by default on transfer
130 $date_start = $dates['date_start'];
131 $pastmonthyear = $dates['pastmonthyear'];
132 $pastmonth = $dates['pastmonth'];
133}
134if (empty($date_endmonth)) {
135 // Period by default on transfer
137 $date_end = $dates['date_end'];
138 $pastmonthyear = $dates['pastmonthyear'];
139 $pastmonth = $dates['pastmonth'];
140}
141
142if (!GETPOSTISSET('date_startmonth') && (empty($date_start) || empty($date_end))) { // We define date_start and date_end, only if we did not submit the form
143 $date_start = dol_get_first_day((int) $pastmonthyear, (int) $pastmonth, false);
144 $date_end = dol_get_last_day((int) $pastmonthyear, (int) $pastmonth, false);
145}
146
147// Get all bank lines
148//-------------------------------------
149$sql = "SELECT b.rowid, b.dateo as do, b.datev as dv, b.amount, b.amount_main_currency, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type, b.fk_account,";
150$sql .= " ba.courant, ba.ref as baref, ba.account_number, ba.fk_accountancy_journal,";
151$sql .= " soc.rowid as socid, soc.nom as name, soc.email as email, bu1.type as typeop_company,";
152if (getDolGlobalString('MAIN_COMPANY_PERENTITY_SHARED')) {
153 $sql .= " spe.accountancy_code_customer_general,";
154 $sql .= " spe.accountancy_code_customer as code_compta_client,";
155 $sql .= " spe.accountancy_code_supplier_general,";
156 $sql .= " spe.accountancy_code_supplier as code_compta_fournisseur,";
157} else {
158 $sql .= " soc.accountancy_code_customer_general,";
159 $sql .= " soc.code_compta as code_compta_client,";
160 $sql .= " soc.accountancy_code_supplier_general,";
161 $sql .= " soc.code_compta_fournisseur,";
162}
163$sql .= " u.accountancy_code_user_general, u.accountancy_code, u.rowid as userid, u.lastname as lastname, u.firstname as firstname, u.email as useremail, u.statut as userstatus,";
164$sql .= " bu2.type as typeop_user,";
165$sql .= " bu3.type as typeop_payment, bu4.type as typeop_payment_supplier";
166$sql .= " FROM ".$db->prefix()."bank as b";
167$sql .= " JOIN ".$db->prefix()."bank_account as ba on b.fk_account = ba.rowid";
168$sql .= " LEFT JOIN ".$db->prefix()."bank_url as bu1 ON bu1.fk_bank = b.rowid AND bu1.type='company'";
169$sql .= " LEFT JOIN ".$db->prefix()."bank_url as bu2 ON bu2.fk_bank = b.rowid AND bu2.type='user'";
170$sql .= " LEFT JOIN ".$db->prefix()."bank_url as bu3 ON bu3.fk_bank = b.rowid AND bu3.type='payment'";
171$sql .= " LEFT JOIN ".$db->prefix()."bank_url as bu4 ON bu4.fk_bank = b.rowid AND bu4.type='payment_supplier'";
172$sql .= " LEFT JOIN ".$db->prefix()."societe as soc on bu1.url_id=soc.rowid";
173if (getDolGlobalString('MAIN_COMPANY_PERENTITY_SHARED')) {
174 $sql .= " LEFT JOIN " . $db->prefix() . "societe_perentity as spe ON spe.fk_soc = soc.rowid AND spe.entity = " . ((int) $conf->entity);
175}
176$sql .= " LEFT JOIN ".$db->prefix()."user as u on bu2.url_id=u.rowid";
177$sql .= " WHERE ba.fk_accountancy_journal=".((int) $id_journal);
178$sql .= " AND b.amount <> 0 AND ba.entity IN (".getEntity('bank_account', 0).")"; // We don't share object for accountancy
179if ($date_start && $date_end) {
180 $sql .= " AND b.dateo >= '".$db->idate($date_start)."' AND b.dateo <= '".$db->idate($date_end)."'";
181}
182// Define begin binding date
183if (getDolGlobalInt('ACCOUNTING_DATE_START_BINDING')) {
184 $sql .= " AND b.dateo >= '".$db->idate(getDolGlobalInt('ACCOUNTING_DATE_START_BINDING'))."'";
185}
186// Already in bookkeeping or not
187if ($in_bookkeeping == 'already') {
188 $sql .= " AND (b.rowid IN (SELECT fk_doc FROM ".$db->prefix()."accounting_bookkeeping as ab WHERE ab.doc_type='bank') )";
189}
190if ($in_bookkeeping == 'notyet') {
191 $sql .= " AND (b.rowid NOT IN (SELECT fk_doc FROM ".$db->prefix()."accounting_bookkeeping as ab WHERE ab.doc_type='bank') )";
192}
193if ($only_rappro == 2) {
194 $sql .= " AND (b.rappro = '1')";
195}
196$sql .= " ORDER BY b.datev";
197//print $sql;
198
199// Preload payment account codes by payment type from c_paiement
200$accountancy_code_by_payment = array();
201$sql2 = "SELECT code, accountancy_code";
202$sql2 .= " FROM ".MAIN_DB_PREFIX."c_paiement";
203$sql2 .= " WHERE entity IN (".getEntity('c_paiement').")";
204$sql2 .= " AND active = 1";
205$resql = $db->query($sql2);
206if ($resql) {
207 while ($objp = $db->fetch_object($resql)) {
208 if (!empty($objp->code) && !empty($objp->accountancy_code)) {
209 $accountancy_code_by_payment[$objp->code] = $objp->accountancy_code;
210 }
211 }
212}
213
214$object = new Account($db);
215$paymentstatic = new Paiement($db);
216$paymentsupplierstatic = new PaiementFourn($db);
217$societestatic = new Societe($db);
218$userstatic = new User($db);
219$bankaccountstatic = new Account($db);
220$chargestatic = new ChargeSociales($db);
221$paymentdonstatic = new PaymentDonation($db);
222$paymentvatstatic = new Tva($db);
223$paymentsalstatic = new PaymentSalary($db);
224$paymentexpensereportstatic = new PaymentExpenseReport($db);
225$paymentvariousstatic = new PaymentVarious($db);
226$paymentloanstatic = new PaymentLoan($db);
227$accountLinestatic = new AccountLine($db);
228$paymentsubscriptionstatic = new Subscription($db);
229
230$tmppayment = new Paiement($db);
231$tmpinvoice = new Facture($db);
232
233$accountingaccount = new AccountingAccount($db);
234$account_transfer = 'NotDefined'; // For static analysis, NotDefined is a reserved word
235
236// Get code of finance journal
237$accountingjournalstatic = new AccountingJournal($db);
238$accountingjournalstatic->fetch($id_journal);
239$journal = $accountingjournalstatic->code;
240$journal_label = $accountingjournalstatic->label;
241
242$tabcompany = array();
243$tabuser = array();
244$tabpay = array();
245$tabbq = array();
246$tabtp = array();
247$tabtype = array();
248$tabmoreinfo = array();
249
250'
251@phan-var-force array<array{id:mixed,name:mixed,code_compta_client:string,email:string}> $tabcompany
252@phan-var-force array<array{id:int,name:string,lastname:string,firstname:string,email:string,accountancy_code:string,status:int> $tabuser
253@phan-var-force array<int,array{date:string,type_payment:string,ref:string,fk_bank:int,ban_account_ref:string,fk_bank_account:int,lib:string,type:string}> $tabpay
254@phan-var-force array<array{lib:string,date?:int|string,type_payment?:string,ref?:string,fk_bank?:int,ban_account_ref?:string,fk_bank_account?:int,type?:string,bank_account_ref?:string,paymentid?:int,paymentsupplierid?:int,soclib?:string,paymentscid?:int,paymentdonationid?:int,paymentsubscriptionid?:int,paymentvatid?:int,paymentsalid?:int,paymentexpensereport?:int,paymentvariousid?:int,account_various?:string,paymentloanid?:int}> $tabtp
255';
256
257$account_customer = 'NotDefined';
258$account_supplier = 'NotDefined';
259$account_employee = 'NotDefined';
260
261//print $sql;
262dol_syslog("accountancy/journal/bankjournal.php", LOG_DEBUG);
263$result = $db->query($sql);
264if ($result) {
265 $num = $db->num_rows($result);
266 //print $sql;
267
268 // Variables
269 $account_supplier = getDolGlobalString('ACCOUNTING_ACCOUNT_SUPPLIER', 'NotDefined'); // NotDefined is a reserved word
270 $account_customer = getDolGlobalString('ACCOUNTING_ACCOUNT_CUSTOMER', 'NotDefined'); // NotDefined is a reserved word
271 $account_employee = getDolGlobalString('SALARIES_ACCOUNTING_ACCOUNT_PAYMENT', 'NotDefined'); // NotDefined is a reserved word
272 $account_expensereport = getDolGlobalString('ACCOUNTING_ACCOUNT_EXPENSEREPORT', 'NotDefined'); // NotDefined is a reserved word
273 $account_pay_vat = getDolGlobalString('ACCOUNTING_VAT_PAY_ACCOUNT', 'NotDefined'); // NotDefined is a reserved word
274 $account_pay_donation = getDolGlobalString('DONATION_ACCOUNTINGACCOUNT', 'NotDefined'); // NotDefined is a reserved word
275 $account_pay_subscription = getDolGlobalString('ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT', 'NotDefined'); // NotDefined is a reserved word
276 $account_transfer = getDolGlobalString('ACCOUNTING_ACCOUNT_TRANSFER_CASH', 'NotDefined'); // NotDefined is a reserved word
277
278 // Loop on each line into the llx_bank table. For each line, we should get:
279 // one line tabpay = line into bank
280 // one line for bank record = tabbq
281 // one line for thirdparty record = tabtp
282 // Note: tabcompany is used to store the subledger account
283 $i = 0;
284 while ($i < $num) {
285 $obj = $db->fetch_object($result);
286
287 $lineisapurchase = -1;
288 $lineisasale = -1;
289 // Old method to detect if it's a sale or purchase
290 if ($obj->label == '(SupplierInvoicePayment)' || $obj->label == '(SupplierInvoicePaymentBack)') {
291 $lineisapurchase = 1;
292 }
293 if ($obj->label == '(CustomerInvoicePayment)' || $obj->label == '(CustomerInvoicePaymentBack)') {
294 $lineisasale = 1;
295 }
296 // Try a more reliable method to detect if record is a supplier payment or a customer payment
297 if ($lineisapurchase < 0) {
298 if ($obj->typeop_payment_supplier == 'payment_supplier') {
299 $lineisapurchase = 1;
300 }
301 }
302 if ($lineisasale < 0) {
303 if ($obj->typeop_payment == 'payment') {
304 $lineisasale = 1;
305 }
306 }
307 //var_dump($obj->type_payment); //var_dump($obj->type_payment_supplier);
308 //var_dump($lineisapurchase); //var_dump($lineisasale);
309
310 // Set accountancy code for bank
311 $compta_bank = $obj->account_number;
312
313 // Determining the bank account by payment method
314 if (!empty($obj->fk_type) && !empty($accountancy_code_by_payment[$obj->fk_type])) {
315 $compta_bank = $accountancy_code_by_payment[$obj->fk_type];
316 }
317
318 // Set accountancy code for thirdparty (example: '411CU...' or '411' if no subledger account defined on customer)
319 $compta_soc = 'NotDefined';
320 $accountancy_code_general = 'NotDefined';
321 if ($lineisapurchase > 0) {
322 $accountancy_code_general = (!empty($obj->accountancy_code_supplier_general) && $obj->accountancy_code_supplier_general != '-1') ? $obj->accountancy_code_supplier_general : $account_supplier;
323 $compta_soc = (($obj->code_compta_fournisseur != "") ? $obj->code_compta_fournisseur : $account_supplier);
324 }
325 if ($lineisasale > 0) {
326 $accountancy_code_general = (!empty($obj->accountancy_code_customer_general) && $obj->accountancy_code_customer_general != '-1') ? $obj->accountancy_code_customer_general : $account_customer;
327 $compta_soc = (!empty($obj->code_compta_client) ? $obj->code_compta_client : $account_customer);
328 }
329
330 $tabcompany[$obj->rowid] = array(
331 'id' => $obj->socid,
332 'name' => $obj->name,
333 'code_compta' => $compta_soc,
334 'accountancy_code_general' => $accountancy_code_general,
335 'email' => $obj->email
336 );
337
338 // Set accountancy code for user
339 // $obj->accountancy_code is the accountancy_code of table u=user (but it is defined only if
340 // a link with type 'user' exists and user as a subledger account)
341 $accountancy_code_user_general = (!empty($obj->accountancy_code_user_general)) ? $obj->accountancy_code_user_general : $account_employee;
342 $compta_user = (!empty($obj->accountancy_code) ? $obj->accountancy_code : '');
343
344 $tabuser[$obj->rowid] = array(
345 'id' => $obj->userid,
346 'name' => dolGetFirstLastname($obj->firstname, $obj->lastname),
347 'lastname' => $obj->lastname,
348 'firstname' => $obj->firstname,
349 'email' => $obj->useremail,
350 'accountancy_code_general' => $accountancy_code_user_general,
351 'accountancy_code' => $compta_user,
352 'status' => $obj->userstatus
353 );
354
355 // Variable bookkeeping ($obj->rowid is Bank Id)
356 $tabpay[$obj->rowid]["date"] = $db->jdate($obj->do);
357 $tabpay[$obj->rowid]["type_payment"] = $obj->fk_type; // CHQ, VIR, LIQ, CB, ...
358 $tabpay[$obj->rowid]["ref"] = $obj->label; // By default. Not unique. May be changed later
359 $tabpay[$obj->rowid]["fk_bank"] = $obj->rowid;
360 $tabpay[$obj->rowid]["bank_account_ref"] = $obj->baref;
361 $tabpay[$obj->rowid]["fk_bank_account"] = $obj->fk_account;
362 $reg = array();
363 if (preg_match('/^\‍((.*)\‍)$/i', $obj->label, $reg)) {
364 $tabpay[$obj->rowid]["lib"] = $langs->trans($reg[1]);
365 } else {
366 $tabpay[$obj->rowid]["lib"] = dol_trunc($obj->label, 60);
367 }
368
369 // Load of url links to the line into llx_bank (so load llx_bank_url)
370 $links = $object->get_url($obj->rowid); // Get an array('url'=>, 'url_id'=>, 'label'=>, 'type'=> 'fk_bank'=> )
371 // print '<p>' . json_encode($object) . "</p>";//exit;
372 // print '<p>' . json_encode($links) . "</p>";//exit;
373
374 // By default
375 $tabpay[$obj->rowid]['type'] = 'unknown'; // Can be SOLD, miscellaneous entry, payment of patient, or any old record with no links in bank_url.
376 $tabtype[$obj->rowid] = 'unknown';
377 $tabmoreinfo[$obj->rowid] = array();
378
379 $amounttouse = $obj->amount;
380 if (!empty($obj->amount_main_currency)) {
381 // If $obj->amount_main_currency is set, it means that $obj->amount is not in same currency, we must use $obj->amount_main_currency
382 $amounttouse = $obj->amount_main_currency;
383 }
384
385 // in case option FACTURE_PAYMENTS_ON_DIFFERENT_THIRDPARTIES_BILLS is on, payment could be for more than one third-partie
386 // so we have to find which part of the payment is affected to each third-parties
387 // (because in this case $obj-amount = the total of the paiement and not the paiement for each third-parties)
388 if (getDolGlobalString('FACTURE_PAYMENTS_ON_DIFFERENT_THIRDPARTIES_BILLS') && ($lineisapurchase == 1 || $lineisasale == 1) ) {
389 if ($lineisapurchase == 1) {
390 $sqlamount = "SELECT SUM(pf.amount) as amount";
391 $sqlamount .= " FROM ".MAIN_DB_PREFIX."paiementfourn_facturefourn AS pf";
392 $sqlamount .= " INNER JOIN ".MAIN_DB_PREFIX."paiementfourn AS p ON pf.fk_paiementfourn = p.rowid";
393 $sqlamount .= " RIGHT JOIN ".MAIN_DB_PREFIX."facture AS f ON pf.fk_facturefourn = f.rowid";
394 $sqlamount .= " WHERE p.fk_bank = ".((int) $obj->rowid);
395 $sqlamount .= " AND f.fk_soc = ".((int) $obj->socid);
396 } else {
397 $sqlamount = "SELECT SUM(pf.amount) as amount";
398 $sqlamount .= " FROM ".MAIN_DB_PREFIX."paiement_facture AS pf";
399 $sqlamount .= " INNER JOIN ".MAIN_DB_PREFIX."paiement AS p ON pf.fk_paiement = p.rowid";
400 $sqlamount .= " RIGHT JOIN ".MAIN_DB_PREFIX."facture AS f ON pf.fk_facture = f.rowid";
401 $sqlamount .= " WHERE p.fk_bank = ".((int) $obj->rowid);
402 $sqlamount .= " AND f.fk_soc = ".((int) $obj->socid);
403 }
404 $resultamount = $db->query($sqlamount);
405 if ($resultamount) {
406 $objamount = $db->fetch_object($resultamount);
407 if (!empty($objamount->amount)) $amounttouse = $objamount->amount;
408 }
409 }
410
411 // get_url may return -1 which is not traversable
412 if (is_array($links) && count($links) > 0) {
413 // Test if entry is for a social contribution, salary or expense report.
414 // In such a case, we will ignore the bank url line for user
415 $is_sc = false;
416 $is_salary = false;
417 $is_expensereport = false;
418 foreach ($links as $v) {
419 if ($v['type'] == 'sc') {
420 $is_sc = true;
421 break;
422 }
423 if ($v['type'] == 'payment_salary') {
424 $is_salary = true;
425 break;
426 }
427 if ($v['type'] == 'payment_expensereport') {
428 $is_expensereport = true;
429 break;
430 }
431 }
432
433 // Now loop on each link of record in bank (code similar to bankentries_list.php)
434 foreach ($links as $key => $val) {
435 if ($links[$key]['type'] == 'user' && !$is_sc && !$is_salary && !$is_expensereport) {
436 // We must avoid as much as possible this "continue". If we want to jump to next loop, it means we don't want to process
437 // the case the link is user (often because managed by hard coded code into another link), and we must avoid this.
438 continue;
439 }
440 if (in_array($links[$key]['type'], array('sc', 'payment_sc', 'payment', 'payment_supplier', 'payment_vat', 'payment_expensereport', 'banktransfert', 'payment_donation', 'member', 'payment_loan', 'payment_salary', 'payment_various'))) {
441 // So we excluded 'company' and 'user' here. We want only payment lines
442
443 // We save tabtype for a future use, to remember what kind of payment it is
444 $tabpay[$obj->rowid]['type'] = $links[$key]['type'];
445 $tabtype[$obj->rowid] = $links[$key]['type'];
446 /* phpcs:disable -- Code does nothing at this moment -> commented
447 } elseif (in_array($links[$key]['type'], array('company', 'user'))) {
448 if ($tabpay[$obj->rowid]['type'] == 'unknown') {
449 // We can guess here it is a bank record for a thirdparty company or a user.
450 // But we won't be able to record somewhere else than into a waiting account, because there is no other journal to record the contreparty.
451 }
452 */ // phpcs::enable
453 }
454
455 // Special case to ask later to add more request to get information for old links without company link.
456 if ($links[$key]['type'] == 'withdraw') {
457 $tabmoreinfo[$obj->rowid]['withdraw'] = 1;
458 }
459
460 if ($links[$key]['type'] == 'payment') {
461 $paymentstatic->id = $links[$key]['url_id'];
462 $paymentstatic->ref = (string) $links[$key]['url_id'];
463 $tabpay[$obj->rowid]["lib"] .= ' '.$paymentstatic->getNomUrl(2, '', ''); // TODO Do not include list of invoice in tooltip, the dol_string_nohtmltag is ko with this
464 $tabpay[$obj->rowid]["paymentid"] = $paymentstatic->id;
465 } elseif ($links[$key]['type'] == 'payment_supplier') {
466 $paymentsupplierstatic->id = $links[$key]['url_id'];
467 $paymentsupplierstatic->ref = (string) $links[$key]['url_id'];
468 $tabpay[$obj->rowid]["lib"] .= ' '.$paymentsupplierstatic->getNomUrl(2);
469 $tabpay[$obj->rowid]["paymentsupplierid"] = $paymentsupplierstatic->id;
470 } elseif ($links[$key]['type'] == 'company') {
471 $societestatic->id = $links[$key]['url_id'];
472 $societestatic->name = $links[$key]['label'];
473 $societestatic->email = $tabcompany[$obj->rowid]['email'];
474 $tabpay[$obj->rowid]["soclib"] = $societestatic->getNomUrl(1, '', 30);
475 if ($compta_soc) {
476 // because we are in 2 loop (loop on the line from the sql queries and loop on $links)
477 // and in case of option FACTURE_PAYMENTS_ON_DIFFERENT_THIRDPARTIES_BILLS is on,
478 // we will pass here n times for each payment line
479 // so we have to add $amoutouse only if the line $links[$key] correspond to the payment line we are in used ( socid correspondinf at the payment line $links)
480 // if FACTURE_PAYMENTS_ON_DIFFERENT_THIRDPARTIES_BILLS is off we add $amounttouse
481 if (!getDolGlobalString('FACTURE_PAYMENTS_ON_DIFFERENT_THIRDPARTIES_BILLS') || $obj->socid == $links[$key]['url_id']){
482 if (empty($tabtp[$obj->rowid][$compta_soc])) {
483 $tabtp[$obj->rowid][$compta_soc] = $amounttouse;
484 } else {
485 $tabtp[$obj->rowid][$compta_soc] += $amounttouse;
486 }
487 }
488 }
489 } elseif ($links[$key]['type'] == 'user') {
490 $userstatic->id = $links[$key]['url_id'];
491 $userstatic->name = $links[$key]['label'];
492 $userstatic->email = $tabuser[$obj->rowid]['email'];
493 $userstatic->firstname = $tabuser[$obj->rowid]['firstname'];
494 $userstatic->lastname = $tabuser[$obj->rowid]['lastname'];
495 $userstatic->status = $tabuser[$obj->rowid]['status'];
496 $userstatic->accountancy_code_user_general = $tabuser[$obj->rowid]['accountancy_code_general'];
497 $userstatic->accountancy_code = $tabuser[$obj->rowid]['accountancy_code'];
498
499 // For a payment of social contribution, we have a link sc + user.
500 // but we already fill the $tabpay[$obj->rowid]["soclib"] in the line 'sc'.
501 // If we fill it here to, we must concat.
502 if ($userstatic->id > 0) {
503 if ($is_sc) {
504 $tabpay[$obj->rowid]["soclib"] .= ' '.$userstatic->getNomUrl(-1, 'accountancy', 0);
505 } else {
506 $tabpay[$obj->rowid]["soclib"] = $userstatic->getNomUrl(-1, 'accountancy', 0);
507 }
508 } else {
509 $tabpay[$obj->rowid]["soclib"] = '???'; // Should not happen, but happens with old data when id of user was not saved on expense report payment.
510 }
511
512 if ($compta_user) {
513 if ($is_sc) {
514 //$tabcompany[$obj->rowid][$compta_user] += $amounttouse;
515 } else {
516 $tabtp[$obj->rowid][$compta_user] += $amounttouse;
517 }
518 }
519 } elseif ($links[$key]['type'] == 'sc') {
520 $chargestatic->id = $links[$key]['url_id'];
521 $chargestatic->ref = (string) $links[$key]['url_id'];
522
523 $tabpay[$obj->rowid]["lib"] .= ' '.$chargestatic->getNomUrl(2);
524 $reg = array();
525 if (preg_match('/^\‍((.*)\‍)$/i', $links[$key]['label'], $reg)) {
526 if ($reg[1] == 'socialcontribution') {
527 $reg[1] = 'SocialContribution';
528 }
529 $chargestatic->label = $langs->trans($reg[1]);
530 } else {
531 $chargestatic->label = $links[$key]['label'];
532 }
533 $chargestatic->ref = $chargestatic->label;
534
535 // Retrieve the accounting code of the social contribution of the payment from link of payment.
536 // Note: We have the social contribution id, it can be faster to get accounting code from social contribution id.
537 /*
538 $sqlmid = "SELECT cchgsoc.accountancy_code";
539 $sqlmid .= " FROM ".MAIN_DB_PREFIX."c_chargesociales cchgsoc";
540 $sqlmid .= " INNER JOIN ".MAIN_DB_PREFIX."chargesociales as chgsoc ON chgsoc.fk_type = cchgsoc.id";
541 $sqlmid .= " INNER JOIN ".MAIN_DB_PREFIX."paiementcharge as paycharg ON paycharg.fk_charge = chgsoc.rowid";
542 $sqlmid .= " INNER JOIN ".MAIN_DB_PREFIX."bank_url as bkurl ON bkurl.url_id=paycharg.rowid AND bkurl.type = 'payment_sc'";
543 $sqlmid .= " WHERE bkurl.fk_bank = ".((int) $obj->rowid);
544
545 dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=".$sqlmid, LOG_DEBUG);
546 $resultmid = $db->query($sqlmid);
547 if ($resultmid) {
548 $objmid = $db->fetch_object($resultmid);
549 $tabtp[$obj->rowid][$objmid->accountancy_code] = isset($tabtp[$obj->rowid][$objmid->accountancy_code]) ? $tabtp[$obj->rowid][$objmid->accountancy_code] + $amounttouse : $amounttouse;
550 }*/
551 $tmpcharge = new ChargeSociales($db);
552 $resultmid = $tmpcharge->fetch($chargestatic->id);
553 if ($resultmid) {
554 $chargestatic->type_label = $tmpcharge->type_label;
555 $chargestatic->type_code = $tmpcharge->type_code;
556 $chargestatic->type_accountancy_code = $tmpcharge->type_accountancy_code;
557
558 $tabtp[$obj->rowid][$tmpcharge->type_accountancy_code] = isset($tabtp[$obj->rowid][$tmpcharge->type_accountancy_code]) ? $tabtp[$obj->rowid][$tmpcharge->type_accountancy_code] + $amounttouse : $amounttouse;
559 }
560
561 $tabpay[$obj->rowid]["soclib"] = $chargestatic->getNomUrl(1, '30');
562 $tabpay[$obj->rowid]["paymentscid"] = $chargestatic->id;
563 } elseif ($links[$key]['type'] == 'payment_donation') {
564 $paymentdonstatic->id = $links[$key]['url_id'];
565 $paymentdonstatic->ref = (string) $links[$key]['url_id'];
566 $paymentdonstatic->fk_donation = $links[$key]['url_id'];
567 $tabpay[$obj->rowid]["lib"] .= ' '.$paymentdonstatic->getNomUrl(2);
568 $tabpay[$obj->rowid]["paymentdonationid"] = $paymentdonstatic->id;
569 $tabtp[$obj->rowid][$account_pay_donation] = isset($tabtp[$obj->rowid][$account_pay_donation]) ? $tabtp[$obj->rowid][$account_pay_donation] + $amounttouse : $amounttouse;
570 } elseif ($links[$key]['type'] == 'member') {
571 $paymentsubscriptionstatic->id = $links[$key]['url_id'];
572 $paymentsubscriptionstatic->ref = (string) $links[$key]['url_id'];
573 $paymentsubscriptionstatic->label = $links[$key]['label'];
574 $tabpay[$obj->rowid]["lib"] .= ' '.$paymentsubscriptionstatic->getNomUrl(2);
575 $tabpay[$obj->rowid]["paymentsubscriptionid"] = $paymentsubscriptionstatic->id;
576 $paymentsubscriptionstatic->fetch($paymentsubscriptionstatic->id);
577 $tabtp[$obj->rowid][$account_pay_subscription] = isset($tabtp[$obj->rowid][$account_pay_subscription]) ? $tabtp[$obj->rowid][$account_pay_subscription] + $amounttouse : $amounttouse;
578 } elseif ($links[$key]['type'] == 'payment_vat') { // Payment VAT
579 $paymentvatstatic->id = $links[$key]['url_id'];
580 $paymentvatstatic->ref = (string) $links[$key]['url_id'];
581 $paymentvatstatic->label = $links[$key]['label'];
582 $tabpay[$obj->rowid]["lib"] .= ' '.$paymentvatstatic->getNomUrl(2);
583 $tabpay[$obj->rowid]["paymentvatid"] = $paymentvatstatic->id;
584 $tabtp[$obj->rowid][$account_pay_vat] = isset($tabtp[$obj->rowid][$account_pay_vat]) ? $tabtp[$obj->rowid][$account_pay_vat] + $amounttouse : $amounttouse;
585 } elseif ($links[$key]['type'] == 'payment_salary') {
586 $paymentsalstatic->id = $links[$key]['url_id'];
587 $paymentsalstatic->ref = (string) $links[$key]['url_id'];
588 $paymentsalstatic->label = $links[$key]['label'];
589 $tabpay[$obj->rowid]["lib"] .= ' '.$paymentsalstatic->getNomUrl(2);
590 $tabpay[$obj->rowid]["paymentsalid"] = $paymentsalstatic->id;
591
592 // This part of code is no more required. it is here to solve case where a link were missing (with v14.0.0) and keep writing in accountancy complete.
593 // Note: A better way to fix this is to delete payment of salary and recreate it, or to fix the bookkeeping table manually after.
594 if (getDolGlobalString('ACCOUNTANCY_AUTOFIX_MISSING_LINK_TO_USER_ON_SALARY_BANK_PAYMENT')) {
595 $tmpsalary = new Salary($db);
596 $tmpsalary->fetch($paymentsalstatic->id);
597 $tmpsalary->fetch_user($tmpsalary->fk_user);
598
599 $userstatic->id = $tmpsalary->user->id;
600 $userstatic->name = $tmpsalary->user->name;
601 $userstatic->email = $tmpsalary->user->email;
602 $userstatic->firstname = $tmpsalary->user->firstname;
603 $userstatic->lastname = $tmpsalary->user->lastname;
604 $userstatic->status = $tmpsalary->user->status;
605 $userstatic->accountancy_code = $tmpsalary->user->accountancy_code;
606
607 if ($userstatic->id > 0) {
608 $tabpay[$obj->rowid]["soclib"] = $userstatic->getNomUrl(1, 'accountancy', 0);
609 } else {
610 $tabpay[$obj->rowid]["soclib"] = '???'; // Should not happen
611 }
612
613 if (empty($obj->typeop_user)) { // Add test to avoid adding amount twice if a link already exists also on user.
614 $accountancy_code_user_general = (!empty($obj->accountancy_code_user_general)) ? $obj->accountancy_code_user_general : $account_employee;
615 $compta_user = $userstatic->accountancy_code;
616 if ($compta_user) {
617 $tabtp[$obj->rowid][$compta_user] += $amounttouse;
618 $tabuser[$obj->rowid] = array(
619 'id' => $userstatic->id,
620 'name' => dolGetFirstLastname($userstatic->firstname, $userstatic->lastname),
621 'lastname' => $userstatic->lastname,
622 'firstname' => $userstatic->firstname,
623 'email' => $userstatic->email,
624 'accountancy_code_general' => $accountancy_code_user_general,
625 'accountancy_code' => $compta_user,
626 'status' => $userstatic->status
627 );
628 }
629 }
630 }
631 } elseif ($links[$key]['type'] == 'payment_expensereport') {
632 $paymentexpensereportstatic->id = $links[$key]['url_id'];
633 $tabpay[$obj->rowid]["lib"] .= $paymentexpensereportstatic->getNomUrl(2);
634 $tabpay[$obj->rowid]["paymentexpensereport"] = $paymentexpensereportstatic->id;
635 } elseif ($links[$key]['type'] == 'payment_various') {
636 $paymentvariousstatic->id = $links[$key]['url_id'];
637 $paymentvariousstatic->ref = (string) $links[$key]['url_id'];
638 $paymentvariousstatic->label = $links[$key]['label'];
639 $tabpay[$obj->rowid]["lib"] .= ' '.$paymentvariousstatic->getNomUrl(2);
640 $tabpay[$obj->rowid]["paymentvariousid"] = $paymentvariousstatic->id;
641 $paymentvariousstatic->fetch($paymentvariousstatic->id);
642 $account_various = (!empty($paymentvariousstatic->accountancy_code) ? $paymentvariousstatic->accountancy_code : 'NotDefined'); // NotDefined is a reserved word
643 $account_subledger = (!empty($paymentvariousstatic->subledger_account) ? $paymentvariousstatic->subledger_account : ''); // NotDefined is a reserved word
644 $tabpay[$obj->rowid]["account_various"] = $account_various;
645 $tabtp[$obj->rowid][$account_subledger] = isset($tabtp[$obj->rowid][$account_subledger]) ? $tabtp[$obj->rowid][$account_subledger] + $amounttouse : $amounttouse;
646 } elseif ($links[$key]['type'] == 'payment_loan') {
647 $paymentloanstatic->id = $links[$key]['url_id'];
648 $paymentloanstatic->ref = (string) $links[$key]['url_id'];
649 $paymentloanstatic->fk_loan = $links[$key]['url_id'];
650 $tabpay[$obj->rowid]["lib"] .= ' '.$paymentloanstatic->getNomUrl(2);
651 $tabpay[$obj->rowid]["paymentloanid"] = $paymentloanstatic->id;
652 //$tabtp[$obj->rowid][$account_pay_loan] += $amounttouse;
653 $sqlmid = 'SELECT pl.amount_capital, pl.amount_insurance, pl.amount_interest, l.accountancy_account_capital, l.accountancy_account_insurance, l.accountancy_account_interest';
654 $sqlmid .= ' FROM '.MAIN_DB_PREFIX.'payment_loan as pl, '.MAIN_DB_PREFIX.'loan as l';
655 $sqlmid .= ' WHERE l.rowid = pl.fk_loan AND pl.fk_bank = '.((int) $obj->rowid);
656
657 dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=".$sqlmid, LOG_DEBUG);
658 $resultmid = $db->query($sqlmid);
659 if ($resultmid) {
660 $objmid = $db->fetch_object($resultmid);
661 $tabtp[$obj->rowid][$objmid->accountancy_account_capital] = isset($objmid->amount_capital) ? ($tabtp[$obj->rowid][$objmid->accountancy_account_capital] ?? 0) - $objmid->amount_capital : 0;
662 $tabtp[$obj->rowid][$objmid->accountancy_account_insurance] = isset($objmid->amount_insurance) ? ($tabtp[$obj->rowid][$objmid->accountancy_account_insurance] ?? 0) - $objmid->amount_insurance : 0;
663 $tabtp[$obj->rowid][$objmid->accountancy_account_interest] = isset($objmid->amount_interest) ? ($tabtp[$obj->rowid][$objmid->accountancy_account_interest] ?? 0) - $objmid->amount_interest : 0;
664 }
665 } elseif ($links[$key]['type'] == 'banktransfert') {
666 $accountLinestatic->fetch($links[$key]['url_id']);
667 $tabpay[$obj->rowid]["lib"] .= ' '.$langs->trans("BankTransfer").' '.$accountLinestatic ->getNomUrl(1);
668 $tabtp[$obj->rowid][$account_transfer] = isset($tabtp[$obj->rowid][$account_transfer]) ? $tabtp[$obj->rowid][$account_transfer] + $amounttouse : $amounttouse;
669 $bankaccountstatic->fetch($tabpay[$obj->rowid]['fk_bank_account']);
670 $tabpay[$obj->rowid]["soclib"] = $bankaccountstatic->getNomUrl(2);
671 }
672 }
673 }
674
675 if (empty($tabbq[$obj->rowid][$compta_bank])) {
676 $tabbq[$obj->rowid][$compta_bank] = $amounttouse;
677 } else {
678 $tabbq[$obj->rowid][$compta_bank] += $amounttouse;
679 }
680
681 // If no links were found to know the amount on thirdparty, we try to guess it.
682 // This may happen on bank entries without the links lines to 'company'.
683 if (empty($tabtp[$obj->rowid]) && !empty($tabmoreinfo[$obj->rowid]['withdraw'])) { // If we don't find 'company' link because it is an old 'withdraw' record
684 foreach ($links as $key => $val) {
685 if ($links[$key]['type'] == 'payment') {
686 // Get thirdparty
687 $tmppayment->fetch($links[$key]['url_id']);
688 $arrayofamounts = $tmppayment->getAmountsArray();
689 if (is_array($arrayofamounts)) {
690 foreach ($arrayofamounts as $invoiceid => $amount) {
691 $tmpinvoice->fetch($invoiceid);
692 $tmpinvoice->fetch_thirdparty();
693 if ($tmpinvoice->thirdparty->code_compta_client) {
694 $tabtp[$obj->rowid][$tmpinvoice->thirdparty->code_compta_client] += $amount;
695 }
696 }
697 }
698 }
699 }
700 }
701
702 // If no links were found to know the amount on thirdparty/user, we init it to account 'NotDefined'.
703 if (empty($tabtp[$obj->rowid])) {
704 $tabtp[$obj->rowid]['NotDefined'] = $tabbq[$obj->rowid][$compta_bank];
705 }
706
707 // if($obj->socid)$tabtp[$obj->rowid][$compta_soc] += $amounttouse;
708
709 $i++;
710 }
711} else {
712 dol_print_error($db);
713}
714
715// Write bookkeeping
716if (!$error && $action == 'writebookkeeping' && $user->hasRight('accounting', 'bind', 'write')) {
717 $now = dol_now();
718
719 $accountingaccountcustomer = new AccountingAccount($db);
720 $accountingaccountcustomer->fetch(0, getDolGlobalString('ACCOUNTING_ACCOUNT_CUSTOMER'), true);
721
722 $accountingaccountsupplier = new AccountingAccount($db);
723 $accountingaccountsupplier->fetch(0, getDolGlobalString('ACCOUNTING_ACCOUNT_SUPPLIER'), true);
724
725 $accountingaccountpayment = new AccountingAccount($db);
726 $accountingaccountpayment->fetch(0, getDolGlobalString('SALARIES_ACCOUNTING_ACCOUNT_PAYMENT'), true);
727
728 $accountingaccountexpensereport = new AccountingAccount($db);
729 $accountingaccountexpensereport->fetch(0, getDolGlobalString('ACCOUNTING_ACCOUNT_EXPENSEREPORT'), true);
730
731 $accountingaccountsuspense = new AccountingAccount($db);
732 $accountingaccountsuspense->fetch(0, getDolGlobalString('ACCOUNTING_ACCOUNT_SUSPENSE'), true);
733
734 $error = 0;
735 foreach ($tabpay as $key => $val) { // $key is rowid into llx_bank
736 $date = dol_print_date($val["date"], 'day');
737
738 $ref = getSourceDocRef($val, $tabtype[$key]);
739
740 $errorforline = 0;
741
742 $totalcredit = 0;
743 $totaldebit = 0;
744
745 $db->begin();
746
747 // Introduce a protection. Total of tabtp must be total of tabbq
748
749 // Bank
750 if (is_array($tabbq[$key])) {
751 // Line into bank account
752 foreach ($tabbq[$key] as $k => $mt) {
753 if ($mt) {
754 if (empty($conf->cache['accountingaccountincurrententity'][$k])) {
755 $accountingaccount = new AccountingAccount($db);
756 $accountingaccount->fetch(0, $k, true); // $k is accounting account of the bank.
757 $conf->cache['accountingaccountincurrententity'][$k] = $accountingaccount;
758 } else {
759 $accountingaccount = $conf->cache['accountingaccountincurrententity'][$k];
760 }
761
762 $account_label = $accountingaccount->label;
763
764 $reflabel = '';
765 if (!empty($val['lib'])) {
766 $reflabel .= dol_string_nohtmltag($val['lib'])." / ";
767 }
768 $reflabel .= $langs->trans("Bank").' '.dol_string_nohtmltag($val['bank_account_ref']);
769 if (!empty($val['soclib'])) {
770 $reflabel .= " / ".dol_string_nohtmltag($val['soclib']);
771 }
772
773 $bookkeeping = new BookKeeping($db);
774 $bookkeeping->doc_date = $val["date"];
775 $bookkeeping->doc_ref = $ref;
776 $bookkeeping->doc_type = 'bank';
777 $bookkeeping->fk_doc = $key;
778 $bookkeeping->fk_docdet = $val["fk_bank"];
779
780 $bookkeeping->numero_compte = $k;
781 $bookkeeping->label_compte = $account_label;
782
783 $bookkeeping->label_operation = $reflabel;
784 $bookkeeping->montant = $mt;
785 $bookkeeping->sens = ($mt >= 0) ? 'D' : 'C';
786 $bookkeeping->debit = ($mt >= 0 ? $mt : 0);
787 $bookkeeping->credit = ($mt < 0 ? -$mt : 0);
788 $bookkeeping->code_journal = $journal;
789 $bookkeeping->journal_label = $langs->transnoentities($journal_label);
790 $bookkeeping->fk_user_author = $user->id;
791 $bookkeeping->date_creation = $now;
792
793 // No subledger_account value for the bank line but add a specific label_operation
794 $bookkeeping->subledger_account = '';
795 $bookkeeping->label_operation = $reflabel;
796 $bookkeeping->entity = $conf->entity;
797
798 $totaldebit += $bookkeeping->debit;
799 $totalcredit += $bookkeeping->credit;
800
801 $result = $bookkeeping->create($user);
802 if ($result < 0) {
803 if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists') { // Already exists
804 $error++;
805 $errorforline++;
806 setEventMessages('Transaction for ('.$bookkeeping->doc_type.', '.$bookkeeping->fk_doc.', '.$bookkeeping->fk_docdet.') were already recorded', null, 'warnings');
807 } else {
808 $error++;
809 $errorforline++;
810 setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors');
811 }
812 }
813 }
814 }
815 }
816
817 // Third party
818 if (!$errorforline) {
819 if (is_array($tabtp[$key])) {
820 // Line into thirdparty account
821 foreach ($tabtp[$key] as $k => $mt) {
822 if ($mt) {
823 $lettering = false;
824
825 $reflabel = '';
826 if (!empty($val['lib'])) {
827 $reflabel .= dol_string_nohtmltag($val['lib']).(!empty($val['soclib']) ? " / " : "");
828 }
829 if ($tabtype[$key] == 'banktransfert') {
830 $reflabel .= dol_string_nohtmltag($langs->transnoentitiesnoconv('TransitionalAccount').' '.$account_transfer);
831 } else {
832 $reflabel .= dol_string_nohtmltag($val['soclib'] ?? '');
833 }
834
835 $bookkeeping = new BookKeeping($db);
836 $bookkeeping->doc_date = $val["date"];
837 $bookkeeping->doc_ref = $ref;
838 $bookkeeping->doc_type = 'bank';
839 $bookkeeping->fk_doc = $key;
840 $bookkeeping->fk_docdet = $val["fk_bank"];
841
842 $bookkeeping->label_operation = $reflabel;
843 $bookkeeping->montant = $mt;
844 $bookkeeping->sens = ($mt < 0) ? 'D' : 'C';
845 $bookkeeping->debit = ($mt < 0 ? -$mt : 0);
846 $bookkeeping->credit = ($mt >= 0) ? $mt : 0;
847 $bookkeeping->code_journal = $journal;
848 $bookkeeping->journal_label = $langs->transnoentities($journal_label);
849 $bookkeeping->fk_user_author = $user->id;
850 $bookkeeping->date_creation = $now;
851
852 if ($tabtype[$key] == 'payment') { // If payment is payment of customer invoice, we get ref of invoice
853 $lettering = true;
854 $bookkeeping->subledger_account = $k; // For payment, the subledger account is stored as $key of $tabtp
855 $bookkeeping->subledger_label = $tabcompany[$key]['name']; // $tabcompany is defined only if we are sure there is 1 thirdparty for the bank transaction
856 $bookkeeping->numero_compte = $tabcompany[$key]['accountancy_code_general'];
857 $bookkeeping->label_compte = $accountingaccountcustomer->label;
858 } elseif ($tabtype[$key] == 'payment_supplier') { // If payment is payment of supplier invoice, we get ref of invoice
859 $lettering = true;
860 $bookkeeping->subledger_account = $k; // For payment, the subledger account is stored as $key of $tabtp
861 $bookkeeping->subledger_label = $tabcompany[$key]['name']; // $tabcompany is defined only if we are sure there is 1 thirdparty for the bank transaction
862 $bookkeeping->numero_compte = $tabcompany[$key]['accountancy_code_general'];
863 $bookkeeping->label_compte = $accountingaccountsupplier->label;
864 } elseif ($tabtype[$key] == 'payment_expensereport') {
865 $bookkeeping->subledger_account = $tabuser[$key]['accountancy_code'];
866 $bookkeeping->subledger_label = $tabuser[$key]['name'];
867 $bookkeeping->numero_compte = getDolGlobalString('ACCOUNTING_ACCOUNT_EXPENSEREPORT');
868 $bookkeeping->label_compte = $accountingaccountexpensereport->label;
869 } elseif ($tabtype[$key] == 'payment_salary') {
870 $bookkeeping->subledger_account = $tabuser[$key]['accountancy_code'];
871 $bookkeeping->subledger_label = $tabuser[$key]['name'];
872 $bookkeeping->numero_compte = $tabuser[$key]['accountancy_code_general'];
873 $bookkeeping->label_compte = $accountingaccountpayment->label;
874 } elseif (in_array($tabtype[$key], array('sc', 'payment_sc'))) { // If payment is payment of social contribution
875 $bookkeeping->subledger_account = '';
876 $bookkeeping->subledger_label = '';
877 if (empty($conf->cache['accountingaccountincurrententity'][$k])) {
878 $accountingaccount = new AccountingAccount($db);
879 $accountingaccount->fetch(0, $k, true);
880 $conf->cache['accountingaccountincurrententity'][$k] = $accountingaccount;
881 } else {
882 $accountingaccount = $conf->cache['accountingaccountincurrententity'][$k];
883 }
884 $bookkeeping->numero_compte = $k;
885 $bookkeeping->label_compte = $accountingaccount->label;
886 } elseif ($tabtype[$key] == 'payment_vat') {
887 $bookkeeping->subledger_account = '';
888 $bookkeeping->subledger_label = '';
889 if (empty($conf->cache['accountingaccountincurrententity'][$k])) {
890 $accountingaccount = new AccountingAccount($db);
891 $accountingaccount->fetch(0, $k, true);
892 $conf->cache['accountingaccountincurrententity'][$k] = $accountingaccount;
893 } else {
894 $accountingaccount = $conf->cache['accountingaccountincurrententity'][$k];
895 }
896 $bookkeeping->numero_compte = $k;
897 $bookkeeping->label_compte = $accountingaccount->label;
898 } elseif ($tabtype[$key] == 'payment_donation') {
899 $bookkeeping->subledger_account = '';
900 $bookkeeping->subledger_label = '';
901 if (empty($conf->cache['accountingaccountincurrententity'][$k])) {
902 $accountingaccount = new AccountingAccount($db);
903 $accountingaccount->fetch(0, $k, true);
904 $conf->cache['accountingaccountincurrententity'][$k] = $accountingaccount;
905 } else {
906 $accountingaccount = $conf->cache['accountingaccountincurrententity'][$k];
907 }
908 $bookkeeping->numero_compte = $k;
909 $bookkeeping->label_compte = $accountingaccount->label;
910 } elseif ($tabtype[$key] == 'member') {
911 $bookkeeping->subledger_account = '';
912 $bookkeeping->subledger_label = '';
913 if (empty($conf->cache['accountingaccountincurrententity'][$k])) {
914 $accountingaccount = new AccountingAccount($db);
915 $accountingaccount->fetch(0, $k, true);
916 $conf->cache['accountingaccountincurrententity'][$k] = $accountingaccount;
917 } else {
918 $accountingaccount = $conf->cache['accountingaccountincurrententity'][$k];
919 }
920 $bookkeeping->numero_compte = $k;
921 $bookkeeping->label_compte = $accountingaccount->label;
922 } elseif ($tabtype[$key] == 'payment_loan') {
923 $bookkeeping->subledger_account = '';
924 $bookkeeping->subledger_label = '';
925 if (empty($conf->cache['accountingaccountincurrententity'][$k])) {
926 $accountingaccount = new AccountingAccount($db);
927 $accountingaccount->fetch(0, $k, true);
928 $conf->cache['accountingaccountincurrententity'][$k] = $accountingaccount;
929 } else {
930 $accountingaccount = $conf->cache['accountingaccountincurrententity'][$k];
931 }
932 $bookkeeping->numero_compte = $k;
933 $bookkeeping->label_compte = $accountingaccount->label;
934 } elseif ($tabtype[$key] == 'payment_various') {
935 $bookkeeping->subledger_account = $k;
936 $bookkeeping->subledger_label = $tabcompany[$key]['name'];
937 if (empty($conf->cache['accountingaccountincurrententity'][$tabpay[$key]["account_various"]])) {
938 $accountingaccount = new AccountingAccount($db);
939 $accountingaccount->fetch(0, $tabpay[$key]["account_various"], true);
940 $conf->cache['accountingaccountincurrententity'][$tabpay[$key]["account_various"]] = $accountingaccount;
941 } else {
942 $accountingaccount = $conf->cache['accountingaccountincurrententity'][$tabpay[$key]["account_various"]];
943 }
944 $bookkeeping->numero_compte = $tabpay[$key]["account_various"];
945 $bookkeeping->label_compte = $accountingaccount->label;
946 } elseif ($tabtype[$key] == 'banktransfert') {
947 $bookkeeping->subledger_account = '';
948 $bookkeeping->subledger_label = '';
949 if (empty($conf->cache['accountingaccountincurrententity'][$k])) {
950 $accountingaccount = new AccountingAccount($db);
951 $accountingaccount->fetch(0, $k, true);
952 $conf->cache['accountingaccountincurrententity'][$k] = $accountingaccount;
953 } else {
954 $accountingaccount = $conf->cache['accountingaccountincurrententity'][$k];
955 }
956 $bookkeeping->numero_compte = $k;
957 $bookkeeping->label_compte = $accountingaccount->label;
958 } else {
959 if ($tabtype[$key] == 'unknown') { // Unknown transaction, we will use a waiting account for thirdparty.
960 // Temporary account
961 $bookkeeping->subledger_account = '';
962 $bookkeeping->subledger_label = '';
963 $bookkeeping->numero_compte = getDolGlobalString('ACCOUNTING_ACCOUNT_SUSPENSE');
964 $bookkeeping->label_compte = $accountingaccountsuspense->label;
965 }
966 }
967 $bookkeeping->label_operation = $reflabel;
968 $bookkeeping->entity = $conf->entity;
969
970 $totaldebit += $bookkeeping->debit;
971 $totalcredit += $bookkeeping->credit;
972
973 $result = $bookkeeping->create($user);
974 if ($result < 0) {
975 if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists') { // Already exists
976 $error++;
977 $errorforline++;
978 setEventMessages('Transaction for ('.$bookkeeping->doc_type.', '.$bookkeeping->fk_doc.', '.$bookkeeping->fk_docdet.') were already recorded', null, 'warnings');
979 } else {
980 $error++;
981 $errorforline++;
982 setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors');
983 }
984 } else {
985 if ($lettering && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && getDolGlobalInt('ACCOUNTING_ENABLE_AUTOLETTERING')) {
986 require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php';
987 $lettering_static = new Lettering($db);
988 $nb_lettering = $lettering_static->bookkeepingLetteringAll(array($bookkeeping->id));
989 }
990 }
991 }
992 }
993 } else { // If thirdparty unknown, output the waiting account
994 foreach ($tabbq[$key] as $k => $mt) {
995 if ($mt) {
996 $reflabel = '';
997 if (!empty($val['lib'])) {
998 $reflabel .= dol_string_nohtmltag($val['lib'])." / ";
999 }
1000 $reflabel .= dol_string_nohtmltag('WaitingAccount');
1001
1002 $bookkeeping = new BookKeeping($db);
1003 $bookkeeping->doc_date = $val["date"];
1004 $bookkeeping->doc_ref = $ref;
1005 $bookkeeping->doc_type = 'bank';
1006 $bookkeeping->fk_doc = $key;
1007 $bookkeeping->fk_docdet = $val["fk_bank"];
1008 $bookkeeping->montant = $mt;
1009 $bookkeeping->sens = ($mt < 0) ? 'D' : 'C';
1010 $bookkeeping->debit = ($mt < 0 ? -$mt : 0);
1011 $bookkeeping->credit = ($mt >= 0) ? $mt : 0;
1012 $bookkeeping->code_journal = $journal;
1013 $bookkeeping->journal_label = $langs->transnoentities($journal_label);
1014 $bookkeeping->fk_user_author = $user->id;
1015 $bookkeeping->date_creation = $now;
1016 $bookkeeping->label_compte = '';
1017 $bookkeeping->label_operation = $reflabel;
1018 $bookkeeping->entity = $conf->entity;
1019
1020 $totaldebit += $bookkeeping->debit;
1021 $totalcredit += $bookkeeping->credit;
1022
1023 $result = $bookkeeping->create($user);
1024
1025 if ($result < 0) {
1026 if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists') { // Already exists
1027 $error++;
1028 $errorforline++;
1029 setEventMessages('Transaction for ('.$bookkeeping->doc_type.', '.$bookkeeping->fk_doc.', '.$bookkeeping->fk_docdet.') were already recorded', null, 'warnings');
1030 } else {
1031 $error++;
1032 $errorforline++;
1033 setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors');
1034 }
1035 }
1036 }
1037 }
1038 }
1039 }
1040
1041 if (price2num($totaldebit, 'MT') != price2num($totalcredit, 'MT')) {
1042 $error++;
1043 $errorforline++;
1044 setEventMessages('We tried to insert a non balanced transaction in book for '.$ref.'. Canceled. Surely a bug.', null, 'errors');
1045 }
1046
1047 if (!$errorforline) {
1048 $db->commit();
1049 } else {
1050 //print 'KO for line '.$key.' '.$error.'<br>';
1051 $db->rollback();
1052
1053 $MAXNBERRORS = 5;
1054 if ($error >= $MAXNBERRORS) {
1055 setEventMessages($langs->trans("ErrorTooManyErrorsProcessStopped").' (>'.$MAXNBERRORS.')', null, 'errors');
1056 break; // Break in the foreach
1057 }
1058 }
1059 }
1060
1061 if (empty($error) && count($tabpay) > 0) {
1062 setEventMessages($langs->trans("GeneralLedgerIsWritten"), null, 'mesgs');
1063 } elseif (count($tabpay) == $error) {
1064 setEventMessages($langs->trans("NoNewRecordSaved"), null, 'warnings');
1065 } else {
1066 setEventMessages($langs->trans("GeneralLedgerSomeRecordWasNotRecorded"), null, 'warnings');
1067 }
1068
1069 $action = '';
1070
1071 // Must reload data, so we make a redirect
1072 if (count($tabpay) != $error) {
1073 $param = 'id_journal='.$id_journal;
1074 $param .= '&date_startday='.$date_startday;
1075 $param .= '&date_startmonth='.$date_startmonth;
1076 $param .= '&date_startyear='.$date_startyear;
1077 $param .= '&date_endday='.$date_endday;
1078 $param .= '&date_endmonth='.$date_endmonth;
1079 $param .= '&date_endyear='.$date_endyear;
1080 $param .= '&in_bookkeeping='.$in_bookkeeping;
1081 header("Location: ".$_SERVER['PHP_SELF'].($param ? '?'.$param : ''));
1082 exit;
1083 }
1084}
1085
1086
1087
1088// Export
1089if ($action == 'exportcsv' && $user->hasRight('accounting', 'bind', 'write')) { // ISO and not UTF8 !
1090 $sep = getDolGlobalString('ACCOUNTING_EXPORT_SEPARATORCSV');
1091
1092 $filename = 'journal';
1093 $type_export = 'journal';
1094 include DOL_DOCUMENT_ROOT.'/accountancy/tpl/export_journal.tpl.php';
1095
1096 // CSV header line
1097 print '"'.$langs->transnoentitiesnoconv("BankId").'"'.$sep;
1098 print '"'.$langs->transnoentitiesnoconv("Date").'"'.$sep;
1099 print '"'.$langs->transnoentitiesnoconv("PaymentMode").'"'.$sep;
1100 print '"'.$langs->transnoentitiesnoconv("AccountAccounting").'"'.$sep;
1101 print '"'.$langs->transnoentitiesnoconv("SubledgerAccount").'"'.$sep;
1102 print '"'.$langs->transnoentitiesnoconv("Label").'"'.$sep;
1103 print '"'.$langs->transnoentitiesnoconv("AccountingDebit").'"'.$sep;
1104 print '"'.$langs->transnoentitiesnoconv("AccountingCredit").'"'.$sep;
1105 print '"'.$langs->transnoentitiesnoconv("Journal").'"'.$sep;
1106 print '"'.$langs->transnoentitiesnoconv("Note").'"'.$sep;
1107 print "\n";
1108
1109 foreach ($tabpay as $key => $val) {
1110 $date = dol_print_date($val["date"], 'day');
1111
1112 $ref = getSourceDocRef($val, $tabtype[$key]);
1113
1114 // Bank
1115 foreach ($tabbq[$key] as $k => $mt) {
1116 if ($mt) {
1117 $reflabel = '';
1118 if (!empty($val['lib'])) {
1119 $reflabel .= dol_string_nohtmltag($val['lib'])." / ";
1120 }
1121 $reflabel .= $langs->trans("Bank").' '.dol_string_nohtmltag($val['bank_account_ref']);
1122 if (!empty($val['soclib'])) {
1123 $reflabel .= " / ".dol_string_nohtmltag($val['soclib']);
1124 }
1125
1126 print '"'.$key.'"'.$sep;
1127 print '"'.$date.'"'.$sep;
1128 print '"'.$val["type_payment"].'"'.$sep;
1129 print '"'.length_accountg(html_entity_decode($k)).'"'.$sep;
1130 print " ".$sep;
1131 print '"'.$reflabel.'"'.$sep;
1132 print '"'.($mt >= 0 ? price($mt) : '').'"'.$sep;
1133 print '"'.($mt < 0 ? price(-$mt) : '').'"'.$sep;
1134 print '"'.$journal.'"'.$sep;
1135 print '"'.dol_string_nohtmltag($ref).'"'.$sep;
1136 print "\n";
1137 }
1138 }
1139
1140 // Third party
1141 if (is_array($tabtp[$key])) {
1142 foreach ($tabtp[$key] as $k => $mt) {
1143 if ($mt) {
1144 $reflabel = '';
1145 if (!empty($val['lib'])) {
1146 $reflabel .= dol_string_nohtmltag($val['lib']).(!empty($val['soclib']) ? " / " : "");
1147 }
1148 if ($tabtype[$key] == 'banktransfert') {
1149 $reflabel .= dol_string_nohtmltag($langs->transnoentitiesnoconv('TransitionalAccount').' '.$account_transfer);
1150 } else {
1151 $reflabel .= dol_string_nohtmltag($val['soclib'] ?? '');
1152 }
1153
1154 print '"'.$key.'"'.$sep;
1155 print '"'.$date.'"'.$sep;
1156 print '"'.$val["type_payment"].'"'.$sep;
1157 if ($tabtype[$key] == 'payment_supplier') {
1158 $account_ledger = (!empty($obj->accountancy_code_supplier_general)) ? $obj->accountancy_code_supplier_general : $account_supplier;
1159 print '"'.length_accountg($account_ledger).'"'.$sep;
1160 } elseif ($tabtype[$key] == 'payment') {
1161 $account_ledger = (!empty($obj->accountancy_code_customer_general)) ? $obj->accountancy_code_customer_general : $account_customer;
1162 print '"'.length_accountg($account_ledger).'"'.$sep;
1163 } elseif ($tabtype[$key] == 'payment_expensereport') {
1164 print '"'.length_accountg(getDolGlobalString('ACCOUNTING_ACCOUNT_EXPENSEREPORT')).'"'.$sep;
1165 } elseif ($tabtype[$key] == 'payment_salary') {
1166 $account_ledger = (!empty($obj->accountancy_code_user_general)) ? $obj->accountancy_code_user_general : $account_employee;
1167 print '"'.length_accountg($account_ledger).'"'.$sep;
1168 } else {
1169 print '"'.length_accountg(html_entity_decode($k)).'"'.$sep;
1170 }
1171 print '"'.length_accounta(html_entity_decode($k)).'"'.$sep;
1172 print '"'.$reflabel.'"'.$sep;
1173 print '"'.($mt < 0 ? price(-$mt) : '').'"'.$sep;
1174 print '"'.($mt >= 0 ? price($mt) : '').'"'.$sep;
1175 print '"'.$journal.'"'.$sep;
1176 print '"'.dol_string_nohtmltag($ref).'"'.$sep;
1177 print "\n";
1178 }
1179 }
1180 } else { // If thirdparty unknown, output the waiting account
1181 foreach ($tabbq[$key] as $k => $mt) {
1182 if ($mt) {
1183 $reflabel = '';
1184 if (!empty($val['lib'])) {
1185 $reflabel .= dol_string_nohtmltag($val['lib'])." / ";
1186 }
1187 $reflabel .= dol_string_nohtmltag('WaitingAccount');
1188
1189 print '"'.$key.'"'.$sep;
1190 print '"'.$date.'"'.$sep;
1191 print '"'.$val["type_payment"].'"'.$sep;
1192 print '"'.length_accountg(getDolGlobalString('ACCOUNTING_ACCOUNT_SUSPENSE')).'"'.$sep;
1193 print $sep;
1194 print '"'.$reflabel.'"'.$sep;
1195 print '"'.($mt < 0 ? price(-$mt) : '').'"'.$sep;
1196 print '"'.($mt >= 0 ? price($mt) : '').'"'.$sep;
1197 print '"'.$journal.'"'.$sep;
1198 print '"'.dol_string_nohtmltag($ref).'"'.$sep;
1199 print "\n";
1200 }
1201 }
1202 }
1203 }
1204}
1205
1206
1207/*
1208 * View
1209 */
1210
1211$form = new Form($db);
1212
1213if (empty($action) || $action == 'view') {
1214 $invoicestatic = new Facture($db);
1215 $invoicesupplierstatic = new FactureFournisseur($db);
1216 $expensereportstatic = new ExpenseReport($db);
1217 $vatstatic = new Tva($db);
1218 $donationstatic = new Don($db);
1219 $loanstatic = new Loan($db);
1220 $salarystatic = new Salary($db);
1221 $variousstatic = new PaymentVarious($db);
1222
1223 $title = $langs->trans("GenerationOfAccountingEntries").' - '.$accountingjournalstatic->getNomUrl(0, 2, 1, '', 1);
1224 $help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double#G&eacute;n&eacute;ration_des_&eacute;critures_en_comptabilit&eacute;';
1225 llxHeader('', dol_string_nohtmltag($title), $help_url, '', 0, 0, '', '', '', 'mod-accountancy accountancy-generation page-bankjournal');
1226
1227 $nom = $title;
1228 $builddate = dol_now();
1229 //$description = $langs->trans("DescFinanceJournal") . '<br>';
1230 $description = $langs->trans("DescJournalOnlyBindedVisible").'<br>';
1231
1232 $listofchoices = array(
1233 'notyet' => $langs->trans("NotYetInGeneralLedger"),
1234 'already' => $langs->trans("AlreadyInGeneralLedger")
1235 );
1236 $period = $form->selectDate($date_start ? $date_start : -1, 'date_start', 0, 0, 0, '', 1, 0).' - '.$form->selectDate($date_end ? $date_end : -1, 'date_end', 0, 0, 0, '', 1, 0);
1237 $period .= '<span class="valignmiddle"> - '.$langs->trans("JournalizationInLedgerStatus").' </span>'.$form->selectarray('in_bookkeeping', $listofchoices, $in_bookkeeping, 1, 0, 0, '', 0, 0, 0, '', 'minwidth75 valignmiddle');
1238
1239 $varlink = 'id_journal='.$id_journal;
1240 $periodlink = '';
1241 $exportlink = '';
1242
1243 $listofchoices = array(
1244 1 => $langs->trans("TransfertAllBankLines"),
1245 2 => $langs->trans("TransfertOnlyConciliatedBankLine")
1246 );
1247 $moreoptions = [ "BankLineConciliated" => $form->selectarray('only_rappro', $listofchoices, $only_rappro, 0, 0, 0, '', 0, 0, 0, '', 'minwidth75 valignmiddle')];
1248
1249 journalHead($nom, '', $period, $periodlink, $description, $builddate, $exportlink, array('action' => ''), '', $varlink, $moreoptions);
1250
1251 $desc = '';
1252
1253 if (getDolGlobalString('ACCOUNTANCY_FISCAL_PERIOD_MODE') != 'blockedonclosed') {
1254 // Test that setup is complete (we are in accounting, so test on entity is always on $conf->entity only, no sharing allowed)
1255 // Fiscal period test
1256 $sql = "SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX."accounting_fiscalyear WHERE entity = ".((int) $conf->entity);
1257 $resql = $db->query($sql);
1258 if ($resql) {
1259 $obj = $db->fetch_object($resql);
1260 if ($obj->nb == 0) {
1261 print '<br><div class="warning">'.img_warning().' '.$langs->trans("TheFiscalPeriodIsNotDefined");
1262 $desc = ' : '.$langs->trans("AccountancyAreaDescFiscalPeriod", 4, '{link}');
1263 $desc = str_replace('{link}', '<strong>'.$langs->transnoentitiesnoconv("MenuAccountancy").'-'.$langs->transnoentitiesnoconv("Setup")."-".$langs->transnoentitiesnoconv("FiscalPeriod").'</strong>', $desc);
1264 print $desc;
1265 print '</div>';
1266 }
1267 } else {
1268 dol_print_error($db);
1269 }
1270 }
1271
1272 // Bank test
1273 $sql = "SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX."bank_account WHERE entity = ".((int) $conf->entity)." AND fk_accountancy_journal IS NULL AND clos=0";
1274 $resql = $db->query($sql);
1275 if ($resql) {
1276 $obj = $db->fetch_object($resql);
1277 if ($obj->nb > 0) {
1278 print '<br><div class="warning">'.img_warning().' '.$langs->trans("TheJournalCodeIsNotDefinedOnSomeBankAccount");
1279 $desc = ' : '.$langs->trans("AccountancyAreaDescBank", 6, '{link}');
1280 $desc = str_replace('{link}', '<strong>'.$langs->transnoentitiesnoconv("MenuAccountancy").'-'.$langs->transnoentitiesnoconv("Setup")."-".$langs->transnoentitiesnoconv("BankAccounts").'</strong>', $desc);
1281 print $desc;
1282 print '</div>';
1283 }
1284 } else {
1285 dol_print_error($db);
1286 }
1287
1288
1289 // Button to write into Ledger
1290 if (getDolGlobalString('ACCOUNTING_ACCOUNT_CUSTOMER') == "" || getDolGlobalString('ACCOUNTING_ACCOUNT_CUSTOMER') == '-1'
1291 || getDolGlobalString('ACCOUNTING_ACCOUNT_SUPPLIER') == "" || getDolGlobalString('ACCOUNTING_ACCOUNT_SUPPLIER') == '-1'
1292 || (isModEnabled("salaries") && (getDolGlobalString('SALARIES_ACCOUNTING_ACCOUNT_PAYMENT') == "" || getDolGlobalString('SALARIES_ACCOUNTING_ACCOUNT_PAYMENT') == '-1'))
1293 || (isModEnabled("expensereport") && (getDolGlobalString('ACCOUNTING_ACCOUNT_EXPENSEREPORT') == "" || getDolGlobalString('ACCOUNTING_ACCOUNT_EXPENSEREPORT') == '-1'))) {
1294
1295
1296 print($desc ? '' : '<br>').'<div class="warning">'.img_warning().' '.$langs->trans("SomeMandatoryStepsOfSetupWereNotDone");
1297 $desc = ' : '.$langs->trans("AccountancyAreaDescMisc", 4, '{link}');
1298 $desc = str_replace('{link}', '<strong>'.$langs->transnoentitiesnoconv("MenuAccountancy").'-'.$langs->transnoentitiesnoconv("Setup")."-".$langs->transnoentitiesnoconv("MenuDefaultAccounts").'</strong>', $desc);
1299 print $desc;
1300 print '</div>';
1301 }
1302
1303
1304 print '<br><div class="tabsAction tabsActionNoBottom centerimp">';
1305
1306 if (getDolGlobalString('ACCOUNTING_ENABLE_EXPORT_DRAFT_JOURNAL') && $in_bookkeeping == 'notyet') {
1307 print '<input type="button" class="butAction" name="exportcsv" value="'.$langs->trans("ExportDraftJournal").'" onclick="launch_export();" />';
1308 }
1309
1310 if (getDolGlobalString('ACCOUNTING_ACCOUNT_CUSTOMER') == "" || getDolGlobalString('ACCOUNTING_ACCOUNT_CUSTOMER') == '-1'
1311 || getDolGlobalString('ACCOUNTING_ACCOUNT_SUPPLIER') == "" || getDolGlobalString('ACCOUNTING_ACCOUNT_SUPPLIER') == '-1') {
1312 print '<input type="button" class="butActionRefused classfortooltip" title="'.dol_escape_htmltag($langs->trans("SomeMandatoryStepsOfSetupWereNotDone")).'" value="'.$langs->trans("WriteBookKeeping").'" />';
1313 } else {
1314 if ($in_bookkeeping == 'notyet') {
1315 print '<input type="button" class="butAction" name="writebookkeeping" value="'.$langs->trans("WriteBookKeeping").'" onclick="writebookkeeping();" />';
1316 } else {
1317 print '<a class="butActionRefused classfortooltip" name="writebookkeeping">'.$langs->trans("WriteBookKeeping").'</a>';
1318 }
1319 }
1320
1321 print '</div>';
1322
1323 // TODO Avoid using js. We can use a direct link with $param
1324 print '
1325 <script type="text/javascript">
1326 function launch_export() {
1327 console.log("Set value into form and submit");
1328 $("div.fiche form input[name=\"action\"]").val("exportcsv");
1329 $("div.fiche form input[type=\"submit\"]").click();
1330 $("div.fiche form input[name=\"action\"]").val("");
1331 }
1332 function writebookkeeping() {
1333 console.log("Set value into form and submit");
1334 $("div.fiche form input[name=\"action\"]").val("writebookkeeping");
1335 $("div.fiche form input[type=\"submit\"]").click();
1336 $("div.fiche form input[name=\"action\"]").val("");
1337 }
1338 </script>';
1339
1340 /*
1341 * Show result array
1342 */
1343 print '<br>';
1344
1345 $i = 0;
1346 print '<div class="div-table-responsive">';
1347 print '<table class="noborder centpercent">';
1348 print '<tr class="liste_titre">';
1349 print "<td>".$langs->trans("Date")."</td>";
1350 print "<td>".$langs->trans("Piece").' ('.$langs->trans("ObjectsRef").")</td>";
1351 print "<td>".$langs->trans("AccountAccounting")."</td>";
1352 print "<td>".$langs->trans("SubledgerAccount")."</td>";
1353 print "<td>".$langs->trans("LabelOperation")."</td>";
1354 print '<td class="center">'.$langs->trans("PaymentMode")."</td>";
1355 print '<td class="right">'.$langs->trans("AccountingDebit")."</td>";
1356 print '<td class="right">'.$langs->trans("AccountingCredit")."</td>";
1357 print "</tr>\n";
1358
1359 foreach ($tabpay as $key => $val) { // $key is rowid in llx_bank
1360 $date = dol_print_date($val["date"], 'day');
1361
1362 $ref = getSourceDocRef($val, $tabtype[$key]);
1363
1364 // Bank
1365 foreach ($tabbq[$key] as $k => $mt) {
1366 if ($mt) {
1367 $reflabel = '';
1368 if (!empty($val['lib'])) {
1369 $reflabel .= $val['lib']." / ";
1370 }
1371 $reflabel .= $langs->trans("Bank").' '.$val['bank_account_ref'];
1372 if (!empty($val['soclib'])) {
1373 $reflabel .= " / ".$val['soclib'];
1374 }
1375
1376 //var_dump($tabpay[$key]);
1377 print '<!-- Bank bank.rowid='.$key.'=accounting_bookkeeping.fk_doc (accounting_bookkeeping.doc_type=\'bank\') type='.$tabpay[$key]['type'].' ref='.$tabpay[$key]['ref'].' -->';
1378 print '<tr class="oddeven">';
1379
1380 // Date
1381 print "<td>".$date."</td>";
1382
1383 // Ref
1384 print '<td class="maxwidth300 nopaddingtopimp nopaddingbottomimp">'.dol_escape_htmltag($ref)."</td>";
1385
1386 // Ledger account
1387 $accounttoshow = length_accountg($k);
1388 if (empty($accounttoshow) || $accounttoshow == 'NotDefined') {
1389 $accounttoshow = '<span class="error">'.$langs->trans("BankAccountNotDefined").'</span>';
1390 }
1391 print '<td class="maxwidth300" title="'.dol_escape_htmltag(dol_string_nohtmltag($accounttoshow)).'">';
1392 print $accounttoshow;
1393 print "</td>";
1394
1395 // Subledger account
1396 print '<td class="maxwidth300">';
1397 /*$accounttoshow = length_accountg($k);
1398 if (empty($accounttoshow) || $accounttoshow == 'NotDefined')
1399 {
1400 print '<span class="error">'.$langs->trans("BankAccountNotDefined").'</span>';
1401 }
1402 else print $accounttoshow;*/
1403 print "</td>";
1404
1405 // Label operation
1406 print '<td class="maxwidth300 nopaddingtopimp nopaddingbottomimp">';
1407 print $reflabel; // This is already html escaped content
1408 print "</td>";
1409
1410 print '<td class="center">'.$val["type_payment"]."</td>";
1411 print '<td class="right nowraponall amount">'.($mt >= 0 ? price($mt) : '')."</td>";
1412 print '<td class="right nowraponall amount">'.($mt < 0 ? price(-$mt) : '')."</td>";
1413 print "</tr>";
1414
1415 $i++;
1416 }
1417 }
1418
1419 // Third party
1420 if (is_array($tabtp[$key])) {
1421 foreach ($tabtp[$key] as $k => $mt) {
1422 if ($mt) {
1423 $reflabel = '';
1424 if (!empty($val['lib'])) {
1425 $reflabel .= $val['lib'].(!empty($val['soclib']) ? " / " : "");
1426 }
1427 if ($tabtype[$key] == 'banktransfert') {
1428 $reflabel .= $langs->trans('TransitionalAccount').' '.$account_transfer;
1429 } else {
1430 $reflabel .= isset($val['soclib']) ? $val['soclib'] : "";
1431 }
1432
1433 print '<!-- Thirdparty bank.rowid='.$key.'=accounting_bookkeeping.fk_doc (accounting_bookkeeping.doc_type=\'bank\') type='.$tabpay[$key]['type'].' ref='.$tabpay[$key]['ref'].' -->';
1434 print '<tr class="oddeven">';
1435
1436 // Date
1437 print "<td>".$date."</td>";
1438
1439 // Ref / Piece
1440 print '<td class="nopaddingtopimp nopaddingbottomimp">'.dol_escape_htmltag($ref)."</td>";
1441
1442
1443 // Ledger account
1444 $account_ledger = $k;
1445 // Try to force general ledger account depending on type
1446 if ($tabtype[$key] == 'payment') {
1447 $account_ledger = (!empty($obj->accountancy_code_customer_general)) ? $obj->accountancy_code_customer_general : $account_customer;
1448 }
1449 if ($tabtype[$key] == 'payment_supplier') {
1450 $account_ledger = (!empty($obj->accountancy_code_supplier_general)) ? $obj->accountancy_code_supplier_general : $account_supplier;
1451 }
1452 if ($tabtype[$key] == 'payment_expensereport') {
1453 $account_ledger = getDolGlobalString('ACCOUNTING_ACCOUNT_EXPENSEREPORT');
1454 }
1455 if ($tabtype[$key] == 'payment_salary') {
1456 $account_ledger = (!empty($obj->accountancy_code_user_general)) ? $obj->accountancy_code_user_general : $account_employee;
1457 }
1458 if ($tabtype[$key] == 'payment_vat') {
1459 $account_ledger = getDolGlobalString('ACCOUNTING_VAT_PAY_ACCOUNT');
1460 }
1461 if ($tabtype[$key] == 'member') {
1462 $account_ledger = getDolGlobalString('ADHERENT_SUBSCRIPTION_ACCOUNTINGACCOUNT');
1463 }
1464 if ($tabtype[$key] == 'payment_various') {
1465 $account_ledger = $tabpay[$key]["account_various"];
1466 }
1467 $accounttoshow = length_accountg($account_ledger);
1468 if (empty($accounttoshow) || $accounttoshow == 'NotDefined') {
1469 if ($tabtype[$key] == 'unknown') {
1470 // We will accept writing, but into a waiting account
1471 if (!getDolGlobalString('ACCOUNTING_ACCOUNT_SUSPENSE') || getDolGlobalString('ACCOUNTING_ACCOUNT_SUSPENSE') == '-1') {
1472 $accounttoshow = '<span class="error small">'.$langs->trans('UnknownAccountForThirdpartyAndWaitingAccountNotDefinedBlocking').'</span>';
1473 } else {
1474 $accounttoshow = '<span class="warning small">'.$langs->trans('UnknownAccountForThirdparty', length_accountg(getDolGlobalString('ACCOUNTING_ACCOUNT_SUSPENSE'))).'</span>'; // We will use a waiting account
1475 }
1476 } else {
1477 // We will refuse writing
1478 $errorstring = 'UnknownAccountForThirdpartyBlocking';
1479 if ($tabtype[$key] == 'payment') {
1480 $errorstring = 'MainAccountForCustomersNotDefined';
1481 }
1482 if ($tabtype[$key] == 'payment_supplier') {
1483 $errorstring = 'MainAccountForSuppliersNotDefined';
1484 }
1485 if ($tabtype[$key] == 'payment_expensereport') {
1486 $errorstring = 'MainAccountForUsersNotDefined';
1487 }
1488 if ($tabtype[$key] == 'payment_salary') {
1489 $errorstring = 'MainAccountForUsersNotDefined';
1490 }
1491 if ($tabtype[$key] == 'payment_vat') {
1492 $errorstring = 'MainAccountForVatPaymentNotDefined';
1493 }
1494 if ($tabtype[$key] == 'member') {
1495 $errorstring = 'MainAccountForSubscriptionPaymentNotDefined';
1496 }
1497 $accounttoshow = '<span class="error small">'.$langs->trans($errorstring).'</span>';
1498 }
1499 }
1500 print '<td class="maxwidth300" title="'.dol_escape_htmltag(dol_string_nohtmltag($accounttoshow)).'">';
1501 print $accounttoshow; // This is a HTML string
1502 print "</td>";
1503
1504 // Subledger account
1505 $accounttoshowsubledger = '';
1506 if (in_array($tabtype[$key], array('payment', 'payment_supplier', 'payment_expensereport', 'payment_salary', 'payment_various'))) { // Type of payments that uses a subledger
1507 $accounttoshowsubledger = length_accounta($k);
1508 if ($accounttoshow != $accounttoshowsubledger) {
1509 if (empty($accounttoshowsubledger) || $accounttoshowsubledger == 'NotDefined') {
1510 //print '<span class="error">'.$langs->trans("ThirdpartyAccountNotDefined").'</span>';
1511 if (!empty($tabcompany[$key]['code_compta'])) {
1512 if (in_array($tabtype[$key], array('payment_various'))) {
1513 // For such case, if subledger is not defined, we won't use subledger accounts.
1514 $accounttoshowsubledger = '<span class="warning small twolinesmax">'.$langs->trans("ThirdpartyAccountNotDefinedOrThirdPartyUnknownSubledgerIgnored").'</span>';
1515 } elseif (in_array($tabtype[$key], array('payment_salary'))) {
1516 $accounttoshowsubledger = '<span class="warning small twolinesmax">'.$langs->trans("ThirdpartyAccountNotDefinedOrThirdPartyUnknownSubledgerIgnored2").'</span>';
1517 } else {
1518 $accounttoshowsubledger = '<span class="warning small twolinesmax">'.$langs->trans("ThirdpartyAccountNotDefinedOrThirdPartyUnknown", $tabcompany[$key]['code_compta']).'</span>';
1519 }
1520 } else {
1521 $accounttoshowsubledger = '<span class="error small twolinesmax">'.$langs->trans("ThirdpartyAccountNotDefinedOrThirdPartyUnknownBlocking").'</span>';
1522 }
1523 }
1524 } else {
1525 $accounttoshowsubledger = '';
1526 }
1527 }
1528 print '<td class="maxwidth300 nopaddingtopimp nopaddingbottomimp" title="'.dolPrintHTMLForAttribute(dol_string_nohtmltag($accounttoshowsubledger)).'">';
1529 print $accounttoshowsubledger; // This is a html string
1530 print "</td>";
1531
1532 // Label operation
1533 print '<td class="nopaddingtopimpo paddingbottomimp">';
1534 print $reflabel; // This is a html string
1535 print "</td>";
1536
1537 print '<td class="center">'.$val["type_payment"]."</td>";
1538
1539 print '<td class="right nowraponall amount">'.($mt < 0 ? price(-$mt) : '')."</td>";
1540
1541 print '<td class="right nowraponall amount">'.($mt >= 0 ? price($mt) : '')."</td>";
1542
1543 print "</tr>";
1544
1545 $i++;
1546 }
1547 }
1548 } else { // Waiting account
1549 foreach ($tabbq[$key] as $k => $mt) {
1550 if ($mt) {
1551 $reflabel = '';
1552 if (!empty($val['lib'])) {
1553 $reflabel .= $val['lib']." / ";
1554 }
1555 $reflabel .= 'WaitingAccount';
1556
1557 print '<!-- Wait bank.rowid='.$key.' -->';
1558 print '<tr class="oddeven">';
1559 print "<td>".$date."</td>";
1560 print "<td>".$ref."</td>";
1561 // Ledger account
1562 print "<td>";
1563 /*if (empty($accounttoshow) || $accounttoshow == 'NotDefined')
1564 {
1565 print '<span class="error">'.$langs->trans("WaitAccountNotDefined").'</span>';
1566 }
1567 else */
1568 print length_accountg(getDolGlobalString('ACCOUNTING_ACCOUNT_SUSPENSE'));
1569 print "</td>";
1570 // Subledger account
1571 print "<td>";
1572 print "</td>";
1573 print "<td>".dol_escape_htmltag($reflabel)."</td>";
1574 print '<td class="center">'.$val["type_payment"]."</td>";
1575 print '<td class="right nowraponall amount">'.($mt < 0 ? price(-$mt) : '')."</td>";
1576 print '<td class="right nowraponall amount">'.($mt >= 0 ? price($mt) : '')."</td>";
1577 print "</tr>";
1578
1579 $i++;
1580 }
1581 }
1582 }
1583 }
1584
1585 if (!$i) {
1586 $colspan = 8;
1587 print '<tr class="oddeven"><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1588 }
1589
1590 print "</table>";
1591 print '</div>';
1592
1593 llxFooter();
1594}
1595
1596$db->close();
1597
1598
1599
1607function getSourceDocRef($val, $typerecord)
1608{
1609 global $db, $langs;
1610
1611 // Defined the docref into $ref (We start with $val['ref'] by default and we complete according to other data)
1612 // WE MUST HAVE SAME REF FOR ALL LINES WE WILL RECORD INTO THE BOOKKEEPING
1613 $ref = $val['ref'];
1614 if ($ref == '(SupplierInvoicePayment)' || $ref == '(SupplierInvoicePaymentBack)') {
1615 $ref = $langs->transnoentitiesnoconv('Supplier');
1616 }
1617 if ($ref == '(CustomerInvoicePayment)' || $ref == '(CustomerInvoicePaymentBack)') {
1618 $ref = $langs->transnoentitiesnoconv('Customer');
1619 }
1620 if ($ref == '(SocialContributionPayment)') {
1621 $ref = $langs->transnoentitiesnoconv('SocialContribution');
1622 }
1623 if ($ref == '(DonationPayment)') {
1624 $ref = $langs->transnoentitiesnoconv('Donation');
1625 }
1626 if ($ref == '(SubscriptionPayment)') {
1627 $ref = $langs->transnoentitiesnoconv('Subscription');
1628 }
1629 if ($ref == '(ExpenseReportPayment)') {
1630 $ref = $langs->transnoentitiesnoconv('Employee');
1631 }
1632 if ($ref == '(LoanPayment)') {
1633 $ref = $langs->transnoentitiesnoconv('Loan');
1634 }
1635 if ($ref == '(payment_salary)') {
1636 $ref = $langs->transnoentitiesnoconv('Employee');
1637 }
1638
1639 $sqlmid = '';
1640 if ($typerecord == 'payment') {
1641 if (getDolGlobalInt('FACTURE_DEPOSITS_ARE_JUST_PAYMENTS')) {
1642 $sqlmid = "SELECT payfac.fk_facture as id, ".$db->ifsql('f1.rowid IS NULL', 'f.ref', 'f1.ref')." as ref";
1643 $sqlmid .= " FROM ".$db->prefix()."paiement_facture as payfac";
1644 $sqlmid .= " LEFT JOIN ".$db->prefix()."facture as f ON f.rowid = payfac.fk_facture";
1645 $sqlmid .= " LEFT JOIN ".$db->prefix()."societe_remise_except as sre ON sre.fk_facture_source = payfac.fk_facture";
1646 $sqlmid .= " LEFT JOIN ".$db->prefix()."facture as f1 ON f1.rowid = sre.fk_facture";
1647 $sqlmid .= " WHERE payfac.fk_paiement=".((int) $val['paymentid']);
1648 } else {
1649 $sqlmid = "SELECT payfac.fk_facture as id, f.ref as ref";
1650 $sqlmid .= " FROM ".$db->prefix()."paiement_facture as payfac";
1651 $sqlmid .= " INNER JOIN ".$db->prefix()."facture as f ON f.rowid = payfac.fk_facture";
1652 $sqlmid .= " WHERE payfac.fk_paiement=".((int) $val['paymentid']);
1653 }
1654 $ref = $langs->transnoentitiesnoconv("Invoice");
1655 } elseif ($typerecord == 'payment_supplier') {
1656 $sqlmid = 'SELECT payfac.fk_facturefourn as id, f.ref';
1657 $sqlmid .= " FROM ".MAIN_DB_PREFIX."paiementfourn_facturefourn as payfac, ".MAIN_DB_PREFIX."facture_fourn as f";
1658 $sqlmid .= " WHERE payfac.fk_facturefourn = f.rowid AND payfac.fk_paiementfourn=".((int) $val["paymentsupplierid"]);
1659 $ref = $langs->transnoentitiesnoconv("SupplierInvoice");
1660 } elseif ($typerecord == 'payment_expensereport') {
1661 $sqlmid = 'SELECT e.rowid as id, e.ref';
1662 $sqlmid .= " FROM ".MAIN_DB_PREFIX."payment_expensereport as pe, ".MAIN_DB_PREFIX."expensereport as e";
1663 $sqlmid .= " WHERE pe.rowid=".((int) $val["paymentexpensereport"])." AND pe.fk_expensereport = e.rowid";
1664 $ref = $langs->transnoentitiesnoconv("ExpenseReport");
1665 } elseif ($typerecord == 'payment_salary') {
1666 $sqlmid = 'SELECT s.rowid as ref';
1667 $sqlmid .= " FROM ".MAIN_DB_PREFIX."payment_salary as s";
1668 $sqlmid .= " WHERE s.rowid=".((int) $val["paymentsalid"]);
1669 $ref = $langs->transnoentitiesnoconv("SalaryPayment");
1670 } elseif ($typerecord == 'sc') {
1671 $sqlmid = 'SELECT sc.rowid as ref';
1672 $sqlmid .= " FROM ".MAIN_DB_PREFIX."paiementcharge as sc";
1673 $sqlmid .= " WHERE sc.rowid=".((int) $val["paymentscid"]);
1674 $ref = $langs->transnoentitiesnoconv("SocialContribution");
1675 } elseif ($typerecord == 'payment_vat') {
1676 $sqlmid = 'SELECT v.rowid as ref';
1677 $sqlmid .= " FROM ".MAIN_DB_PREFIX."tva as v";
1678 $sqlmid .= " WHERE v.rowid=".((int) $val["paymentvatid"]);
1679 $ref = $langs->transnoentitiesnoconv("PaymentVat");
1680 } elseif ($typerecord == 'payment_donation') {
1681 $sqlmid = 'SELECT payd.fk_donation as ref';
1682 $sqlmid .= " FROM ".MAIN_DB_PREFIX."payment_donation as payd";
1683 $sqlmid .= " WHERE payd.fk_donation=".((int) $val["paymentdonationid"]);
1684 $ref = $langs->transnoentitiesnoconv("Donation");
1685 } elseif ($typerecord == 'payment_loan') {
1686 $sqlmid = 'SELECT l.rowid as ref';
1687 $sqlmid .= " FROM ".MAIN_DB_PREFIX."payment_loan as l";
1688 $sqlmid .= " WHERE l.rowid=".((int) $val["paymentloanid"]);
1689 $ref = $langs->transnoentitiesnoconv("LoanPayment");
1690 } elseif ($typerecord == 'payment_various') {
1691 $sqlmid = 'SELECT v.rowid as ref';
1692 $sqlmid .= " FROM ".MAIN_DB_PREFIX."payment_various as v";
1693 $sqlmid .= " WHERE v.rowid=".((int) $val["paymentvariousid"]);
1694 $ref = $langs->transnoentitiesnoconv("VariousPayment");
1695 }
1696 // Add warning
1697 if (empty($sqlmid)) {
1698 dol_syslog("Found a typerecord=".$typerecord." not supported", LOG_WARNING);
1699 }
1700
1701 if ($sqlmid) {
1702 dol_syslog("accountancy/journal/bankjournal.php::sqlmid=".$sqlmid, LOG_DEBUG);
1703 $resultmid = $db->query($sqlmid);
1704 if ($resultmid) {
1705 while ($objmid = $db->fetch_object($resultmid)) {
1706 $ref .= ' '.$objmid->ref;
1707 }
1708 } else {
1709 dol_print_error($db);
1710 }
1711 }
1712
1713 $ref = dol_trunc($langs->transnoentitiesnoconv("BankId").' '.$val['fk_bank'].' - '.$ref, 295); // 295 + 3 dots (...) is < than max size of 300
1714 return $ref;
1715}
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
length_accountg($account)
Return General accounting account with defined length (used for product and miscellaneous)
journalHead($nom, $variant, $period, $periodlink, $description, $builddate, $exportlink='', $moreparam=array(), $calcmode='', $varlink='', $moreoptions=array())
Show header of a page used to transfer/dispatch data in accounting.
getDefaultDatesForTransfer()
Return Default dates for transfer based on periodicity option in accountancy setup.
length_accounta($accounta)
Return Auxiliary accounting account of thirdparties with defined length.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
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:73
getSourceDocRef($val, $typerecord)
Return source for doc_ref of a bank transaction.
Class to manage bank accounts.
Class to manage bank transaction lines.
Class to manage accounting accounts.
Class to manage accounting journals.
Class to manage Ledger (General Ledger and Subledger)
Class for managing the social charges.
Class to manage donations.
Definition don.class.php:41
Class to manage Trips and Expenses.
Class to manage suppliers invoices.
Class to manage invoices.
Class to manage generation of HTML components Only common components must be here.
Class Lettering.
Loan.
Class to manage payments for supplier invoices.
Class to manage payments of customer invoices.
Class to manage payments of donations.
Class to manage payments of expense report.
Class to manage payments of loans.
Class to manage payments of salaries.
Class to manage various payments.
Class to manage salary payments.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage subscriptions of foundation members.
Class to manage VAT - Value-added tax (also known in French as TVA - Taxe sur la valeur ajoutée)
Definition tva.class.php:39
Class to manage Dolibarr users.
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
Definition date.lib.php:603
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:622
dol_now($mode='gmt')
Return date for now.
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...
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.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.