dolibarr 20.0.0
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-2017 Alexandre Spangaro <aspangaro@open-dsi.fr>
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-2024 Frédéric France <frederic.france@free.fr>
11 * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
12 * Copyright (C) 2024 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';
36require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
37require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
39require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
41
42// Load translation files required by the page
43$langs->loadLangs(array('banks', 'categories', 'compta', 'bills', 'other'));
44if (isModEnabled('member')) {
45 $langs->load("members");
46}
47if (isModEnabled('don')) {
48 $langs->load("donations");
49}
50if (isModEnabled('loan')) {
51 $langs->load("loan");
52}
53if (isModEnabled('salaries')) {
54 $langs->load("salaries");
55}
56
57
58$id = GETPOSTINT('rowid');
59$rowid = GETPOSTINT('rowid');
60$accountoldid = GETPOSTINT('account'); // GETPOST('account') is old account id
61$accountid = GETPOSTINT('accountid'); // GETPOST('accountid') is new account id
62$ref = GETPOST('ref', 'alpha');
63$action = GETPOST('action', 'aZ09');
64$confirm = GETPOST('confirm', 'alpha');
65$orig_account = GETPOST("orig_account");
66$backtopage = GETPOST('backtopage', 'alpha');
67$cancel = GETPOST('cancel', 'alpha');
68
69// Security check
70$fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
71$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
72$socid = 0;
73if ($user->socid) {
74 $socid = $user->socid;
75}
76
77$result = restrictedArea($user, 'banque', $accountoldid, 'bank_account');
78if (!$user->hasRight('banque', 'lire') && !$user->hasRight('banque', 'consolidate')) {
80}
81
82$hookmanager->initHooks(array('bankline'));
83$object = new AccountLine($db);
84$extrafields = new ExtraFields($db);
85$extrafields->fetch_name_optionals_label($object->element);
86
87/*
88 * Actions
89 */
90
91$parameters = array('socid' => $socid);
92$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
93if ($reshook < 0) {
94 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
95}
96if ($cancel) {
97 if ($backtopage) {
98 header("Location: ".$backtopage);
99 exit;
100 }
101}
102
103
104if ($user->hasRight('banque', 'consolidate') && $action == 'donext') {
105 $al = new AccountLine($db);
106 $al->dateo_next(GETPOSTINT("rowid"));
107} elseif ($user->hasRight('banque', 'consolidate') && $action == 'doprev') {
108 $al = new AccountLine($db);
109 $al->dateo_previous(GETPOSTINT("rowid"));
110} elseif ($user->hasRight('banque', 'consolidate') && $action == 'dvnext') {
111 $al = new AccountLine($db);
112 $al->datev_next(GETPOSTINT("rowid"));
113} elseif ($user->hasRight('banque', 'consolidate') && $action == 'dvprev') {
114 $al = new AccountLine($db);
115 $al->datev_previous(GETPOSTINT("rowid"));
116}
117
118if ($action == 'confirm_delete_categ' && $confirm == "yes" && $user->hasRight('banque', 'modifier')) {
119 $cat1 = GETPOSTINT("cat1");
120 if (!empty($rowid) && !empty($cat1)) {
121 $sql = "DELETE FROM ".MAIN_DB_PREFIX."bank_class WHERE lineid = ".((int) $rowid)." AND fk_categ = ".((int) $cat1);
122 if (!$db->query($sql)) {
123 dol_print_error($db);
124 }
125 } else {
126 setEventMessages($langs->trans("MissingIds"), null, 'errors');
127 }
128}
129
130if ($user->hasRight('banque', 'modifier') && $action == "update") {
131 $error = 0;
132
133 $result = $object->fetch($rowid);
134 if ($result <= 0) {
135 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.
136 $object->id = $rowid;
137 }
138
139 $acsource = new Account($db);
140 $acsource->fetch($accountoldid);
141
142 $actarget = new Account($db);
143 if (GETPOSTINT('accountid') > 0 && !$object->rappro && !$object->getVentilExportCompta()) { // We ask to change bank account
144 $actarget->fetch(GETPOSTINT('accountid'));
145 } else {
146 $actarget->fetch($accountoldid);
147 }
148
149 if (!($actarget->id > 0)) {
150 setEventMessages($langs->trans("ErrorFailedToLoadBankAccount"), null, 'errors');
151 $error++;
152 }
153 if ($actarget->type == Account::TYPE_CASH && GETPOST('value', 'alpha') != 'LIQ') {
154 setEventMessages($langs->trans("ErrorCashAccountAcceptsOnlyCashMoney"), null, 'errors');
155 $error++;
156 }
157
158 if (!$error) {
159 $db->begin();
160
161 $amount = price2num(GETPOST('amount'));
162 $dateop = dol_mktime(12, 0, 0, GETPOST("dateomonth"), GETPOST("dateoday"), GETPOST("dateoyear"));
163 $dateval = dol_mktime(12, 0, 0, GETPOST("datevmonth"), GETPOST("datevday"), GETPOST("datevyear"));
164 $sql = "UPDATE ".MAIN_DB_PREFIX."bank";
165 $sql .= " SET ";
166 // Always opened
167 if (GETPOSTISSET('value')) {
168 $sql .= " fk_type='".$db->escape(GETPOST('value'))."',";
169 }
170 if (GETPOSTISSET('num_chq')) {
171 $sql .= " num_chq='".$db->escape(GETPOST("num_chq"))."',";
172 }
173 if (GETPOSTISSET('banque')) {
174 $sql .= " banque='".$db->escape(GETPOST("banque"))."',";
175 }
176 if (GETPOSTISSET('emetteur')) {
177 $sql .= " emetteur='".$db->escape(GETPOST("emetteur"))."',";
178 }
179 // Blocked when conciliated
180 if (!$object->rappro) {
181 if (GETPOSTISSET('label')) {
182 $sql .= " label = '".$db->escape(GETPOST("label"))."',";
183 }
184 if (GETPOSTISSET('amount')) {
185 $sql .= " amount= '".$db->escape($amount)."',";
186 }
187 if (GETPOSTISSET('dateomonth')) {
188 $sql .= " dateo = '".$db->idate($dateop)."',";
189 }
190 if (GETPOSTISSET('datevmonth')) {
191 $sql .= " datev = '".$db->idate($dateval)."',";
192 }
193 }
194 $sql .= " fk_account = ".((int) $actarget->id);
195 $sql .= " WHERE rowid = ".((int) $object->id);
196
197 $result = $db->query($sql);
198 if (!$result) {
199 $error++;
200 }
201
202 if (!$error) {
203 $arrayofcategs = GETPOST('custcats', 'array');
204 $sql = "DELETE FROM ".MAIN_DB_PREFIX."bank_class WHERE lineid = ".((int) $rowid);
205 if (!$db->query($sql)) {
206 $error++;
207 dol_print_error($db);
208 }
209 if (count($arrayofcategs)) {
210 foreach ($arrayofcategs as $val) {
211 $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank_class (lineid, fk_categ) VALUES (".((int) $rowid).", ".((int) $val).")";
212 if (!$db->query($sql)) {
213 $error++;
214 dol_print_error($db);
215 }
216 }
217 // $arrayselected will be loaded after in page output
218 }
219 }
220
221 if (!$error) {
222 $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
223 $object->insertExtraFields();
224 }
225
226 if (!$error) {
227 setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
228 $db->commit();
229 } else {
230 $db->rollback();
231 dol_print_error($db);
232 }
233 }
234}
235
236// Reconcile
237if ($user->hasRight('banque', 'consolidate') && ($action == 'num_releve' || $action == 'setreconcile')) {
238 $num_rel = trim(GETPOST("num_rel"));
239 $rappro = GETPOST('reconciled') ? 1 : 0;
240
241 // Check parameters
242 if ($rappro && empty($num_rel)) {
243 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("AccountStatement")), null, 'errors');
244 $error++;
245 }
246
247 if (!$error) {
248 $db->begin();
249 $object->fetch($rowid);
250 $oldNum_rel = $object->num_releve;
251 $id = $object->fk_account;
252
253 $sql = "UPDATE ".MAIN_DB_PREFIX."bank";
254 $sql .= " SET num_releve = ".($num_rel ? "'".$db->escape($num_rel)."'" : "null");
255 if (empty($num_rel)) {
256 $sql .= ", rappro = 0";
257 } else {
258 $sql .= ", rappro = ".((int) $rappro);
259 }
260 $sql .= " WHERE rowid = ".((int) $rowid);
261
262 $updatePathFile = true;
263 $update_dir = true;
264
265 dol_syslog("line.php update bank line to set the new bank receipt number", LOG_DEBUG);
266
267 $result = $db->query($sql);
268
269 // 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.
270 // Renaming can be done when we rename globally a bank receipt but not when changing 1 line from one receipt into another one.
271 /*
272 if ($result) {
273 if ($oldNum_rel) {
274 if ($num_rel) {
275 $oldfilepath = dol_sanitizePathName("bank/".((int) $id)."/statement/".$oldNum_rel);
276 $filepath = dol_sanitizePathName("bank/".((int) $id)."/statement/".$num_rel);
277
278 $sql = "UPDATE ".MAIN_DB_PREFIX."ecm_files";
279 $sql .= " SET filepath = '".$db->escape($filepath)."'";
280 $sql .= " WHERE filepath = '".$db->escape($oldfilepath)."'";
281 $updatePathFile = $db->query($sql);
282
283 $srcdir = dol_sanitizePathName(DOL_DATA_ROOT."/bank/".((int) $id)."/statement/".$oldNum_rel);
284 $destdir = dol_sanitizePathName(DOL_DATA_ROOT."/bank/".((int) $id)."/statement/".$num_rel);
285
286 if (dol_is_dir($srcdir)) {
287 $update_dir = dol_move_dir($srcdir, $destdir, 1);
288 }
289 }
290 }
291 }
292 */
293
294 if ($result && $updatePathFile && $update_dir) {
295 setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
296 $db->commit();
297 } else {
298 $langs->load("errors");
299 setEventMessages($langs->trans("ErrorFailToRenameDir", $oldfilepath, $filepath), null, 'mesgs');
300 $db->rollback();
301 }
302 }
303}
304
305
306
307/*
308 * View
309 */
310
311$form = new Form($db);
312
313llxHeader('', $langs->trans("BankTransaction"));
314
315$arrayselected = array();
316
317$c = new Categorie($db);
318$cats = $c->containing($rowid, Categorie::TYPE_BANK_LINE);
319if (is_array($cats)) {
320 foreach ($cats as $cat) {
321 $arrayselected[] = $cat->id;
322 }
323}
324
325$head = bankline_prepare_head($rowid);
326
327
328$sql = "SELECT b.rowid, b.dateo as do, b.datev as dv, b.amount, b.label, b.rappro,";
329$sql .= " b.num_releve, b.fk_user_author, b.num_chq, b.fk_type, b.fk_account, b.fk_bordereau as receiptid,";
330$sql .= " b.emetteur,b.banque";
331$sql .= " FROM ".MAIN_DB_PREFIX."bank as b";
332$sql .= " WHERE rowid=".((int) $rowid);
333$sql .= " ORDER BY dateo ASC";
334$result = $db->query($sql);
335if ($result) {
336 $i = 0;
337 $total = 0;
338 if ($db->num_rows($result)) {
339 $objp = $db->fetch_object($result);
340
341 $total = $total + $objp->amount;
342
343 $acct = new Account($db);
344 $acct->fetch($objp->fk_account);
345 $account = $acct->id;
346
347 $bankline = new AccountLine($db);
348 $bankline->fetch($rowid, $ref);
349
350 $links = $acct->get_url($rowid);
351 $bankline->load_previous_next_ref('', 'rowid');
352
353 // Confirmations
354 if ($action == 'delete_categ') {
355 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);
356 }
357
358 print '<form name="update" method="POST" action="'.$_SERVER['PHP_SELF'].'?rowid='.$rowid.'">';
359 print '<input type="hidden" name="token" value="'.newToken().'">';
360 print '<input type="hidden" name="action" value="update">';
361 print '<input type="hidden" name="orig_account" value="'.$orig_account.'">';
362 print '<input type="hidden" name="account" value="'.$acct->id.'">';
363
364 print dol_get_fiche_head($head, 'bankline', $langs->trans('LineRecord'), 0, 'accountline', 0);
365
366 $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>';
367
368
369 dol_banner_tab($bankline, 'rowid', $linkback);
370
371 print '<div class="fichecenter2">';
372
373 print '<div class="underbanner clearboth"></div>';
374 print '<table class="border centpercent tableforfield">';
375
376 $i++;
377
378 // Bank account
379 print '<tr><td class="titlefieldcreate">'.$langs->trans("BankAccount").'</td>';
380 print '<td>';
381 // $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.
382 if (($objp->rappro || $bankline->getVentilExportCompta()) && $objp->fk_account > 0) {
383 print $acct->getNomUrl(1, 'transactions', 'reflabel');
384 } else {
385 print img_picto('', 'bank_account', 'class="paddingright"');
386 print $form->select_comptes($acct->id, 'accountid', 0, '', ($acct->id > 0 ? $acct->id : 1), '', 0, '', 1);
387 }
388 print '</td>';
389 print '</tr>';
390
391 // Show links of bank transactions
392 if (count($links)) {
393 print '<tr><td class="tdtop">'.$langs->trans("Links").'</td>';
394 print '<td>';
395 foreach ($links as $key => $val) {
396 if ($key) {
397 print '<br>';
398 }
399 if ($links[$key]['type'] == 'payment') {
400 require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
401 $paymenttmp = new Paiement($db);
402 $paymenttmp->fetch($links[$key]['url_id']);
403 $paymenttmp->ref = $langs->trans("Payment").' '.$paymenttmp->ref;
404 /*print '<a href="'.DOL_URL_ROOT.'/compta/paiement/card.php?id='.$links[$key]['url_id'].'">';
405 print img_object($langs->trans('Payment'),'payment').' ';
406 print $langs->trans("Payment");
407 print '</a>';*/
408 print $paymenttmp->getNomUrl(1);
409 } elseif ($links[$key]['type'] == 'payment_supplier') {
410 require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php';
411 $paymenttmp = new PaiementFourn($db);
412 $paymenttmp->fetch($links[$key]['url_id']);
413 $paymenttmp->ref = $langs->trans("Payment").' '.$paymenttmp->ref;
414 /*print '<a href="'.DOL_URL_ROOT.'/fourn/paiement/card.php?id='.$links[$key]['url_id'].'">';
415 print img_object($langs->trans('Payment'),'payment').' ';
416 print $langs->trans("Payment");
417 print '</a>';*/
418 print $paymenttmp->getNomUrl(1);
419 } elseif ($links[$key]['type'] == 'company') {
420 $societe = new Societe($db);
421 $societe->fetch($links[$key]['url_id']);
422 print $societe->getNomUrl(1);
423 } elseif ($links[$key]['type'] == 'sc') {
424 print '<a href="'.DOL_URL_ROOT.'/compta/sociales/card.php?id='.$links[$key]['url_id'].'">';
425 print img_object($langs->trans('SocialContribution'), 'bill').' ';
426 print $langs->trans("SocialContribution").($links[$key]['label'] ? ' - '.$links[$key]['label'] : '');
427 print '</a>';
428 } elseif ($links[$key]['type'] == 'vat') {
429 print '<a href="'.DOL_URL_ROOT.'/compta/tva/card.php?id='.$links[$key]['url_id'].'">';
430 print img_object($langs->trans('VATDeclaration'), 'bill').' ';
431 print $langs->trans("VATDeclaration").($links[$key]['label'] ? '&nbsp;'.$links[$key]['label'] : '');
432 print '</a>';
433 } elseif ($links[$key]['type'] == 'salary') {
434 print '<a href="'.DOL_URL_ROOT.'/salaries/card.php?id='.$links[$key]['url_id'].'">';
435 print img_object($langs->trans('Salary'), 'bill').' ';
436 print $langs->trans("Salary").($links[$key]['label'] ? ' - '.$links[$key]['label'] : '');
437 print '</a>';
438 } elseif ($links[$key]['type'] == 'payment_sc') {
439 print '<a href="'.DOL_URL_ROOT.'/compta/payment_sc/card.php?id='.$links[$key]['url_id'].'">';
440 print img_object($langs->trans('Payment'), 'payment').' ';
441 print $langs->trans("SocialContributionPayment");
442 print '</a>';
443 } elseif ($links[$key]['type'] == 'payment_vat') {
444 print '<a href="'.DOL_URL_ROOT.'/compta/payment_vat/card.php?id='.$links[$key]['url_id'].'">';
445 print img_object($langs->trans('VATPayment'), 'payment').' ';
446 print $langs->trans("VATPayment");
447 print '</a>';
448 } elseif ($links[$key]['type'] == 'payment_salary') {
449 print '<a href="'.DOL_URL_ROOT.'/salaries/payment_salary/card.php?id='.$links[$key]['url_id'].'">';
450 print img_object($langs->trans('PaymentSalary'), 'payment').' ';
451 print $langs->trans("SalaryPayment");
452 print '</a>';
453 } elseif ($links[$key]['type'] == 'payment_loan') {
454 print '<a href="'.DOL_URL_ROOT.'/loan/payment/card.php?id='.$links[$key]['url_id'].'">';
455 print img_object($langs->trans('LoanPayment'), 'payment').' ';
456 print $langs->trans("PaymentLoan");
457 print '</a>';
458 } elseif ($links[$key]['type'] == 'loan') {
459 print '<a href="'.DOL_URL_ROOT.'/loan/card.php?id='.$links[$key]['url_id'].'">';
460 print img_object($langs->trans('Loan'), 'bill').' ';
461 print $langs->trans("Loan");
462 print '</a>';
463 } elseif ($links[$key]['type'] == 'member') {
464 print '<a href="'.DOL_URL_ROOT.'/adherents/card.php?rowid='.$links[$key]['url_id'].'">';
465 print img_object($langs->trans('Member'), 'user').' ';
466 print $links[$key]['label'];
467 print '</a>';
468 } elseif ($links[$key]['type'] == 'payment_donation') {
469 print '<a href="'.DOL_URL_ROOT.'/don/payment/card.php?id='.$links[$key]['url_id'].'">';
470 print img_object($langs->trans('Donation'), 'payment').' ';
471 print $langs->trans("DonationPayment");
472 print '</a>';
473 } elseif ($links[$key]['type'] == 'banktransfert') { // transfer between 1 local account and another local account
474 print '<a href="'.DOL_URL_ROOT.'/compta/bank/line.php?rowid='.$links[$key]['url_id'].'">';
475 print img_object($langs->trans('Transaction'), 'payment').' ';
476 print $langs->trans("TransactionOnTheOtherAccount");
477 print '</a>';
478 } elseif ($links[$key]['type'] == 'user') {
479 print '<a href="'.DOL_URL_ROOT.'/user/card.php?id='.$links[$key]['url_id'].'">';
480 print img_object($langs->trans('User'), 'user').' ';
481 print $langs->trans("User");
482 print '</a>';
483 } elseif ($links[$key]['type'] == 'payment_various') {
484 print '<a href="'.DOL_URL_ROOT.'/compta/bank/various_payment/card.php?id='.$links[$key]['url_id'].'">';
485 print img_object($langs->trans('VariousPayment'), 'payment').' ';
486 print $langs->trans("VariousPayment");
487 print '</a>';
488 } else {
489 // Example type = 'direct-debit', or 'credit-transfer', ....
490 print '<a href="'.$links[$key]['url'].$links[$key]['url_id'].'">';
491 print img_object('', 'generic').' ';
492 print $links[$key]['label'];
493 print '</a>';
494 }
495 }
496 print '</td></tr>';
497 }
498
499 // Type of payment / Number
500 print "<tr><td>".$langs->trans("Type")." / ".$langs->trans("Numero");
501 print ' <em>('.$langs->trans("ChequeOrTransferNumber").')</em>';
502 print "</td>";
503 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
504 print '<td>';
505 $form->select_types_paiements($objp->fk_type, "value", '', 2);
506 print '<input type="text" class="flat" name="num_chq" value="'.(empty($objp->num_chq) ? '' : $objp->num_chq).'">';
507 if ($objp->receiptid) {
508 include_once DOL_DOCUMENT_ROOT.'/compta/paiement/cheque/class/remisecheque.class.php';
509 $receipt = new RemiseCheque($db);
510 $receipt->fetch($objp->receiptid);
511 print ' &nbsp; &nbsp; '.$langs->trans("CheckReceipt").': '.$receipt->getNomUrl(2);
512 }
513 print '</td>';
514 } else {
515 print '<td>'.$objp->fk_type.' '.dol_escape_htmltag($objp->num_chq).'</td>';
516 }
517 print "</tr>";
518
519 // Transmitter
520 print "<tr><td>".$langs->trans("CheckTransmitter");
521 print ' <em>('.$langs->trans("ChequeMaker").')</em>';
522 print "</td>";
523 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
524 print '<td>';
525 print '<input type="text" class="flat minwidth200" name="emetteur" value="'.(empty($objp->emetteur) ? '' : dol_escape_htmltag($objp->emetteur)).'">';
526 print '</td>';
527 } else {
528 print '<td>'.$objp->emetteur.'</td>';
529 }
530 print "</tr>";
531
532 // Bank of cheque
533 print "<tr><td>".$langs->trans("Bank");
534 print ' <em>('.$langs->trans("ChequeBank").')</em>';
535 print "</td>";
536 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
537 print '<td>';
538 print '<input type="text" class="flat minwidth200" name="banque" value="'.(empty($objp->banque) ? '' : dol_escape_htmltag($objp->banque)).'">';
539 print '</td>';
540 } else {
541 print '<td>'.dol_escape_htmltag($objp->banque).'</td>';
542 }
543 print "</tr>";
544
545 // Date ope
546 print '<tr><td>'.$langs->trans("DateOperation").'</td>';
547 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
548 print '<td>';
549 print $form->selectDate($db->jdate($objp->do), 'dateo', 0, 0, 0, 'update', 1, 0, $objp->rappro);
550 if (!$objp->rappro) {
551 print ' &nbsp; ';
552 print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=doprev&id='.$objp->fk_account.'&rowid='.$objp->rowid.'&token='.newToken().'">';
553 print img_edit_remove()."</a> ";
554 print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=donext&id='.$objp->fk_account.'&rowid='.$objp->rowid.'&token='.newToken().'">';
555 print img_edit_add()."</a>";
556 }
557 print '</td>';
558 } else {
559 print '<td>';
560 print dol_print_date($db->jdate($objp->do), "day");
561 print '</td>';
562 }
563 print '</tr>';
564
565 // Value date
566 print "<tr><td>".$langs->trans("DateValue")."</td>";
567 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
568 print '<td>';
569 print $form->selectDate($db->jdate($objp->dv), 'datev', 0, 0, 0, 'update', 1, 0, $objp->rappro);
570 if (!$objp->rappro) {
571 print ' &nbsp; ';
572 print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=dvprev&id='.$objp->fk_account.'&rowid='.$objp->rowid.'&token='.newToken().'">';
573 print img_edit_remove()."</a> ";
574 print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=dvnext&id='.$objp->fk_account.'&rowid='.$objp->rowid.'&token='.newToken().'">';
575 print img_edit_add()."</a>";
576 }
577 print '</td>';
578 } else {
579 print '<td>';
580 print dol_print_date($db->jdate($objp->dv), "day");
581 print '</td>';
582 }
583 print "</tr>";
584
585 // Description
586 $reg = array();
587 print "<tr><td>".$langs->trans("Label")."</td>";
588 if ($user->hasRight('banque', 'modifier') || $user->hasRight('banque', 'consolidate')) {
589 print '<td>';
590 print '<input name="label" class="flat minwidth300" '.($objp->rappro ? ' disabled' : '').' value="';
591 if (preg_match('/^\‍((.*)\‍)$/i', $objp->label, $reg)) {
592 // Label generique car entre parentheses. On l'affiche en le traduisant
593 print $langs->trans($reg[1]);
594 } else {
595 print dol_escape_htmltag($objp->label);
596 }
597 print '">';
598 print '</td>';
599 } else {
600 print '<td>';
601 if (preg_match('/^\‍((.*)\‍)$/i', $objp->label, $reg)) {
602 // Label generique car entre parentheses. On l'affiche en le traduisant
603 print $langs->trans($reg[1]);
604 } else {
605 print dol_escape_htmltag($objp->label);
606 }
607 print '</td>';
608 }
609 print '</tr>';
610
611 // Amount
612 print "<tr><td>".$langs->trans("Amount")."</td>";
613 if ($user->hasRight('banque', 'modifier')) {
614 print '<td>';
615 print '<input name="amount" class="flat maxwidth100" '.($objp->rappro ? ' disabled' : '').' value="'.price($objp->amount).'"> '.$langs->trans("Currency".$acct->currency_code);
616 print '</td>';
617 } else {
618 print '<td>';
619 print price($objp->amount);
620 print '</td>';
621 }
622 print "</tr>";
623
624 // Categories
625 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
626 $langs->load('categories');
627
628 // Bank line
629 print '<tr><td class="toptd">'.$form->editfieldkey('RubriquesTransactions', 'custcats', '', $object, 0).'</td><td>';
630 $cate_arbo = $form->select_all_categories(Categorie::TYPE_BANK_LINE, null, 'parent', null, null, 1);
631
632 $arrayselected = array();
633
634 $c = new Categorie($db);
635 $cats = $c->containing($bankline->id, Categorie::TYPE_BANK_LINE);
636 if (is_array($cats)) {
637 foreach ($cats as $cat) {
638 $arrayselected[] = $cat->id;
639 }
640 }
641 print img_picto('', 'category', 'class="paddingright"').$form->multiselectarray('custcats', $cate_arbo, $arrayselected, null, null, null, null, "90%");
642 print "</td></tr>";
643 }
644
645 // Other attributes
646 $parameters = array();
647 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $bankline, $action); // Note that $action and $object may have been modified by hook
648 print $hookmanager->resPrint;
649 if (empty($reshook)) {
650 print $bankline->showOptionals($extrafields, ($objp->rappro ? 'view' : 'create'), $parameters);
651 }
652 print "</table>";
653
654 // Code to adjust value date with plus and less picto using an Ajax call instead of a full reload of page
655 /* Not yet ready. We must manage inline replacement of input date field
656 $urlajax = DOL_URL_ROOT.'/core/ajax/bankconciliate.php?token='.currentToken();
657 print '
658 <script type="text/javascript">
659 $(function() {
660 $("a.ajaxforbankoperationchange").each(function(){
661 var current = $(this);
662 current.click(function()
663 {
664 var url = "'.$urlajax.'&"+current.attr("href").split("?")[1];
665 $.get(url, function(data)
666 {
667 console.log(url)
668 console.log(data)
669 current.parent().prev().replaceWith(data);
670 });
671 return false;
672 });
673 });
674 });
675 </script>
676 ';
677 */
678 print '</div>';
679
680 print dol_get_fiche_end();
681
682
683 print '<div class="center"><input type="submit" class="button" value="'.$langs->trans("Update").'"></div><br>';
684
685 print "</form>";
686
687
688
689 // Releve rappro
690 if ($acct->canBeConciliated() > 0) { // Si compte rapprochable
691 print load_fiche_titre($langs->trans("Reconciliation"), '', 'bank_account');
692 print '<hr>'."\n";
693
694 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'?rowid='.$objp->rowid.'">';
695 print '<input type="hidden" name="token" value="'.newToken().'">';
696 print '<input type="hidden" name="action" value="setreconcile">';
697 print '<input type="hidden" name="orig_account" value="'.$orig_account.'">';
698 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
699
700 print '<div class="fichecenter">';
701
702 print '<table class="border centpercent">';
703
704 print '<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans("AccountStatement"), $langs->trans("InputReceiptNumber"))."</td>";
705 if ($user->hasRight('banque', 'consolidate')) {
706 print '<td>';
707 if ($objp->rappro) {
708 print '<input name="num_rel_bis" id="num_rel_bis" class="flat" type="text" value="'.$objp->num_releve.'"'.($objp->rappro ? ' disabled' : '').'>';
709 print '<input name="num_rel" id="num_rel" class="flat" type="hidden" value="'.$objp->num_releve.'">';
710 } else {
711 print '<input name="num_rel" id="num_rel" class="flat" value="'.$objp->num_releve.'"'.($objp->rappro ? ' disabled' : '').'>';
712 }
713 if ($objp->num_releve) {
714 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>';
715 }
716 print '</td>';
717 } else {
718 print '<td>'.$objp->num_releve.'</td>';
719 }
720 print '</tr>';
721
722 print '<tr><td><label for="reconciled">'.$langs->trans("BankLineConciliated").'</label></td>';
723 if ($user->hasRight('banque', 'consolidate')) {
724 print '<td>';
725 print '<input type="checkbox" id="reconciled" name="reconciled" class="flat" '.(GETPOSTISSET("reconciled") ? (GETPOST("reconciled") ? ' checked="checked"' : '') : ($objp->rappro ? ' checked="checked"' : '')).'">';
726
727 print '
728 <script type="text/javascript">
729 jQuery(document).ready(function() {
730 $("#reconciled").click(function(){
731 console.log("We click on checkbox reconciled "+$("#reconciled").prop("checked"));
732 if ($("#reconciled").prop("checked") == false) {
733 console.log("we remove disabled");
734 jQuery("#num_rel_bis").removeAttr("disabled");
735 jQuery("#num_rel").removeAttr("disabled");
736 jQuery("#num_rel_bis").attr("type", "hidden");
737 jQuery("#num_rel").attr("type", "text");
738 jQuery("#num_rel_bis").hide();
739 jQuery("#num_rel").show();
740 } else {
741
742 }
743 });
744 });
745 </script>
746 ';
747
748 print '</td>';
749 } else {
750 print '<td>'.yn($objp->rappro).'</td>';
751 }
752 print '</tr>';
753 print '</table>';
754
755 print '</div>';
756
757 print '<div class="center">';
758
759 print '<input type="submit" class="button" value="'.$langs->trans("Update").'">';
760 if ($backtopage) {
761 print ' &nbsp; ';
762 print '<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans("Cancel").'">';
763 }
764 print '</div>';
765
766 print '</form>';
767 }
768 }
769
770 $db->free($result);
771} else {
772 dol_print_error($db);
773}
774
775// End of page
776llxFooter();
777$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage bank accounts.
const TYPE_CASH
Cash account.
Class to manage bank transaction lines.
Class to manage categories.
Class to manage standard extra fields.
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 cheque delivery receipts.
Class to manage third parties objects (customers, suppliers, prospects...)
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_edit_add($titlealt='default', $other='')
Show logo +.
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.