dolibarr  x.y.z
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("ChequeReceipt"), '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 $sql .= " WHERE b.fk_account = ba.rowid";
609 $sql .= " AND ba.entity IN (".getEntity('bank_account').")";
610 if ($search_account > 0) {
611  $sql .= " AND b.fk_account = ".((int) $search_account);
612 }
613 // Search period criteria
614 if (dol_strlen($search_dt_start) > 0) {
615  $sql .= " AND b.dateo >= '".$db->idate($search_dt_start)."'";
616 }
617 if (dol_strlen($search_dt_end) > 0) {
618  $sql .= " AND b.dateo <= '".$db->idate($search_dt_end)."'";
619 }
620 // Search period criteria
621 if (dol_strlen($search_dv_start) > 0) {
622  $sql .= " AND b.datev >= '".$db->idate($search_dv_start)."'";
623 }
624 if (dol_strlen($search_dv_end) > 0) {
625  $sql .= " AND b.datev <= '".$db->idate($search_dv_end)."'";
626 }
627 if ($search_ref) {
628  $sql .= natural_search("b.rowid", $search_ref, 1);
629 }
630 if ($search_req_nb) {
631  $sql .= natural_search("b.num_chq", $search_req_nb);
632 }
633 if ($search_num_releve) {
634  $sql .= natural_search("b.num_releve", $search_num_releve);
635 }
636 if ($search_conciliated != '' && $search_conciliated != '-1') {
637  $sql .= " AND b.rappro = ".((int) $search_conciliated);
638 }
639 if ($search_fk_bordereau > 0) {
640  $sql .= " AND b.fk_bordereau = " . ((int) $search_fk_bordereau);
641 }
642 if ($search_thirdparty_user) {
643  $sql.= " AND (b.rowid IN ";
644  $sql.= " ( SELECT bu.fk_bank FROM ".MAIN_DB_PREFIX."bank_url AS bu";
645  $sql.= " JOIN ".MAIN_DB_PREFIX."bank AS b2 ON b2.rowid = bu.fk_bank";
646  $sql.= " JOIN ".MAIN_DB_PREFIX."user AS subUser ON (bu.type = 'user' AND bu.url_id = subUser.rowid)";
647  $sql.= " WHERE ". natural_search(array("subUser.firstname", "subUser.lastname"), $search_thirdparty_user, '', 1).")";
648 
649  $sql.= " OR 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."societe AS subSoc ON (bu.type = 'company' AND bu.url_id = subSoc.rowid)";
653  $sql.= " WHERE ". natural_search(array("subSoc.nom"), $search_thirdparty_user, '', 1);
654  $sql.= "))";
655 }
656 if ($search_description) {
657  $search_description_to_use = $search_description;
658  $arrayoffixedlabels = array(
659  'payment_salary',
660  'CustomerInvoicePayment', 'CustomerInvoicePaymentBack',
661  'SupplierInvoicePayment', 'SupplierInvoicePaymentBack',
662  'DonationPayment',
663  'ExpenseReportPayment',
664  'SocialContributionPayment',
665  'SubscriptionPayment',
666  'WithdrawalPayment'
667  );
668  foreach ($arrayoffixedlabels as $keyforlabel) {
669  $translatedlabel = $langs->transnoentitiesnoconv($keyforlabel);
670  if (preg_match('/'.$search_description.'/i', $translatedlabel)) {
671  $search_description_to_use .= "|".$keyforlabel;
672  }
673  }
674  $sql .= natural_search("b.label", $search_description_to_use); // Warning some text are just translation keys, not translated strings
675 }
676 
677 if ($search_bid > 0) {
678  $sql .= " AND b.rowid = l.lineid AND l.fk_categ = ".((int) $search_bid);
679 }
680 if (!empty($search_type)) {
681  $sql .= " AND b.fk_type = '".$db->escape($search_type)."'";
682 }
683 // Search criteria amount
684 if ($search_debit) {
685  $sql .= natural_search('ABS(b.amount)', $search_debit, 1);
686  $sql .= ' AND b.amount <= 0';
687 }
688 if ($search_credit) {
689  $sql .= natural_search('b.amount', $search_credit, 1);
690  $sql .= ' AND b.amount >= 0';
691 }
692 // Add where from extra fields
693 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
694 
695 // Add where from hooks
696 $parameters = array();
697 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
698 $sql .= $hookmanager->resPrint;
699 
700 $sql .= $db->order($sortfield, $sortorder);
701 
702 $nbtotalofrecords = '';
703 $nbtotalofpages = 0;
704 if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
705  $result = $db->query($sql);
706  $nbtotalofrecords = $db->num_rows($result);
707  $nbtotalofpages = ceil($nbtotalofrecords / $limit);
708 }
709 
710 if (($id > 0 || !empty($ref)) && ((string) $page == '')) {
711  // We open a list of transaction of a dedicated account and no page was set by defaut
712  // We force on last page.
713  $page = ($nbtotalofpages - 1);
714  $offset = $limit * $page;
715  if ($page < 0) {
716  $page = 0;
717  }
718 }
719 if ($page >= $nbtotalofpages) {
720  // If we made a search and result has low page than the page number we were on
721  $page = ($nbtotalofpages - 1);
722  $offset = $limit * $page;
723  if ($page < 0) {
724  $page = 0;
725  }
726 }
727 
728 
729 // If not account defined $mode_balance_ok=false
730 if (empty($search_account)) {
731  $mode_balance_ok = false;
732 }
733 // If a search is done $mode_balance_ok=false
734 if (!empty($search_ref)) {
735  $mode_balance_ok = false;
736 }
737 if (!empty($search_description)) {
738  $mode_balance_ok = false;
739 }
740 if (!empty($search_type)) {
741  $mode_balance_ok = false;
742 }
743 if (!empty($search_debit)) {
744  $mode_balance_ok = false;
745 }
746 if (!empty($search_credit)) {
747  $mode_balance_ok = false;
748 }
749 if (!empty($search_thirdparty_user)) {
750  $mode_balance_ok = false;
751 }
752 if ($search_conciliated != '' && $search_conciliated != '-1') {
753  $mode_balance_ok = false;
754 }
755 if (!empty($search_num_releve)) {
756  $mode_balance_ok = false;
757 }
758 if (!empty($search_fk_bordereau)) {
759  $mode_balance_ok = false;
760 }
761 
762 $sql .= $db->plimit($limit + 1, $offset);
763 //print $sql;
764 dol_syslog('compta/bank/bankentries_list.php', LOG_DEBUG);
765 $resql = $db->query($sql);
766 if ($resql) {
767  $num = $db->num_rows($resql);
768 
769  $arrayofselected = (!empty($toselect) && is_array($toselect)) ? $toselect : array();
770 
771  // List of mass actions available
772  $arrayofmassactions = array(
773  //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
774  //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
775  );
776  //if ($user->rights->bank->supprimer) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
777  if (in_array($massaction, array('presend', 'predelete'))) {
778  $arrayofmassactions = array();
779  }
780  $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
781 
782  // Confirmation delete
783  if ($action == 'delete') {
784  $text = $langs->trans('ConfirmDeleteTransaction');
785  print $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id.'&rowid='.GETPOST("rowid", 'int'), $langs->trans('DeleteTransaction'), $text, 'confirm_delete', null, '', 1);
786  }
787 
788  // Lines of title fields
789  print '<form method="post" action="'.$_SERVER["PHP_SELF"].'" name="search_form">'."\n";
790  if ($optioncss != '') {
791  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
792  }
793  print '<input type="hidden" name="token" value="'.newToken().'">';
794  print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
795  print '<input type="hidden" name="action" value="'.($action != 'delete' ? $action : 'search').'">';
796  if (!empty($view)) {
797  print '<input type="hidden" name="view" value="'.dol_escape_htmltag($view).'">';
798  }
799  print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
800  print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
801  print '<input type="hidden" name="page" value="'.$page.'">';
802  print '<input type="hidden" name="id" value="'.$id.'">';
803  print '<input type="hidden" name="ref" value="'.$ref.'">';
804  if (GETPOST('bid')) {
805  print '<input type="hidden" name="bid" value="'.GETPOST("bid", 'int').'">';
806  }
807 
808  // Form to reconcile
809  if ($user->rights->banque->consolidate && $action == 'reconcile') {
810  print '<div class="valignmiddle inline-block" style="padding-right: 20px;">';
811  print '<strong>'.$langs->trans("InputReceiptNumber").'</strong>: ';
812  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
813  print '</div>';
814  if (is_array($options) && count($options)) {
815  print $langs->trans("EventualyAddCategory").': ';
816  print Form::selectarray('cat', $options, GETPOST('cat'), 1);
817  }
818  print '<br><div style="margin-top: 5px;"><span class="opacitymedium">'.$langs->trans("ThenCheckLinesAndConciliate").'</span> ';
819  print '<input class="button" name="confirm_savestatement" type="submit" value="'.$langs->trans("SaveStatementOnly").'">';
820  print ' '.$langs->trans("or").' ';
821  print '<input class="button" name="confirm_reconcile" type="submit" value="'.$langs->trans("Conciliate").'">';
822  print ' '.$langs->trans("or").' ';
823  print '<input type="submit" name="cancel" class="button button-cancel" value="'.$langs->trans("Cancel").'">';
824  print '</div>';
825 
826  // Show last bank statements
827  $nbmax = 12; // We show last 12 receipts (so we can have more than one year)
828  $liste = "";
829  $sql = "SELECT DISTINCT num_releve FROM ".MAIN_DB_PREFIX."bank";
830  $sql .= " WHERE fk_account = ".((int) $object->id)." AND num_releve IS NOT NULL";
831  $sql .= $db->order("num_releve", "DESC");
832  $sql .= $db->plimit($nbmax + 1);
833  print '<br>';
834  print $langs->trans("LastAccountStatements").' : ';
835  $resqlr = $db->query($sql);
836  if ($resqlr) {
837  $numr = $db->num_rows($resqlr);
838  $i = 0;
839  $last_ok = 0;
840  while (($i < $numr) && ($i < $nbmax)) {
841  $objr = $db->fetch_object($resqlr);
842  if (!$last_ok) {
843  $last_releve = $objr->num_releve;
844  $last_ok = 1;
845  }
846  $i++;
847  $liste = '<a href="'.DOL_URL_ROOT.'/compta/bank/releve.php?account='.$id.'&amp;num='.$objr->num_releve.'">'.$objr->num_releve.'</a> &nbsp; '.$liste;
848  }
849  if ($numr >= $nbmax) {
850  $liste = "... &nbsp; ".$liste;
851  }
852  print $liste;
853  if ($numr <= 0) {
854  print '<b>'.$langs->trans("None").'</b>';
855  }
856  } else {
857  dol_print_error($db);
858  }
859 
860  // Using BANK_REPORT_LAST_NUM_RELEVE to automatically report last num (or not)
861  if (!empty($conf->global->BANK_REPORT_LAST_NUM_RELEVE)) {
862  print '
863  <script type="text/javascript">
864  $("#num_releve").val("' . $last_releve.'");
865  </script>
866  ';
867  }
868  print '<br><br>';
869  }
870 
871  // Form to add a transaction with no invoice
872  if (!empty($user->rights->banque->modifier) && $action == 'addline' && !empty($conf->global->BANK_USE_OLD_VARIOUS_PAYMENT)) {
873  print load_fiche_titre($langs->trans("AddBankRecordLong"), '', '');
874 
875  print '<table class="noborder centpercent">';
876 
877  print '<tr class="liste_titre">';
878  print '<td>'.$langs->trans("Description").'</td>';
879  print '<td>'.$langs->trans("Date").'</td>';
880  print '<td>&nbsp;</td>';
881  print '<td>'.$langs->trans("Type").'</td>';
882  print '<td>'.$langs->trans("Numero").'</td>';
883  print '<td class=right>'.$langs->trans("BankAccount").'</td>';
884  print '<td class=right>'.$langs->trans("Debit").'</td>';
885  print '<td class=right>'.$langs->trans("Credit").'</td>';
886  /*if (isModEnabled('accounting'))
887  {
888  print '<td class="center">';
889  print $langs->trans("AccountAccounting");
890  print '</td>';
891  }*/
892  print '<td align="center">&nbsp;</td>';
893  print '</tr>';
894 
895  print '<tr>';
896  print '<td>';
897  print '<input name="label" class="flat minwidth200" type="text" value="'.GETPOST("label", "alpha").'">';
898  if (is_array($options) && count($options)) {
899  print '<br>'.$langs->trans("Rubrique").': ';
900  print Form::selectarray('cat1', $options, GETPOST('cat1'), 1);
901  }
902  print '</td>';
903  print '<td class="nowrap">';
904  print $form->selectDate(empty($dateop) ?-1 : $dateop, 'op', 0, 0, 0, 'transaction');
905  print '</td>';
906  print '<td>&nbsp;</td>';
907  print '<td class="nowrap">';
908  $form->select_types_paiements((GETPOST('operation') ?GETPOST('operation') : ($object->courant == Account::TYPE_CASH ? 'LIQ' : '')), 'operation', '1,2', 2, 1);
909  print '</td>';
910  print '<td>';
911  print '<input name="num_chq" class="flat" type="text" size="4" value="'.GETPOST("num_chq", "alpha").'">';
912  print '</td>';
913  //if (! $search_account > 0)
914  //{
915  print '<td class=right>';
916  $form->select_comptes(GETPOST('add_account', 'int') ?GETPOST('add_account', 'int') : $search_account, 'add_account', 0, '', 1, ($id > 0 || !empty($ref) ? ' disabled="disabled"' : ''));
917  print '</td>';
918  //}
919  print '<td class="right"><input name="adddebit" class="flat" type="text" size="4" value="'.GETPOST("adddebit", "alpha").'"></td>';
920  print '<td class="right"><input name="addcredit" class="flat" type="text" size="4" value="'.GETPOST("addcredit", "alpha").'"></td>';
921  /*if (isModEnabled('accounting'))
922  {
923  print '<td class="center">';
924  print $formaccounting->select_account($search_accountancy_code, 'search_accountancy_code', 1, null, 1, 1, '');
925  print '</td>';
926  }*/
927  print '<td class="center">';
928  print '<input type="submit" name="save" class="button buttongen marginbottomonly button-add" value="'.$langs->trans("Add").'"><br>';
929  print '<input type="submit" name="cancel" class="button buttongen marginbottomonly button-cancel" value="'.$langs->trans("Cancel").'">';
930  print '</td></tr>';
931 
932  print '</table>';
933  print '<br>';
934  }
935 
936  // Code to adjust value date with plus and less picto using an Ajax call instead of a full reload of page
937  $urlajax = DOL_URL_ROOT.'/core/ajax/bankconciliate.php?token='.currentToken();
938  print '
939  <script type="text/javascript">
940  $(function() {
941  $("a.ajaxforbankoperationchange").each(function(){
942  var current = $(this);
943  current.click(function()
944  {
945  var url = "'.$urlajax.'&"+current.attr("href").split("?")[1];
946  $.get(url, function(data)
947  {
948  console.log(url)
949  console.log(data)
950  current.parent().parent().find(".spanforajaxedit").replaceWith(data);
951  });
952  return false;
953  });
954  });
955  });
956  </script>
957  ';
958 
959  $i = 0;
960 
961  // Title
962  $bankcateg = new BankCateg($db);
963 
964  $newcardbutton = '';
965  if ($action != 'addline' && $action != 'reconcile') {
966  if (empty($conf->global->BANK_DISABLE_DIRECT_INPUT)) {
967  if (empty($conf->global->BANK_USE_OLD_VARIOUS_PAYMENT)) { // Default is to record miscellaneous direct entries using miscellaneous payments
968  $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);
969  } else // If direct entries is not done using miscellaneous payments
970  {
971  $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle', $_SERVER["PHP_SELF"].'?action=addline&token='.newToken().'&page='.$page.$param, '', $user->rights->banque->modifier);
972  }
973  } else {
974  $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle', $_SERVER["PHP_SELF"].'?action=addline&token='.newToken().'&page='.$page.$param, '', -1);
975  }
976  }
977 
978  $morehtml = '';
979  /*$morehtml = '<div class="inline-block '.(($buttonreconcile || $newcardbutton) ? 'marginrightonly' : '').'">';
980  $morehtml .= '<label for="pageplusone">'.$langs->trans("Page")."</label> "; // ' Page ';
981  $morehtml .= '<input type="text" name="pageplusone" id="pageplusone" class="flat right width25 pageplusone" value="'.($page + 1).'">';
982  $morehtml .= '/'.$nbtotalofpages.' ';
983  $morehtml .= '</div>';
984  */
985 
986  if ($action != 'addline' && $action != 'reconcile') {
987  $morehtml .= $buttonreconcile;
988  }
989 
990  $morehtml .= '<!-- Add New button -->'.$newcardbutton;
991 
992  $picto = 'bank_account';
993  if ($id > 0 || !empty($ref)) {
994  $picto = '';
995  }
996 
997  print_barre_liste($langs->trans("BankTransactions"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $picto, 0, $morehtml, '', $limit, 0, 0, 1);
998 
999  // We can add page now to param
1000  if ($page != '') {
1001  $param .= '&page='.urlencode($page);
1002  }
1003 
1004  $moreforfilter = '';
1005 
1006  $moreforfilter .= '<div class="divsearchfield">';
1007  $moreforfilter .= $langs->trans('DateOperationShort');
1008  $moreforfilter .= ($conf->browser->layout == 'phone' ? '<br>' : ' ');
1009  $moreforfilter .= '<div class="nowrap inline-block">';
1010  $moreforfilter .= $form->selectDate($search_dt_start, 'search_start_dt', 0, 0, 1, "search_form", 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1011  $moreforfilter .= '</div>';
1012  $moreforfilter .= ($conf->browser->layout == 'phone' ? '' : ' ');
1013  $moreforfilter .= '<div class="nowrap inline-block">';
1014  $moreforfilter .= $form->selectDate($search_dt_end, 'search_end_dt', 0, 0, 1, "search_form", 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1015  $moreforfilter .= '</div>';
1016  $moreforfilter .= '</div>';
1017 
1018  $moreforfilter .= '<div class="divsearchfield">';
1019  $moreforfilter .= $langs->trans('DateValueShort');
1020  $moreforfilter .= ($conf->browser->layout == 'phone' ? '<br>' : ' ');
1021  $moreforfilter .= '<div class="nowrap inline-block">';
1022  $moreforfilter .= $form->selectDate($search_dv_start, 'search_start_dv', 0, 0, 1, "search_form", 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1023  $moreforfilter .= '</div>';
1024  $moreforfilter .= ($conf->browser->layout == 'phone' ? '' : ' ');
1025  $moreforfilter .= '<div class="nowrap inline-block">';
1026  $moreforfilter .= $form->selectDate($search_dv_end, 'search_end_dv', 0, 0, 1, "search_form", 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1027  $moreforfilter .= '</div>';
1028  $moreforfilter .= '</div>';
1029 
1030  if (isModEnabled('categorie')) {
1031  // Categories
1032  if (isModEnabled('categorie') && !empty($user->rights->categorie->lire)) {
1033  $langs->load('categories');
1034 
1035  // Bank line
1036  $moreforfilter .= '<div class="divsearchfield">';
1037  $tmptitle = $langs->trans('RubriquesTransactions');
1038  $cate_arbo = $form->select_all_categories(Categorie::TYPE_BANK_LINE, $search_bid, 'parent', null, null, 1);
1039  $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$form->selectarray('search_bid', $cate_arbo, $search_bid, $tmptitle, 0, 0, '', 0, 0, 0, '', '', 1);
1040  $moreforfilter .= '</div>';
1041  }
1042  }
1043 
1044  $parameters = array();
1045  $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook
1046  if (empty($reshook)) {
1047  $moreforfilter .= $hookmanager->resPrint;
1048  } else {
1049  $moreforfilter = $hookmanager->resPrint;
1050  }
1051 
1052  if ($moreforfilter) {
1053  print '<div class="liste_titre liste_titre_bydiv centpercent">';
1054  print $moreforfilter;
1055  print '</div>'."\n";
1056  }
1057 
1058  $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1059  $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
1060  // When action is 'reconcile', we force to have the column num_releve always enabled (otherwise we can't make reconciliation).
1061  if ($action == 'reconcile') {
1062  $arrayfields['b.num_releve']['checked'] = 1;
1063  }
1064 
1065  print '<div class="div-table-responsive">';
1066  print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
1067 
1068 
1069  print '<tr class="liste_titre_filter">';
1070  if (!empty($arrayfields['b.rowid']['checked'])) {
1071  print '<td class="liste_titre">';
1072  print '<input type="text" class="flat" name="search_ref" size="2" value="'.dol_escape_htmltag($search_ref).'">';
1073  print '</td>';
1074  }
1075  if (!empty($arrayfields['b.label']['checked'])) {
1076  print '<td class="liste_titre">';
1077  print '<input type="text" class="flat maxwidth100" name="search_description" value="'.dol_escape_htmltag($search_description).'">';
1078  print '</td>';
1079  }
1080  if (!empty($arrayfields['b.dateo']['checked'])) {
1081  print '<td class="liste_titre">&nbsp;</td>';
1082  }
1083  if (!empty($arrayfields['b.datev']['checked'])) {
1084  print '<td class="liste_titre">&nbsp;</td>';
1085  }
1086  if (!empty($arrayfields['type']['checked'])) {
1087  print '<td class="liste_titre" align="center">';
1088  print $form->select_types_paiements(empty($search_type) ? '' : $search_type, 'search_type', '', 2, 1, 1, 0, 1, 'maxwidth100', 1);
1089  print '</td>';
1090  }
1091  // Numero
1092  if (!empty($arrayfields['b.num_chq']['checked'])) {
1093  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>';
1094  }
1095  // Checked
1096  if (!empty($arrayfields['bu.label']['checked'])) {
1097  print '<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_thirdparty" value="'.dol_escape_htmltag($search_thirdparty_user).'"></td>';
1098  }
1099  // Ref
1100  if (!empty($arrayfields['ba.ref']['checked'])) {
1101  print '<td class="liste_titre">';
1102  $form->select_comptes($search_account, 'search_account', 0, '', 1, ($id > 0 || !empty($ref) ? ' disabled="disabled"' : ''), 0, 'maxwidth100');
1103  print '</td>';
1104  }
1105  // Debit
1106  if (!empty($arrayfields['b.debit']['checked'])) {
1107  print '<td class="liste_titre right">';
1108  print '<input type="text" class="flat width50" name="search_debit" value="'.dol_escape_htmltag($search_debit).'">';
1109  print '</td>';
1110  }
1111  // Credit
1112  if (!empty($arrayfields['b.credit']['checked'])) {
1113  print '<td class="liste_titre right">';
1114  print '<input type="text" class="flat width50" name="search_credit" value="'.dol_escape_htmltag($search_credit).'">';
1115  print '</td>';
1116  }
1117  // Balance before
1118  if (!empty($arrayfields['balancebefore']['checked'])) {
1119  print '<td class="liste_titre right">';
1120  $htmltext = $langs->trans("BalanceVisibilityDependsOnSortAndFilters", $langs->transnoentitiesnoconv("DateValue"));
1121  print $form->textwithpicto('', $htmltext, 1);
1122  print '</td>';
1123  }
1124  // Balance
1125  if (!empty($arrayfields['balance']['checked'])) {
1126  print '<td class="liste_titre right">';
1127  $htmltext = $langs->trans("BalanceVisibilityDependsOnSortAndFilters", $langs->transnoentitiesnoconv("DateValue"));
1128  print $form->textwithpicto('', $htmltext, 1);
1129  print '</td>';
1130  }
1131  // Numero statement
1132  if (!empty($arrayfields['b.num_releve']['checked'])) {
1133  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>';
1134  }
1135  // Conciliated
1136  if (!empty($arrayfields['b.conciliated']['checked'])) {
1137  print '<td class="liste_titre" align="center">';
1138  print $form->selectyesno('search_conciliated', $search_conciliated, 1, false, 1, 1);
1139  print '</td>';
1140  }
1141  // Bordereau
1142  if (!empty($arrayfields['b.fk_bordereau']['checked'])) {
1143  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>';
1144  }
1145 
1146  // Actions and select
1147  print '<td class="liste_titre" align="middle">';
1148  $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0, 'checkforselect', 1);
1149  print $searchpicto;
1150  print '</td>';
1151  print "</tr>\n";
1152 
1153  // Fields title
1154  print '<tr class="liste_titre">';
1155  if (!empty($arrayfields['b.rowid']['checked'])) {
1156  print_liste_field_titre($arrayfields['b.rowid']['label'], $_SERVER['PHP_SELF'], 'b.rowid', '', $param, '', $sortfield, $sortorder);
1157  }
1158  if (!empty($arrayfields['b.label']['checked'])) {
1159  print_liste_field_titre($arrayfields['b.label']['label'], $_SERVER['PHP_SELF'], 'b.label', '', $param, '', $sortfield, $sortorder);
1160  }
1161  if (!empty($arrayfields['b.dateo']['checked'])) {
1162  print_liste_field_titre($arrayfields['b.dateo']['label'], $_SERVER['PHP_SELF'], 'b.dateo', '', $param, '', $sortfield, $sortorder, "center ");
1163  }
1164  if (!empty($arrayfields['b.datev']['checked'])) {
1165  print_liste_field_titre($arrayfields['b.datev']['label'], $_SERVER['PHP_SELF'], 'b.datev,b.dateo,b.rowid', '', $param, 'align="center"', $sortfield, $sortorder);
1166  }
1167  if (!empty($arrayfields['type']['checked'])) {
1168  print_liste_field_titre($arrayfields['type']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'align="center"', $sortfield, $sortorder);
1169  }
1170  if (!empty($arrayfields['b.num_chq']['checked'])) {
1171  print_liste_field_titre($arrayfields['b.num_chq']['label'], $_SERVER['PHP_SELF'], 'b.num_chq', '', $param, '', $sortfield, $sortorder, "center ");
1172  }
1173  if (!empty($arrayfields['bu.label']['checked'])) {
1174  print_liste_field_titre($arrayfields['bu.label']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder);
1175  }
1176  if (!empty($arrayfields['ba.ref']['checked'])) {
1177  print_liste_field_titre($arrayfields['ba.ref']['label'], $_SERVER['PHP_SELF'], 'ba.ref', '', $param, '', $sortfield, $sortorder);
1178  }
1179  if (!empty($arrayfields['b.debit']['checked'])) {
1180  print_liste_field_titre($arrayfields['b.debit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, '', $sortfield, $sortorder, "right ");
1181  }
1182  if (!empty($arrayfields['b.credit']['checked'])) {
1183  print_liste_field_titre($arrayfields['b.credit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, '', $sortfield, $sortorder, "right ");
1184  }
1185  if (!empty($arrayfields['balancebefore']['checked'])) {
1186  print_liste_field_titre($arrayfields['balancebefore']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, "right ");
1187  }
1188  if (!empty($arrayfields['balance']['checked'])) {
1189  print_liste_field_titre($arrayfields['balance']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, "right ");
1190  }
1191  if (!empty($arrayfields['b.num_releve']['checked'])) {
1192  print_liste_field_titre($arrayfields['b.num_releve']['label'], $_SERVER['PHP_SELF'], 'b.num_releve', '', $param, '', $sortfield, $sortorder, "center ");
1193  }
1194  if (!empty($arrayfields['b.conciliated']['checked'])) {
1195  print_liste_field_titre($arrayfields['b.conciliated']['label'], $_SERVER['PHP_SELF'], 'b.rappro', '', $param, '', $sortfield, $sortorder, "center ");
1196  }
1197  if (!empty($arrayfields['b.fk_bordereau']['checked'])) {
1198  print_liste_field_titre($arrayfields['b.fk_bordereau']['label'], $_SERVER['PHP_SELF'], 'b.fk_bordereau', '', $param, '', $sortfield, $sortorder, "center ");
1199  }
1200 
1201  // Extra fields
1202  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1203  // Hook fields
1204  $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
1205  $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1206  print $hookmanager->resPrint;
1207  // Actions and select
1208  print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
1209  print "</tr>\n";
1210 
1211  $balance = 0; // For balance
1212  $balancebefore = 0; // For balance
1213  $balancecalculated = false;
1214  $posconciliatecol = 0;
1215  $cachebankaccount = array();
1216 
1217  // Loop on each record
1218  $sign = 1;
1219 
1220  while ($i < min($num, $limit)) {
1221  $objp = $db->fetch_object($resql);
1222  $links = $bankaccountstatic->get_url($objp->rowid);
1223 
1224  // If we are in a situation where we need/can show balance, we calculate the start of balance
1225  if (!$balancecalculated && (!empty($arrayfields['balancebefore']['checked']) || !empty($arrayfields['balance']['checked'])) && ($mode_balance_ok || $search_conciliated === '0')) {
1226  if (!$search_account) {
1227  dol_print_error('', 'account is not defined but $mode_balance_ok is true');
1228  exit;
1229  }
1230 
1231  // Loop on each record before
1232  $sign = 1;
1233  $i = 0;
1234  $sqlforbalance = 'SELECT SUM(b.amount) as previoustotal';
1235  $sqlforbalance .= " FROM ";
1236  $sqlforbalance .= " ".MAIN_DB_PREFIX."bank_account as ba,";
1237  $sqlforbalance .= " ".MAIN_DB_PREFIX."bank as b";
1238  $sqlforbalance .= " WHERE b.fk_account = ba.rowid";
1239  $sqlforbalance .= " AND ba.entity IN (".getEntity('bank_account').")";
1240  $sqlforbalance .= " AND b.fk_account = ".((int) $search_account);
1241  $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."))))";
1242  $resqlforbalance = $db->query($sqlforbalance);
1243  //print $sqlforbalance;
1244  if ($resqlforbalance) {
1245  $objforbalance = $db->fetch_object($resqlforbalance);
1246  if ($objforbalance) {
1247  // If sort is desc,desc,desc then total of previous date + amount is the balancebefore of the previous line before the line to show
1248  if ($sortfield == 'b.datev,b.dateo,b.rowid' && ($sortorder == 'desc' || $sortorder == 'desc,desc' || $sortorder == 'desc,desc,desc')) {
1249  $balancebefore = $objforbalance->previoustotal + ($sign * $objp->amount);
1250  } else {
1251  // If sort is asc,asc,asc then total of previous date is balance of line before the next line to show
1252  $balance = $objforbalance->previoustotal;
1253  }
1254  }
1255  } else {
1256  dol_print_error($db);
1257  }
1258 
1259  $balancecalculated = true;
1260 
1261  // Output a line with start balance
1262  if ($user->rights->banque->consolidate && $action == 'reconcile') {
1263  $tmpnbfieldbeforebalance = 0;
1264  $tmpnbfieldafterbalance = 0;
1265  $balancefieldfound = 0;
1266  foreach ($arrayfields as $key => $val) {
1267  if ($key == 'balancebefore' || $key == 'balance') {
1268  $balancefieldfound++;
1269  continue;
1270  }
1271  if (!empty($arrayfields[$key]['checked'])) {
1272  if (!$balancefieldfound) {
1273  $tmpnbfieldbeforebalance++;
1274  } else {
1275  $tmpnbfieldafterbalance++;
1276  }
1277  }
1278  }
1279  // Extra fields
1280  $element = 'banktransaction';
1281  if (!empty($extrafields->attributes[$element]['label']) && is_array($extrafields->attributes[$element]['label']) && count($extrafields->attributes[$element]['label'])) {
1282  foreach ($extrafields->attributes[$element]['label'] as $key => $val) {
1283  if (!empty($arrayfields["ef.".$key]['checked'])) {
1284  if (!empty($arrayfields[$key]['checked'])) {
1285  if (!$balancefieldfound) {
1286  $tmpnbfieldbeforebalance++;
1287  } else {
1288  $tmpnbfieldafterbalance++;
1289  }
1290  }
1291  }
1292  }
1293  }
1294 
1295  print '<tr class="oddeven trforbreak">';
1296  if ($tmpnbfieldbeforebalance) {
1297  print '<td colspan="'.$tmpnbfieldbeforebalance.'">';
1298  print '&nbsp;';
1299  print '</td>';
1300  }
1301 
1302  if (!empty($arrayfields['balancebefore']['checked'])) {
1303  print '<td class="right">';
1304  if ($search_conciliated !== '0') {
1305  print price(price2num($balance, 'MT'), 1, $langs);
1306  }
1307  print '</td>';
1308  }
1309  if (!empty($arrayfields['balance']['checked'])) {
1310  print '<td class="right">';
1311  if ($search_conciliated !== '0') {
1312  print price(price2num($balance, 'MT'), 1, $langs);
1313  }
1314  print '</td>';
1315  }
1316  if (!empty($arrayfields['b.num_releve']['checked'])) {
1317  print '<td class="center">';
1318  print '<input type="checkbox" id="selectAll" title="'.dol_escape_htmltag($langs->trans("SelectAll")).'" />';
1319  print ' <script type="text/javascript">
1320  $("input#selectAll").change(function() {
1321  $("input[type=checkbox][name^=rowid]").prop("checked", $(this).is(":checked"));
1322  });
1323  </script>';
1324  print '</td>';
1325  }
1326  print '<td colspan="'.($tmpnbfieldafterbalance + 1).'">';
1327  print '&nbsp;';
1328  print '</td>';
1329  print '</tr>';
1330  }
1331  }
1332 
1333  if ($sortfield == 'b.datev,b.dateo,b.rowid' && ($sortorder == 'desc' || $sortorder == 'desc,desc' || $sortorder == 'desc,desc,desc')) {
1334  $balance = price2num($balancebefore, 'MT'); // balance = balancebefore of previous line (sort is desc)
1335  $balancebefore = price2num($balancebefore - ($sign * $objp->amount), 'MT');
1336  } else {
1337  $balancebefore = price2num($balance, 'MT'); // balancebefore = balance of previous line (sort is asc)
1338  $balance = price2num($balance + ($sign * $objp->amount), 'MT');
1339  }
1340 
1341  if (empty($cachebankaccount[$objp->bankid])) {
1342  $bankaccounttmp = new Account($db);
1343  $bankaccounttmp->fetch($objp->bankid);
1344  $cachebankaccount[$objp->bankid] = $bankaccounttmp;
1345  $bankaccount = $bankaccounttmp;
1346  } else {
1347  $bankaccount = $cachebankaccount[$objp->bankid];
1348  }
1349 
1350  if (empty($conf->global->BANK_COLORIZE_MOVEMENT)) {
1351  $backgroundcolor = "class='oddeven'";
1352  } else {
1353  if ($objp->amount < 0) {
1354  $color = '#' . getDolGlobalString('BANK_COLORIZE_MOVEMENT_COLOR1', 'fca955');
1355  $backgroundcolor = 'style="background: '.$color.';"';
1356  } else {
1357  $color = '#' . getDolGlobalString('BANK_COLORIZE_MOVEMENT_COLOR2', '7fdb86');
1358  $backgroundcolor = 'style="background: '.$color.';"';
1359  }
1360  }
1361 
1362  $banklinestatic->id = $objp->rowid;
1363  $banklinestatic->ref = $objp->rowid;
1364 
1365  print '<tr class="oddeven" '.$backgroundcolor.'>';
1366 
1367  // Ref
1368  if (!empty($arrayfields['b.rowid']['checked'])) {
1369  print '<td class="nowrap left">';
1370  print $banklinestatic->getNomUrl(1);
1371  print '</td>';
1372  if (!$i) {
1373  $totalarray['nbfield']++;
1374  }
1375  }
1376 
1377  // Description
1378  if (!empty($arrayfields['b.label']['checked'])) {
1379  $labeltoshow = '';
1380  $titletoshow = '';
1381  $reg = array();
1382  preg_match('/\‍((.+)\‍)/i', $objp->label, $reg); // Si texte entoure de parenthee on tente recherche de traduction
1383  if (!empty($reg[1]) && $langs->trans($reg[1]) != $reg[1]) {
1384  $labeltoshow = $langs->trans($reg[1]);
1385  } else {
1386  if ($objp->label == '(payment_salary)') {
1387  $labeltoshow = $langs->trans("SalaryPayment");
1388  } else {
1389  $labeltoshow = dol_escape_htmltag($objp->label);
1390  $titletoshow = $objp->label;
1391  }
1392  }
1393 
1394 
1395  print '<td class="tdoverflowmax250"'.($titletoshow ? ' title="'.dol_escape_htmltag($titletoshow).'"' : '').'>';
1396 
1397  // Add info about links after description
1398  $cachebankaccount = array();
1399  foreach ($links as $key => $val) {
1400  print '<!-- '.$links[$key]['type'].' -->';
1401  if ($links[$key]['type'] == 'withdraw') {
1402  $banktransferstatic->id = $links[$key]['url_id'];
1403  $banktransferstatic->ref = $links[$key]['label'];
1404  print $banktransferstatic->getNomUrl(0).' ';
1405  } elseif ($links[$key]['type'] == 'payment') {
1406  $paymentstatic->id = $links[$key]['url_id'];
1407  $paymentstatic->ref = $links[$key]['url_id']; // FIXME This is id, not ref of payment
1408  $paymentstatic->date = $db->jdate($objp->do);
1409  print $paymentstatic->getNomUrl(2).' ';
1410  } elseif ($links[$key]['type'] == 'payment_supplier') {
1411  $paymentsupplierstatic->id = $links[$key]['url_id'];
1412  $paymentsupplierstatic->ref = $links[$key]['url_id']; // FIXME This is id, not ref of payment
1413  print $paymentsupplierstatic->getNomUrl(2).' ';
1414  } elseif ($links[$key]['type'] == 'payment_sc') {
1415  $paymentscstatic->id = $links[$key]['url_id'];
1416  $paymentscstatic->ref = $links[$key]['url_id'];
1417  $paymentscstatic->label = $links[$key]['label'];
1418  print $paymentscstatic->getNomUrl(2).' ';
1419  } elseif ($links[$key]['type'] == 'payment_vat') {
1420  $paymentvatstatic->id = $links[$key]['url_id'];
1421  $paymentvatstatic->ref = $links[$key]['url_id'];
1422  print $paymentvatstatic->getNomUrl(2).' ';
1423  } elseif ($links[$key]['type'] == 'payment_salary') {
1424  $paymentsalstatic->id = $links[$key]['url_id'];
1425  $paymentsalstatic->ref = $links[$key]['url_id'];
1426  $paymentsalstatic->label = $links[$key]['label'];
1427  print $paymentsalstatic->getNomUrl(2).' ';
1428  } elseif ($links[$key]['type'] == 'payment_loan') {
1429  print '<a href="'.DOL_URL_ROOT.'/loan/payment/card.php?id='.$links[$key]['url_id'].'">';
1430  print ' '.img_object($langs->trans('ShowPayment'), 'payment').' ';
1431  print '</a> ';
1432  } elseif ($links[$key]['type'] == 'payment_donation') {
1433  $paymentdonationstatic->id = $links[$key]['url_id'];
1434  $paymentdonationstatic->ref = $links[$key]['url_id'];
1435  print $paymentdonationstatic->getNomUrl(2).' ';
1436  } elseif ($links[$key]['type'] == 'payment_expensereport') {
1437  $paymentexpensereportstatic->id = $links[$key]['url_id'];
1438  $paymentexpensereportstatic->ref = $links[$key]['url_id'];
1439  print $paymentexpensereportstatic->getNomUrl(2).' ';
1440  } elseif ($links[$key]['type'] == 'payment_various') {
1441  $paymentvariousstatic->id = $links[$key]['url_id'];
1442  $paymentvariousstatic->ref = $links[$key]['url_id'];
1443  print $paymentvariousstatic->getNomUrl(2).' ';
1444  } elseif ($links[$key]['type'] == 'banktransfert') {
1445  // Do not show link to transfer since there is no transfer card (avoid confusion). Can already be accessed from transaction detail.
1446  if ($objp->amount > 0) {
1447  $banklinestatic->fetch($links[$key]['url_id']);
1448  $bankstatic->id = $banklinestatic->fk_account;
1449  $bankstatic->label = $banklinestatic->bank_account_ref;
1450  print $langs->trans("TransferFrom").' ';
1451  print $bankstatic->getNomUrl(1, 'transactions');
1452  print ' '.$langs->trans("toward").' ';
1453  $bankstatic->id = $objp->bankid;
1454  $bankstatic->label = $objp->bankref;
1455  print $bankstatic->getNomUrl(1, '');
1456  print ' - ';
1457  } else {
1458  $bankstatic->id = $objp->bankid;
1459  $bankstatic->label = $objp->bankref;
1460  print $langs->trans("TransferFrom").' ';
1461  print $bankstatic->getNomUrl(1, '');
1462  print ' '.$langs->trans("toward").' ';
1463  $banklinestatic->fetch($links[$key]['url_id']);
1464  $bankstatic->id = $banklinestatic->fk_account;
1465  $bankstatic->label = $banklinestatic->bank_account_ref;
1466  print $bankstatic->getNomUrl(1, 'transactions');
1467  print ' - ';
1468  }
1469  //var_dump($links);
1470  } elseif ($links[$key]['type'] == 'company') {
1471  } elseif ($links[$key]['type'] == 'user') {
1472  } elseif ($links[$key]['type'] == 'member') {
1473  } elseif ($links[$key]['type'] == 'sc') {
1474  } elseif ($links[$key]['type'] == 'vat') {
1475  } elseif ($links[$key]['type'] == 'salary') {
1476  // Information is already shown using the payment_salary link. No need of this link.
1477  } else {
1478  // Show link with label $links[$key]['label']
1479  print '<a href="'.$links[$key]['url'].$links[$key]['url_id'].'">';
1480  if (preg_match('/^\‍((.*)\‍)$/i', $links[$key]['label'], $reg)) {
1481  // Label generique car entre parentheses. On l'affiche en le traduisant
1482  if ($reg[1] == 'paiement') {
1483  $reg[1] = 'Payment';
1484  }
1485  print $langs->trans($reg[1]);
1486  } else {
1487  print $links[$key]['label'];
1488  }
1489  print '</a>'.($labeltoshow ? ' - ' : '');
1490  }
1491  }
1492 
1493  print $labeltoshow; // Already escaped
1494 
1495  print '</td>';
1496  if (!$i) {
1497  $totalarray['nbfield']++;
1498  }
1499  }
1500 
1501  // Date ope
1502  if (!empty($arrayfields['b.dateo']['checked'])) {
1503  print '<td align="center" class="nowrap">';
1504  print '<span class="spanforajaxedit" id="dateoperation_'.$objp->rowid.'">'.dol_print_date($db->jdate($objp->do), "day")."</span>";
1505  print '&nbsp;';
1506  print '<span class="inline-block">';
1507  print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=doprev&amp;account='.$objp->bankid.'&amp;rowid='.$objp->rowid.'">';
1508  print img_edit_remove()."</a> ";
1509  print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=donext&amp;account='.$objp->bankid.'&amp;rowid='.$objp->rowid.'">';
1510  print img_edit_add()."</a>";
1511  print '</span>';
1512  print "</td>\n";
1513  if (!$i) {
1514  $totalarray['nbfield']++;
1515  }
1516  }
1517 
1518  // Date value
1519  if (!empty($arrayfields['b.datev']['checked'])) {
1520  print '<td align="center" class="nowrap">';
1521  print '<span class="spanforajaxedit" id="datevalue_'.$objp->rowid.'">'.dol_print_date($db->jdate($objp->dv), "day")."</span>";
1522  print '&nbsp;';
1523  print '<span class="inline-block">';
1524  print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=dvprev&amp;account='.$objp->bankid.'&amp;rowid='.$objp->rowid.'">';
1525  print img_edit_remove()."</a> ";
1526  print '<a class="ajaxforbankoperationchange" href="'.$_SERVER['PHP_SELF'].'?action=dvnext&amp;account='.$objp->bankid.'&amp;rowid='.$objp->rowid.'">';
1527  print img_edit_add()."</a>";
1528  print '</span>';
1529  print "</td>\n";
1530  if (!$i) {
1531  $totalarray['nbfield']++;
1532  }
1533  }
1534 
1535  // Payment type
1536  if (!empty($arrayfields['type']['checked'])) {
1537  print '<td class="tdoverflowmax100 center">';
1538  $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);
1539  if ($labeltype == 'SOLD') {
1540  print '&nbsp;'; //$langs->trans("InitialBankBalance");
1541  } else {
1542  print $labeltype;
1543  }
1544  print "</td>\n";
1545  if (!$i) {
1546  $totalarray['nbfield']++;
1547  }
1548  }
1549 
1550  // Num cheque
1551  if (!empty($arrayfields['b.num_chq']['checked'])) {
1552  print '<td class="nowrap" align="center">'.($objp->num_chq ? dol_escape_htmltag($objp->num_chq) : "")."</td>\n";
1553  if (!$i) {
1554  $totalarray['nbfield']++;
1555  }
1556  }
1557 
1558  // Third party
1559  if (!empty($arrayfields['bu.label']['checked'])) {
1560  print '<td class="tdoverflowmax150">';
1561 
1562  $companylinked_id = 0;
1563  $userlinked_id = 0;
1564  $type_link = "";
1565 
1566  //payment line type to define user display and user or company linked
1567  foreach ($links as $key => $value) {
1568  if ($links[$key]['type'] == 'payment_sc') {
1569  $type_link = 'payment_sc';
1570  }
1571  if ($links[$key]['type'] == 'payment_salary') {
1572  $type_link = 'payment_salary';
1573  }
1574 
1575  if ($links[$key]['type'] == 'company') {
1576  $companylinked_id = $links[$key]['url_id'];
1577  }
1578  if ($links[$key]['type'] == 'user') {
1579  $userlinked_id = $links[$key]['url_id'];
1580  }
1581  }
1582 
1583  if ($companylinked_id) {
1584  // TODO Add a cache of loaded companies here ?
1585  $companystatic->fetch($companylinked_id);
1586  print $companystatic->getNomUrl(1);
1587  } elseif ($userlinked_id &&
1588  (($type_link == 'payment_salary' && !empty($user->rights->salaries->read))
1589  || ($type_link == 'payment_sc' && !empty($user->rights->tax->charges->lire)))) {
1590  // Get object user from cache or load it
1591  if (!empty($conf->cache['user'][$userlinked_id])) {
1592  $tmpuser = $conf->cache['user'][$userlinked_id];
1593  } else {
1594  $tmpuser = new User($db);
1595  $tmpuser->fetch($userlinked_id);
1596  $conf->cache['user'][$userlinked_id] = $tmpuser;
1597  }
1598  print $tmpuser->getNomUrl(1);
1599  } else {
1600  print '&nbsp;';
1601  }
1602 
1603  print '</td>';
1604  if (!$i) {
1605  $totalarray['nbfield']++;
1606  }
1607  }
1608 
1609  // Bank account
1610  if (!empty($arrayfields['ba.ref']['checked'])) {
1611  print '<td class="nowrap">';
1612  print $bankaccount->getNomUrl(1);
1613  print "</td>\n";
1614  if (!$i) {
1615  $totalarray['nbfield']++;
1616  }
1617  }
1618 
1619  // Debit
1620  if (!empty($arrayfields['b.debit']['checked'])) {
1621  print '<td class="nowrap right"><span class="amount">';
1622  if ($objp->amount < 0) {
1623  print price($objp->amount * -1);
1624  $totalarray['totaldeb'] += $objp->amount;
1625  }
1626  print "</span></td>\n";
1627  if (!$i) {
1628  $totalarray['nbfield']++;
1629  }
1630  if (!$i) {
1631  $totalarray['totaldebfield'] = $totalarray['nbfield'];
1632  }
1633  }
1634 
1635  // Credit
1636  if (!empty($arrayfields['b.credit']['checked'])) {
1637  print '<td class="nowrap right"><span class="amount">';
1638  if ($objp->amount > 0) {
1639  print price($objp->amount);
1640  $totalarray['totalcred'] += $objp->amount;
1641  }
1642  print "</span></td>\n";
1643  if (!$i) {
1644  $totalarray['nbfield']++;
1645  }
1646  if (!$i) {
1647  $totalarray['totalcredfield'] = $totalarray['nbfield'];
1648  }
1649  }
1650 
1651  // Balance before
1652  if (!empty($arrayfields['balancebefore']['checked'])) {
1653  if ($mode_balance_ok) {
1654  if ($balancebefore >= 0) {
1655  print '<td class="nowrap right">&nbsp;'.price($balancebefore).'</td>';
1656  } else {
1657  print '<td class="error nowrap right">&nbsp;'.price($balancebefore).'</td>';
1658  }
1659  } else {
1660  print '<td class="right">-</td>';
1661  }
1662  if (!$i) {
1663  $totalarray['nbfield']++;
1664  }
1665  }
1666 
1667  // Balance after
1668  if (!empty($arrayfields['balance']['checked'])) {
1669  if ($mode_balance_ok) {
1670  if ($balance >= 0) {
1671  print '<td class="nowrap right">&nbsp;'.price($balance).'</td>';
1672  } else {
1673  print '<td class="error nowrap right">&nbsp;'.price($balance).'</td>';
1674  }
1675  } else {
1676  print '<td class="right">-</td>';
1677  }
1678  if (!$i) {
1679  $totalarray['nbfield']++;
1680  }
1681  }
1682 
1683  if (!empty($arrayfields['b.num_releve']['checked'])) {
1684  print '<td class="nowraponall" align="center">';
1685  // Transaction reconciliated or edit link
1686  if ($bankaccount->canBeConciliated() > 0) {
1687  if ($objp->num_releve) {
1688  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>';
1689  }
1690  if (!$objp->conciliated && $action == 'reconcile') {
1691  if ($objp->num_releve) {
1692  print '&nbsp;';
1693  }
1694  print '<input class="flat" name="rowid['.$objp->rowid.']" type="checkbox" value="'.$objp->rowid.'" size="1"'.(!empty($_POST['rowid'][$objp->rowid]) ? ' checked' : '').'>';
1695  }
1696  }
1697  print '</td>';
1698  if (!$i) {
1699  $totalarray['nbfield']++;
1700  $posconciliatecol = $totalarray['nbfield'];
1701  }
1702  }
1703 
1704  if (!empty($arrayfields['b.conciliated']['checked'])) {
1705  print '<td class="nowraponall" align="center">';
1706  print yn($objp->conciliated);
1707  print '</td>';
1708  if (!$i) {
1709  $totalarray['nbfield']++;
1710  }
1711  }
1712 
1713  if (!empty($arrayfields['b.fk_bordereau']['checked'])) {
1714  $bordereaustatic->fetch($objp->fk_bordereau);
1715  print '<td class="nowraponall" align="center">';
1716  print $bordereaustatic->getNomUrl();
1717  print '</td>';
1718  if (!$i) {
1719  $totalarray['nbfield']++;
1720  }
1721  }
1722 
1723  // Action edit/delete and select
1724  print '<td class="nowraponall" align="center">';
1725  // Transaction reconciliated or edit link
1726  if ($objp->conciliated && $bankaccount->canBeConciliated() > 0) { // If line not conciliated and account can be conciliated
1727  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.'">';
1728  print img_edit();
1729  print '</a>';
1730  } else {
1731  if ($user->rights->banque->modifier || $user->rights->banque->consolidate) {
1732  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.'">';
1733  print img_edit();
1734  print '</a>';
1735  } else {
1736  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.'">';
1737  print img_view();
1738  print '</a>';
1739  }
1740  if ($bankaccount->canBeConciliated() > 0 && empty($objp->conciliated)) {
1741  if ($db->jdate($objp->dv) < ($now - $conf->bank->rappro->warning_delay)) {
1742  print ' '.img_warning($langs->trans("ReconciliationLate"));
1743  }
1744  }
1745  if ($user->rights->banque->modifier) {
1746  print '<a href="'.$_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&rowid='.$objp->rowid.'&page='.$page.$param.($sortfield ? '&sortfield='.$sortfield : '').($sortorder ? '&sortorder='.$sortorder : '').'">';
1747  print img_delete('', 'class="marginleftonly"');
1748  print '</a>';
1749  }
1750  }
1751 
1752  // Action column
1753  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1754  $selected = 0;
1755  if (in_array($obj->rowid, $arrayofselected)) {
1756  $selected = 1;
1757  }
1758  print '<input id="cb'.$obj->rowid.'" class="flat checkforselect marginleftonly" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1759  }
1760  print '</td>';
1761  if (!$i) {
1762  $totalarray['nbfield']++;
1763  }
1764 
1765  print "</tr>";
1766 
1767  $i++;
1768  }
1769 
1770  // Show total line
1771  if (isset($totalarray['totaldebfield']) || isset($totalarray['totalcredfield'])) {
1772  print '<tr class="liste_total">';
1773  $i = 0;
1774  while ($i < $totalarray['nbfield']) {
1775  $i++;
1776  if ($i == 1) {
1777  if ($num < $limit && empty($offset)) {
1778  print '<td class="left">'.$langs->trans("Total").'</td>';
1779  } else {
1780  print '<td class="left tdoverflowmax50" title="'.$langs->trans("Totalforthispage").'">'.$langs->trans("Totalforthispage").'</td>';
1781  }
1782  } elseif ($totalarray['totaldebfield'] == $i) {
1783  print '<td class="right"><span class="amount">'.price(-1 * $totalarray['totaldeb']).'</span></td>';
1784  } elseif ($totalarray['totalcredfield'] == $i) {
1785  print '<td class="right"><span class="amount">'.price($totalarray['totalcred']).'</span></td>';
1786  } elseif ($i == $posconciliatecol) {
1787  print '<td class="center">';
1788  if ($user->rights->banque->consolidate && $action == 'reconcile') {
1789  print '<input class="button" name="confirm_reconcile" type="submit" value="'.$langs->trans("Conciliate").'">';
1790  }
1791  print '</td>';
1792  } else {
1793  print '<td></td>';
1794  }
1795  }
1796  print '</tr>';
1797  }
1798 
1799  // If no record found
1800  if ($num == 0) {
1801  $colspan = 1;
1802  foreach ($arrayfields as $key => $val) {
1803  if (!empty($val['checked'])) {
1804  $colspan++;
1805  }
1806  }
1807  print '<tr><td colspan="'.($colspan + 1).'" class="opacitymedium">'.$langs->trans("NoRecordFound").'</td></tr>';
1808  }
1809 
1810  print "</table>";
1811  print "</div>";
1812 
1813  print '</form>';
1814  $db->free($resql);
1815 } else {
1816  dol_print_error($db);
1817 }
1818 
1819 // End of page
1820 llxFooter();
1821 $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:45
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.