dolibarr  17.0.4
bankentries_list.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2001-2002 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2004-2019 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
5  * Copyright (C) 2012 Vinícius Nogueira <viniciusvgn@gmail.com>
6  * Copyright (C) 2014 Florian Henry <florian.henry@open-cooncept.pro>
7  * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
8  * Copyright (C) 2016 Juanjo Menent <jmenent@2byte.es>
9  * Copyright (C) 2017-2019 Alexandre Spangaro <aspangaro@open-dsi.fr>
10  * Copyright (C) 2018 Ferran Marcet <fmarcet@2byte.es>
11  * Copyright (C) 2018-2021 Frédéric France <frederic.france@netlogic.fr>
12  * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
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
35 require '../../main.inc.php';
36 
37 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
38 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
39 require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php';
40 
41 require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
42 require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
43 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
44 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/bankcateg.class.php';
45 require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
46 require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
47 require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/paymentvat.class.php';
48 require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
49 require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/paymentsocialcontribution.class.php';
50 require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
51 require_once DOL_DOCUMENT_ROOT.'/salaries/class/paymentsalary.class.php';
52 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/paymentvarious.class.php';
53 require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/bonprelevement.class.php';
54 require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php';
55 require_once DOL_DOCUMENT_ROOT.'/don/class/paymentdonation.class.php';
56 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/paymentexpensereport.class.php';
57 require_once DOL_DOCUMENT_ROOT.'/loan/class/loan.class.php';
58 require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php';
59 require_once DOL_DOCUMENT_ROOT.'/compta/paiement/cheque/class/remisecheque.class.php';
60 
61 // Load translation files required by the page
62 $langs->loadLangs(array("banks", "bills", "categories", "companies", "margins", "salaries", "loan", "donations", "trips", "members", "compta", "accountancy"));
63 
64 $id = GETPOST('id', 'int');
65 $ref = GETPOST('ref', 'alpha');
66 $action = GETPOST('action', 'aZ09');
67 $cancel = GETPOST('cancel', 'alpha');
68 $confirm = GETPOST('confirm', 'alpha');
69 $contextpage = 'banktransactionlist'.(empty($object->ref) ? '' : '-'.$object->id);
70 $massaction = GETPOST('massaction', 'alpha');
71 $optioncss = GETPOST('optioncss', 'aZ09');
72 
73 // Security check
74 $fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
75 $fieldtype = (!empty($ref) ? 'ref' : 'rowid');
76 if ($fieldvalue) {
77  if ($user->socid) {
78  $socid = $user->socid;
79  }
80  $result = restrictedArea($user, 'banque', $fieldvalue, 'bank_account&bank_account', '', '', $fieldtype);
81 } else {
82  if ($user->socid) {
83  $socid = $user->socid;
84  }
85  $result = restrictedArea($user, 'banque');
86 }
87 
88 $dateop = dol_mktime(12, 0, 0, GETPOST("opmonth", 'int'), GETPOST("opday", 'int'), GETPOST("opyear", 'int'));
89 $search_debit = GETPOST("search_debit", 'alpha');
90 $search_credit = GETPOST("search_credit", 'alpha');
91 $search_type = GETPOST("search_type", 'alpha');
92 $search_account = GETPOST("search_account", 'int') ?GETPOST("search_account", 'int') : GETPOST("account", 'int');
93 $search_accountancy_code = GETPOST('search_accountancy_code', 'alpha') ?GETPOST('search_accountancy_code', 'alpha') : GETPOST('accountancy_code', 'alpha');
94 $search_bid = GETPOST("search_bid", "int") ?GETPOST("search_bid", "int") : GETPOST("bid", "int");
95 $search_ref = GETPOST('search_ref', 'alpha');
96 $search_description = GETPOST("search_description", 'alpha');
97 $search_dt_start = dol_mktime(0, 0, 0, GETPOST('search_start_dtmonth', 'int'), GETPOST('search_start_dtday', 'int'), GETPOST('search_start_dtyear', 'int'));
98 $search_dt_end = dol_mktime(0, 0, 0, GETPOST('search_end_dtmonth', 'int'), GETPOST('search_end_dtday', 'int'), GETPOST('search_end_dtyear', 'int'));
99 $search_dv_start = dol_mktime(0, 0, 0, GETPOST('search_start_dvmonth', 'int'), GETPOST('search_start_dvday', 'int'), GETPOST('search_start_dvyear', 'int'));
100 $search_dv_end = dol_mktime(0, 0, 0, GETPOST('search_end_dvmonth', 'int'), GETPOST('search_end_dvday', 'int'), GETPOST('search_end_dvyear', 'int'));
101 $search_thirdparty_user = GETPOST("search_thirdparty", 'alpha') ?GETPOST("search_thirdparty", 'alpha') : GETPOST("thirdparty", 'alpha');
102 $search_req_nb = GETPOST("req_nb", 'alpha');
103 $search_num_releve = GETPOST("search_num_releve", 'alpha');
104 $search_conciliated = GETPOST("search_conciliated", 'int');
105 $search_fk_bordereau = GETPOST("search_fk_bordereau", 'int');
106 $optioncss = GETPOST('optioncss', 'alpha');
107 $toselect = GETPOST('toselect', 'array');
108 $num_releve = GETPOST("num_releve", "alpha");
109 if (empty($dateop)) {
110  $dateop = -1;
111 }
112 
113 $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
114 $sortfield = GETPOST('sortfield', 'aZ09comma');
115 $sortorder = GETPOST('sortorder', 'aZ09comma');
116 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
117 $pageplusone = GETPOST("pageplusone", 'int');
118 if ($pageplusone) {
119  $page = $pageplusone - 1;
120 }
121 if (empty($page) || $page == -1) {
122  $page = 0;
123 } // If $page is not defined, or '' or -1
124 $offset = $limit * $page;
125 $pageprev = $page - 1;
126 $pagenext = $page + 1;
127 if (!$sortorder) {
128  $sortorder = 'desc,desc,desc';
129 }
130 if (!$sortfield) {
131  $sortfield = 'b.datev,b.dateo,b.rowid';
132 }
133 
134 $object = new Account($db);
135 if ($id > 0 || !empty($ref)) {
136  $result = $object->fetch($id, $ref);
137  $search_account = $object->id; // Force the search field on id of account
138 
139  if (!($object->id > 0)) {
140  $langs->load("errors");
141  print($langs->trans('ErrorRecordNotFound'));
142  exit;
143  }
144 }
145 
146 $mode_balance_ok = false;
147 //if (($sortfield == 'b.datev' || $sortfield == 'b.datev,b.dateo,b.rowid')) // TODO Manage balance when account not selected
148 if (($sortfield == 'b.datev' || $sortfield == 'b.datev,b.dateo,b.rowid')) {
149  $sortfield = 'b.datev,b.dateo,b.rowid';
150  if ($id > 0 || !empty($ref) || $search_account > 0) {
151  $mode_balance_ok = true;
152  }
153 }
154 
155 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
156 $hookmanager->initHooks(array('banktransactionlist', $contextpage));
157 $extrafields = new ExtraFields($db);
158 
159 // fetch optionals attributes and labels
160 $extrafields->fetch_name_optionals_label('banktransaction');
161 $search_array_options = $extrafields->getOptionalsFromPost('banktransaction', '', 'search_');
162 
163 $arrayfields = array(
164  'b.rowid'=>array('label'=>$langs->trans("Ref"), 'checked'=>1,'position'=>10),
165  'b.label'=>array('label'=>$langs->trans("Description"), 'checked'=>1,'position'=>20),
166  'b.dateo'=>array('label'=>$langs->trans("DateOperationShort"), 'checked'=>1,'position'=>30),
167  'b.datev'=>array('label'=>$langs->trans("DateValueShort"), 'checked'=>1,'position'=>40),
168  'type'=>array('label'=>$langs->trans("Type"), 'checked'=>1,'position'=>50),
169  'b.num_chq'=>array('label'=>$langs->trans("Numero"), 'checked'=>1,'position'=>60),
170  'bu.label'=>array('label'=>$langs->trans("ThirdParty").'/'.$langs->trans("User"), 'checked'=>1, 'position'=>70),
171  'ba.ref'=>array('label'=>$langs->trans("BankAccount"), 'checked'=>(($id > 0 || !empty($ref)) ? 0 : 1), 'position'=>80),
172  'b.debit'=>array('label'=>$langs->trans("Debit"), 'checked'=>1, 'position'=>90),
173  'b.credit'=>array('label'=>$langs->trans("Credit"), 'checked'=>1, 'position'=>100),
174  'balancebefore'=>array('label'=>$langs->trans("BalanceBefore"), 'checked'=>0, 'position'=>110),
175  'balance'=>array('label'=>$langs->trans("Balance"), 'checked'=>1, 'position'=>120),
176  'b.num_releve'=>array('label'=>$langs->trans("AccountStatement"), 'checked'=>1, 'position'=>130),
177  'b.conciliated'=>array('label'=>$langs->trans("BankLineReconciled"), 'enabled'=> $object->rappro, 'checked'=>($action == 'reconcile' ? 1 : 0), 'position'=>140),
178  'b.fk_bordereau'=>array('label'=>$langs->trans("ChequeNumber"), 'checked'=>0, 'position'=>150),
179 );
180 // Extra fields
181 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
182 
183 $object->fields = dol_sort_array($object->fields, 'position');
184 $arrayfields = dol_sort_array($arrayfields, 'position');
185 
186 /*
187  * Actions
188  */
189 
190 if (GETPOST('cancel', 'alpha')) {
191  $action = 'list';
192  $massaction = '';
193 }
194 if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
195  $massaction = '';
196 }
197 
198 $parameters = array();
199 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
200 if ($reshook < 0) {
201  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
202 }
203 
204 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
205 
206 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
207  $search_dt_start = '';
208  $search_dt_end = '';
209  $search_dv_start = '';
210  $search_dv_end = '';
211  $search_type = "";
212  $search_debit = "";
213  $search_credit = "";
214  $search_bid = "";
215  $search_ref = "";
216  $search_req_nb = '';
217  $search_description = '';
218  $search_thirdparty_user = '';
219  $search_num_releve = '';
220  $search_conciliated = '';
221  $search_fk_bordereau = '';
222  $toselect = array();
223 
224  $search_account = "";
225  if ($id > 0 || !empty($ref)) {
226  $search_account = $object->id;
227  }
228 }
229 
230 if (empty($reshook)) {
231  $objectclass = 'Account';
232  $objectlabel = 'BankTransaction';
233  $permissiontoread = !empty($user->rights->banque->lire);
234  $permissiontodelete = !empty($user->rights->banque->modifier);
235  $uploaddir = $conf->bank->dir_output;
236  include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
237 }
238 
239 $rowids = GETPOST('rowid', 'array');
240 
241 // Conciliation
242 if ((GETPOST('confirm_savestatement', 'alpha') || GETPOST('confirm_reconcile', 'alpha'))
243  && (GETPOST("num_releve", "alpha") || !empty($rowids))
244  && !empty($user->rights->banque->consolidate)
245  && (!GETPOSTISSET('pageplusone') || (GETPOST('pageplusone') == GETPOST('pageplusoneold')))) {
246  $error = 0;
247 
248  // Definition, nettoyage parametres
249  $num_releve = GETPOST("num_releve", "alpha");
250 
251  if ($num_releve) {
252  $bankline = new AccountLine($db);
253 
254  $rowids = GETPOST('rowid', 'array');
255 
256  if (!empty($rowids) && is_array($rowids)) {
257  foreach ($rowids as $row) {
258  if ($row > 0) {
259  $result = $bankline->fetch($row);
260  $bankline->num_releve = $num_releve; // GETPOST("num_releve");
261  $result = $bankline->update_conciliation($user, GETPOST("cat"), GETPOST('confirm_reconcile', 'alpha') ? 1 : 0); // If we confirm_reconcile, we set flag 'rappro' to 1.
262  if ($result < 0) {
263  setEventMessages($bankline->error, $bankline->errors, 'errors');
264  $error++;
265  break;
266  }
267  }
268  }
269  } else {
270  $error++;
271  $langs->load("errors");
272  setEventMessages($langs->trans("NoRecordSelected"), null, 'errors');
273  }
274  } else {
275  $error++;
276  $langs->load("errors");
277  setEventMessages($langs->trans("ErrorPleaseTypeBankTransactionReportName"), null, 'errors');
278  }
279 
280  if (!$error) {
281  $param = 'action=reconcile&contextpage=banktransactionlist&id='.((int) $id).'&search_account='.((int) $id);
282  if ($page) {
283  $param .= '&page='.urlencode($page);
284  }
285  if ($offset) {
286  $param .= '&offset='.urlencode($offset);
287  }
288  if ($limit) {
289  $param .= '&limit='.urlencode($limit);
290  }
291  if ($search_conciliated != '' && $search_conciliated != '-1') {
292  $param .= '&search_conciliated='.urlencode($search_conciliated);
293  }
294  if ($search_thirdparty_user) {
295  $param .= '&search_thirdparty='.urlencode($search_thirdparty_user);
296  }
297  if ($search_num_releve) {
298  $param .= '&search_num_releve='.urlencode($search_num_releve);
299  }
300  if ($search_description) {
301  $param .= '&search_description='.urlencode($search_description);
302  }
303  if (dol_strlen($search_dt_start) > 0) {
304  $param .= '&search_start_dtmonth='.GETPOST('search_start_dtmonth', 'int').'&search_start_dtday='.GETPOST('search_start_dtday', 'int').'&search_start_dtyear='.GETPOST('search_start_dtyear', 'int');
305  }
306  if (dol_strlen($search_dt_end) > 0) {
307  $param .= '&search_end_dtmonth='.GETPOST('search_end_dtmonth', 'int').'&search_end_dtday='.GETPOST('search_end_dtday', 'int').'&search_end_dtyear='.GETPOST('search_end_dtyear', 'int');
308  }
309  if (dol_strlen($search_dv_start) > 0) {
310  $param .= '&search_start_dvmonth='.GETPOST('search_start_dvmonth', 'int').'&search_start_dvday='.GETPOST('search_start_dvday', 'int').'&search_start_dvyear='.GETPOST('search_start_dvyear', 'int');
311  }
312  if (dol_strlen($search_dv_end) > 0) {
313  $param .= '&search_end_dvmonth='.GETPOST('search_end_dvmonth', 'int').'&search_end_dvday='.GETPOST('search_end_dvday', 'int').'&search_end_dvyear='.GETPOST('search_end_dvyear', 'int');
314  }
315  if ($search_type) {
316  $param .= '&search_type='.urlencode($search_type);
317  }
318  if ($search_debit) {
319  $param .= '&search_debit='.urlencode($search_debit);
320  }
321  if ($search_credit) {
322  $param .= '&search_credit='.urlencode($search_credit);
323  }
324  $param .= '&sortfield='.urlencode($sortfield).'&sortorder='.urlencode($sortorder);
325  header('Location: '.$_SERVER["PHP_SELF"].'?'.$param); // To avoid to submit twice and allow the back button
326  exit;
327  }
328 }
329 
330 
331 if (GETPOST('save') && !$cancel && !empty($user->rights->banque->modifier)) {
332  $error = 0;
333 
334  if (price2num(GETPOST("addcredit")) > 0) {
335  $amount = price2num(GETPOST("addcredit"));
336  } else {
337  $amount = - price2num(GETPOST("adddebit"));
338  }
339 
340  $operation = GETPOST("operation", 'alpha');
341  $num_chq = GETPOST("num_chq", 'alpha');
342  $label = GETPOST("label", 'alpha');
343  $cat1 = GETPOST("cat1", 'alpha');
344 
345  $bankaccountid = $id;
346  if (GETPOST('add_account', 'int') > 0) {
347  $bankaccountid = GETPOST('add_account', 'int');
348  }
349  if (!$dateop) {
350  $error++;
351  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), null, 'errors');
352  }
353  if (!$operation) {
354  $error++;
355  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), null, 'errors');
356  }
357  if (!$label) {
358  $error++;
359  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Label")), null, 'errors');
360  }
361  if (!$amount) {
362  $error++;
363  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Amount")), null, 'errors');
364  }
365  if (!($bankaccountid > 0)) {
366  $error++;
367  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("BankAccount")), null, 'errors');
368  }
369  /*if (isModEnabled('accounting') && (empty($search_accountancy_code) || $search_accountancy_code == '-1'))
370  {
371  setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("AccountAccounting")), null, 'errors');
372  $error++;
373  }*/
374 
375  if (!$error && !empty($conf->global->BANK_USE_OLD_VARIOUS_PAYMENT)) {
376  $objecttmp = new Account($db);
377  $objecttmp->fetch($bankaccountid);
378  $insertid = $objecttmp->addline($dateop, $operation, $label, $amount, $num_chq, ($cat1 > 0 ? $cat1 : 0), $user, '', '', $search_accountancy_code);
379  if ($insertid > 0) {
380  setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
381  header("Location: ".$_SERVER['PHP_SELF'].($id ? "?id=".$id : ''));
382  exit;
383  } else {
384  setEventMessages($object->error, $object->errors, 'errors');
385  }
386  } else {
387  $action = 'addline';
388  }
389 }
390 
391 if ($action == 'confirm_delete' && $confirm == 'yes' && !empty($user->rights->banque->modifier)) {
392  $accline = new AccountLine($db);
393  $result = $accline->fetch(GETPOST("rowid", "int"));
394  $result = $accline->delete($user);
395  if ($result <= 0) {
396  setEventMessages($accline->error, $accline->errors, 'errors');
397  } else {
398  setEventMessages('RecordDeleted', null, 'mesgs');
399  }
400 }
401 
402 /*
403  * View
404  */
405 
406 $form = new Form($db);
407 $formother = new FormOther($db);
408 $formaccounting = new FormAccounting($db);
409 
410 $companystatic = new Societe($db);
411 $bankaccountstatic = new Account($db);
412 $userstatic= new User($db);
413 
414 $banktransferstatic = new BonPrelevement($db);
415 $societestatic = new Societe($db);
416 $userstatic = new User($db);
417 $chargestatic = new ChargeSociales($db);
418 $loanstatic = new Loan($db);
419 $memberstatic = new Adherent($db);
420 $donstatic = new Don($db);
421 $paymentstatic = new Paiement($db);
422 $paymentsupplierstatic = new PaiementFourn($db);
423 $paymentscstatic = new PaymentSocialContribution($db);
424 $paymentvatstatic = new PaymentVAT($db);
425 $paymentsalstatic = new PaymentSalary($db);
426 $paymentdonationstatic = new PaymentDonation($db);
427 $paymentvariousstatic = new PaymentVarious($db);
428 $paymentexpensereportstatic = new PaymentExpenseReport($db);
429 $bankstatic = new Account($db);
430 $banklinestatic = new AccountLine($db);
431 $bordereaustatic = new RemiseCheque($db);
432 
433 $now = dol_now();
434 
435 // Must be before button action
436 $param = '';
437 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
438  $param .= '&contextpage='.urlencode($contextpage);
439 }
440 if ($limit > 0 && $limit != $conf->liste_limit) {
441  $param .= '&limit='.urlencode($limit);
442 }
443 if ($id > 0) {
444  $param .= '&id='.urlencode($id);
445 }
446 if (!empty($ref)) {
447  $param .= '&ref='.urlencode($ref);
448 }
449 if (!empty($search_ref)) {
450  $param .= '&search_ref='.urlencode($search_ref);
451 }
452 if (!empty($search_description)) {
453  $param .= '&search_description='.urlencode($search_description);
454 }
455 if (!empty($search_type)) {
456  $param .= '&type='.urlencode($search_type);
457 }
458 if (!empty($search_thirdparty_user)) {
459  $param .= '&search_thirdparty='.urlencode($search_thirdparty_user);
460 }
461 if (!empty($search_debit)) {
462  $param .= '&search_debit='.urlencode($search_debit);
463 }
464 if (!empty($search_credit)) {
465  $param .= '&search_credit='.urlencode($search_credit);
466 }
467 if ($search_account > 0) {
468  $param .= '&search_account='.urlencode($search_account);
469 }
470 if (!empty($search_num_releve)) {
471  $param .= '&search_num_releve='.urlencode($search_num_releve);
472 }
473 if ($search_conciliated != '' && $search_conciliated != '-1') {
474  $param .= '&search_conciliated='.urlencode($search_conciliated);
475 }
476 if ($search_fk_bordereau > 0) {
477  $param .= '$&search_fk_bordereau='.urlencode($search_fk_bordereau);
478 }
479 if ($search_bid > 0) {
480  $param .= '&search_bid='.urlencode($search_bid);
481 }
482 if (dol_strlen($search_dt_start) > 0) {
483  $param .= '&search_start_dtmonth='.GETPOST('search_start_dtmonth', 'int').'&search_start_dtday='.GETPOST('search_start_dtday', 'int').'&search_start_dtyear='.GETPOST('search_start_dtyear', 'int');
484 }
485 if (dol_strlen($search_dt_end) > 0) {
486  $param .= '&search_end_dtmonth='.GETPOST('search_end_dtmonth', 'int').'&search_end_dtday='.GETPOST('search_end_dtday', 'int').'&search_end_dtyear='.GETPOST('search_end_dtyear', 'int');
487 }
488 if (dol_strlen($search_dv_start) > 0) {
489  $param .= '&search_start_dvmonth='.GETPOST('search_start_dvmonth', 'int').'&search_start_dvday='.GETPOST('search_start_dvday', 'int').'&search_start_dvyear='.GETPOST('search_start_dvyear', 'int');
490 }
491 if (dol_strlen($search_dv_end) > 0) {
492  $param .= '&search_end_dvmonth='.GETPOST('search_end_dvmonth', 'int').'&search_end_dvday='.GETPOST('search_end_dvday', 'int').'&search_end_dvyear='.GETPOST('search_end_dvyear', 'int');
493 }
494 if ($search_req_nb) {
495  $param .= '&req_nb='.urlencode($search_req_nb);
496 }
497 if (GETPOST("search_thirdparty", 'int')) {
498  $param .= '&thirdparty='.urlencode(GETPOST("search_thirdparty", 'int'));
499 }
500 if ($optioncss != '') {
501  $param .= '&optioncss='.urlencode($optioncss);
502 }
503 if ($action == 'reconcile') {
504  $param .= '&action=reconcile';
505 }
506 $totalarray = array(
507  'nbfield' => 0,
508  'totalcred' => 0,
509  'totaldeb' => 0,
510 );
511 // Add $param from extra fields
512 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
513 
514 $options = array();
515 
516 $buttonreconcile = '';
517 $morehtmlref = '';
518 
519 if ($id > 0 || !empty($ref)) {
520  $title = $object->ref.' - '.$langs->trans("Transactions");
521 } else {
522  $title = $langs->trans("BankTransactions");
523 }
524 $help_url = '';
525 
526 llxHeader('', $title, $help_url, '', 0, 0, array(), array(), $param);
527 
528 
529 if ($id > 0 || !empty($ref)) {
530  // Load bank groups
531  require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/bankcateg.class.php';
532  $bankcateg = new BankCateg($db);
533 
534  foreach ($bankcateg->fetchAll() as $bankcategory) {
535  $options[$bankcategory->id] = $bankcategory->label;
536  }
537 
538  // Bank card
539  $head = bank_prepare_head($object);
540  print dol_get_fiche_head($head, 'journal', $langs->trans("FinancialAccount"), 0, 'account');
541 
542  $linkback = '<a href="'.DOL_URL_ROOT.'/compta/bank/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
543 
544  dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref, '', 0, '', '', 1);
545 
546  print dol_get_fiche_end();
547 
548 
549  /*
550  * Buttons actions
551  */
552 
553  if ($action != 'reconcile') {
554  if ($object->canBeConciliated() > 0) {
555  $allowautomaticconciliation = false; // TODO
556  $titletoconciliatemanual = $langs->trans("Conciliate");
557  $titletoconciliateauto = $langs->trans("Conciliate");
558  if ($allowautomaticconciliation) {
559  $titletoconciliatemanual .= ' ('.$langs->trans("Manual").')';
560  $titletoconciliateauto .= ' ('.$langs->trans("Auto").')';
561  }
562 
563  // If not cash account and can be reconciliate
564  if ($user->rights->banque->consolidate) {
565  $newparam = $param;
566  $newparam = preg_replace('/search_conciliated=\d+/i', '', $newparam);
567  $buttonreconcile = '<a class="butAction" style="margin-bottom: 5px !important; margin-top: 5px !important" href="'.DOL_URL_ROOT.'/compta/bank/bankentries_list.php?action=reconcile&sortfield=b.datev,b.dateo,b.rowid&sortorder=asc,asc,asc&search_conciliated=0'.$newparam.'">'.$titletoconciliatemanual.'</a>';
568  } else {
569  $buttonreconcile = '<a class="butActionRefused" style="margin-bottom: 5px !important; margin-top: 5px !important" title="'.$langs->trans("NotEnoughPermissions").'" href="#">'.$titletoconciliatemanual.'</a>';
570  }
571 
572  if ($allowautomaticconciliation) {
573  // If not cash account and can be reconciliate
574  if ($user->rights->banque->consolidate) {
575  $newparam = $param;
576  $newparam = preg_replace('/search_conciliated=\d+/i', '', $newparam);
577  $buttonreconcile .= ' <a class="butAction" style="margin-bottom: 5px !important; margin-top: 5px !important" href="'.DOL_URL_ROOT.'/compta/bank/bankentries_list.php?action=reconcile&sortfield=b.datev,b.dateo,b.rowid&sortorder=asc,asc,asc&search_conciliated=0'.$newparam.'">'.$titletoconciliateauto.'</a>';
578  } else {
579  $buttonreconcile .= ' <a class="butActionRefused" style="margin-bottom: 5px !important; margin-top: 5px !important" title="'.$langs->trans("NotEnoughPermissions").'" href="#">'.$titletoconciliateauto.'</a>';
580  }
581  }
582  }
583  }
584 }
585 
586 $sql = "SELECT b.rowid, b.dateo as do, b.datev as dv, b.amount, b.label, b.rappro as conciliated, b.num_releve, b.num_chq,";
587 $sql .= " b.fk_account, b.fk_type, b.fk_bordereau,";
588 $sql .= " ba.rowid as bankid, ba.ref as bankref";
589 // Add fields from extrafields
590 if (!empty($extrafields->attributes[$object->table_element]['label'])) {
591  foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
592  $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
593  }
594 }
595 // Add fields from hooks
596 $parameters = array();
597 $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
598 $sql .= $hookmanager->resPrint;
599 $sql .= " FROM ";
600 if ($search_bid > 0) {
601  $sql .= MAIN_DB_PREFIX."bank_class as l,";
602 }
603 $sql .= " ".MAIN_DB_PREFIX."bank_account as ba,";
604 $sql .= " ".MAIN_DB_PREFIX."bank as b";
605 if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
606  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (b.rowid = ef.fk_object)";
607 }
608 
609 // Add fields from hooks
610 $parameters = array();
611 $reshook = $hookmanager->executeHooks('printFieldListJoin', $parameters); // Note that $action and $object may have been modified by hook
612 $sql .= $hookmanager->resPrint;
613 
614 $sql .= " WHERE b.fk_account = ba.rowid";
615 $sql .= " AND ba.entity IN (".getEntity('bank_account').")";
616 if ($search_account > 0) {
617  $sql .= " AND b.fk_account = ".((int) $search_account);
618 }
619 // Search period criteria
620 if (dol_strlen($search_dt_start) > 0) {
621  $sql .= " AND b.dateo >= '".$db->idate($search_dt_start)."'";
622 }
623 if (dol_strlen($search_dt_end) > 0) {
624  $sql .= " AND b.dateo <= '".$db->idate($search_dt_end)."'";
625 }
626 // Search period criteria
627 if (dol_strlen($search_dv_start) > 0) {
628  $sql .= " AND b.datev >= '".$db->idate($search_dv_start)."'";
629 }
630 if (dol_strlen($search_dv_end) > 0) {
631  $sql .= " AND b.datev <= '".$db->idate($search_dv_end)."'";
632 }
633 if ($search_ref) {
634  $sql .= natural_search("b.rowid", $search_ref, 1);
635 }
636 if ($search_req_nb) {
637  $sql .= natural_search("b.num_chq", $search_req_nb);
638 }
639 if ($search_num_releve) {
640  $sql .= natural_search("b.num_releve", $search_num_releve);
641 }
642 if ($search_conciliated != '' && $search_conciliated != '-1') {
643  $sql .= " AND b.rappro = ".((int) $search_conciliated);
644 }
645 if ($search_fk_bordereau > 0) {
646  $sql .= " AND b.fk_bordereau = " . ((int) $search_fk_bordereau);
647 }
648 if ($search_thirdparty_user) {
649  $sql.= " AND (b.rowid IN ";
650  $sql.= " ( SELECT bu.fk_bank FROM ".MAIN_DB_PREFIX."bank_url AS bu";
651  $sql.= " JOIN ".MAIN_DB_PREFIX."bank AS b2 ON b2.rowid = bu.fk_bank";
652  $sql.= " JOIN ".MAIN_DB_PREFIX."user AS subUser ON (bu.type = 'user' AND bu.url_id = subUser.rowid)";
653  $sql.= " WHERE ". natural_search(array("subUser.firstname", "subUser.lastname"), $search_thirdparty_user, '', 1).")";
654 
655  $sql.= " OR b.rowid IN ";
656  $sql.= " ( SELECT bu.fk_bank FROM ".MAIN_DB_PREFIX."bank_url AS bu";
657  $sql.= " JOIN ".MAIN_DB_PREFIX."bank AS b2 ON b2.rowid = bu.fk_bank";
658  $sql.= " JOIN ".MAIN_DB_PREFIX."societe AS subSoc ON (bu.type = 'company' AND bu.url_id = subSoc.rowid)";
659  $sql.= " WHERE ". natural_search(array("subSoc.nom"), $search_thirdparty_user, '', 1);
660  $sql.= "))";
661 }
662 if ($search_description) {
663  $search_description_to_use = $search_description;
664  $arrayoffixedlabels = array(
665  'payment_salary',
666  'CustomerInvoicePayment', 'CustomerInvoicePaymentBack',
667  'SupplierInvoicePayment', 'SupplierInvoicePaymentBack',
668  'DonationPayment',
669  'ExpenseReportPayment',
670  'SocialContributionPayment',
671  'SubscriptionPayment',
672  'WithdrawalPayment'
673  );
674  foreach ($arrayoffixedlabels as $keyforlabel) {
675  $translatedlabel = $langs->transnoentitiesnoconv($keyforlabel);
676  if (preg_match('/'.$search_description.'/i', $translatedlabel)) {
677  $search_description_to_use .= "|".$keyforlabel;
678  }
679  }
680  $sql .= natural_search("b.label", $search_description_to_use); // Warning some text are just translation keys, not translated strings
681 }
682 
683 if ($search_bid > 0) {
684  $sql .= " AND b.rowid = l.lineid AND l.fk_categ = ".((int) $search_bid);
685 }
686 if (!empty($search_type)) {
687  $sql .= " AND b.fk_type = '".$db->escape($search_type)."'";
688 }
689 // Search criteria amount
690 if ($search_debit) {
691  $sql .= natural_search('ABS(b.amount)', $search_debit, 1);
692  $sql .= ' AND b.amount <= 0';
693 }
694 if ($search_credit) {
695  $sql .= natural_search('b.amount', $search_credit, 1);
696  $sql .= ' AND b.amount >= 0';
697 }
698 // Add where from extra fields
699 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
700 
701 // Add where from hooks
702 $parameters = array();
703 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
704 $sql .= $hookmanager->resPrint;
705 
706 $sql .= $db->order($sortfield, $sortorder);
707 
708 $nbtotalofrecords = '';
709 $nbtotalofpages = 0;
710 if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
711  $result = $db->query($sql);
712  $nbtotalofrecords = $db->num_rows($result);
713  $nbtotalofpages = ceil($nbtotalofrecords / $limit);
714 }
715 
716 if (($id > 0 || !empty($ref)) && ((string) $page == '')) {
717  // We open a list of transaction of a dedicated account and no page was set by defaut
718  // We force on last page.
719  $page = ($nbtotalofpages - 1);
720  $offset = $limit * $page;
721  if ($page < 0) {
722  $page = 0;
723  }
724 }
725 if ($page >= $nbtotalofpages) {
726  // If we made a search and result has low page than the page number we were on
727  $page = ($nbtotalofpages - 1);
728  $offset = $limit * $page;
729  if ($page < 0) {
730  $page = 0;
731  }
732 }
733 
734 
735 // If not account defined $mode_balance_ok=false
736 if (empty($search_account)) {
737  $mode_balance_ok = false;
738 }
739 // If a search is done $mode_balance_ok=false
740 if (!empty($search_ref)) {
741  $mode_balance_ok = false;
742 }
743 if (!empty($search_description)) {
744  $mode_balance_ok = false;
745 }
746 if (!empty($search_type)) {
747  $mode_balance_ok = false;
748 }
749 if (!empty($search_debit)) {
750  $mode_balance_ok = false;
751 }
752 if (!empty($search_credit)) {
753  $mode_balance_ok = false;
754 }
755 if (!empty($search_thirdparty_user)) {
756  $mode_balance_ok = false;
757 }
758 if ($search_conciliated != '' && $search_conciliated != '-1') {
759  $mode_balance_ok = false;
760 }
761 if (!empty($search_num_releve)) {
762  $mode_balance_ok = false;
763 }
764 if (!empty($search_fk_bordereau)) {
765  $mode_balance_ok = false;
766 }
767 
768 $sql .= $db->plimit($limit + 1, $offset);
769 //print $sql;
770 dol_syslog('compta/bank/bankentries_list.php', LOG_DEBUG);
771 $resql = $db->query($sql);
772 if ($resql) {
773  $num = $db->num_rows($resql);
774 
775  $arrayofselected = (!empty($toselect) && is_array($toselect)) ? $toselect : array();
776 
777  // List of mass actions available
778  $arrayofmassactions = array(
779  //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
780  //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
781  );
782  //if ($user->rights->bank->supprimer) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
783  if (in_array($massaction, array('presend', 'predelete'))) {
784  $arrayofmassactions = array();
785  }
786  $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
787 
788  // Confirmation delete
789  if ($action == 'delete') {
790  $text = $langs->trans('ConfirmDeleteTransaction');
791  print $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id.'&rowid='.GETPOST("rowid", 'int'), $langs->trans('DeleteTransaction'), $text, 'confirm_delete', null, '', 1);
792  }
793 
794  // Lines of title fields
795  print '<form method="post" action="'.$_SERVER["PHP_SELF"].'" name="search_form">'."\n";
796  if ($optioncss != '') {
797  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
798  }
799  print '<input type="hidden" name="token" value="'.newToken().'">';
800  print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
801  print '<input type="hidden" name="action" value="'.($action != 'delete' ? $action : 'search').'">';
802  if (!empty($view)) {
803  print '<input type="hidden" name="view" value="'.dol_escape_htmltag($view).'">';
804  }
805  print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
806  print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
807  print '<input type="hidden" name="page" value="'.$page.'">';
808  print '<input type="hidden" name="id" value="'.$id.'">';
809  print '<input type="hidden" name="ref" value="'.$ref.'">';
810  if (GETPOST('bid')) {
811  print '<input type="hidden" name="bid" value="'.GETPOST("bid", 'int').'">';
812  }
813 
814  // Form to reconcile
815  if ($user->rights->banque->consolidate && $action == 'reconcile') {
816  print '<div class="valignmiddle inline-block" style="padding-right: 20px;">';
817  print '<strong>'.$langs->trans("InputReceiptNumber").'</strong>: ';
818  print '<input class="flat" id="num_releve" name="num_releve" type="text" value="'.(GETPOST('num_releve') ?GETPOST('num_releve') : '').'" size="10">'; // The only default value is value we just entered
819  print '</div>';
820  if (is_array($options) && count($options)) {
821  print $langs->trans("EventualyAddCategory").': ';
822  print Form::selectarray('cat', $options, GETPOST('cat'), 1);
823  }
824  print '<br><div style="margin-top: 5px;"><span class="opacitymedium">'.$langs->trans("ThenCheckLinesAndConciliate").'</span> ';
825  print '<input class="button" name="confirm_savestatement" type="submit" value="'.$langs->trans("SaveStatementOnly").'">';
826  print ' '.$langs->trans("or").' ';
827  print '<input class="button" name="confirm_reconcile" type="submit" value="'.$langs->trans("Conciliate").'">';
828  print ' '.$langs->trans("or").' ';
829  print '<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans("Cancel").'">';
830  print '</div>';
831 
832  // Show last bank statements
833  $nbmax = 12; // We show last 12 receipts (so we can have more than one year)
834  $liste = "";
835  $sql = "SELECT DISTINCT num_releve FROM ".MAIN_DB_PREFIX."bank";
836  $sql .= " WHERE fk_account = ".((int) $object->id)." AND num_releve IS NOT NULL";
837  $sql .= $db->order("num_releve", "DESC");
838  $sql .= $db->plimit($nbmax + 1);
839  print '<br>';
840  print $langs->trans("LastAccountStatements").' : ';
841  $resqlr = $db->query($sql);
842  if ($resqlr) {
843  $numr = $db->num_rows($resqlr);
844  $i = 0;
845  $last_ok = 0;
846  while (($i < $numr) && ($i < $nbmax)) {
847  $objr = $db->fetch_object($resqlr);
848  if (!$last_ok) {
849  $last_releve = $objr->num_releve;
850  $last_ok = 1;
851  }
852  $i++;
853  $liste = '<a href="'.DOL_URL_ROOT.'/compta/bank/releve.php?account='.$id.'&amp;num='.$objr->num_releve.'">'.$objr->num_releve.'</a> &nbsp; '.$liste;
854  }
855  if ($numr >= $nbmax) {
856  $liste = "... &nbsp; ".$liste;
857  }
858  print $liste;
859  if ($numr <= 0) {
860  print '<b>'.$langs->trans("None").'</b>';
861  }
862  } else {
863  dol_print_error($db);
864  }
865 
866  // Using BANK_REPORT_LAST_NUM_RELEVE to automatically report last num (or not)
867  if (!empty($conf->global->BANK_REPORT_LAST_NUM_RELEVE)) {
868  print '
869  <script type="text/javascript">
870  $("#num_releve").val("' . $last_releve.'");
871  </script>
872  ';
873  }
874  print '<br><br>';
875  }
876 
877  // Form to add a transaction with no invoice
878  if (!empty($user->rights->banque->modifier) && $action == 'addline' && !empty($conf->global->BANK_USE_OLD_VARIOUS_PAYMENT)) {
879  print load_fiche_titre($langs->trans("AddBankRecordLong"), '', '');
880 
881  print '<table class="noborder centpercent">';
882 
883  print '<tr class="liste_titre">';
884  print '<td>'.$langs->trans("Description").'</td>';
885  print '<td>'.$langs->trans("Date").'</td>';
886  print '<td>&nbsp;</td>';
887  print '<td>'.$langs->trans("Type").'</td>';
888  print '<td>'.$langs->trans("Numero").'</td>';
889  print '<td class=right>'.$langs->trans("BankAccount").'</td>';
890  print '<td class=right>'.$langs->trans("Debit").'</td>';
891  print '<td class=right>'.$langs->trans("Credit").'</td>';
892  /*if (isModEnabled('accounting'))
893  {
894  print '<td class="center">';
895  print $langs->trans("AccountAccounting");
896  print '</td>';
897  }*/
898  print '<td align="center">&nbsp;</td>';
899  print '</tr>';
900 
901  print '<tr>';
902  print '<td>';
903  print '<input name="label" class="flat minwidth200" type="text" value="'.GETPOST("label", "alpha").'">';
904  if (is_array($options) && count($options)) {
905  print '<br>'.$langs->trans("Rubrique").': ';
906  print Form::selectarray('cat1', $options, GETPOST('cat1'), 1);
907  }
908  print '</td>';
909  print '<td class="nowrap">';
910  print $form->selectDate(empty($dateop) ?-1 : $dateop, 'op', 0, 0, 0, 'transaction');
911  print '</td>';
912  print '<td>&nbsp;</td>';
913  print '<td class="nowrap">';
914  $form->select_types_paiements((GETPOST('operation') ?GETPOST('operation') : ($object->courant == Account::TYPE_CASH ? 'LIQ' : '')), 'operation', '1,2', 2, 1);
915  print '</td>';
916  print '<td>';
917  print '<input name="num_chq" class="flat" type="text" size="4" value="'.GETPOST("num_chq", "alpha").'">';
918  print '</td>';
919  //if (! $search_account > 0)
920  //{
921  print '<td class=right>';
922  $form->select_comptes(GETPOST('add_account', 'int') ?GETPOST('add_account', 'int') : $search_account, 'add_account', 0, '', 1, ($id > 0 || !empty($ref) ? ' disabled="disabled"' : ''));
923  print '</td>';
924  //}
925  print '<td class="right"><input name="adddebit" class="flat" type="text" size="4" value="'.GETPOST("adddebit", "alpha").'"></td>';
926  print '<td class="right"><input name="addcredit" class="flat" type="text" size="4" value="'.GETPOST("addcredit", "alpha").'"></td>';
927  /*if (isModEnabled('accounting'))
928  {
929  print '<td class="center">';
930  print $formaccounting->select_account($search_accountancy_code, 'search_accountancy_code', 1, null, 1, 1, '');
931  print '</td>';
932  }*/
933  print '<td class="center">';
934  print '<input type="submit" name="save" class="button buttongen marginbottomonly button-add" value="'.$langs->trans("Add").'"><br>';
935  print '<input type="submit" name="cancel" class="button buttongen marginbottomonly button-cancel" value="'.$langs->trans("Cancel").'">';
936  print '</td></tr>';
937 
938  print '</table>';
939  print '<br>';
940  }
941 
942  // Code to adjust value date with plus and less picto using an Ajax call instead of a full reload of page
943  $urlajax = DOL_URL_ROOT.'/core/ajax/bankconciliate.php?token='.currentToken();
944  print '
945  <script type="text/javascript">
946  $(function() {
947  $("a.ajaxforbankoperationchange").each(function(){
948  var current = $(this);
949  current.click(function()
950  {
951  var url = "'.$urlajax.'&"+current.attr("href").split("?")[1];
952  $.get(url, function(data)
953  {
954  console.log(url)
955  console.log(data)
956  current.parent().parent().find(".spanforajaxedit").replaceWith(data);
957  });
958  return false;
959  });
960  });
961  });
962  </script>
963  ';
964 
965  $i = 0;
966 
967  // Title
968  $bankcateg = new BankCateg($db);
969 
970  $newcardbutton = '';
971  if ($action != 'addline' && $action != 'reconcile') {
972  if (empty($conf->global->BANK_DISABLE_DIRECT_INPUT)) {
973  if (empty($conf->global->BANK_USE_OLD_VARIOUS_PAYMENT)) { // Default is to record miscellaneous direct entries using miscellaneous payments
974  $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/compta/bank/various_payment/card.php?action=create&accountid='.urlencode($search_account).'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.urlencode($search_account)), '', $user->rights->banque->modifier);
975  } else // If direct entries is not done using miscellaneous payments
976  {
977  $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle', $_SERVER["PHP_SELF"].'?action=addline&token='.newToken().'&page='.$page.$param, '', $user->rights->banque->modifier);
978  }
979  } else {
980  $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle', $_SERVER["PHP_SELF"].'?action=addline&token='.newToken().'&page='.$page.$param, '', -1);
981  }
982  }
983 
984  $morehtml = '';
985  /*$morehtml = '<div class="inline-block '.(($buttonreconcile || $newcardbutton) ? 'marginrightonly' : '').'">';
986  $morehtml .= '<label for="pageplusone">'.$langs->trans("Page")."</label> "; // ' Page ';
987  $morehtml .= '<input type="text" name="pageplusone" id="pageplusone" class="flat right width25 pageplusone" value="'.($page + 1).'">';
988  $morehtml .= '/'.$nbtotalofpages.' ';
989  $morehtml .= '</div>';
990  */
991 
992  if ($action != 'addline' && $action != 'reconcile') {
993  $morehtml .= $buttonreconcile;
994  }
995 
996  $morehtml .= '<!-- Add New button -->'.$newcardbutton;
997 
998  $picto = 'bank_account';
999  if ($id > 0 || !empty($ref)) {
1000  $picto = '';
1001  }
1002 
1003  print_barre_liste($langs->trans("BankTransactions"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $picto, 0, $morehtml, '', $limit, 0, 0, 1);
1004 
1005  // We can add page now to param
1006  if ($page != '') {
1007  $param .= '&page='.urlencode($page);
1008  }
1009 
1010  $moreforfilter = '';
1011 
1012  $moreforfilter .= '<div class="divsearchfield">';
1013  $moreforfilter .= $langs->trans('DateOperationShort');
1014  $moreforfilter .= ($conf->browser->layout == 'phone' ? '<br>' : ' ');
1015  $moreforfilter .= '<div class="nowrap inline-block">';
1016  $moreforfilter .= $form->selectDate($search_dt_start, 'search_start_dt', 0, 0, 1, "search_form", 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1017  $moreforfilter .= '</div>';
1018  $moreforfilter .= ($conf->browser->layout == 'phone' ? '' : ' ');
1019  $moreforfilter .= '<div class="nowrap inline-block">';
1020  $moreforfilter .= $form->selectDate($search_dt_end, 'search_end_dt', 0, 0, 1, "search_form", 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1021  $moreforfilter .= '</div>';
1022  $moreforfilter .= '</div>';
1023 
1024  $moreforfilter .= '<div class="divsearchfield">';
1025  $moreforfilter .= $langs->trans('DateValueShort');
1026  $moreforfilter .= ($conf->browser->layout == 'phone' ? '<br>' : ' ');
1027  $moreforfilter .= '<div class="nowrap inline-block">';
1028  $moreforfilter .= $form->selectDate($search_dv_start, 'search_start_dv', 0, 0, 1, "search_form", 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1029  $moreforfilter .= '</div>';
1030  $moreforfilter .= ($conf->browser->layout == 'phone' ? '' : ' ');
1031  $moreforfilter .= '<div class="nowrap inline-block">';
1032  $moreforfilter .= $form->selectDate($search_dv_end, 'search_end_dv', 0, 0, 1, "search_form", 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1033  $moreforfilter .= '</div>';
1034  $moreforfilter .= '</div>';
1035 
1036  if (isModEnabled('categorie')) {
1037  // Categories
1038  if (isModEnabled('categorie') && !empty($user->rights->categorie->lire)) {
1039  $langs->load('categories');
1040 
1041  // Bank line
1042  $moreforfilter .= '<div class="divsearchfield">';
1043  $tmptitle = $langs->trans('RubriquesTransactions');
1044  $cate_arbo = $form->select_all_categories(Categorie::TYPE_BANK_LINE, $search_bid, 'parent', null, null, 1);
1045  $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$form->selectarray('search_bid', $cate_arbo, $search_bid, $tmptitle, 0, 0, '', 0, 0, 0, '', '', 1);
1046  $moreforfilter .= '</div>';
1047  }
1048  }
1049 
1050  $parameters = array();
1051  $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook
1052  if (empty($reshook)) {
1053  $moreforfilter .= $hookmanager->resPrint;
1054  } else {
1055  $moreforfilter = $hookmanager->resPrint;
1056  }
1057 
1058  if ($moreforfilter) {
1059  print '<div class="liste_titre liste_titre_bydiv centpercent">';
1060  print $moreforfilter;
1061  print '</div>'."\n";
1062  }
1063 
1064  $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1065  $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
1066  // When action is 'reconcile', we force to have the column num_releve always enabled (otherwise we can't make reconciliation).
1067  if ($action == 'reconcile') {
1068  $arrayfields['b.num_releve']['checked'] = 1;
1069  }
1070 
1071  print '<div class="div-table-responsive">';
1072  print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
1073 
1074 
1075  print '<tr class="liste_titre_filter">';
1076  if (!empty($arrayfields['b.rowid']['checked'])) {
1077  print '<td class="liste_titre">';
1078  print '<input type="text" class="flat" name="search_ref" size="2" value="'.dol_escape_htmltag($search_ref).'">';
1079  print '</td>';
1080  }
1081  if (!empty($arrayfields['b.label']['checked'])) {
1082  print '<td class="liste_titre">';
1083  print '<input type="text" class="flat maxwidth100" name="search_description" value="'.dol_escape_htmltag($search_description).'">';
1084  print '</td>';
1085  }
1086  if (!empty($arrayfields['b.dateo']['checked'])) {
1087  print '<td class="liste_titre">&nbsp;</td>';
1088  }
1089  if (!empty($arrayfields['b.datev']['checked'])) {
1090  print '<td class="liste_titre">&nbsp;</td>';
1091  }
1092  if (!empty($arrayfields['type']['checked'])) {
1093  print '<td class="liste_titre" align="center">';
1094  print $form->select_types_paiements(empty($search_type) ? '' : $search_type, 'search_type', '', 2, 1, 1, 0, 1, 'maxwidth100', 1);
1095  print '</td>';
1096  }
1097  // Numero
1098  if (!empty($arrayfields['b.num_chq']['checked'])) {
1099  print '<td class="liste_titre" align="center"><input type="text" class="flat" name="req_nb" value="'.dol_escape_htmltag($search_req_nb).'" size="2"></td>';
1100  }
1101  // Checked
1102  if (!empty($arrayfields['bu.label']['checked'])) {
1103  print '<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_thirdparty" value="'.dol_escape_htmltag($search_thirdparty_user).'"></td>';
1104  }
1105  // Ref
1106  if (!empty($arrayfields['ba.ref']['checked'])) {
1107  print '<td class="liste_titre">';
1108  $form->select_comptes($search_account, 'search_account', 0, '', 1, ($id > 0 || !empty($ref) ? ' disabled="disabled"' : ''), 0, 'maxwidth100');
1109  print '</td>';
1110  }
1111  // Debit
1112  if (!empty($arrayfields['b.debit']['checked'])) {
1113  print '<td class="liste_titre right">';
1114  print '<input type="text" class="flat width50" name="search_debit" value="'.dol_escape_htmltag($search_debit).'">';
1115  print '</td>';
1116  }
1117  // Credit
1118  if (!empty($arrayfields['b.credit']['checked'])) {
1119  print '<td class="liste_titre right">';
1120  print '<input type="text" class="flat width50" name="search_credit" value="'.dol_escape_htmltag($search_credit).'">';
1121  print '</td>';
1122  }
1123  // Balance before
1124  if (!empty($arrayfields['balancebefore']['checked'])) {
1125  print '<td class="liste_titre right">';
1126  $htmltext = $langs->trans("BalanceVisibilityDependsOnSortAndFilters", $langs->transnoentitiesnoconv("DateValue"));
1127  print $form->textwithpicto('', $htmltext, 1);
1128  print '</td>';
1129  }
1130  // Balance
1131  if (!empty($arrayfields['balance']['checked'])) {
1132  print '<td class="liste_titre right">';
1133  $htmltext = $langs->trans("BalanceVisibilityDependsOnSortAndFilters", $langs->transnoentitiesnoconv("DateValue"));
1134  print $form->textwithpicto('', $htmltext, 1);
1135  print '</td>';
1136  }
1137  // Numero statement
1138  if (!empty($arrayfields['b.num_releve']['checked'])) {
1139  print '<td class="liste_titre" align="center"><input type="text" class="flat" name="search_num_releve" value="'.dol_escape_htmltag($search_num_releve).'" size="3"></td>';
1140  }
1141  // Conciliated
1142  if (!empty($arrayfields['b.conciliated']['checked'])) {
1143  print '<td class="liste_titre center parentonrightofpage">';
1144  print $form->selectyesno('search_conciliated', $search_conciliated, 1, false, 1, 1, 'search_status onrightofpage maxwidth75');
1145  print '</td>';
1146  }
1147  // Bordereau
1148  if (!empty($arrayfields['b.fk_bordereau']['checked'])) {
1149  print '<td class="liste_titre" align="center"><input type="text" class="flat" name="search_fk_bordereau" value="'.dol_escape_htmltag($search_fk_bordereau).'" size="3"></td>';
1150  }
1151 
1152  // Actions and select
1153  print '<td class="liste_titre" align="middle">';
1154  $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0, 'checkforselect', 1);
1155  print $searchpicto;
1156  print '</td>';
1157  print "</tr>\n";
1158 
1159  // Fields title
1160  print '<tr class="liste_titre">';
1161  if (!empty($arrayfields['b.rowid']['checked'])) {
1162  print_liste_field_titre($arrayfields['b.rowid']['label'], $_SERVER['PHP_SELF'], 'b.rowid', '', $param, '', $sortfield, $sortorder);
1163  }
1164  if (!empty($arrayfields['b.label']['checked'])) {
1165  print_liste_field_titre($arrayfields['b.label']['label'], $_SERVER['PHP_SELF'], 'b.label', '', $param, '', $sortfield, $sortorder);
1166  }
1167  if (!empty($arrayfields['b.dateo']['checked'])) {
1168  print_liste_field_titre($arrayfields['b.dateo']['label'], $_SERVER['PHP_SELF'], 'b.dateo', '', $param, '', $sortfield, $sortorder, "center ");
1169  }
1170  if (!empty($arrayfields['b.datev']['checked'])) {
1171  print_liste_field_titre($arrayfields['b.datev']['label'], $_SERVER['PHP_SELF'], 'b.datev,b.dateo,b.rowid', '', $param, 'align="center"', $sortfield, $sortorder);
1172  }
1173  if (!empty($arrayfields['type']['checked'])) {
1174  print_liste_field_titre($arrayfields['type']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'align="center"', $sortfield, $sortorder);
1175  }
1176  if (!empty($arrayfields['b.num_chq']['checked'])) {
1177  print_liste_field_titre($arrayfields['b.num_chq']['label'], $_SERVER['PHP_SELF'], 'b.num_chq', '', $param, '', $sortfield, $sortorder, "center ");
1178  }
1179  if (!empty($arrayfields['bu.label']['checked'])) {
1180  print_liste_field_titre($arrayfields['bu.label']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder);
1181  }
1182  if (!empty($arrayfields['ba.ref']['checked'])) {
1183  print_liste_field_titre($arrayfields['ba.ref']['label'], $_SERVER['PHP_SELF'], 'ba.ref', '', $param, '', $sortfield, $sortorder);
1184  }
1185  if (!empty($arrayfields['b.debit']['checked'])) {
1186  print_liste_field_titre($arrayfields['b.debit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, '', $sortfield, $sortorder, "right ");
1187  }
1188  if (!empty($arrayfields['b.credit']['checked'])) {
1189  print_liste_field_titre($arrayfields['b.credit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, '', $sortfield, $sortorder, "right ");
1190  }
1191  if (!empty($arrayfields['balancebefore']['checked'])) {
1192  print_liste_field_titre($arrayfields['balancebefore']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, "right ");
1193  }
1194  if (!empty($arrayfields['balance']['checked'])) {
1195  print_liste_field_titre($arrayfields['balance']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, "right ");
1196  }
1197  if (!empty($arrayfields['b.num_releve']['checked'])) {
1198  print_liste_field_titre($arrayfields['b.num_releve']['label'], $_SERVER['PHP_SELF'], 'b.num_releve', '', $param, '', $sortfield, $sortorder, "center ");
1199  }
1200  if (!empty($arrayfields['b.conciliated']['checked'])) {
1201  print_liste_field_titre($arrayfields['b.conciliated']['label'], $_SERVER['PHP_SELF'], 'b.rappro', '', $param, '', $sortfield, $sortorder, "center ");
1202  }
1203  if (!empty($arrayfields['b.fk_bordereau']['checked'])) {
1204  print_liste_field_titre($arrayfields['b.fk_bordereau']['label'], $_SERVER['PHP_SELF'], 'b.fk_bordereau', '', $param, '', $sortfield, $sortorder, "center ");
1205  }
1206 
1207  // Extra fields
1208  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1209  // Hook fields
1210  $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
1211  $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1212  print $hookmanager->resPrint;
1213  // Actions and select
1214  print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
1215  print "</tr>\n";
1216 
1217  $balance = 0; // For balance
1218  $balancebefore = 0; // For balance
1219  $balancecalculated = false;
1220  $posconciliatecol = 0;
1221  $cachebankaccount = array();
1222 
1223  // Loop on each record
1224  $sign = 1;
1225 
1226  while ($i < min($num, $limit)) {
1227  $objp = $db->fetch_object($resql);
1228  $links = $bankaccountstatic->get_url($objp->rowid);
1229 
1230  // If we are in a situation where we need/can show balance, we calculate the start of balance
1231  if (!$balancecalculated && (!empty($arrayfields['balancebefore']['checked']) || !empty($arrayfields['balance']['checked'])) && ($mode_balance_ok || $search_conciliated === '0')) {
1232  if (!$search_account) {
1233  dol_print_error('', 'account is not defined but $mode_balance_ok is true');
1234  exit;
1235  }
1236 
1237  // Loop on each record before
1238  $sign = 1;
1239  $i = 0;
1240  $sqlforbalance = 'SELECT SUM(b.amount) as previoustotal';
1241  $sqlforbalance .= " FROM ";
1242  $sqlforbalance .= " ".MAIN_DB_PREFIX."bank_account as ba,";
1243  $sqlforbalance .= " ".MAIN_DB_PREFIX."bank as b";
1244  $sqlforbalance .= " WHERE b.fk_account = ba.rowid";
1245  $sqlforbalance .= " AND ba.entity IN (".getEntity('bank_account').")";
1246  $sqlforbalance .= " AND b.fk_account = ".((int) $search_account);
1247  $sqlforbalance .= " AND (b.datev < '".$db->idate($db->jdate($objp->dv))."' OR (b.datev = '".$db->idate($db->jdate($objp->dv))."' AND (b.dateo < '".$db->idate($db->jdate($objp->do))."' OR (b.dateo = '".$db->idate($db->jdate($objp->do))."' AND b.rowid < ".$objp->rowid."))))";
1248  $resqlforbalance = $db->query($sqlforbalance);
1249  //print $sqlforbalance;
1250  if ($resqlforbalance) {
1251  $objforbalance = $db->fetch_object($resqlforbalance);
1252  if ($objforbalance) {
1253  // If sort is desc,desc,desc then total of previous date + amount is the balancebefore of the previous line before the line to show
1254  if ($sortfield == 'b.datev,b.dateo,b.rowid' && ($sortorder == 'desc' || $sortorder == 'desc,desc' || $sortorder == 'desc,desc,desc')) {
1255  $balancebefore = $objforbalance->previoustotal + ($sign * $objp->amount);
1256  } else {
1257  // If sort is asc,asc,asc then total of previous date is balance of line before the next line to show
1258  $balance = $objforbalance->previoustotal;
1259  }
1260  }
1261  } else {
1262  dol_print_error($db);
1263  }
1264 
1265  $balancecalculated = true;
1266 
1267  // Output a line with start balance
1268  if ($user->rights->banque->consolidate && $action == 'reconcile') {
1269  $tmpnbfieldbeforebalance = 0;
1270  $tmpnbfieldafterbalance = 0;
1271  $balancefieldfound = 0;
1272  foreach ($arrayfields as $key => $val) {
1273  if ($key == 'balancebefore' || $key == 'balance') {
1274  $balancefieldfound++;
1275  continue;
1276  }
1277  if (!empty($arrayfields[$key]['checked'])) {
1278  if (!$balancefieldfound) {
1279  $tmpnbfieldbeforebalance++;
1280  } else {
1281  $tmpnbfieldafterbalance++;
1282  }
1283  }
1284  }
1285  // Extra fields
1286  $element = 'banktransaction';
1287  if (!empty($extrafields->attributes[$element]['label']) && is_array($extrafields->attributes[$element]['label']) && count($extrafields->attributes[$element]['label'])) {
1288  foreach ($extrafields->attributes[$element]['label'] as $key => $val) {
1289  if (!empty($arrayfields["ef.".$key]['checked'])) {
1290  if (!empty($arrayfields[$key]['checked'])) {
1291  if (!$balancefieldfound) {
1292  $tmpnbfieldbeforebalance++;
1293  } else {
1294  $tmpnbfieldafterbalance++;
1295  }
1296  }
1297  }
1298  }
1299  }
1300 
1301  print '<tr class="oddeven trforbreak">';
1302  if ($tmpnbfieldbeforebalance) {
1303  print '<td colspan="'.$tmpnbfieldbeforebalance.'">';
1304  print '&nbsp;';
1305  print '</td>';
1306  }
1307 
1308  if (!empty($arrayfields['balancebefore']['checked'])) {
1309  print '<td class="right">';
1310  if ($search_conciliated !== '0') {
1311  print price(price2num($balance, 'MT'), 1, $langs);
1312  }
1313  print '</td>';
1314  }
1315  if (!empty($arrayfields['balance']['checked'])) {
1316  print '<td class="right">';
1317  if ($search_conciliated !== '0') {
1318  print price(price2num($balance, 'MT'), 1, $langs);
1319  }
1320  print '</td>';
1321  }
1322  if (!empty($arrayfields['b.num_releve']['checked'])) {
1323  print '<td class="center">';
1324  print '<input type="checkbox" id="selectAll" title="'.dol_escape_htmltag($langs->trans("SelectAll")).'" />';
1325  print ' <script type="text/javascript">
1326  $("input#selectAll").change(function() {
1327  $("input[type=checkbox][name^=rowid]").prop("checked", $(this).is(":checked"));
1328  });
1329  </script>';
1330  print '</td>';
1331  }
1332  print '<td colspan="'.($tmpnbfieldafterbalance + 1).'">';
1333  print '&nbsp;';
1334  print '</td>';
1335  print '</tr>';
1336  }
1337  }
1338 
1339  if ($sortfield == 'b.datev,b.dateo,b.rowid' && ($sortorder == 'desc' || $sortorder == 'desc,desc' || $sortorder == 'desc,desc,desc')) {
1340  $balance = price2num($balancebefore, 'MT'); // balance = balancebefore of previous line (sort is desc)
1341  $balancebefore = price2num($balancebefore - ($sign * $objp->amount), 'MT');
1342  } else {
1343  $balancebefore = price2num($balance, 'MT'); // balancebefore = balance of previous line (sort is asc)
1344  $balance = price2num($balance + ($sign * $objp->amount), 'MT');
1345  }
1346 
1347  if (empty($cachebankaccount[$objp->bankid])) {
1348  $bankaccounttmp = new Account($db);
1349  $bankaccounttmp->fetch($objp->bankid);
1350  $cachebankaccount[$objp->bankid] = $bankaccounttmp;
1351  $bankaccount = $bankaccounttmp;
1352  } else {
1353  $bankaccount = $cachebankaccount[$objp->bankid];
1354  }
1355 
1356  if (empty($conf->global->BANK_COLORIZE_MOVEMENT)) {
1357  $backgroundcolor = "class='oddeven'";
1358  } else {
1359  if ($objp->amount < 0) {
1360  $color = '#' . getDolGlobalString('BANK_COLORIZE_MOVEMENT_COLOR1', 'fca955');
1361  $backgroundcolor = 'style="background: '.$color.';"';
1362  } else {
1363  $color = '#' . getDolGlobalString('BANK_COLORIZE_MOVEMENT_COLOR2', '7fdb86');
1364  $backgroundcolor = 'style="background: '.$color.';"';
1365  }
1366  }
1367 
1368  $banklinestatic->id = $objp->rowid;
1369  $banklinestatic->ref = $objp->rowid;
1370 
1371  print '<tr class="oddeven" '.$backgroundcolor.'>';
1372 
1373  // Ref
1374  if (!empty($arrayfields['b.rowid']['checked'])) {
1375  print '<td class="nowrap left">';
1376  print $banklinestatic->getNomUrl(1);
1377  print '</td>';
1378  if (!$i) {
1379  $totalarray['nbfield']++;
1380  }
1381  }
1382 
1383  // Description
1384  if (!empty($arrayfields['b.label']['checked'])) {
1385  $labeltoshow = '';
1386  $titletoshow = '';
1387  $reg = array();
1388  preg_match('/\‍((.+)\‍)/i', $objp->label, $reg); // Si texte entoure de parenthee on tente recherche de traduction
1389  if (!empty($reg[1]) && $langs->trans($reg[1]) != $reg[1]) {
1390  $labeltoshow = $langs->trans($reg[1]);
1391  } else {
1392  if ($objp->label == '(payment_salary)') {
1393  $labeltoshow = $langs->trans("SalaryPayment");
1394  } else {
1395  $labeltoshow = dol_escape_htmltag($objp->label);
1396  $titletoshow = $objp->label;
1397  }
1398  }
1399 
1400 
1401  print '<td class="tdoverflowmax250"'.($titletoshow ? ' title="'.dol_escape_htmltag($titletoshow).'"' : '').'>';
1402 
1403  // Add info about links after description
1404  $cachebankaccount = array();
1405  foreach ($links as $key => $val) {
1406  print '<!-- '.$links[$key]['type'].' -->';
1407  if ($links[$key]['type'] == 'withdraw') {
1408  $banktransferstatic->id = $links[$key]['url_id'];
1409  $banktransferstatic->ref = $links[$key]['label'];
1410  print $banktransferstatic->getNomUrl(0).' ';
1411  } elseif ($links[$key]['type'] == 'payment') {
1412  $paymentstatic->id = $links[$key]['url_id'];
1413  $paymentstatic->ref = $links[$key]['url_id']; // FIXME This is id, not ref of payment
1414  $paymentstatic->date = $db->jdate($objp->do);
1415  print $paymentstatic->getNomUrl(2).' ';
1416  } elseif ($links[$key]['type'] == 'payment_supplier') {
1417  $paymentsupplierstatic->id = $links[$key]['url_id'];
1418  $paymentsupplierstatic->ref = $links[$key]['url_id']; // FIXME This is id, not ref of payment
1419  print $paymentsupplierstatic->getNomUrl(2).' ';
1420  } elseif ($links[$key]['type'] == 'payment_sc') {
1421  $paymentscstatic->id = $links[$key]['url_id'];
1422  $paymentscstatic->ref = $links[$key]['url_id'];
1423  $paymentscstatic->label = $links[$key]['label'];
1424  print $paymentscstatic->getNomUrl(2).' ';
1425  } elseif ($links[$key]['type'] == 'payment_vat') {
1426  $paymentvatstatic->id = $links[$key]['url_id'];
1427  $paymentvatstatic->ref = $links[$key]['url_id'];
1428  print $paymentvatstatic->getNomUrl(2).' ';
1429  } elseif ($links[$key]['type'] == 'payment_salary') {
1430  $paymentsalstatic->id = $links[$key]['url_id'];
1431  $paymentsalstatic->ref = $links[$key]['url_id'];
1432  $paymentsalstatic->label = $links[$key]['label'];
1433  print $paymentsalstatic->getNomUrl(2).' ';
1434  } elseif ($links[$key]['type'] == 'payment_loan') {
1435  print '<a href="'.DOL_URL_ROOT.'/loan/payment/card.php?id='.$links[$key]['url_id'].'">';
1436  print ' '.img_object($langs->trans('ShowPayment'), 'payment').' ';
1437  print '</a> ';
1438  } elseif ($links[$key]['type'] == 'payment_donation') {
1439  $paymentdonationstatic->id = $links[$key]['url_id'];
1440  $paymentdonationstatic->ref = $links[$key]['url_id'];
1441  print $paymentdonationstatic->getNomUrl(2).' ';
1442  } elseif ($links[$key]['type'] == 'payment_expensereport') {
1443  $paymentexpensereportstatic->id = $links[$key]['url_id'];
1444  $paymentexpensereportstatic->ref = $links[$key]['url_id'];
1445  print $paymentexpensereportstatic->getNomUrl(2).' ';
1446  } elseif ($links[$key]['type'] == 'payment_various') {
1447  $paymentvariousstatic->id = $links[$key]['url_id'];
1448  $paymentvariousstatic->ref = $links[$key]['url_id'];
1449  print $paymentvariousstatic->getNomUrl(2).' ';
1450  } elseif ($links[$key]['type'] == 'banktransfert') {
1451  // Do not show link to transfer since there is no transfer card (avoid confusion). Can already be accessed from transaction detail.
1452  if ($objp->amount > 0) {
1453  $banklinestatic->fetch($links[$key]['url_id']);
1454  $bankstatic->id = $banklinestatic->fk_account;
1455  $bankstatic->label = $banklinestatic->bank_account_ref;
1456  print $langs->trans("TransferFrom").' ';
1457  print $bankstatic->getNomUrl(1, 'transactions');
1458  print ' '.$langs->trans("toward").' ';
1459  $bankstatic->id = $objp->bankid;
1460  $bankstatic->label = $objp->bankref;
1461  print $bankstatic->getNomUrl(1, '');
1462  print ' - ';
1463  } else {
1464  $bankstatic->id = $objp->bankid;
1465  $bankstatic->label = $objp->bankref;
1466  print $langs->trans("TransferFrom").' ';
1467  print $bankstatic->getNomUrl(1, '');
1468  print ' '.$langs->trans("toward").' ';
1469  $banklinestatic->fetch($links[$key]['url_id']);
1470  $bankstatic->id = $banklinestatic->fk_account;
1471  $bankstatic->label = $banklinestatic->bank_account_ref;
1472  print $bankstatic->getNomUrl(1, 'transactions');
1473  print ' - ';
1474  }
1475  //var_dump($links);
1476  } elseif ($links[$key]['type'] == 'company') {
1477  } elseif ($links[$key]['type'] == 'user') {
1478  } elseif ($links[$key]['type'] == 'member') {
1479  } elseif ($links[$key]['type'] == 'sc') {
1480  } elseif ($links[$key]['type'] == 'vat') {
1481  } elseif ($links[$key]['type'] == 'salary') {
1482  // Information is already shown using the payment_salary link. No need of this link.
1483  } else {
1484  // Show link with label $links[$key]['label']
1485  print '<a href="'.$links[$key]['url'].$links[$key]['url_id'].'">';
1486  if (preg_match('/^\‍((.*)\‍)$/i', $links[$key]['label'], $reg)) {
1487  // Label generique car entre parentheses. On l'affiche en le traduisant
1488  if ($reg[1] == 'paiement') {
1489  $reg[1] = 'Payment';
1490  }
1491  print $langs->trans($reg[1]);
1492  } else {
1493  print $links[$key]['label'];
1494  }
1495  print '</a>'.($labeltoshow ? ' - ' : '');
1496  }
1497  }
1498 
1499  print $labeltoshow; // Already escaped
1500 
1501  print '</td>';
1502  if (!$i) {
1503  $totalarray['nbfield']++;
1504  }
1505  }
1506 
1507  // Date ope
1508  if (!empty($arrayfields['b.dateo']['checked'])) {
1509  print '<td align="center" class="nowrap">';
1510  print '<span class="spanforajaxedit" id="dateoperation_'.$objp->rowid.'">'.dol_print_date($db->jdate($objp->do), "day")."</span>";
1511  print '&nbsp;';
1512  print '<span class="inline-block">';
1513  print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=doprev&amp;account='.$objp->bankid.'&amp;rowid='.$objp->rowid.'">';
1514  print img_edit_remove()."</a> ";
1515  print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=donext&amp;account='.$objp->bankid.'&amp;rowid='.$objp->rowid.'">';
1516  print img_edit_add()."</a>";
1517  print '</span>';
1518  print "</td>\n";
1519  if (!$i) {
1520  $totalarray['nbfield']++;
1521  }
1522  }
1523 
1524  // Date value
1525  if (!empty($arrayfields['b.datev']['checked'])) {
1526  print '<td align="center" class="nowrap">';
1527  print '<span class="spanforajaxedit" id="datevalue_'.$objp->rowid.'">'.dol_print_date($db->jdate($objp->dv), "day")."</span>";
1528  print '&nbsp;';
1529  print '<span class="inline-block">';
1530  print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=dvprev&amp;account='.$objp->bankid.'&amp;rowid='.$objp->rowid.'">';
1531  print img_edit_remove()."</a> ";
1532  print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=dvnext&amp;account='.$objp->bankid.'&amp;rowid='.$objp->rowid.'">';
1533  print img_edit_add()."</a>";
1534  print '</span>';
1535  print "</td>\n";
1536  if (!$i) {
1537  $totalarray['nbfield']++;
1538  }
1539  }
1540 
1541  // Payment type
1542  if (!empty($arrayfields['type']['checked'])) {
1543  print '<td class="tdoverflowmax100 center">';
1544  $labeltype = ($langs->trans("PaymentTypeShort".$objp->fk_type) != "PaymentTypeShort".$objp->fk_type) ? $langs->trans("PaymentTypeShort".$objp->fk_type) : $langs->getLabelFromKey($db, $objp->fk_type, 'c_paiement', 'code', 'libelle', '', 1);
1545  if ($labeltype == 'SOLD') {
1546  print '&nbsp;'; //$langs->trans("InitialBankBalance");
1547  } else {
1548  print $labeltype;
1549  }
1550  print "</td>\n";
1551  if (!$i) {
1552  $totalarray['nbfield']++;
1553  }
1554  }
1555 
1556  // Num cheque
1557  if (!empty($arrayfields['b.num_chq']['checked'])) {
1558  print '<td class="nowrap" align="center">'.($objp->num_chq ? dol_escape_htmltag($objp->num_chq) : "")."</td>\n";
1559  if (!$i) {
1560  $totalarray['nbfield']++;
1561  }
1562  }
1563 
1564  // Third party
1565  if (!empty($arrayfields['bu.label']['checked'])) {
1566  print '<td class="tdoverflowmax150">';
1567 
1568  $companylinked_id = 0;
1569  $userlinked_id = 0;
1570  $type_link = "";
1571 
1572  //payment line type to define user display and user or company linked
1573  foreach ($links as $key => $value) {
1574  if ($links[$key]['type'] == 'payment_sc') {
1575  $type_link = 'payment_sc';
1576  }
1577  if ($links[$key]['type'] == 'payment_salary') {
1578  $type_link = 'payment_salary';
1579  }
1580 
1581  if ($links[$key]['type'] == 'company') {
1582  $companylinked_id = $links[$key]['url_id'];
1583  }
1584  if ($links[$key]['type'] == 'user') {
1585  $userlinked_id = $links[$key]['url_id'];
1586  }
1587  }
1588 
1589  if ($companylinked_id) {
1590  // TODO Add a cache of loaded companies here ?
1591  $companystatic->fetch($companylinked_id);
1592  print $companystatic->getNomUrl(1);
1593  } elseif ($userlinked_id &&
1594  (($type_link == 'payment_salary' && !empty($user->rights->salaries->read))
1595  || ($type_link == 'payment_sc' && !empty($user->rights->tax->charges->lire)))) {
1596  // Get object user from cache or load it
1597  if (!empty($conf->cache['user'][$userlinked_id])) {
1598  $tmpuser = $conf->cache['user'][$userlinked_id];
1599  } else {
1600  $tmpuser = new User($db);
1601  $tmpuser->fetch($userlinked_id);
1602  $conf->cache['user'][$userlinked_id] = $tmpuser;
1603  }
1604  print $tmpuser->getNomUrl(1);
1605  } else {
1606  print '&nbsp;';
1607  }
1608 
1609  print '</td>';
1610  if (!$i) {
1611  $totalarray['nbfield']++;
1612  }
1613  }
1614 
1615  // Bank account
1616  if (!empty($arrayfields['ba.ref']['checked'])) {
1617  print '<td class="nowrap">';
1618  print $bankaccount->getNomUrl(1);
1619  print "</td>\n";
1620  if (!$i) {
1621  $totalarray['nbfield']++;
1622  }
1623  }
1624 
1625  // Debit
1626  if (!empty($arrayfields['b.debit']['checked'])) {
1627  print '<td class="nowrap right"><span class="amount">';
1628  if ($objp->amount < 0) {
1629  print price($objp->amount * -1);
1630  $totalarray['totaldeb'] += $objp->amount;
1631  }
1632  print "</span></td>\n";
1633  if (!$i) {
1634  $totalarray['nbfield']++;
1635  }
1636  if (!$i) {
1637  $totalarray['totaldebfield'] = $totalarray['nbfield'];
1638  }
1639  }
1640 
1641  // Credit
1642  if (!empty($arrayfields['b.credit']['checked'])) {
1643  print '<td class="nowrap right"><span class="amount">';
1644  if ($objp->amount > 0) {
1645  print price($objp->amount);
1646  $totalarray['totalcred'] += $objp->amount;
1647  }
1648  print "</span></td>\n";
1649  if (!$i) {
1650  $totalarray['nbfield']++;
1651  }
1652  if (!$i) {
1653  $totalarray['totalcredfield'] = $totalarray['nbfield'];
1654  }
1655  }
1656 
1657  // Balance before
1658  if (!empty($arrayfields['balancebefore']['checked'])) {
1659  if ($mode_balance_ok) {
1660  if ($balancebefore >= 0) {
1661  print '<td class="nowrap right">&nbsp;'.price($balancebefore).'</td>';
1662  } else {
1663  print '<td class="error nowrap right">&nbsp;'.price($balancebefore).'</td>';
1664  }
1665  } else {
1666  print '<td class="right">-</td>';
1667  }
1668  if (!$i) {
1669  $totalarray['nbfield']++;
1670  }
1671  }
1672 
1673  // Balance after
1674  if (!empty($arrayfields['balance']['checked'])) {
1675  if ($mode_balance_ok) {
1676  if ($balance >= 0) {
1677  print '<td class="nowrap right">&nbsp;'.price($balance).'</td>';
1678  } else {
1679  print '<td class="error nowrap right">&nbsp;'.price($balance).'</td>';
1680  }
1681  } else {
1682  print '<td class="right">-</td>';
1683  }
1684  if (!$i) {
1685  $totalarray['nbfield']++;
1686  }
1687  }
1688 
1689  if (!empty($arrayfields['b.num_releve']['checked'])) {
1690  print '<td class="nowraponall" align="center">';
1691  // Transaction reconciliated or edit link
1692  if ($bankaccount->canBeConciliated() > 0) {
1693  if ($objp->num_releve) {
1694  print '<a href="releve.php?num='.urlencode($objp->num_releve).'&account='.urlencode($objp->bankid).'&save_lastsearch_values=1">'.dol_escape_htmltag($objp->num_releve).'</a>';
1695  }
1696  if (!$objp->conciliated && $action == 'reconcile') {
1697  if ($objp->num_releve) {
1698  print '&nbsp;';
1699  }
1700  print '<input class="flat" name="rowid['.$objp->rowid.']" type="checkbox" value="'.$objp->rowid.'" size="1"'.(!empty($_POST['rowid'][$objp->rowid]) ? ' checked' : '').'>';
1701  }
1702  }
1703  print '</td>';
1704  if (!$i) {
1705  $totalarray['nbfield']++;
1706  $posconciliatecol = $totalarray['nbfield'];
1707  }
1708  }
1709 
1710  if (!empty($arrayfields['b.conciliated']['checked'])) {
1711  print '<td class="nowraponall" align="center">';
1712  print yn($objp->conciliated);
1713  print '</td>';
1714  if (!$i) {
1715  $totalarray['nbfield']++;
1716  }
1717  }
1718 
1719  if (!empty($arrayfields['b.fk_bordereau']['checked'])) {
1720  $bordereaustatic->fetch($objp->fk_bordereau);
1721  print '<td class="nowraponall" align="center">';
1722  print $bordereaustatic->getNomUrl();
1723  print '</td>';
1724  if (!$i) {
1725  $totalarray['nbfield']++;
1726  }
1727  }
1728 
1729  // Fields from hook
1730  $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$objp, 'i'=>$i, 'totalarray'=>&$totalarray);
1731  $reshook=$hookmanager->executeHooks('printFieldListValue', $parameters, $objecttmp); // Note that $action and $objecttmpect may have been modified by hook
1732  print $hookmanager->resPrint;
1733 
1734  // Action edit/delete and select
1735  print '<td class="nowraponall" align="center">';
1736  // Transaction reconciliated or edit link
1737  if ($objp->conciliated && $bankaccount->canBeConciliated() > 0) { // If line not conciliated and account can be conciliated
1738  print '<a class="editfielda" href="'.DOL_URL_ROOT.'/compta/bank/line.php?save_lastsearch_values=1&rowid='.$objp->rowid.($object->id > 0 ? '&account='.$object->id : '').'&page='.$page.'">';
1739  print img_edit();
1740  print '</a>';
1741  } else {
1742  if ($user->rights->banque->modifier || $user->rights->banque->consolidate) {
1743  print '<a class="editfielda" href="'.DOL_URL_ROOT.'/compta/bank/line.php?save_lastsearch_values=1&rowid='.$objp->rowid.($object->id > 0 ? '&account='.$object->id : '').'&page='.$page.'">';
1744  print img_edit();
1745  print '</a>';
1746  } else {
1747  print '<a class="editfielda" href="'.DOL_URL_ROOT.'/compta/bank/line.php?save_lastsearch_values=1&rowid='.$objp->rowid.($object->id > 0 ? '&account='.$object->id : '').'&page='.$page.'">';
1748  print img_view();
1749  print '</a>';
1750  }
1751  if ($bankaccount->canBeConciliated() > 0 && empty($objp->conciliated)) {
1752  if ($db->jdate($objp->dv) < ($now - $conf->bank->rappro->warning_delay)) {
1753  print ' '.img_warning($langs->trans("ReconciliationLate"));
1754  }
1755  }
1756  if ($user->rights->banque->modifier) {
1757  print '<a href="'.$_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&rowid='.$objp->rowid.'&page='.$page.$param.($sortfield ? '&sortfield='.$sortfield : '').($sortorder ? '&sortorder='.$sortorder : '').'">';
1758  print img_delete('', 'class="marginleftonly"');
1759  print '</a>';
1760  }
1761  }
1762 
1763  // Action column
1764  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1765  $selected = 0;
1766  if (in_array($obj->rowid, $arrayofselected)) {
1767  $selected = 1;
1768  }
1769  print '<input id="cb'.$obj->rowid.'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1770  }
1771  print '</td>';
1772  if (!$i) {
1773  $totalarray['nbfield']++;
1774  }
1775 
1776  print "</tr>";
1777 
1778  $i++;
1779  }
1780 
1781  // Show total line
1782  if (isset($totalarray['totaldebfield']) || isset($totalarray['totalcredfield'])) {
1783  print '<tr class="liste_total">';
1784  $i = 0;
1785  while ($i < $totalarray['nbfield']) {
1786  $i++;
1787  if ($i == 1) {
1788  if ($num < $limit && empty($offset)) {
1789  print '<td class="left">'.$langs->trans("Total").'</td>';
1790  } else {
1791  print '<td class="left tdoverflowmax50" title="'.$langs->trans("Totalforthispage").'">'.$langs->trans("Totalforthispage").'</td>';
1792  }
1793  } elseif ($totalarray['totaldebfield'] == $i) {
1794  print '<td class="right"><span class="amount">'.price(-1 * $totalarray['totaldeb']).'</span></td>';
1795  } elseif ($totalarray['totalcredfield'] == $i) {
1796  print '<td class="right"><span class="amount">'.price($totalarray['totalcred']).'</span></td>';
1797  } elseif ($i == $posconciliatecol) {
1798  print '<td class="center">';
1799  if ($user->rights->banque->consolidate && $action == 'reconcile') {
1800  print '<input class="button" name="confirm_reconcile" type="submit" value="'.$langs->trans("Conciliate").'">';
1801  }
1802  print '</td>';
1803  } else {
1804  print '<td></td>';
1805  }
1806  }
1807  print '</tr>';
1808  }
1809 
1810  // If no record found
1811  if ($num == 0) {
1812  $colspan = 1;
1813  foreach ($arrayfields as $key => $val) {
1814  if (!empty($val['checked'])) {
1815  $colspan++;
1816  }
1817  }
1818  print '<tr><td colspan="'.($colspan + 1).'" class="opacitymedium">'.$langs->trans("NoRecordFound").'</td></tr>';
1819  }
1820 
1821  print "</table>";
1822  print "</div>";
1823 
1824  print '</form>';
1825  $db->free($resql);
1826 } else {
1827  dol_print_error($db);
1828 }
1829 
1830 // End of page
1831 llxFooter();
1832 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
bank_prepare_head(Account $object)
Prepare array with list of tabs.
Definition: bank.lib.php:37
Class to manage bank accounts.
const TYPE_CASH
Cash account.
Class to manage bank transaction lines.
Class to manage members of a foundation.
Class to manage bank categories.
Class to manage withdrawal receipts.
Classe permettant la gestion des paiements des charges La tva collectee n'est calculee que sur les fa...
Class to manage donations.
Definition: don.class.php:39
Class to manage standard extra fields.
Class to manage generation of HTML components for accounting management.
Class to manage generation of HTML components Only common components must be here.
static selectarray($htmlname, $array, $id='', $show_empty=0, $key_in_label=0, $value_as_key=0, $moreparam='', $translate=0, $maxlen=0, $disabled=0, $sort='', $morecss='minwidth75', $addjscombo=1, $moreparamonempty='', $disablebademail=0, $nohtmlescape=0)
Return a HTML select string, built from an array of key+value.
Classe permettant la generation de composants html autre Only common components are here.
Loan.
Definition: loan.class.php:31
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 salaries.
Class to manage payments of social contributions.
Class to manage payments of social contributions.
Class to manage various payments.
Class to manage cheque delivery receipts.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
Definition: user.class.php:47
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tabs of a record.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
currentToken()
Return the value of token currently saved into session with name 'token'.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
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='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
img_view($titlealt='default', $float=0, $other='class="valignmiddle"')
Show logo view card.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
if(!function_exists('utf8_encode')) if(!function_exists('utf8_decode')) getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
img_edit_add($titlealt='default', $other='')
Show logo +.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
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 -.
$nbtotalofrecords
Count total nb of records.
Definition: list.php:329
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.