dolibarr  19.0.0-dev
export.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2013-2016 Olivier Geffroy <jeff@jeffinfo.com>
3  * Copyright (C) 2013-2016 Florian Henry <florian.henry@open-concept.pro>
4  * Copyright (C) 2013-2023 Alexandre Spangaro <aspangaro@open-dsi.fr>
5  * Copyright (C) 2022 Lionel Vessiller <lvessiller@open-dsi.fr>
6  * Copyright (C) 2016-2017 Laurent Destailleur <eldy@users.sourceforge.net>
7  * Copyright (C) 2018-2021 Frédéric France <frederic.france@netlogic.fr>
8  * Copyright (C) 2022 Progiseize <a.bisotti@progiseize.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program. If not, see <https://www.gnu.org/licenses/>.
22  */
23 
30 // Load Dolibarr environment
31 require '../../main.inc.php';
32 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancyexport.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
34 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/lettering.class.php';
35 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
37 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
38 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
39 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
40 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
41 require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
42 
43 // Load translation files required by the page
44 $langs->loadLangs(array("accountancy", "compta"));
45 
46 $socid = GETPOST('socid', 'int');
47 
48 $action = GETPOST('action', 'aZ09');
49 $massaction = GETPOST('massaction', 'alpha');
50 $confirm = GETPOST('confirm', 'alpha');
51 $toselect = GETPOST('toselect', 'array');
52 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'bookkeepinglist';
53 $search_mvt_num = GETPOST('search_mvt_num', 'int');
54 $search_doc_type = GETPOST("search_doc_type", 'alpha');
55 $search_doc_ref = GETPOST("search_doc_ref", 'alpha');
56 $search_date_startyear = GETPOST('search_date_startyear', 'int');
57 $search_date_startmonth = GETPOST('search_date_startmonth', 'int');
58 $search_date_startday = GETPOST('search_date_startday', 'int');
59 $search_date_endyear = GETPOST('search_date_endyear', 'int');
60 $search_date_endmonth = GETPOST('search_date_endmonth', 'int');
61 $search_date_endday = GETPOST('search_date_endday', 'int');
62 $search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
63 $search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
64 $search_doc_date = dol_mktime(0, 0, 0, GETPOST('doc_datemonth', 'int'), GETPOST('doc_dateday', 'int'), GETPOST('doc_dateyear', 'int'));
65 $search_date_creation_startyear = GETPOST('search_date_creation_startyear', 'int');
66 $search_date_creation_startmonth = GETPOST('search_date_creation_startmonth', 'int');
67 $search_date_creation_startday = GETPOST('search_date_creation_startday', 'int');
68 $search_date_creation_endyear = GETPOST('search_date_creation_endyear', 'int');
69 $search_date_creation_endmonth = GETPOST('search_date_creation_endmonth', 'int');
70 $search_date_creation_endday = GETPOST('search_date_creation_endday', 'int');
71 $search_date_creation_start = dol_mktime(0, 0, 0, $search_date_creation_startmonth, $search_date_creation_startday, $search_date_creation_startyear);
72 $search_date_creation_end = dol_mktime(23, 59, 59, $search_date_creation_endmonth, $search_date_creation_endday, $search_date_creation_endyear);
73 $search_date_modification_startyear = GETPOST('search_date_modification_startyear', 'int');
74 $search_date_modification_startmonth = GETPOST('search_date_modification_startmonth', 'int');
75 $search_date_modification_startday = GETPOST('search_date_modification_startday', 'int');
76 $search_date_modification_endyear = GETPOST('search_date_modification_endyear', 'int');
77 $search_date_modification_endmonth = GETPOST('search_date_modification_endmonth', 'int');
78 $search_date_modification_endday = GETPOST('search_date_modification_endday', 'int');
79 $search_date_modification_start = dol_mktime(0, 0, 0, $search_date_modification_startmonth, $search_date_modification_startday, $search_date_modification_startyear);
80 $search_date_modification_end = dol_mktime(23, 59, 59, $search_date_modification_endmonth, $search_date_modification_endday, $search_date_modification_endyear);
81 $search_date_export_startyear = GETPOST('search_date_export_startyear', 'int');
82 $search_date_export_startmonth = GETPOST('search_date_export_startmonth', 'int');
83 $search_date_export_startday = GETPOST('search_date_export_startday', 'int');
84 $search_date_export_endyear = GETPOST('search_date_export_endyear', 'int');
85 $search_date_export_endmonth = GETPOST('search_date_export_endmonth', 'int');
86 $search_date_export_endday = GETPOST('search_date_export_endday', 'int');
87 $search_date_export_start = dol_mktime(0, 0, 0, $search_date_export_startmonth, $search_date_export_startday, $search_date_export_startyear);
88 $search_date_export_end = dol_mktime(23, 59, 59, $search_date_export_endmonth, $search_date_export_endday, $search_date_export_endyear);
89 $search_date_validation_startyear = GETPOST('search_date_validation_startyear', 'int');
90 $search_date_validation_startmonth = GETPOST('search_date_validation_startmonth', 'int');
91 $search_date_validation_startday = GETPOST('search_date_validation_startday', 'int');
92 $search_date_validation_endyear = GETPOST('search_date_validation_endyear', 'int');
93 $search_date_validation_endmonth = GETPOST('search_date_validation_endmonth', 'int');
94 $search_date_validation_endday = GETPOST('search_date_validation_endday', 'int');
95 $search_date_validation_start = dol_mktime(0, 0, 0, $search_date_validation_startmonth, $search_date_validation_startday, $search_date_validation_startyear);
96 $search_date_validation_end = dol_mktime(23, 59, 59, $search_date_validation_endmonth, $search_date_validation_endday, $search_date_validation_endyear);
97 $search_import_key = GETPOST("search_import_key", 'alpha');
98 
99 //var_dump($search_date_start);exit;
100 if (GETPOST("button_delmvt_x") || GETPOST("button_delmvt.x") || GETPOST("button_delmvt")) {
101  $action = 'delbookkeepingyear';
102 }
103 if (GETPOST("button_export_file_x") || GETPOST("button_export_file.x") || GETPOST("button_export_file")) {
104  $action = 'export_file';
105 }
106 
107 $search_account_category = GETPOST('search_account_category', 'int');
108 
109 $search_accountancy_code = GETPOST("search_accountancy_code", 'alpha');
110 $search_accountancy_code_start = GETPOST('search_accountancy_code_start', 'alpha');
111 if ($search_accountancy_code_start == - 1) {
112  $search_accountancy_code_start = '';
113 }
114 $search_accountancy_code_end = GETPOST('search_accountancy_code_end', 'alpha');
115 if ($search_accountancy_code_end == - 1) {
116  $search_accountancy_code_end = '';
117 }
118 
119 $search_accountancy_aux_code = GETPOST("search_accountancy_aux_code", 'alpha');
120 $search_accountancy_aux_code_start = GETPOST('search_accountancy_aux_code_start', 'alpha');
121 if ($search_accountancy_aux_code_start == - 1) {
122  $search_accountancy_aux_code_start = '';
123 }
124 $search_accountancy_aux_code_end = GETPOST('search_accountancy_aux_code_end', 'alpha');
125 if ($search_accountancy_aux_code_end == - 1) {
126  $search_accountancy_aux_code_end = '';
127 }
128 $search_mvt_label = GETPOST('search_mvt_label', 'alpha');
129 $search_direction = GETPOST('search_direction', 'alpha');
130 $search_debit = GETPOST('search_debit', 'alpha');
131 $search_credit = GETPOST('search_credit', 'alpha');
132 $search_ledger_code = GETPOST('search_ledger_code', 'array');
133 $search_lettering_code = GETPOST('search_lettering_code', 'alpha');
134 $search_not_reconciled = GETPOST('search_not_reconciled', 'alpha');
135 
136 // Load variable for pagination
137 $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION) ? $conf->liste_limit : $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION);
138 $sortfield = GETPOST('sortfield', 'aZ09comma');
139 $sortorder = GETPOST('sortorder', 'aZ09comma');
140 $optioncss = GETPOST('optioncss', 'alpha');
141 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
142 if (empty($page) || $page < 0) {
143  $page = 0;
144 }
145 $offset = $limit * $page;
146 $pageprev = $page - 1;
147 $pagenext = $page + 1;
148 if ($sortorder == "") {
149  $sortorder = "ASC";
150 }
151 if ($sortfield == "") {
152  $sortfield = "t.piece_num,t.rowid";
153 }
154 
155 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
156 $object = new BookKeeping($db);
157 $hookmanager->initHooks(array('bookkeepingexport'));
158 
159 $formaccounting = new FormAccounting($db);
160 $form = new Form($db);
161 
162 if (!in_array($action, array('export_file', 'delmouv', 'delmouvconfirm')) && !GETPOSTISSET('begin') && !GETPOSTISSET('formfilteraction') && GETPOST('page', 'int') == '' && !GETPOST('noreset', 'int') && $user->hasRight('accounting', 'mouvements', 'export')) {
163  if (empty($search_date_start) && empty($search_date_end) && !GETPOSTISSET('restore_lastsearch_values') && !GETPOST('search_accountancy_code_start')) {
164  $query = "SELECT date_start, date_end from ".MAIN_DB_PREFIX."accounting_fiscalyear ";
165  $query .= " where date_start < '".$db->idate(dol_now())."' and date_end > '".$db->idate(dol_now())."' limit 1";
166  $res = $db->query($query);
167 
168  if ($res->num_rows > 0) {
169  $fiscalYear = $db->fetch_object($res);
170  $search_date_start = strtotime($fiscalYear->date_start);
171  $search_date_end = strtotime($fiscalYear->date_end);
172  } else {
173  $month_start = ($conf->global->SOCIETE_FISCAL_MONTH_START ? ($conf->global->SOCIETE_FISCAL_MONTH_START) : 1);
174  $year_start = dol_print_date(dol_now(), '%Y');
175  if (dol_print_date(dol_now(), '%m') < $month_start) {
176  $year_start--; // If current month is lower that starting fiscal month, we start last year
177  }
178  $year_end = $year_start + 1;
179  $month_end = $month_start - 1;
180  if ($month_end < 1) {
181  $month_end = 12;
182  $year_end--;
183  }
184  $search_date_start = dol_mktime(0, 0, 0, $month_start, 1, $year_start);
185  $search_date_end = dol_get_last_day($year_end, $month_end);
186  }
187  }
188 }
189 
190 
191 $arrayfields = array(
192  't.piece_num'=>array('label'=>$langs->trans("TransactionNumShort"), 'checked'=>1),
193  't.code_journal'=>array('label'=>$langs->trans("Codejournal"), 'checked'=>1),
194  't.doc_date'=>array('label'=>$langs->trans("Docdate"), 'checked'=>1),
195  't.doc_ref'=>array('label'=>$langs->trans("Piece"), 'checked'=>1),
196  't.numero_compte'=>array('label'=>$langs->trans("AccountAccountingShort"), 'checked'=>1),
197  't.subledger_account'=>array('label'=>$langs->trans("SubledgerAccount"), 'checked'=>1),
198  't.label_operation'=>array('label'=>$langs->trans("Label"), 'checked'=>1),
199  't.debit'=>array('label'=>$langs->trans("AccountingDebit"), 'checked'=>1),
200  't.credit'=>array('label'=>$langs->trans("AccountingCredit"), 'checked'=>1),
201  't.lettering_code'=>array('label'=>$langs->trans("LetteringCode"), 'checked'=>1),
202  't.date_creation'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0),
203  't.tms'=>array('label'=>$langs->trans("DateModification"), 'checked'=>0),
204  't.date_export'=>array('label'=>$langs->trans("DateExport"), 'checked'=>1),
205  't.date_validated'=>array('label'=>$langs->trans("DateValidationAndLock"), 'checked'=>1, 'enabled'=>!getDolGlobalString("ACCOUNTANCY_DISABLE_CLOSURE_LINE_BY_LINE")),
206  't.import_key'=>array('label'=>$langs->trans("ImportId"), 'checked'=>0, 'position'=>1100),
207 );
208 
209 if (empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) {
210  unset($arrayfields['t.lettering_code']);
211 }
212 
213 $accountancyexport = new AccountancyExport($db);
214 $listofformat = $accountancyexport->getType();
215 $formatexportset = getDolGlobalString('ACCOUNTING_EXPORT_MODELCSV');
216 if (empty($listofformat[$formatexportset])) {
217  $formatexportset = 1;
218 }
219 
220 $error = 0;
221 
222 if (!isModEnabled('accounting')) {
223  accessforbidden();
224 }
225 if ($user->socid > 0) {
226  accessforbidden();
227 }
228 if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
229  accessforbidden();
230 }
231 
232 
233 /*
234  * Actions
235  */
236 
237 $param = '';
238 
239 if (GETPOST('cancel', 'alpha')) {
240  $action = 'list'; $massaction = '';
241 }
242 if (!GETPOST('confirmmassaction', 'alpha')) {
243  $massaction = '';
244 }
245 
246 $parameters = array('socid'=>$socid);
247 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
248 if ($reshook < 0) {
249  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
250 }
251 
252 if (empty($reshook)) {
253  include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
254 
255  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
256  $search_mvt_num = '';
257  $search_doc_type = '';
258  $search_doc_ref = '';
259  $search_doc_date = '';
260  $search_account_category = '';
261  $search_accountancy_code = '';
262  $search_accountancy_code_start = '';
263  $search_accountancy_code_end = '';
264  $search_accountancy_aux_code = '';
265  $search_accountancy_aux_code_start = '';
266  $search_accountancy_aux_code_end = '';
267  $search_mvt_label = '';
268  $search_direction = '';
269  $search_ledger_code = array();
270  $search_date_startyear = '';
271  $search_date_startmonth = '';
272  $search_date_startday = '';
273  $search_date_endyear = '';
274  $search_date_endmonth = '';
275  $search_date_endday = '';
276  $search_date_start = '';
277  $search_date_end = '';
278  $search_date_creation_startyear = '';
279  $search_date_creation_startmonth = '';
280  $search_date_creation_startday = '';
281  $search_date_creation_endyear = '';
282  $search_date_creation_endmonth = '';
283  $search_date_creation_endday = '';
284  $search_date_creation_start = '';
285  $search_date_creation_end = '';
286  $search_date_modification_startyear = '';
287  $search_date_modification_startmonth = '';
288  $search_date_modification_startday = '';
289  $search_date_modification_endyear = '';
290  $search_date_modification_endmonth = '';
291  $search_date_modification_endday = '';
292  $search_date_modification_start = '';
293  $search_date_modification_end = '';
294  $search_date_export_startyear = '';
295  $search_date_export_startmonth = '';
296  $search_date_export_startday = '';
297  $search_date_export_endyear = '';
298  $search_date_export_endmonth = '';
299  $search_date_export_endday = '';
300  $search_date_export_start = '';
301  $search_date_export_end = '';
302  $search_date_validation_startyear = '';
303  $search_date_validation_startmonth = '';
304  $search_date_validation_startday = '';
305  $search_date_validation_endyear = '';
306  $search_date_validation_endmonth = '';
307  $search_date_validation_endday = '';
308  $search_date_validation_start = '';
309  $search_date_validation_end = '';
310  $search_debit = '';
311  $search_credit = '';
312  $search_lettering_code = '';
313  $search_not_reconciled = '';
314  $search_import_key = '';
315  $toselect = array();
316  }
317 
318  // Must be after the remove filter action, before the export.
319  $filter = array();
320  if (!empty($search_date_start)) {
321  $filter['t.doc_date>='] = $search_date_start;
322  $tmp = dol_getdate($search_date_start);
323  $param .= '&search_date_startmonth='.urlencode($tmp['mon']).'&search_date_startday='.urlencode($tmp['mday']).'&search_date_startyear='.urlencode($tmp['year']);
324  }
325  if (!empty($search_date_end)) {
326  $filter['t.doc_date<='] = $search_date_end;
327  $tmp = dol_getdate($search_date_end);
328  $param .= '&search_date_endmonth='.urlencode($tmp['mon']).'&search_date_endday='.urlencode($tmp['mday']).'&search_date_endyear='.urlencode($tmp['year']);
329  }
330  if (!empty($search_doc_date)) {
331  $filter['t.doc_date'] = $search_doc_date;
332  $tmp = dol_getdate($search_doc_date);
333  $param .= '&doc_datemonth='.urlencode($tmp['mon']).'&doc_dateday='.urlencode($tmp['mday']).'&doc_dateyear='.urlencode($tmp['year']);
334  }
335  if (!empty($search_doc_type)) {
336  $filter['t.doc_type'] = $search_doc_type;
337  $param .= '&search_doc_type='.urlencode($search_doc_type);
338  }
339  if (!empty($search_doc_ref)) {
340  $filter['t.doc_ref'] = $search_doc_ref;
341  $param .= '&search_doc_ref='.urlencode($search_doc_ref);
342  }
343  if ($search_account_category != '-1' && !empty($search_account_category)) {
344  require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancycategory.class.php';
345  $accountingcategory = new AccountancyCategory($db);
346 
347  $listofaccountsforgroup = $accountingcategory->getCptsCat(0, 'fk_accounting_category = '.((int) $search_account_category));
348  $listofaccountsforgroup2 = array();
349  if (is_array($listofaccountsforgroup)) {
350  foreach ($listofaccountsforgroup as $tmpval) {
351  $listofaccountsforgroup2[] = "'".$db->escape($tmpval['id'])."'";
352  }
353  }
354  $filter['t.search_accounting_code_in'] = join(',', $listofaccountsforgroup2);
355  $param .= '&search_account_category='.urlencode($search_account_category);
356  }
357  if (!empty($search_accountancy_code)) {
358  $filter['t.numero_compte'] = $search_accountancy_code;
359  $param .= '&search_accountancy_code='.urlencode($search_accountancy_code);
360  }
361  if (!empty($search_accountancy_code_start)) {
362  $filter['t.numero_compte>='] = $search_accountancy_code_start;
363  $param .= '&search_accountancy_code_start='.urlencode($search_accountancy_code_start);
364  }
365  if (!empty($search_accountancy_code_end)) {
366  $filter['t.numero_compte<='] = $search_accountancy_code_end;
367  $param .= '&search_accountancy_code_end='.urlencode($search_accountancy_code_end);
368  }
369  if (!empty($search_accountancy_aux_code)) {
370  $filter['t.subledger_account'] = $search_accountancy_aux_code;
371  $param .= '&search_accountancy_aux_code='.urlencode($search_accountancy_aux_code);
372  }
373  if (!empty($search_accountancy_aux_code_start)) {
374  $filter['t.subledger_account>='] = $search_accountancy_aux_code_start;
375  $param .= '&search_accountancy_aux_code_start='.urlencode($search_accountancy_aux_code_start);
376  }
377  if (!empty($search_accountancy_aux_code_end)) {
378  $filter['t.subledger_account<='] = $search_accountancy_aux_code_end;
379  $param .= '&search_accountancy_aux_code_end='.urlencode($search_accountancy_aux_code_end);
380  }
381  if (!empty($search_mvt_label)) {
382  $filter['t.label_operation'] = $search_mvt_label;
383  $param .= '&search_mvt_label='.urlencode($search_mvt_label);
384  }
385  if (!empty($search_direction)) {
386  $filter['t.sens'] = $search_direction;
387  $param .= '&search_direction='.urlencode($search_direction);
388  }
389  if (!empty($search_ledger_code)) {
390  $filter['t.code_journal'] = $search_ledger_code;
391  foreach ($search_ledger_code as $code) {
392  $param .= '&search_ledger_code[]='.urlencode($code);
393  }
394  }
395  if (!empty($search_mvt_num)) {
396  $filter['t.piece_num'] = $search_mvt_num;
397  $param .= '&search_mvt_num='.urlencode($search_mvt_num);
398  }
399  if (!empty($search_date_creation_start)) {
400  $filter['t.date_creation>='] = $search_date_creation_start;
401  $tmp = dol_getdate($search_date_creation_start);
402  $param .= '&search_date_creation_startmonth='.urlencode($tmp['mon']).'&search_date_creation_startday='.urlencode($tmp['mday']).'&search_date_creation_startyear='.urlencode($tmp['year']);
403  }
404  if (!empty($search_date_creation_end)) {
405  $filter['t.date_creation<='] = $search_date_creation_end;
406  $tmp = dol_getdate($search_date_creation_end);
407  $param .= '&search_date_creation_endmonth='.urlencode($tmp['mon']).'&search_date_creation_endday='.urlencode($tmp['mday']).'&search_date_creation_endyear='.urlencode($tmp['year']);
408  }
409  if (!empty($search_date_modification_start)) {
410  $filter['t.tms>='] = $search_date_modification_start;
411  $tmp = dol_getdate($search_date_modification_start);
412  $param .= '&search_date_modification_startmonth='.urlencode($tmp['mon']).'&search_date_modification_startday='.urlencode($tmp['mday']).'&search_date_modification_startyear='.urlencode($tmp['year']);
413  }
414  if (!empty($search_date_modification_end)) {
415  $filter['t.tms<='] = $search_date_modification_end;
416  $tmp = dol_getdate($search_date_modification_end);
417  $param .= '&search_date_modification_endmonth='.urlencode($tmp['mon']).'&search_date_modification_endday='.urlencode($tmp['mday']).'&search_date_modification_endyear='.urlencode($tmp['year']);
418  }
419  if (!empty($search_date_export_start)) {
420  $filter['t.date_export>='] = $search_date_export_start;
421  $tmp = dol_getdate($search_date_export_start);
422  $param .= '&search_date_export_startmonth='.urlencode($tmp['mon']).'&search_date_export_startday='.urlencode($tmp['mday']).'&search_date_export_startyear='.urlencode($tmp['year']);
423  }
424  if (!empty($search_date_export_end)) {
425  $filter['t.date_export<='] = $search_date_export_end;
426  $tmp = dol_getdate($search_date_export_end);
427  $param .= '&search_date_export_endmonth='.urlencode($tmp['mon']).'&search_date_export_endday='.urlencode($tmp['mday']).'&search_date_export_endyear='.urlencode($tmp['year']);
428  }
429  if (!empty($search_date_validation_start)) {
430  $filter['t.date_validated>='] = $search_date_validation_start;
431  $tmp = dol_getdate($search_date_validation_start);
432  $param .= '&search_date_validation_startmonth='.urlencode($tmp['mon']).'&search_date_validation_startday='.urlencode($tmp['mday']).'&search_date_validation_startyear='.urlencode($tmp['year']);
433  }
434  if (!empty($search_date_validation_end)) {
435  $filter['t.date_validated<='] = $search_date_validation_end;
436  $tmp = dol_getdate($search_date_validation_end);
437  $param .= '&search_date_validation_endmonth='.urlencode($tmp['mon']).'&search_date_validation_endday='.urlencode($tmp['mday']).'&search_date_validation_endyear='.urlencode($tmp['year']);
438  }
439  if (!empty($search_debit)) {
440  $filter['t.debit'] = $search_debit;
441  $param .= '&search_debit='.urlencode($search_debit);
442  }
443  if (!empty($search_credit)) {
444  $filter['t.credit'] = $search_credit;
445  $param .= '&search_credit='.urlencode($search_credit);
446  }
447  if (!empty($search_lettering_code)) {
448  $filter['t.lettering_code'] = $search_lettering_code;
449  $param .= '&search_lettering_code='.urlencode($search_lettering_code);
450  }
451  if (!empty($search_not_reconciled)) {
452  $filter['t.reconciled_option'] = $search_not_reconciled;
453  $param .= '&search_not_reconciled='.urlencode($search_not_reconciled);
454  }
455  if (!empty($search_import_key)) {
456  $filter['t.import_key'] = $search_import_key;
457  $param .= '&search_import_key='.urlencode($search_import_key);
458  }
459 
460  if ($action == 'setreexport') {
461  $setreexport = GETPOST('value', 'int');
462  if (!dolibarr_set_const($db, "ACCOUNTING_REEXPORT", $setreexport, 'yesno', 0, '', $conf->entity)) {
463  $error++;
464  }
465 
466  if (!$error) {
467  if (empty($conf->global->ACCOUNTING_REEXPORT)) {
468  setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsDisable"), null, 'mesgs');
469  } else {
470  setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsEnable"), null, 'warnings');
471  }
472  } else {
473  setEventMessages($langs->trans("Error"), null, 'errors');
474  }
475  }
476 
477  // Mass actions
478  $objectclass = 'Bookkeeping';
479  $objectlabel = 'Bookkeeping';
480  $permissiontoread = $user->hasRight('societe', 'lire');
481  $permissiontodelete = $user->hasRight('societe', 'supprimer');
482  $permissiontoadd = $user->hasRight('societe', 'creer');
483  $uploaddir = $conf->societe->dir_output;
484  include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
485 }
486 
487 // Build and execute select (used by page and export action)
488 // must de set after the action that set $filter
489 // --------------------------------------------------------------------
490 
491 $sql = 'SELECT';
492 $sql .= ' t.rowid,';
493 $sql .= " t.doc_date,";
494 $sql .= " t.doc_type,";
495 $sql .= " t.doc_ref,";
496 $sql .= " t.fk_doc,";
497 $sql .= " t.fk_docdet,";
498 $sql .= " t.thirdparty_code,";
499 $sql .= " t.subledger_account,";
500 $sql .= " t.subledger_label,";
501 $sql .= " t.numero_compte,";
502 $sql .= " t.label_compte,";
503 $sql .= " t.label_operation,";
504 $sql .= " t.debit,";
505 $sql .= " t.credit,";
506 $sql .= " t.lettering_code,";
507 $sql .= " t.montant as amount,";
508 $sql .= " t.sens,";
509 $sql .= " t.fk_user_author,";
510 $sql .= " t.import_key,";
511 $sql .= " t.code_journal,";
512 $sql .= " t.journal_label,";
513 $sql .= " t.piece_num,";
514 $sql .= " t.date_creation,";
515 $sql .= " t.tms as date_modification,";
516 $sql .= " t.date_export,";
517 $sql .= " t.date_validated as date_validation,";
518 $sql .= " t.import_key";
519 
520 $sqlfields = $sql; // $sql fields to remove for count total
521 
522 $sql .= ' FROM '.MAIN_DB_PREFIX.$object->table_element.' as t';
523 // Manage filter
524 $sqlwhere = array();
525 if (count($filter) > 0) {
526  foreach ($filter as $key => $value) {
527  if ($key == 't.doc_date') {
528  $sqlwhere[] = $key."='".$db->idate($value)."'";
529  } elseif ($key == 't.doc_date>=' || $key == 't.doc_date<=') {
530  $sqlwhere[] = $key."'".$db->idate($value)."'";
531  } elseif ($key == 't.numero_compte>=' || $key == 't.numero_compte<=' || $key == 't.subledger_account>=' || $key == 't.subledger_account<=') {
532  $sqlwhere[] = $key."'".$db->escape($value)."'";
533  } elseif ($key == 't.fk_doc' || $key == 't.fk_docdet' || $key == 't.piece_num') {
534  $sqlwhere[] = $key.'='.((int) $value);
535  } elseif ($key == 't.subledger_account' || $key == 't.numero_compte') {
536  $sqlwhere[] = $key." LIKE '".$db->escape($value)."%'";
537  } elseif ($key == 't.subledger_account') {
538  $sqlwhere[] = natural_search($key, $value, 0, 1);
539  } elseif ($key == 't.date_creation>=' || $key == 't.date_creation<=') {
540  $sqlwhere[] = $key."'".$db->idate($value)."'";
541  } elseif ($key == 't.tms>=' || $key == 't.tms<=') {
542  $sqlwhere[] = $key."'".$db->idate($value)."'";
543  } elseif ($key == 't.date_export>=' || $key == 't.date_export<=') {
544  $sqlwhere[] = $key."'".$db->idate($value)."'";
545  } elseif ($key == 't.date_validated>=' || $key == 't.date_validated<=') {
546  $sqlwhere[] = $key."'".$db->idate($value)."'";
547  } elseif ($key == 't.credit' || $key == 't.debit') {
548  $sqlwhere[] = natural_search($key, $value, 1, 1);
549  } elseif ($key == 't.reconciled_option') {
550  $sqlwhere[] = 't.lettering_code IS NULL';
551  } elseif ($key == 't.code_journal' && !empty($value)) {
552  if (is_array($value)) {
553  $sqlwhere[] = natural_search("t.code_journal", join(',', $value), 3, 1);
554  } else {
555  $sqlwhere[] = natural_search("t.code_journal", $value, 3, 1);
556  }
557  } elseif ($key == 't.search_accounting_code_in' && !empty($value)) {
558  $sqlwhere[] = 't.numero_compte IN ('.$db->sanitize($value, 1).')';
559  } else {
560  $sqlwhere[] = natural_search($key, $value, 0, 1);
561  }
562  }
563 }
564 $sql .= ' WHERE t.entity IN ('.getEntity('accountancy').')';
565 if (empty($conf->global->ACCOUNTING_REEXPORT)) { // Reexport not enabled (default mode)
566  $sql .= " AND t.date_export IS NULL";
567 }
568 if (count($sqlwhere) > 0) {
569  $sql .= ' AND '.implode(' AND ', $sqlwhere);
570 }
571 //print $sql;
572 
573 
574 // Export into a file with format defined into setup (FEC, CSV, ...)
575 // Must be after definition of $sql
576 if ($action == 'export_fileconfirm' && $user->hasRight('accounting', 'mouvements', 'export')) {
577  // TODO Replace the fetchAll to get all ->line followed by call to ->export(). fetchAll() currently consumes too much memory on large export.
578  // Replace this with the query($sql) and loop on each line to export them.
579  $result = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter, 'AND', (empty($conf->global->ACCOUNTING_REEXPORT) ? 0 : 1));
580 
581  if ($result < 0) {
582  setEventMessages($object->error, $object->errors, 'errors');
583  } else {
584  // Export files then exit
585  $accountancyexport = new AccountancyExport($db);
586 
587  $formatexport = GETPOST('formatexport', 'int');
588  $notexportlettering = GETPOST('notexportlettering', 'alpha');
589 
590  if (!empty($notexportlettering)) {
591  if (is_array($object->lines)) {
592  foreach ($object->lines as $k => $movement) {
593  unset($object->lines[$k]->lettering_code);
594  unset($object->lines[$k]->date_lettering);
595  }
596  }
597  }
598 
599  $notifiedexportdate = GETPOST('notifiedexportdate', 'alpha');
600  $notifiedvalidationdate = GETPOST('notifiedvalidationdate', 'alpha');
601  $withAttachment = !empty(trim(GETPOST('notifiedexportfull', 'alphanohtml'))) ? 1 : 0;
602 
603  // Output data on screen or download
604  $result = $accountancyexport->export($object->lines, $formatexport, $withAttachment);
605 
606  $error = 0;
607  if ($result < 0) {
608  $error++;
609  } else {
610  if (!empty($notifiedexportdate) || !empty($notifiedvalidationdate)) {
611  if (is_array($object->lines)) {
612  dol_syslog("/accountancy/bookkeeping/list.php Function export_file Specify movements as exported", LOG_DEBUG);
613 
614  // Specify as export : update field date_export or date_validated
615  $db->begin();
616 
617  // TODO Merge update for each line into one global using rowid IN (list of movement ids)
618  foreach ($object->lines as $movement) {
619  $now = dol_now();
620 
621  $setfields = '';
622  if (!empty($notifiedexportdate) && empty($movement->date_export)) {
623  $setfields .= ($setfields ? "," : "")." date_export = '".$db->idate($now)."'";
624  }
625  if (!empty($notifiedvalidationdate) && empty($movement->date_validation)) {
626  $setfields .= ($setfields ? "," : "")." date_validated = '".$db->idate($now)."'";
627  }
628 
629  if ($setfields) {
630  $sql = " UPDATE ".MAIN_DB_PREFIX."accounting_bookkeeping";
631  $sql .= " SET ".$setfields;
632  $sql .= " WHERE rowid = ".((int) $movement->id);
633 
634  $result = $db->query($sql);
635  if (!$result) {
636  $error++;
637  break;
638  }
639  }
640  }
641 
642  if (!$error) {
643  $db->commit();
644  } else {
645  $error++;
646  $accountancyexport->errors[] = $langs->trans('NotAllExportedMovementsCouldBeRecordedAsExportedOrValidated');
647  $db->rollback();
648  }
649  }
650  }
651  }
652 
653  if ($error) {
654  setEventMessages('', $accountancyexport->errors, 'errors');
655  header('Location: '.$_SERVER['PHP_SELF']);
656  }
657  exit(); // download or show errors
658  }
659 }
660 
661 
662 /*
663  * View
664  */
665 
666 $formother = new FormOther($db);
667 $formfile = new FormFile($db);
668 
669 $title_page = $langs->trans("Operations").' - '.$langs->trans("ExportAccountancy");
670 
671 // Count total nb of records
672 $nbtotalofrecords = '';
673 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
674  /* The fast and low memory method to get and count full list converts the sql into a sql count */
675  $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
676  $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
677  $resql = $db->query($sqlforcount);
678  if ($resql) {
679  $objforcount = $db->fetch_object($resql);
680  $nbtotalofrecords = $objforcount->nbtotalofrecords;
681  } else {
682  dol_print_error($db);
683  }
684 
685  if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
686  $page = 0;
687  $offset = 0;
688  }
689  $db->free($resql);
690 }
691 
692 // Complete request and execute it with limit
693 $sql .= $db->order($sortfield, $sortorder);
694 if ($limit) {
695  $sql .= $db->plimit($limit + 1, $offset);
696 }
697 
698 $resql = $db->query($sql);
699 if (!$resql) {
700  dol_print_error($db);
701  exit;
702 }
703 
704 $num = $db->num_rows($resql);
705 
706 $arrayofselected = is_array($toselect) ? $toselect : array();
707 
708 // Output page
709 // --------------------------------------------------------------------
710 
711 llxHeader('', $title_page);
712 
713 $formconfirm = '';
714 
715 if ($action == 'export_file') {
716  $form_question = array();
717 
718  $form_question['formatexport'] = array(
719  'name' => 'formatexport',
720  'type' => 'select',
721  'label' => $langs->trans('Modelcsv'), // TODO Use Selectmodelcsv and show a select combo
722  'values' => $listofformat,
723  'default' => $formatexportset,
724  'morecss' => 'minwidth200 maxwidth200'
725  );
726 
727  $form_question['separator0'] = array('name'=>'separator0', 'type'=>'separator');
728 
729  if (getDolGlobalInt("ACCOUNTING_ENABLE_LETTERING")) {
730  // If 1, we check by default.
731  $checked = !empty($conf->global->ACCOUNTING_DEFAULT_NOT_EXPORT_LETTERING) ? 'true' : 'false';
732  $form_question['notexportlettering'] = array(
733  'name' => 'notexportlettering',
734  'type' => 'checkbox',
735  'label' => $langs->trans('NotExportLettering'),
736  'value' => $checked,
737  );
738 
739  $form_question['separator1'] = array('name'=>'separator1', 'type'=>'separator');
740  }
741 
742  // If 1 or not set, we check by default.
743  $checked = (!isset($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_EXPORT_DATE) || !empty($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_EXPORT_DATE));
744  $form_question['notifiedexportdate'] = array(
745  'name' => 'notifiedexportdate',
746  'type' => 'checkbox',
747  'label' => $langs->trans('NotifiedExportDate'),
748  'value' => (!empty($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_EXPORT_DATE) ? 'false' : 'true'),
749  );
750 
751  $form_question['separator2'] = array('name'=>'separator2', 'type'=>'separator');
752 
753  if (!getDolGlobalString("ACCOUNTANCY_DISABLE_CLOSURE_LINE_BY_LINE")) {
754  // If 0 or not set, we NOT check by default.
755  $checked = (isset($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_VALIDATION_DATE) || !empty($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_VALIDATION_DATE));
756  $form_question['notifiedvalidationdate'] = array(
757  'name' => 'notifiedvalidationdate',
758  'type' => 'checkbox',
759  'label' => $langs->trans('NotifiedValidationDate', $langs->transnoentitiesnoconv("MenuAccountancyClosure")),
760  'value' => $checked,
761  );
762 
763  $form_question['separator3'] = array('name'=>'separator3', 'type'=>'separator');
764  }
765 
766  // add documents in an archive for accountancy export (Quadratus)
767  if (getDolGlobalString('ACCOUNTING_EXPORT_MODELCSV') == AccountancyExport::$EXPORT_TYPE_QUADRATUS) {
768  $form_question['notifiedexportfull'] = array(
769  'name' => 'notifiedexportfull',
770  'type' => 'checkbox',
771  'label' => $langs->trans('NotifiedExportFull'),
772  'value' => 'false',
773  );
774  }
775 
776  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans("ExportFilteredList").'...', $langs->trans('ConfirmExportFile'), 'export_fileconfirm', $form_question, '', 1, 420, 600);
777 }
778 
779 // Print form confirm
780 print $formconfirm;
781 
782 //$param=''; param started before
783 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
784  $param .= '&contextpage='.urlencode($contextpage);
785 }
786 if ($limit > 0 && $limit != $conf->liste_limit) {
787  $param .= '&limit='.urlencode($limit);
788 }
789 
790 // List of mass actions available
791 $arrayofmassactions = array();
792 $massactionbutton = $form->selectMassAction($massaction, $arrayofmassactions);
793 
794 print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">';
795 print '<input type="hidden" name="token" value="'.newToken().'">';
796 print '<input type="hidden" name="action" value="list">';
797 if ($optioncss != '') {
798  print '<input type="hidden" name="optioncss" value="'.urlencode($optioncss).'">';
799 }
800 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
801 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
802 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
803 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
804 
805 if (count($filter)) {
806  $buttonLabel = $langs->trans("ExportFilteredList");
807 } else {
808  $buttonLabel = $langs->trans("ExportList");
809 }
810 
811 $parameters = array('param' => $param);
812 $reshook = $hookmanager->executeHooks('addMoreActionsButtonsList', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
813 if ($reshook < 0) {
814  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
815 }
816 
817 $newcardbutton = empty($hookmanager->resPrint) ? '' : $hookmanager->resPrint;
818 if (empty($reshook)) {
819  // Button re-export
820  if (empty($conf->global->ACCOUNTING_REEXPORT)) {
821  $newcardbutton .= '<a class="valignmiddle" href="'.$_SERVER['PHP_SELF'].'?action=setreexport&token='.newToken().'&value=1'.($param ? '&'.$param : '').'&sortfield='.urlencode($sortfield).'&sortorder='.urlencode($sortorder).'">'.img_picto($langs->trans("ClickToShowAlreadyExportedLines"), 'switch_off', 'class="small size15x valignmiddle"');
822  $newcardbutton .= '<span class="valignmiddle marginrightonly paddingleft">'.$langs->trans("ClickToShowAlreadyExportedLines").'</span>';
823  $newcardbutton .= '</a>';
824  } else {
825  $newcardbutton .= '<a class="valignmiddle" href="'.$_SERVER['PHP_SELF'].'?action=setreexport&token='.newToken().'&value=0'.($param ? '&'.$param : '').'&sortfield='.urlencode($sortfield).'&sortorder='.urlencode($sortorder).'">'.img_picto($langs->trans("DocsAlreadyExportedAreIncluded"), 'switch_on', 'class="warning size15x valignmiddle"');
826  $newcardbutton .= '<span class="valignmiddle marginrightonly paddingleft">'.$langs->trans("DocsAlreadyExportedAreIncluded").'</span>';
827  $newcardbutton .= '</a>';
828  }
829 
830  if ($user->hasRight('accounting', 'mouvements', 'export')) {
831  $newcardbutton .= dolGetButtonTitle($buttonLabel, $langs->trans("ExportFilteredList"), 'fa fa-file-export paddingleft', $_SERVER["PHP_SELF"].'?action=export_file&token='.newToken().($param ? '&'.$param : '').'&sortfield='.urlencode($sortfield).'&sortorder='.urlencode($sortorder), $user->hasRight('accounting', 'mouvements', 'export'));
832  }
833 }
834 
835 print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1);
836 
837 // Not display message when all the list of docs are included
838 if (empty($conf->global->ACCOUNTING_REEXPORT)) {
839  print info_admin($langs->trans("WarningDataDisappearsWhenDataIsExported"), 0, 0, 0, 'hideonsmartphone info');
840 }
841 
842 //$topicmail = "Information";
843 //$modelmail = "accountingbookkeeping";
844 //$objecttmp = new BookKeeping($db);
845 //$trackid = 'bk'.$object->id;
846 include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
847 
848 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
849 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
850 if ($massactionbutton && $contextpage != 'poslist') {
851  $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
852 }
853 
854 $moreforfilter = '';
855 $moreforfilter .= '<div class="divsearchfield">';
856 $moreforfilter .= $langs->trans('AccountingCategory').': ';
857 $moreforfilter .= '<div class="nowrap inline-block">';
858 $moreforfilter .= $formaccounting->select_accounting_category($search_account_category, 'search_account_category', 1, 0, 0, 0);
859 $moreforfilter .= '</div>';
860 $moreforfilter .= '</div>';
861 
862 $parameters = array();
863 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
864 if (empty($reshook)) {
865  $moreforfilter .= $hookmanager->resPrint;
866 } else {
867  $moreforfilter = $hookmanager->resPrint;
868 }
869 
870 print '<div class="liste_titre liste_titre_bydiv centpercent">';
871 print $moreforfilter;
872 print '</div>';
873 
874 print '<div class="div-table-responsive">';
875 print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">';
876 
877 // Filters lines
878 print '<tr class="liste_titre_filter">';
879 // Action column
880 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
881  print '<td class="liste_titre center">';
882  $searchpicto = $form->showFilterButtons('left');
883  print $searchpicto;
884  print '</td>';
885 }
886 // Movement number
887 if (!empty($arrayfields['t.piece_num']['checked'])) {
888  print '<td class="liste_titre"><input type="text" name="search_mvt_num" size="6" value="'.dol_escape_htmltag($search_mvt_num).'"></td>';
889 }
890 // Code journal
891 if (!empty($arrayfields['t.code_journal']['checked'])) {
892  print '<td class="liste_titre center">';
893  print $formaccounting->multi_select_journal($search_ledger_code, 'search_ledger_code', 0, 1, 1, 1, 'small maxwidth75');
894  print '</td>';
895 }
896 // Date document
897 if (!empty($arrayfields['t.doc_date']['checked'])) {
898  print '<td class="liste_titre center">';
899  print '<div class="nowrap">';
900  print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
901  print '</div>';
902  print '<div class="nowrap">';
903  print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
904  print '</div>';
905  print '</td>';
906 }
907 // Ref document
908 if (!empty($arrayfields['t.doc_ref']['checked'])) {
909  print '<td class="liste_titre"><input type="text" name="search_doc_ref" size="8" value="'.dol_escape_htmltag($search_doc_ref).'"></td>';
910 }
911 // Accountancy account
912 if (!empty($arrayfields['t.numero_compte']['checked'])) {
913  print '<td class="liste_titre">';
914  print '<div class="nowrap">';
915  print $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth150', 'account');
916  print '</div>';
917  print '<div class="nowrap">';
918  print $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth150', 'account');
919  print '</div>';
920  print '</td>';
921 }
922 // Subledger account
923 if (!empty($arrayfields['t.subledger_account']['checked'])) {
924  print '<td class="liste_titre">';
925  // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because it does not
926  // use setup of keypress to select thirdparty and this hang browser on large database.
927  if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) {
928  print '<div class="nowrap">';
929  //print $langs->trans('From').' ';
930  print $formaccounting->select_auxaccount($search_accountancy_aux_code_start, 'search_accountancy_aux_code_start', $langs->trans('From'), 'maxwidth250', 'subledgeraccount');
931  print '</div>';
932  print '<div class="nowrap">';
933  print $formaccounting->select_auxaccount($search_accountancy_aux_code_end, 'search_accountancy_aux_code_end', $langs->trans('to'), 'maxwidth250', 'subledgeraccount');
934  print '</div>';
935  } else {
936  print '<input type="text" class="maxwidth75" name="search_accountancy_aux_code" value="'.dol_escape_htmltag($search_accountancy_aux_code).'">';
937  }
938  print '</td>';
939 }
940 // Label operation
941 if (!empty($arrayfields['t.label_operation']['checked'])) {
942  print '<td class="liste_titre">';
943  print '<input type="text" size="7" class="flat" name="search_mvt_label" value="'.dol_escape_htmltag($search_mvt_label).'"/>';
944  print '</td>';
945 }
946 // Debit
947 if (!empty($arrayfields['t.debit']['checked'])) {
948  print '<td class="liste_titre right">';
949  print '<input type="text" class="flat" name="search_debit" size="4" value="'.dol_escape_htmltag($search_debit).'">';
950  print '</td>';
951 }
952 // Credit
953 if (!empty($arrayfields['t.credit']['checked'])) {
954  print '<td class="liste_titre right">';
955  print '<input type="text" class="flat" name="search_credit" size="4" value="'.dol_escape_htmltag($search_credit).'">';
956  print '</td>';
957 }
958 // Lettering code
959 if (!empty($arrayfields['t.lettering_code']['checked'])) {
960  print '<td class="liste_titre center">';
961  print '<input type="text" size="3" class="flat" name="search_lettering_code" value="'.dol_escape_htmltag($search_lettering_code).'"/>';
962  print '<br><span class="nowrap"><input type="checkbox" id="search_not_reconciled" name="search_not_reconciled" value="notreconciled"'.($search_not_reconciled == 'notreconciled' ? ' checked' : '').'><label for="search_not_reconciled">'.$langs->trans("NotReconciled").'</label></span>';
963  print '</td>';
964 }
965 
966 // Fields from hook
967 $parameters = array('arrayfields'=>$arrayfields);
968 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
969 print $hookmanager->resPrint;
970 
971 // Date creation
972 if (!empty($arrayfields['t.date_creation']['checked'])) {
973  print '<td class="liste_titre center">';
974  print '<div class="nowrap">';
975  print $form->selectDate($search_date_creation_start, 'search_date_creation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
976  print '</div>';
977  print '<div class="nowrap">';
978  print $form->selectDate($search_date_creation_end, 'search_date_creation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
979  print '</div>';
980  print '</td>';
981 }
982 // Date modification
983 if (!empty($arrayfields['t.tms']['checked'])) {
984  print '<td class="liste_titre center">';
985  print '<div class="nowrap">';
986  print $form->selectDate($search_date_modification_start, 'search_date_modification_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
987  print '</div>';
988  print '<div class="nowrap">';
989  print $form->selectDate($search_date_modification_end, 'search_date_modification_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
990  print '</div>';
991  print '</td>';
992 }
993 // Date export
994 if (!empty($arrayfields['t.date_export']['checked'])) {
995  print '<td class="liste_titre center">';
996  print '<div class="nowrap">';
997  print $form->selectDate($search_date_export_start, 'search_date_export_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
998  print '</div>';
999  print '<div class="nowrap">';
1000  print $form->selectDate($search_date_export_end, 'search_date_export_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1001  print '</div>';
1002  print '</td>';
1003 }
1004 // Date validation
1005 if (!empty($arrayfields['t.date_validated']['checked'])) {
1006  print '<td class="liste_titre center">';
1007  print '<div class="nowrap">';
1008  print $form->selectDate($search_date_validation_start, 'search_date_validation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1009  print '</div>';
1010  print '<div class="nowrap">';
1011  print $form->selectDate($search_date_validation_end, 'search_date_validation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1012  print '</div>';
1013  print '</td>';
1014 }
1015 if (!empty($arrayfields['t.import_key']['checked'])) {
1016  print '<td class="liste_titre center">';
1017  print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="'.dol_escape_htmltag($search_import_key).'">';
1018  print '</td>';
1019 }
1020 // Action column
1021 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1022  print '<td class="liste_titre center">';
1023  $searchpicto = $form->showFilterButtons();
1024  print $searchpicto;
1025  print '</td>';
1026 }
1027 print "</tr>\n";
1028 
1029 print '<tr class="liste_titre">';
1030 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1031  print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch actioncolumn ');}
1032 if (!empty($arrayfields['t.piece_num']['checked'])) {
1033  print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, "", $sortfield, $sortorder);
1034 }
1035 if (!empty($arrayfields['t.code_journal']['checked'])) {
1036  print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center ');
1037 }
1038 if (!empty($arrayfields['t.doc_date']['checked'])) {
1039  print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1040 }
1041 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1042  print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder);
1043 }
1044 if (!empty($arrayfields['t.numero_compte']['checked'])) {
1045  print_liste_field_titre($arrayfields['t.numero_compte']['label'], $_SERVER['PHP_SELF'], "t.numero_compte", "", $param, "", $sortfield, $sortorder);
1046 }
1047 if (!empty($arrayfields['t.subledger_account']['checked'])) {
1048  print_liste_field_titre($arrayfields['t.subledger_account']['label'], $_SERVER['PHP_SELF'], "t.subledger_account", "", $param, "", $sortfield, $sortorder);
1049 }
1050 if (!empty($arrayfields['t.label_operation']['checked'])) {
1051  print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder);
1052 }
1053 if (!empty($arrayfields['t.debit']['checked'])) {
1054  print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right ');
1055 }
1056 if (!empty($arrayfields['t.credit']['checked'])) {
1057  print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right ');
1058 }
1059 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1060  print_liste_field_titre($arrayfields['t.lettering_code']['label'], $_SERVER['PHP_SELF'], "t.lettering_code", "", $param, '', $sortfield, $sortorder, 'center ');
1061 }
1062 // Hook fields
1063 $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
1064 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1065 print $hookmanager->resPrint;
1066 if (!empty($arrayfields['t.date_creation']['checked'])) {
1067  print_liste_field_titre($arrayfields['t.date_creation']['label'], $_SERVER['PHP_SELF'], "t.date_creation", "", $param, '', $sortfield, $sortorder, 'center ');
1068 }
1069 if (!empty($arrayfields['t.tms']['checked'])) {
1070  print_liste_field_titre($arrayfields['t.tms']['label'], $_SERVER['PHP_SELF'], "t.tms", "", $param, '', $sortfield, $sortorder, 'center ');
1071 }
1072 if (!empty($arrayfields['t.date_export']['checked'])) {
1073  print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export,t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1074 }
1075 if (!empty($arrayfields['t.date_validated']['checked'])) {
1076  print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated,t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1077 }
1078 if (!empty($arrayfields['t.import_key']['checked'])) {
1079  print_liste_field_titre($arrayfields['t.import_key']['label'], $_SERVER["PHP_SELF"], "t.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
1080 }
1081 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1082  print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1083 }
1084 print "</tr>\n";
1085 
1086 
1087 $line = new BookKeepingLine();
1088 
1089 // Loop on record
1090 // --------------------------------------------------------------------
1091 $i = 0;
1092 $totalarray = array();
1093 $totalarray['nbfield'] = 0;
1094 $total_debit = 0;
1095 $total_credit = 0;
1096 $totalarray['val'] = array ();
1097 $totalarray['val']['totaldebit'] = 0;
1098 $totalarray['val']['totalcredit'] = 0;
1099 
1100 while ($i < min($num, $limit)) {
1101  $obj = $db->fetch_object($resql);
1102  if (empty($obj)) {
1103  break; // Should not happen
1104  }
1105 
1106  $line->id = $obj->rowid;
1107  $line->doc_date = $db->jdate($obj->doc_date);
1108  $line->doc_type = $obj->doc_type;
1109  $line->doc_ref = $obj->doc_ref;
1110  $line->fk_doc = $obj->fk_doc;
1111  $line->fk_docdet = $obj->fk_docdet;
1112  $line->thirdparty_code = $obj->thirdparty_code;
1113  $line->subledger_account = $obj->subledger_account;
1114  $line->subledger_label = $obj->subledger_label;
1115  $line->numero_compte = $obj->numero_compte;
1116  $line->label_compte = $obj->label_compte;
1117  $line->label_operation = $obj->label_operation;
1118  $line->debit = $obj->debit;
1119  $line->credit = $obj->credit;
1120  $line->montant = $obj->amount; // deprecated
1121  $line->amount = $obj->amount;
1122  $line->sens = $obj->sens;
1123  $line->lettering_code = $obj->lettering_code;
1124  $line->fk_user_author = $obj->fk_user_author;
1125  $line->import_key = $obj->import_key;
1126  $line->code_journal = $obj->code_journal;
1127  $line->journal_label = $obj->journal_label;
1128  $line->piece_num = $obj->piece_num;
1129  $line->date_creation = $db->jdate($obj->date_creation);
1130  $line->date_modification = $db->jdate($obj->date_modification);
1131  $line->date_export = $db->jdate($obj->date_export);
1132  $line->date_validation = $db->jdate($obj->date_validation);
1133 
1134  $total_debit += $line->debit;
1135  $total_credit += $line->credit;
1136 
1137  print '<tr class="oddeven">';
1138  // Action column
1139  if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1140  print '<td class="nowraponall center">';
1141  if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1142  $selected = 0;
1143  if (in_array($line->id, $arrayofselected)) {
1144  $selected = 1;
1145  }
1146  print '<input id="cb'.$line->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$line->id.'"'.($selected ? ' checked="checked"' : '').' />';
1147  }
1148  print '</td>';
1149  if (!$i) {
1150  $totalarray['nbfield']++;
1151  }
1152  }
1153 
1154  // Piece number
1155  if (!empty($arrayfields['t.piece_num']['checked'])) {
1156  print '<td>';
1157  $object->id = $line->id;
1158  $object->piece_num = $line->piece_num;
1159  print $object->getNomUrl(1, '', 0, '', 1);
1160  print '</td>';
1161  if (!$i) {
1162  $totalarray['nbfield']++;
1163  }
1164  }
1165 
1166  // Journal code
1167  if (!empty($arrayfields['t.code_journal']['checked'])) {
1168  $accountingjournal = new AccountingJournal($db);
1169  $result = $accountingjournal->fetch('', $line->code_journal);
1170  $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal);
1171  print '<td class="center tdoverflowmax150">'.$journaltoshow.'</td>';
1172  if (!$i) {
1173  $totalarray['nbfield']++;
1174  }
1175  }
1176 
1177  // Document date
1178  if (!empty($arrayfields['t.doc_date']['checked'])) {
1179  print '<td class="center">'.dol_print_date($line->doc_date, 'day').'</td>';
1180  if (!$i) {
1181  $totalarray['nbfield']++;
1182  }
1183  }
1184 
1185  // Document ref
1186  if (!empty($arrayfields['t.doc_ref']['checked'])) {
1187  if ($line->doc_type == 'customer_invoice') {
1188  $langs->loadLangs(array('bills'));
1189 
1190  require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1191  $objectstatic = new Facture($db);
1192  $objectstatic->fetch($line->fk_doc);
1193  //$modulepart = 'facture';
1194 
1195  $filename = dol_sanitizeFileName($line->doc_ref);
1196  $filedir = $conf->facture->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1197  $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1198  $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1199  } elseif ($line->doc_type == 'supplier_invoice') {
1200  $langs->loadLangs(array('bills'));
1201 
1202  require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1203  $objectstatic = new FactureFournisseur($db);
1204  $objectstatic->fetch($line->fk_doc);
1205  //$modulepart = 'invoice_supplier';
1206 
1207  $filename = dol_sanitizeFileName($line->doc_ref);
1208  $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($line->fk_doc, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1209  $subdir = get_exdir($objectstatic->id, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1210  $documentlink = $formfile->getDocumentsLink($objectstatic->element, $subdir, $filedir);
1211  } elseif ($line->doc_type == 'expense_report') {
1212  $langs->loadLangs(array('trips'));
1213 
1214  require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
1215  $objectstatic = new ExpenseReport($db);
1216  $objectstatic->fetch($line->fk_doc);
1217  //$modulepart = 'expensereport';
1218 
1219  $filename = dol_sanitizeFileName($line->doc_ref);
1220  $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1221  $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1222  $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1223  } elseif ($line->doc_type == 'bank') {
1224  require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1225  $objectstatic = new AccountLine($db);
1226  $objectstatic->fetch($line->fk_doc);
1227  } else {
1228  // Other type
1229  }
1230 
1231  $labeltoshow = '';
1232  $labeltoshowalt = '';
1233  if ($line->doc_type == 'customer_invoice' || $line->doc_type == 'supplier_invoice' || $line->doc_type == 'expense_report') {
1234  $labeltoshow .= $objectstatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1);
1235  $labeltoshow .= $documentlink;
1236  $labeltoshowalt .= $objectstatic->ref;
1237  } elseif ($line->doc_type == 'bank') {
1238  $labeltoshow .= $objectstatic->getNomUrl(1);
1239  $labeltoshowalt .= $objectstatic->ref;
1240  $bank_ref = strstr($line->doc_ref, '-');
1241  $labeltoshow .= " " . $bank_ref;
1242  $labeltoshowalt .= " " . $bank_ref;
1243  } else {
1244  $labeltoshow .= $line->doc_ref;
1245  $labeltoshowalt .= $line->doc_ref;
1246  }
1247 
1248  print '<td class="nowraponall tdoverflowmax200" title="'.dol_escape_htmltag($labeltoshowalt).'">';
1249  print $labeltoshow;
1250  print "</td>\n";
1251  if (!$i) {
1252  $totalarray['nbfield']++;
1253  }
1254  }
1255 
1256  // Account number
1257  if (!empty($arrayfields['t.numero_compte']['checked'])) {
1258  print '<td>'.length_accountg($line->numero_compte).'</td>';
1259  if (!$i) {
1260  $totalarray['nbfield']++;
1261  }
1262  }
1263 
1264  // Subledger account
1265  if (!empty($arrayfields['t.subledger_account']['checked'])) {
1266  print '<td>'.length_accounta($line->subledger_account).'</td>';
1267  if (!$i) {
1268  $totalarray['nbfield']++;
1269  }
1270  }
1271 
1272  // Label operation
1273  if (!empty($arrayfields['t.label_operation']['checked'])) {
1274  print '<td class="small tdoverflowmax200" title="'.dol_escape_htmltag($line->label_operation).'">'.dol_escape_htmltag($line->label_operation).'</td>';
1275  if (!$i) {
1276  $totalarray['nbfield']++;
1277  }
1278  }
1279 
1280  // Amount debit
1281  if (!empty($arrayfields['t.debit']['checked'])) {
1282  print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
1283  if (!$i) {
1284  $totalarray['nbfield']++;
1285  }
1286  if (!$i) {
1287  $totalarray['pos'][$totalarray['nbfield']] = 'totaldebit';
1288  }
1289  $totalarray['val']['totaldebit'] += $line->debit;
1290  }
1291 
1292  // Amount credit
1293  if (!empty($arrayfields['t.credit']['checked'])) {
1294  print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
1295  if (!$i) {
1296  $totalarray['nbfield']++;
1297  }
1298  if (!$i) {
1299  $totalarray['pos'][$totalarray['nbfield']] = 'totalcredit';
1300  }
1301  $totalarray['val']['totalcredit'] += $line->credit;
1302  }
1303 
1304  // Lettering code
1305  if (!empty($arrayfields['t.lettering_code']['checked'])) {
1306  print '<td class="center">'.$line->lettering_code.'</td>';
1307  if (!$i) {
1308  $totalarray['nbfield']++;
1309  }
1310  }
1311 
1312  // Fields from hook
1313  $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
1314  $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1315  print $hookmanager->resPrint;
1316 
1317  // Creation operation date
1318  if (!empty($arrayfields['t.date_creation']['checked'])) {
1319  print '<td class="center">'.dol_print_date($line->date_creation, 'dayhour', 'tzuserrel').'</td>';
1320  if (!$i) {
1321  $totalarray['nbfield']++;
1322  }
1323  }
1324 
1325  // Modification operation date
1326  if (!empty($arrayfields['t.tms']['checked'])) {
1327  print '<td class="center">'.dol_print_date($line->date_modification, 'dayhour', 'tzuserrel').'</td>';
1328  if (!$i) {
1329  $totalarray['nbfield']++;
1330  }
1331  }
1332 
1333  // Exported operation date
1334  if (!empty($arrayfields['t.date_export']['checked'])) {
1335  print '<td class="center nowraponall">'.dol_print_date($line->date_export, 'dayhour', 'tzuserrel').'</td>';
1336  if (!$i) {
1337  $totalarray['nbfield']++;
1338  }
1339  }
1340 
1341  // Validated operation date
1342  if (!empty($arrayfields['t.date_validated']['checked'])) {
1343  print '<td class="center nowraponall">'.dol_print_date($line->date_validation, 'dayhour', 'tzuserrel').'</td>';
1344  if (!$i) {
1345  $totalarray['nbfield']++;
1346  }
1347  }
1348 
1349  if (!empty($arrayfields['t.import_key']['checked'])) {
1350  print '<td class="tdoverflowmax100">'.$obj->import_key."</td>\n";
1351  if (!$i) {
1352  $totalarray['nbfield']++;
1353  }
1354  }
1355 
1356  // Action column
1357  if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1358  print '<td class="nowraponall center">';
1359  if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1360  $selected = 0;
1361  if (in_array($line->id, $arrayofselected)) {
1362  $selected = 1;
1363  }
1364  print '<input id="cb'.$line->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$line->id.'"'.($selected ? ' checked="checked"' : '').' />';
1365  }
1366  print '</td>';
1367  if (!$i) {
1368  $totalarray['nbfield']++;
1369  }
1370  }
1371 
1372 
1373  print "</tr>\n";
1374 
1375  $i++;
1376 }
1377 
1378 // Show total line
1379 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1380 
1381 // If no record found
1382 if ($num == 0) {
1383  $colspan = 1;
1384  foreach ($arrayfields as $key => $val) {
1385  if (!empty($val['checked'])) {
1386  $colspan++;
1387  }
1388  }
1389  print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1390 }
1391 
1392 $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
1393 $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1394 print $hookmanager->resPrint;
1395 
1396 print "</table>";
1397 print '</div>';
1398 
1399 print '</form>';
1400 
1401 // End of page
1402 llxFooter();
1403 
1404 $db->close();
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
Definition: admin.lib.php:638
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
Class to manage bank transaction lines.
Class to manage categories of an accounting account.
Manage the different format accountancy export.
Class to manage accounting journals.
Class to manage Ledger (General Ledger and Subledger)
Class BookKeepingLine.
Class to manage Trips and Expenses.
Class to manage suppliers invoices.
Class to manage invoices.
Class to manage generation of HTML components for accounting management.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Classe permettant la generation de composants html autre Only common components are here.
if(isModEnabled('facture') && $user->hasRight('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') && $user->hasRight('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:746
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition: date.lib.php:595
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...
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.
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...
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.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
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.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
$formconfirm
if ($action == 'delbookkeepingyear') {
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.