dolibarr  18.0.0-alpha
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 $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 center parentonrightofpage">';
1138  print $form->selectyesno('search_conciliated', $search_conciliated, 1, false, 1, 1, 'search_status onrightofpage maxwidth75');
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();
Societe
Class to manage third parties objects (customers, suppliers, prospects...)
Definition: societe.class.php:50
yn
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
Definition: functions.lib.php:6743
dol_escape_htmltag
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.
Definition: functions.lib.php:1534
llxFooter
llxFooter()
Empty footer.
Definition: wrapper.php:70
ChargeSociales
Classe permettant la gestion des paiements des charges La tva collectee n'est calculee que sur les fa...
Definition: chargesociales.class.php:34
PaymentSalary
Class to manage payments of salaries.
Definition: paymentsalary.class.php:34
$sql
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)) $sql
Social contributions to pay.
Definition: index.php:745
load_fiche_titre
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
Definition: functions.lib.php:5400
GETPOST
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
Definition: functions.lib.php:551
PaymentSocialContribution
Class to manage payments of social contributions.
Definition: paymentsocialcontribution.class.php:33
dol_print_error
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
Definition: functions.lib.php:5031
dol_sort_array
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...
Definition: functions.lib.php:8801
PaymentDonation
Class to manage payments of donations.
Definition: paymentdonation.class.php:30
$form
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
Don
Class to manage donations.
Definition: don.class.php:38
PaymentVAT
Class to manage payments of social contributions.
Definition: paymentvat.class.php:33
FormOther
Classe permettant la generation de composants html autre Only common components are here.
Definition: html.formother.class.php:39
img_edit
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
Definition: functions.lib.php:4576
FormAccounting
Class to manage generation of HTML components for accounting management.
Definition: html.formaccounting.class.php:33
dol_banner_tab
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.
Definition: functions.lib.php:2132
$help_url
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
price2num
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
Definition: functions.lib.php:5876
Loan
Loan.
Definition: loan.class.php:30
dol_print_date
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
Definition: functions.lib.php:2601
img_picto
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
Definition: functions.lib.php:4061
PaymentVarious
Class to manage various payments.
Definition: paymentvarious.class.php:32
Account\TYPE_CASH
const TYPE_CASH
Cash account.
Definition: account.class.php:355
llxHeader
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
BonPrelevement
Class to manage withdrawal receipts.
Definition: bonprelevement.class.php:43
img_delete
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
Definition: functions.lib.php:4616
BankCateg
Class to manage bank categories.
Definition: bankcateg.class.php:29
dolGetButtonTitle
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.
Definition: functions.lib.php:11112
img_edit_add
img_edit_add($titlealt='default', $other='')
Show logo +.
Definition: functions.lib.php:4540
dol_syslog
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
Definition: functions.lib.php:1669
bank_prepare_head
bank_prepare_head(Account $object)
Prepare array with list of tabs.
Definition: bank.lib.php:37
Form\selectarray
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.
Definition: html.form.class.php:8137
print_barre_liste
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.
Definition: functions.lib.php:5453
PaymentExpenseReport
Class to manage payments of expense report.
Definition: paymentexpensereport.class.php:31
Adherent
Class to manage members of a foundation.
Definition: adherent.class.php:46
dol_strlen
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
Definition: functions.lib.php:3923
restrictedArea
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.
Definition: security.lib.php:349
newToken
newToken()
Return the value of token currently saved into session with name 'newtoken'.
Definition: functions.lib.php:11438
dol_get_fiche_end
dol_get_fiche_end($notab=0)
Return tab footer of a card.
Definition: functions.lib.php:2104
isModEnabled
isModEnabled($module)
Is Dolibarr module enabled.
Definition: functions.lib.php:166
dol_get_fiche_head
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
Definition: functions.lib.php:1906
getDolGlobalString
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
Definition: functions.lib.php:101
PaiementFourn
Class to manage payments for supplier invoices.
Definition: paiementfourn.class.php:38
img_edit_remove
img_edit_remove($titlealt='default', $other='')
Show logo -.
Definition: functions.lib.php:4557
User
Class to manage Dolibarr users.
Definition: user.class.php:46
Paiement
Class to manage payments of customer invoices.
Definition: paiement.class.php:42
GETPOSTISSET
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
Definition: functions.lib.php:451
img_view
img_view($titlealt='default', $float=0, $other='class="valignmiddle"')
Show logo view card.
Definition: functions.lib.php:4595
print_liste_field_titre
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
Definition: functions.lib.php:5218
natural_search
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...
Definition: functions.lib.php:9872
ExtraFields
Class to manage standard extra fields.
Definition: extrafields.class.php:39
RemiseCheque
Class to manage cheque delivery receipts.
Definition: remisecheque.class.php:34
Form
Class to manage generation of HTML components Only common components must be here.
Definition: html.form.class.php:52
AccountLine
Class to manage bank transaction lines.
Definition: account.class.php:1873
dol_now
dol_now($mode='auto')
Return date for now.
Definition: functions.lib.php:2982
price
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.
Definition: functions.lib.php:5750
setEventMessages
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
Definition: functions.lib.php:8552
dol_mktime
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...
Definition: functions.lib.php:2894
currentToken
currentToken()
Return the value of token currently saved into session with name 'token'.
Definition: functions.lib.php:11450
$nbtotalofrecords
$nbtotalofrecords
Count total nb of records.
Definition: list.php:329
Account
Class to manage bank accounts.
Definition: account.class.php:40