dolibarr 24.0.0-beta
line.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2003 Xavier DUTOIT <doli@sydesy.com>
4 * Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2004 Christophe Combelles <ccomb@free.fr>
6 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
7 * Copyright (C) 2015-2026 Alexandre Spangaro <alexandre@inovea-conseil.com>
8 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
9 * Copyright (C) 2016 Marcos García <marcosgdf@gmail.com>
10 * Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
11 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
12 * Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program. If not, see <https://www.gnu.org/licenses/>.
26 */
27
34// Load Dolibarr environment
35require '../../main.inc.php';
44require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
45require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
46require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
47require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
48require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
49
50// Load translation files required by the page
51$langs->loadLangs(array('banks', 'categories', 'compta', 'bills', 'other'));
52if (isModEnabled('member')) {
53 $langs->load("members");
54}
55if (isModEnabled('don')) {
56 $langs->load("donations");
57}
58if (isModEnabled('loan')) {
59 $langs->load("loan");
60}
61if (isModEnabled('salaries')) {
62 $langs->load("salaries");
63}
64
65
66$id = GETPOSTINT('rowid');
67$rowid = GETPOSTINT('rowid');
68$accountoldid = GETPOSTINT('account'); // GETPOST('account') is old account id
69$accountid = GETPOSTINT('accountid'); // GETPOST('accountid') is new account id
70$ref = GETPOST('ref', 'alpha');
71$action = GETPOST('action', 'aZ09');
72$confirm = GETPOST('confirm', 'alpha');
73$orig_account = GETPOST("orig_account");
74$backtopage = GETPOST('backtopage', 'alpha');
75$cancel = GETPOST('cancel', 'alpha');
76
77// Security check
78$fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
79$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
80$socid = 0;
81if ($user->socid) {
82 $socid = $user->socid;
83}
84
85// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
86$hookmanager->initHooks(array('bankline'));
87
88$result = restrictedArea($user, 'banque', $accountoldid, 'bank_account');
89if (!$user->hasRight('banque', 'lire') && !$user->hasRight('banque', 'consolidate')) {
91}
92
94$extrafields->fetch_name_optionals_label($object->element);
95
96if ($id > 0) {
97 $result = $object->fetch($id);
98 if ($result <= 0) {
99 dol_syslog('Failed to read bank line with id '.$rowid, LOG_WARNING); // This happens due to old bug that has set fk_account to null.
100 $object->id = $id;
101 }
102}
103
104
105/*
106 * Actions
107 */
108
109$error = 0;
110
111$parameters = array('socid' => $socid);
112$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
113if ($reshook < 0) {
114 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
115}
116if ($cancel) {
117 if ($backtopage) {
118 header("Location: ".$backtopage);
119 exit;
120 }
121}
122
123
124if ($user->hasRight('banque', 'consolidate') && $action == 'donext') {
125 $al = new AccountLine($db);
126 $al->dateo_next(GETPOSTINT("rowid"));
127} elseif ($user->hasRight('banque', 'consolidate') && $action == 'doprev') {
128 $al = new AccountLine($db);
129 $al->dateo_previous(GETPOSTINT("rowid"));
130} elseif ($user->hasRight('banque', 'consolidate') && $action == 'dvnext') {
131 $al = new AccountLine($db);
132 $al->datev_next(GETPOSTINT("rowid"));
133} elseif ($user->hasRight('banque', 'consolidate') && $action == 'dvprev') {
134 $al = new AccountLine($db);
135 $al->datev_previous(GETPOSTINT("rowid"));
136}
137
138if ($action == 'confirm_delete_categ' && $confirm == "yes" && $user->hasRight('banque', 'modifier')) {
139 $cat1 = GETPOSTINT("cat1");
140 if (!empty($rowid) && !empty($cat1)) {
141 $sql = "DELETE FROM ".MAIN_DB_PREFIX."category_bankline WHERE lineid = ".((int) $rowid)." AND fk_categ = ".((int) $cat1);
142 if (!$db->query($sql)) {
144 }
145 } else {
146 setEventMessages($langs->trans("MissingIds"), null, 'errors');
147 }
148}
149
150if ($user->hasRight('banque', 'modifier') && $action == "update") {
151 $acsource = new Account($db);
152 $acsource->fetch($accountoldid);
153
154 $actarget = new Account($db);
155 if (GETPOSTINT('accountid') > 0 && !$object->rappro && !$object->getVentilExportCompta()) { // We ask to change bank account
156 $actarget->fetch(GETPOSTINT('accountid'));
157 } else {
158 $actarget->fetch($accountoldid);
159 }
160
161 if (!($actarget->id > 0)) {
162 setEventMessages($langs->trans("ErrorFailedToLoadBankAccount"), null, 'errors');
163 $error++;
164 }
165 if ($actarget->type == Account::TYPE_CASH && GETPOST('value', 'alpha') != 'LIQ') {
166 setEventMessages($langs->trans("ErrorCashAccountAcceptsOnlyCashMoney"), null, 'errors');
167 $error++;
168 }
169
170 if (!$error) {
171 $db->begin();
172
173 $amount = price2num(GETPOST('amount'));
174 $dateop = dol_mktime(12, 0, 0, GETPOSTINT("dateomonth"), GETPOSTINT("dateoday"), GETPOSTINT("dateoyear"));
175 $dateval = dol_mktime(12, 0, 0, GETPOSTINT("datevmonth"), GETPOSTINT("datevday"), GETPOSTINT("datevyear"));
176 $sql = "UPDATE ".MAIN_DB_PREFIX."bank";
177 $sql .= " SET ";
178 // Always opened
179 if (GETPOSTISSET('value')) {
180 $type = GETPOST('value');
181 $sql .= " fk_type='".$db->escape(empty($type) && $object->fk_type == 'SOLD' ? 'SOLD' : $type)."',";
182 }
183 if (GETPOSTISSET('num_chq')) {
184 $sql .= " num_chq='".$db->escape(GETPOST("num_chq"))."',";
185 }
186 if (GETPOSTISSET('banque')) {
187 $sql .= " banque='".$db->escape(GETPOST("banque"))."',";
188 }
189 if (GETPOSTISSET('emetteur')) {
190 $sql .= " emetteur='".$db->escape(GETPOST("emetteur"))."',";
191 }
192 // Blocked when conciliated
193 if (!$object->rappro) {
194 if (GETPOSTISSET('label')) {
195 $sql .= " label = '".$db->escape(GETPOST("label"))."',";
196 }
197 if (GETPOSTISSET('amount')) {
198 $sql .= " amount= '".$db->escape($amount)."',";
199 }
200 if (GETPOSTISSET('dateomonth')) {
201 $sql .= " dateo = '".$db->idate($dateop)."',";
202 }
203 if (GETPOSTISSET('datevmonth')) {
204 $sql .= " datev = '".$db->idate($dateval)."',";
205 }
206 }
207 $sql .= " fk_account = ".((int) $actarget->id);
208 $sql .= " WHERE rowid = ".((int) $object->id);
209
210 $result = $db->query($sql);
211 if (!$result) {
212 $error++;
213 }
214
215 if (!$error) {
216 $arrayofcategs = GETPOST('custcats', 'array');
217 $sql = "DELETE FROM ".MAIN_DB_PREFIX."category_bankline WHERE lineid = ".((int) $rowid);
218 if (!$db->query($sql)) {
219 $error++;
221 }
222 if (count($arrayofcategs)) {
223 foreach ($arrayofcategs as $val) {
224 $sql = "INSERT INTO ".MAIN_DB_PREFIX."category_bankline (lineid, fk_categ) VALUES (".((int) $rowid).", ".((int) $val).")";
225 if (!$db->query($sql)) {
226 $error++;
228 }
229 }
230 // $arrayselected will be loaded after in page output
231 }
232 }
233
234 if (!$error) {
235 $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
236 $object->insertExtraFields();
237 }
238
239 if (!$error) {
240 setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
241 $db->commit();
242 } else {
243 $db->rollback();
245 }
246 }
247}
248
249// Reconcile
250if ($user->hasRight('banque', 'consolidate') && ($action == 'num_releve' || $action == 'setreconcile')) {
251 $num_rel = trim(GETPOST("num_rel"));
252 $rappro = GETPOST('reconciled') ? 1 : 0;
253
254 // Check parameters
255 if ($rappro && empty($num_rel)) {
256 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("AccountStatement")), null, 'errors');
257 $error++;
258 }
259
260 if (!$error) {
261 $db->begin();
262
263 $oldNum_rel = $object->num_releve;
264 $id = $object->fk_account;
265
266 $sql = "UPDATE ".MAIN_DB_PREFIX."bank";
267 $sql .= " SET num_releve = ".($num_rel ? "'".$db->escape($num_rel)."'" : "null");
268 if (empty($num_rel)) {
269 $sql .= ", rappro = 0";
270 } else {
271 $sql .= ", rappro = ".((int) $rappro);
272 }
273 $sql .= " WHERE rowid = ".((int) $rowid);
274
275 $updatePathFile = true;
276 $update_dir = true;
277
278 dol_syslog("line.php update bank line to set the new bank receipt number", LOG_DEBUG);
279
280 $result = $db->query($sql);
281
282 // We must not rename the directory of the bank receipt when we change 1 line of bank receipt. Other lines may share the same old ref.
283 // Renaming can be done when we rename globally a bank receipt but not when changing 1 line from one receipt into another one.
284 $filepath = '';
285 $oldfilepath = '';
286 /*
287 if ($result) {
288 if ($oldNum_rel) {
289 if ($num_rel) {
290 $oldfilepath = dol_sanitizePathName("bank/".((int) $id)."/statement/".$oldNum_rel);
291 $filepath = dol_sanitizePathName("bank/".((int) $id)."/statement/".$num_rel);
292
293 $sql = "UPDATE ".MAIN_DB_PREFIX."ecm_files";
294 $sql .= " SET filepath = '".$db->escape($filepath)."'";
295 $sql .= " WHERE filepath = '".$db->escape($oldfilepath)."'";
296 $updatePathFile = $db->query($sql);
297
298 $srcdir = dol_sanitizePathName(DOL_DATA_ROOT."/bank/".((int) $id)."/statement/".$oldNum_rel);
299 $destdir = dol_sanitizePathName(DOL_DATA_ROOT."/bank/".((int) $id)."/statement/".$num_rel);
300
301 if (dol_is_dir($srcdir)) {
302 $update_dir = dol_move_dir($srcdir, $destdir, 1);
303 }
304 }
305 }
306 }
307 */
308
309 if ($result && $updatePathFile && $update_dir) {
310 setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
311 $db->commit();
312 } else {
313 $langs->load("errors");
314 setEventMessages($langs->trans("ErrorFailToRenameDir", $oldfilepath, $filepath), null, 'mesgs');
315 $db->rollback();
316 }
317 }
318}
319
320
321
322/*
323 * View
324 */
325
326$object->fetch($rowid);
327
328$form = new Form($db);
329
330llxHeader('', $langs->trans("BankTransaction"));
331
332$arrayselected = array();
333
335$cats = $c->containing($rowid, Categorie::TYPE_BANK_LINE);
336if (is_array($cats)) {
337 foreach ($cats as $cat) {
338 $arrayselected[] = $cat->id;
339 }
340}
341
342$head = bankline_prepare_head($rowid);
343
344
345$sql = "SELECT b.rowid, b.dateo as do, b.datev as dv, b.amount, b.label, b.rappro,";
346$sql .= " b.num_releve, b.fk_user_author, b.num_chq, b.fk_type, b.fk_account, b.fk_bordereau as receiptid,";
347$sql .= " b.emetteur,b.banque";
348$sql .= " FROM ".MAIN_DB_PREFIX."bank as b";
349$sql .= " WHERE rowid=".((int) $rowid);
350$sql .= " ORDER BY dateo ASC";
351$result = $db->query($sql);
352if ($result) {
353 $i = 0;
354 $total = 0;
355 if ($db->num_rows($result)) {
356 $objp = $db->fetch_object($result);
357
358 $total += $objp->amount;
359
360 $acct = new Account($db);
361 $acct->fetch($objp->fk_account);
362 $account = $acct->id;
363
364 $bankline = new AccountLine($db);
365 $bankline->fetch($rowid, $ref);
366
367 $links = $acct->get_url($rowid);
368 $bankline->load_previous_next_ref('', 'rowid');
369
370 // Confirmations
371 if ($action == 'delete_categ') {
372 print $form->formconfirm($_SERVER['PHP_SELF']."?rowid=".urlencode((string) ($rowid))."&cat1=".urlencode((string) (GETPOSTINT("fk_categ")))."&orig_account=".urlencode((string) ($orig_account)), $langs->trans("RemoveFromRubrique"), $langs->trans("RemoveFromRubriqueConfirm"), "confirm_delete_categ", '', 'yes', 1);
373 }
374
375 print '<form name="update" method="POST" action="'.$_SERVER['PHP_SELF'].'?rowid='.$rowid.'">';
376 print '<input type="hidden" name="token" value="'.newToken().'">';
377 print '<input type="hidden" name="action" value="update">';
378 print '<input type="hidden" name="orig_account" value="'.$orig_account.'">';
379 print '<input type="hidden" name="account" value="'.$acct->id.'">';
380
381 print dol_get_fiche_head($head, 'bankline', $langs->trans('LineRecord'), 0, 'accountline', 0);
382
383 $linkback = '<a href="'.DOL_URL_ROOT.'/compta/bank/bankentries_list.php?restore_lastsearch_values=1'.(GETPOSTINT('account', 1) ? '&id='.GETPOSTINT('account', 1) : '').'">'.$langs->trans("BackToList").'</a>';
384
385
386 dol_banner_tab($bankline, 'rowid', $linkback);
387
388 print '<div class="fichecenter2">';
389
390 print '<div class="underbanner clearboth"></div>';
391 print '<table class="border centpercent tableforfield">';
392
393 $i++;
394
395 // Bank account
396 print '<tr><td class="titlefieldcreate">'.$langs->trans("BankAccount").'</td>';
397 print '<td>';
398 // $objp->fk_account may be not > 0 if data was lost by an old bug. In such a case, we let a chance to user to fix it.
399 if (($objp->rappro || $bankline->getVentilExportCompta()) && $objp->fk_account > 0) {
400 print $acct->getNomUrl(1, 'transactions', 'reflabel');
401 } else {
402 print img_picto('', 'bank_account', 'class="paddingright"');
403 print $form->select_comptes($acct->id, 'accountid', 0, '', ($acct->id > 0 ? $acct->id : 1), '', 0, '', 1);
404 }
405 print '</td>';
406 print '</tr>';
407
408 // Show links of bank transactions
409 if (count($links)) {
410 print '<tr><td class="tdtop">'.$langs->trans("Links").'</td>';
411 print '<td>';
412 foreach ($links as $key => $val) {
413 if ($key) {
414 print '<br>';
415 }
416 if ($links[$key]['type'] == 'payment') {
417 require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
418 $paymenttmp = new Paiement($db);
419 $paymenttmp->fetch($links[$key]['url_id']);
420 $paymenttmp->ref = $langs->trans("Payment").' '.$paymenttmp->ref;
421 /*print '<a href="'.DOL_URL_ROOT.'/compta/paiement/card.php?id='.$links[$key]['url_id'].'">';
422 print img_object($langs->trans('Payment'),'payment').' ';
423 print $langs->trans("Payment");
424 print '</a>';*/
425 print $paymenttmp->getNomUrl(1);
426 } elseif ($links[$key]['type'] == 'payment_supplier') {
427 require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php';
428 $paymenttmp = new PaiementFourn($db);
429 $paymenttmp->fetch($links[$key]['url_id']);
430 $paymenttmp->ref = $langs->trans("Payment").' '.$paymenttmp->ref;
431 /*print '<a href="'.DOL_URL_ROOT.'/fourn/paiement/card.php?id='.$links[$key]['url_id'].'">';
432 print img_object($langs->trans('Payment'),'payment').' ';
433 print $langs->trans("Payment");
434 print '</a>';*/
435 print $paymenttmp->getNomUrl(1);
436 } elseif ($links[$key]['type'] == 'company') {
437 $societe = new Societe($db);
438 $societe->fetch($links[$key]['url_id']);
439 print $societe->getNomUrl(1);
440 } elseif ($links[$key]['type'] == 'sc') {
441 print '<a href="'.DOL_URL_ROOT.'/compta/sociales/card.php?id='.$links[$key]['url_id'].'">';
442 print img_object($langs->trans('SocialContribution'), 'bill').' ';
443 print $langs->trans("SocialContribution").($links[$key]['label'] ? ' - '.$links[$key]['label'] : '');
444 print '</a>';
445 } elseif ($links[$key]['type'] == 'vat') {
446 print '<a href="'.DOL_URL_ROOT.'/compta/tva/card.php?id='.$links[$key]['url_id'].'">';
447 print img_object($langs->trans('VATDeclaration'), 'bill').' ';
448 print $langs->trans("VATDeclaration").($links[$key]['label'] ? '&nbsp;'.$links[$key]['label'] : '');
449 print '</a>';
450 } elseif ($links[$key]['type'] == 'salary') {
451 print '<a href="'.DOL_URL_ROOT.'/salaries/card.php?id='.$links[$key]['url_id'].'">';
452 print img_object($langs->trans('Salary'), 'bill').' ';
453 print $langs->trans("Salary").($links[$key]['label'] ? ' - '.$links[$key]['label'] : '');
454 print '</a>';
455 } elseif ($links[$key]['type'] == 'payment_sc') {
456 print '<a href="'.DOL_URL_ROOT.'/compta/payment_sc/card.php?id='.$links[$key]['url_id'].'">';
457 print img_object($langs->trans('Payment'), 'payment').' ';
458 print $langs->trans("SocialContributionPayment");
459 print '</a>';
460 } elseif ($links[$key]['type'] == 'payment_vat') {
461 print '<a href="'.DOL_URL_ROOT.'/compta/payment_vat/card.php?id='.$links[$key]['url_id'].'">';
462 print img_object($langs->trans('VATPayment'), 'payment').' ';
463 print $langs->trans("VATPayment");
464 print '</a>';
465 } elseif ($links[$key]['type'] == 'payment_salary') {
466 print '<a href="'.DOL_URL_ROOT.'/salaries/payment_salary/card.php?id='.$links[$key]['url_id'].'">';
467 print img_object($langs->trans('SalaryPayment'), 'payment').' ';
468 print $langs->trans("SalaryPayment");
469 print '</a>';
470 } elseif ($links[$key]['type'] == 'payment_loan') {
471 print '<a href="'.DOL_URL_ROOT.'/loan/payment/card.php?id='.$links[$key]['url_id'].'">';
472 print img_object($langs->trans('LoanPayment'), 'payment').' ';
473 print $langs->trans("LoanPayment");
474 print '</a>';
475 } elseif ($links[$key]['type'] == 'loan') {
476 print '<a href="'.DOL_URL_ROOT.'/loan/card.php?id='.$links[$key]['url_id'].'">';
477 print img_object($langs->trans('Loan'), 'bill').' ';
478 print $langs->trans("Loan");
479 print '</a>';
480 } elseif ($links[$key]['type'] == 'member') {
481 print '<a href="'.DOL_URL_ROOT.'/adherents/card.php?rowid='.$links[$key]['url_id'].'">';
482 print img_object($langs->trans('Member'), 'user').' ';
483 print $links[$key]['label'];
484 print '</a>';
485 } elseif ($links[$key]['type'] == 'payment_donation') {
486 print '<a href="'.DOL_URL_ROOT.'/don/payment/card.php?id='.$links[$key]['url_id'].'">';
487 print img_object($langs->trans('Donation'), 'payment').' ';
488 print $langs->trans("DonationPayment");
489 print '</a>';
490 } elseif ($links[$key]['type'] == 'banktransfert') { // transfer between 1 local account and another local account
491 print '<a href="'.DOL_URL_ROOT.'/compta/bank/line.php?rowid='.$links[$key]['url_id'].'">';
492 print img_object($langs->trans('Transaction'), 'payment').' ';
493 print $langs->trans("TransactionOnTheOtherAccount");
494 print '</a>';
495 } elseif ($links[$key]['type'] == 'user') {
496 print '<a href="'.DOL_URL_ROOT.'/user/card.php?id='.$links[$key]['url_id'].'">';
497 print img_object($langs->trans('User'), 'user').' ';
498 print $langs->trans("User");
499 print '</a>';
500 } elseif ($links[$key]['type'] == 'payment_various') {
501 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/paymentvarious.class.php';
502 $paymenttmp = new PaymentVarious($db);
503 $paymenttmp->fetch($links[$key]['url_id']);
504 $paymenttmp->ref = $langs->trans("VariousPayment").' '.$paymenttmp->ref;
505 /*
506 print '<a href="'.DOL_URL_ROOT.'/compta/bank/various_payment/card.php?id='.$links[$key]['url_id'].'">';
507 print img_object($langs->trans('VariousPayment'), 'payment').' ';
508 print $langs->trans("VariousPayment");
509 print '</a>';
510 */
511 print $paymenttmp->getNomUrl(1);
512 } else {
513 // Example type = 'direct-debit', or 'credit-transfer', ....
514 print '<a href="'.$links[$key]['url'].$links[$key]['url_id'].'">';
515 print img_object('', 'generic').' ';
516 print $links[$key]['label'];
517 print '</a>';
518 }
519 }
520 print '</td></tr>';
521 }
522
523 // Type of payment / Number
524 print "<tr><td>".$langs->trans("Type")." / ".$langs->trans("Numero");
525 print ' <em>('.$langs->trans("ChequeOrTransferNumber").')</em>';
526 print "</td>";
527 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
528 print '<td>';
529 $form->select_types_paiements($objp->fk_type, "value", '', 2);
530 print '<input type="text" class="flat" name="num_chq" value="'.(empty($objp->num_chq) ? '' : $objp->num_chq).'">';
531 if ($objp->receiptid) {
532 include_once DOL_DOCUMENT_ROOT.'/compta/paiement/cheque/class/remisecheque.class.php';
533 $receipt = new RemiseCheque($db);
534 $receipt->fetch($objp->receiptid);
535 print ' &nbsp; &nbsp; '.$langs->trans("CheckReceipt").': '.$receipt->getNomUrl(2);
536 }
537 print '</td>';
538 } else {
539 print '<td>'.$objp->fk_type.' '.dol_escape_htmltag($objp->num_chq).'</td>';
540 }
541 print "</tr>";
542
543 // Transmitter
544 print "<tr><td>".$langs->trans("CheckTransmitter");
545 print ' <em>('.$langs->trans("ChequeMaker").')</em>';
546 print "</td>";
547 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
548 print '<td>';
549 print '<input type="text" class="flat minwidth200" name="emetteur" value="'.(empty($objp->emetteur) ? '' : dol_escape_htmltag($objp->emetteur)).'">';
550 print '</td>';
551 } else {
552 print '<td>'.$objp->emetteur.'</td>';
553 }
554 print "</tr>";
555
556 // Bank of cheque
557 print "<tr><td>".$langs->trans("Bank");
558 print ' <em>('.$langs->trans("ChequeBank").')</em>';
559 print "</td>";
560 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
561 print '<td>';
562 print '<input type="text" class="flat minwidth200" name="banque" value="'.(empty($objp->banque) ? '' : dol_escape_htmltag($objp->banque)).'">';
563 print '</td>';
564 } else {
565 print '<td>'.dol_escape_htmltag($objp->banque).'</td>';
566 }
567 print "</tr>";
568
569 // Date ope
570 print '<tr><td>'.$langs->trans("DateOperation").'</td>';
571 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
572 print '<td>';
573 print $form->selectDate($db->jdate($objp->do), 'dateo', 0, 0, 0, 'update', 1, 0, $objp->rappro);
574 if (!$objp->rappro) {
575 print ' &nbsp; ';
576 print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=doprev&id='.$objp->fk_account.'&rowid='.$objp->rowid.'&token='.newToken().'">';
577 print img_edit_remove()."</a> ";
578 print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=donext&id='.$objp->fk_account.'&rowid='.$objp->rowid.'&token='.newToken().'">';
579 print img_edit_add()."</a>";
580 }
581 print '</td>';
582 } else {
583 print '<td>';
584 print dol_print_date($db->jdate($objp->do), "day");
585 print '</td>';
586 }
587 print '</tr>';
588
589 // Value date
590 print "<tr><td>".$langs->trans("DateValue")."</td>";
591 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
592 print '<td>';
593 print $form->selectDate($db->jdate($objp->dv), 'datev', 0, 0, 0, 'update', 1, 0, $objp->rappro);
594 if (!$objp->rappro) {
595 print ' &nbsp; ';
596 print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=dvprev&id='.$objp->fk_account.'&rowid='.$objp->rowid.'&token='.newToken().'">';
597 print img_edit_remove()."</a> ";
598 print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=dvnext&id='.$objp->fk_account.'&rowid='.$objp->rowid.'&token='.newToken().'">';
599 print img_edit_add()."</a>";
600 }
601 print '</td>';
602 } else {
603 print '<td>';
604 print dol_print_date($db->jdate($objp->dv), "day");
605 print '</td>';
606 }
607 print "</tr>";
608
609 // Description
610 $reg = array();
611 print "<tr><td>".$langs->trans("Label")."</td>";
612 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
613 print '<td>';
614 print '<input name="label" class="flat minwidth300" '.($objp->rappro ? ' disabled' : '').' value="';
615 if (preg_match('/^\‍((.*)\‍)$/i', $objp->label, $reg)) {
616 // Label generique car entre parentheses. On l'affiche en le traduisant
617 print $langs->trans($reg[1]);
618 } else {
619 print dol_escape_htmltag($objp->label);
620 }
621 print '">';
622 print '</td>';
623 } else {
624 print '<td>';
625 if (preg_match('/^\‍((.*)\‍)$/i', $objp->label, $reg)) {
626 // Label generique car entre parentheses. On l'affiche en le traduisant
627 print $langs->trans($reg[1]);
628 } else {
629 print dol_escape_htmltag($objp->label);
630 }
631 print '</td>';
632 }
633 print '</tr>';
634
635 // Amount
636 print "<tr><td>".$langs->trans("Amount")."</td>";
637 if ($user->hasRight('banque', 'modifier')) {
638 print '<td>';
639 print '<input name="amount" class="flat maxwidth100" '.($objp->rappro ? ' disabled' : '').' value="'.price($objp->amount).'"> '.$langs->trans("Currency".$acct->currency_code);
640 print '</td>';
641 } else {
642 print '<td>';
643 print price($objp->amount);
644 print '</td>';
645 }
646 print "</tr>";
647
648 // Categories
649 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
650 $langs->load('categories');
651
652 // Bank line
653 print '<tr><td class="toptd">'.$form->editfieldkey('RubriquesTransactions', 'custcats', '', $object, 0).'</td><td>';
654 print $form->selectCategories(Categorie::TYPE_BANK_LINE, 'custcats', $object);
655 print "</td></tr>";
656 }
657
658 // Other attributes
659 $parameters = array();
660 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $bankline, $action); // Note that $action and $object may have been modified by hook
661 print $hookmanager->resPrint;
662 if (empty($reshook)) {
663 print $bankline->showOptionals($extrafields, ($objp->rappro ? 'view' : 'create'), $parameters);
664 }
665 print "</table>";
666
667 // Code to adjust value date with plus and less picto using an Ajax call instead of a full reload of page
668 /* Not yet ready. We must manage inline replacement of input date field
669 $urlajax = DOL_URL_ROOT.'/core/ajax/bankconciliate.php?token='.currentToken();
670 print '
671 <script type="text/javascript">
672 $(function() {
673 $("a.ajaxforbankoperationchange").each(function(){
674 var current = $(this);
675 current.click(function()
676 {
677 var url = "'.$urlajax.'&"+current.attr("href").split("?")[1];
678 console.log("We click on ajaxforbankoperationchange url="+url);
679 $.get(url, function(data)
680 {
681 console.log(data);
682 current.parent().prev().replaceWith(data);
683 });
684 return false;
685 });
686 });
687 });
688 </script>
689 ';
690 */
691 print '</div>';
692
693 print dol_get_fiche_end();
694
695
696 print '<div class="center"><input type="submit" class="button" value="'.$langs->trans("Update").'"></div><br>';
697
698 print "</form>";
699
700
701
702 // Releve rappro
703 if ($acct->canBeConciliated() > 0) { // Si compte rapprochable
704 print load_fiche_titre($langs->trans("Reconciliation"), '', 'bank_account');
705 print '<hr>'."\n";
706
707 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'?rowid='.$objp->rowid.'">';
708 print '<input type="hidden" name="token" value="'.newToken().'">';
709 print '<input type="hidden" name="action" value="setreconcile">';
710 print '<input type="hidden" name="orig_account" value="'.$orig_account.'">';
711 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
712
713 print '<div class="fichecenter">';
714
715 print '<table class="border centpercent">';
716
717 print '<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans("AccountStatement"), $langs->trans("InputReceiptNumber"))."</td>";
718 if ($user->hasRight('banque', 'consolidate')) {
719 print '<td>';
720 if ($objp->rappro) {
721 print '<input name="num_rel_bis" id="num_rel_bis" class="flat" type="text" value="'.$objp->num_releve.'"'.($objp->rappro ? ' disabled' : '').'>';
722 print '<input name="num_rel" id="num_rel" class="flat" type="hidden" value="'.$objp->num_releve.'">';
723 } else {
724 print '<input name="num_rel" id="num_rel" class="flat" value="'.$objp->num_releve.'"'.($objp->rappro ? ' disabled' : '').'>';
725 }
726 if ($objp->num_releve) {
727 print ' &nbsp; <a href="'.DOL_URL_ROOT.'/compta/bank/releve.php?num='.$objp->num_releve.'&account='.$acct->id.'">('.$langs->trans("AccountStatement").' '.$objp->num_releve.')</a>';
728 }
729 print '</td>';
730 } else {
731 print '<td>'.$objp->num_releve.'</td>';
732 }
733 print '</tr>';
734
735 print '<tr><td><label for="reconciled">'.$langs->trans("BankLineConciliated").'</label></td>';
736 if ($user->hasRight('banque', 'consolidate')) {
737 print '<td>';
738 print '<input type="checkbox" id="reconciled" name="reconciled" class="flat" '.(GETPOSTISSET("reconciled") ? (GETPOST("reconciled") ? ' checked="checked"' : '') : ($objp->rappro ? ' checked="checked"' : '')).'">';
739
740 print '
741 <script type="text/javascript">
742 jQuery(document).ready(function() {
743 $("#reconciled").click(function(){
744 console.log("We click on checkbox reconciled "+$("#reconciled").prop("checked"));
745 if ($("#reconciled").prop("checked") == false) {
746 console.log("we remove disabled");
747 jQuery("#num_rel_bis").removeAttr("disabled");
748 jQuery("#num_rel").removeAttr("disabled");
749 jQuery("#num_rel_bis").attr("type", "hidden");
750 jQuery("#num_rel").attr("type", "text");
751 jQuery("#num_rel_bis").hide();
752 jQuery("#num_rel").show();
753 } else {
754
755 }
756 });
757 });
758 </script>
759 ';
760
761 print '</td>';
762 } else {
763 print '<td>'.yn($objp->rappro).'</td>';
764 }
765 print '</tr>';
766 print '</table>';
767
768 print '</div>';
769
770 print '<div class="center">';
771
772 print '<input type="submit" class="button" value="'.$langs->trans("Update").'">';
773 if ($backtopage) {
774 print ' &nbsp; ';
775 print '<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans("Cancel").'">';
776 }
777 print '</div>';
778
779 print '</form>';
780 }
781 }
782
783 $db->free($result);
784} else {
786}
787
788// End of page
789llxFooter();
790$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
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
$c
Definition line.php:334
Class to manage bank accounts.
const TYPE_CASH
Cash account.
Class to manage bank transaction lines.
Class to manage categories.
Class to manage generation of HTML components Only common components must be here.
Class to manage payments for supplier invoices.
Class to manage payments of customer invoices.
Class to manage various payments.
Class to manage cheque delivery receipts.
Class to manage third parties objects (customers, suppliers, prospects...)
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
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_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
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, $morecssdiv='')
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.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
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...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
img_edit_add($titlealt='default', $other='')
Show logo "+".
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
img_edit_remove($titlealt='default', $other='')
Show logo "-".
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...
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.