dolibarr 24.0.2
list.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-2026 Alexandre Spangaro <alexandre@inovea-conseil.com>
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-2025 Frédéric France <frederic.france@free.fr>
8 * Copyright (C) 2022 Progiseize <a.bisotti@progiseiea-conseil.com>
9 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
10 * Copyright (C) 2025 Nicolas Barrouillet <nicolas@pragma-tech.fr>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 3 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
32// Load Dolibarr environment
33require '../../main.inc.php';
41require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
42require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfiscalyear.class.php';
43require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
44require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
45require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
46require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
47require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
48require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
49require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php';
50require_once DOL_DOCUMENT_ROOT.'/accountancy/class/lettering.class.php';
51
52// Load translation files required by the page
53$langs->loadLangs(array("accountancy", "categories", "compta", "other"));
54
55// Get Parameters
56$socid = GETPOSTINT('socid');
57$journal_code = GETPOST('code_journal', 'alpha');
58$account = GETPOST("account", 'int');
59$massdate = dol_mktime(0, 0, 0, GETPOSTINT('massdatemonth'), GETPOSTINT('massdateday'), GETPOSTINT('massdateyear'));
60
61// action+display Parameters
62$action = GETPOST('action', 'aZ09');
63$massaction = GETPOST('massaction', 'alpha');
64$confirm = GETPOST('confirm', 'alpha');
65$toselect = GETPOST('toselect', 'array:int');
66$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php'));
67
68// Search Parameters
69$search_mvt_num = GETPOST('search_mvt_num', 'alpha');
70$search_doc_type = GETPOST("search_doc_type", 'alpha');
71$search_doc_ref = GETPOST("search_doc_ref", 'alpha');
72
73$search_doc_date = GETPOSTDATE('doc_date', 'getpost'); // deprecated. Can use 'search_date_start/end'
74
75$search_date_start = GETPOSTDATE('search_date_start', 'getpost', 'auto', 'search_date_start_accountancy');
76$search_date_end = GETPOSTDATE('search_date_end', 'getpostend', 'auto', 'search_date_end_accountancy');
77
78$search_date_creation_start = GETPOSTDATE('search_date_creation_start', 'getpost');
79$search_date_creation_end = GETPOSTDATE('search_date_creation_end', 'getpostend');
80
81$search_date_modification_start = GETPOSTDATE('search_date_modification_start', 'getpost');
82$search_date_modification_end = GETPOSTDATE('search_date_modification_end', 'getpostend');
83
84$search_date_export_start = GETPOSTDATE('search_date_export_start', 'getpost');
85$search_date_export_end = GETPOSTDATE('search_date_export_end', 'getpostend');
86
87$search_date_validation_start = GETPOSTDATE('search_date_validation_start', 'getpost');
88$search_date_validation_end = GETPOSTDATE('search_date_validation_end', 'getpostend');
89
90// Due date start
91$search_date_due_start_day = GETPOSTINT('search_date_due_start_day');
92$search_date_due_start_month = GETPOSTINT('search_date_due_start_month');
93$search_date_due_start_year = GETPOSTINT('search_date_due_start_year');
94$search_date_due_start = GETPOSTDATE('search_date_due_start_', 'getpost');
95
96// Due date end
97$search_date_due_end_day = GETPOSTINT('search_date_due_end_day');
98$search_date_due_end_month = GETPOSTINT('search_date_due_end_month');
99$search_date_due_end_year = GETPOSTINT('search_date_due_end_year');
100$search_date_due_end = GETPOSTDATE('search_date_due_end_', 'getpostend');
101
102$search_import_key = GETPOST("search_import_key", 'alpha');
103
104$search_account_category = GETPOSTINT('search_account_category');
105
106$search_accountancy_code = GETPOST("search_accountancy_code", 'alpha');
107$search_accountancy_code_start = GETPOST('search_accountancy_code_start', 'alpha');
108if ($search_accountancy_code_start == - 1) {
109 $search_accountancy_code_start = '';
110}
111$search_accountancy_code_end = GETPOST('search_accountancy_code_end', 'alpha');
112if ($search_accountancy_code_end == - 1) {
113 $search_accountancy_code_end = '';
114}
115
116$search_accountancy_aux_code = GETPOST("search_accountancy_aux_code", 'alpha');
117$search_accountancy_aux_code_start = GETPOST('search_accountancy_aux_code_start', 'alpha');
118if ($search_accountancy_aux_code_start == - 1) {
119 $search_accountancy_aux_code_start = '';
120}
121$search_accountancy_aux_code_end = GETPOST('search_accountancy_aux_code_end', 'alpha');
122if ($search_accountancy_aux_code_end == - 1) {
123 $search_accountancy_aux_code_end = '';
124}
125$search_mvt_label = GETPOST('search_mvt_label', 'alpha');
126$search_direction = GETPOST('search_direction', 'alpha');
127$search_debit = GETPOST('search_debit', 'alpha');
128$search_credit = GETPOST('search_credit', 'alpha');
129$search_ledger_code = GETPOST('search_ledger_code', 'array');
130$search_lettering_code = GETPOST('search_lettering_code', 'alpha');
131$search_not_reconciled = GETPOST('search_not_reconciled', 'alpha');
132
133// Load variable for pagination
134$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : getDolGlobalString('ACCOUNTING_LIMIT_LIST_VENTILATION', $conf->liste_limit);
135$sortfield = GETPOST('sortfield', 'aZ09comma');
136$sortorder = GETPOST('sortorder', 'aZ09comma');
137$optioncss = GETPOST('optioncss', 'alpha');
138$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
139if (empty($page) || $page < 0) {
140 $page = 0;
141}
142$offset = $limit * $page;
143$pageprev = $page - 1;
144$pagenext = $page + 1;
145if ($sortorder == "") {
146 $sortorder = "ASC";
147}
148if ($sortfield == "") {
149 $sortfield = "t.piece_num,t.rowid";
150}
151
152// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
153$object = new BookKeeping($db);
154$hookmanager->initHooks(array('bookkeepinglist'));
155
156$formfiscalyear = new FormFiscalYear($db);
157$formaccounting = new FormAccounting($db);
158$form = new Form($db);
159
160if (!in_array($action, array('delmouv', 'delmouvconfirm')) && !GETPOSTISSET('begin') && !GETPOSTISSET('formfilteraction') && GETPOST('page', 'alpha') == '' && !GETPOSTINT('noreset') && $user->hasRight('accounting', 'mouvements', 'export')) {
161 if (empty($search_date_start) && empty($search_date_end) && !GETPOSTISSET('restore_lastsearch_values') && !GETPOST('search_mvt_num') && !GETPOST('search_accountancy_code_start')) {
162 $sql = "SELECT date_start, date_end";
163 $sql .= " FROM ".MAIN_DB_PREFIX."accounting_fiscalyear ";
164 if (getDolGlobalInt('ACCOUNTANCY_FISCALYEAR_DEFAULT')) {
165 $sql .= " WHERE rowid = " . getDolGlobalInt('ACCOUNTANCY_FISCALYEAR_DEFAULT');
166 } else {
167 $sql .= " WHERE date_start < '" . $db->idate(dol_now()) . "' and date_end > '" . $db->idate(dol_now()) . "'";
168 }
169 $sql .= $db->plimit(1);
170 $res = $db->query($sql);
171
172 if ($db->num_rows($res) > 0) {
173 $fiscalYear = $db->fetch_object($res);
174 $search_date_start = strtotime($fiscalYear->date_start);
175 $search_date_end = strtotime($fiscalYear->date_end);
176 } else {
177 $month_start = getDolGlobalInt('SOCIETE_FISCAL_MONTH_START', 1);
178 $year_start = (int) dol_print_date(dol_now(), '%Y');
179 if (dol_print_date(dol_now(), '%m') < $month_start) {
180 $year_start--; // If current month is lower that starting fiscal month, we start last year
181 }
182 $year_end = $year_start + 1;
183 $month_end = $month_start - 1;
184 if ($month_end < 1) {
185 $month_end = 12;
186 $year_end--;
187 }
188 $search_date_start = dol_mktime(0, 0, 0, $month_start, 1, $year_start);
189 $search_date_end = dol_get_last_day($year_end, $month_end);
190 }
191 }
192}
193
194
195$arrayfields = array(
196 't.piece_num' => array('label' => $langs->trans("TransactionNumShort"), 'checked' => '1'),
197 't.code_journal' => array('label' => $langs->trans("Codejournal"), 'checked' => '1'),
198 't.doc_date' => array('label' => $langs->trans("Docdate"), 'checked' => '1'),
199 't.doc_ref' => array('label' => $langs->trans("Piece"), 'checked' => '1'),
200 't.numero_compte' => array('label' => $langs->trans("AccountAccountingShort"), 'checked' => '1'),
201 't.subledger_account' => array('label' => $langs->trans("SubledgerAccount"), 'checked' => '1'),
202 't.label_operation' => array('label' => $langs->trans("Label"), 'checked' => '1'),
203 't.debit' => array('label' => $langs->trans("AccountingDebit"), 'checked' => '1'),
204 't.credit' => array('label' => $langs->trans("AccountingCredit"), 'checked' => '1'),
205 't.lettering_code' => array('label' => $langs->trans("LetteringCode"), 'checked' => '1'),
206 't.date_creation' => array('label' => $langs->trans("DateCreation"), 'checked' => '0'),
207 't.tms' => array('label' => $langs->trans("DateModification"), 'checked' => '0'),
208 't.date_export' => array('label' => $langs->trans("DateExport"), 'checked' => '0'),
209 't.date_validated' => array('label' => $langs->trans("DateValidationAndLock"), 'checked' => '0', 'enabled' => (string) (int) !getDolGlobalString("ACCOUNTANCY_DISABLE_CLOSURE_LINE_BY_LINE")),
210 't.date_lim_reglement' => array('label' => $langs->trans("DateDue"), 'checked' => '0'),
211 't.import_key' => array('label' => $langs->trans("ImportId"), 'checked' => '0', 'position' => 1100),
212);
213// Add hook to complete $arrayfield
214$parameters = array('arrayfields' => &$arrayfields);
215$reshook = $hookmanager->executeHooks('completeArrayFields', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
216
217if (!getDolGlobalString('ACCOUNTING_ENABLE_LETTERING')) {
218 unset($arrayfields['t.lettering_code']);
219}
220
221$error = 0;
222
223if (!isModEnabled('accounting')) {
225}
226if ($user->socid > 0) {
228}
229if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
231}
232
233// Permissions
234$permissiontoread = $user->hasRight('accounting', 'mouvements', 'lire');
235$permissiontoadd = $user->hasRight('accounting', 'mouvements', 'creer');
236$permissiontodelete = $user->hasRight('accounting', 'mouvements', 'supprimer');
237$permissiontoexport = $user->hasRight('accounting', 'mouvements', 'export');
238
239
240/*
241 * Actions
242 */
243
244$param = '';
245$filter = array();
246
247if (GETPOST('cancel', 'alpha')) {
248 $action = 'list';
249 $massaction = '';
250}
251if (!GETPOST('confirmmassaction', 'alpha') &&
252 !in_array($massaction, [
253 'pregeneralunmatchingmanual',
254 'predeletebookkeepingwriting',
255 'preclonebookkeepingwriting',
256 'preassignaccountbookkeepingwriting',
257 'prereturnaccountbookkeepingwriting'
258 ])) {
259 $massaction = '';
260}
261
262$parameters = array('socid' => $socid);
263$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
264if ($reshook < 0) {
265 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
266}
267
268if (empty($reshook)) {
269 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
270
271 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
272 $search_mvt_num = '';
273 $search_doc_type = '';
274 $search_doc_ref = '';
275 $search_doc_date = '';
276 $search_account_category = '';
277 $search_accountancy_code = '';
278 $search_accountancy_code_start = '';
279 $search_accountancy_code_end = '';
280 $search_accountancy_aux_code = '';
281 $search_accountancy_aux_code_start = '';
282 $search_accountancy_aux_code_end = '';
283 $search_mvt_label = '';
284 $search_direction = '';
285 $search_ledger_code = array();
286 $search_date_start = '';
287 $search_date_end = '';
288 $search_date_creation_start = '';
289 $search_date_creation_end = '';
290 $search_date_modification_start = '';
291 $search_date_modification_end = '';
292 $search_date_export_start = '';
293 $search_date_export_end = '';
294 $search_date_validation_start = '';
295 $search_date_validation_end = '';
296 // Due date start
297 $search_date_due_start_day = '';
298 $search_date_due_start_month = '';
299 $search_date_due_start_year = '';
300 $search_date_due_start = '';
301 // Due date end
302 $search_date_due_end_day = '';
303 $search_date_due_end_month = '';
304 $search_date_due_end_year = '';
305 $search_date_due_end = '';
306 $search_debit = '';
307 $search_credit = '';
308 $search_lettering_code = '';
309 $search_not_reconciled = '';
310 $search_import_key = '';
311 $toselect = array();
312 unset($_SESSION['DOLDATE_search_date_start_accountancy_day']);
313 unset($_SESSION['DOLDATE_search_date_start_accountancy_month']);
314 unset($_SESSION['DOLDATE_search_date_start_accountancy_year']);
315 unset($_SESSION['DOLDATE_search_date_end_accountancy_day']);
316 unset($_SESSION['DOLDATE_search_date_end_accountancy_month']);
317 unset($_SESSION['DOLDATE_search_date_end_accountancy_year']);
318 }
319
320 // Must be after the remove filter action, before the export.
321 if (!empty($search_date_start)) {
322 $filter['t.doc_date>='] = $search_date_start;
323 $tmp = dol_getdate($search_date_start);
324 $param .= '&search_date_startmonth='.((int) $tmp['mon']).'&search_date_startday='.((int) $tmp['mday']).'&search_date_startyear='.((int) $tmp['year']);
325 }
326 if (!empty($search_date_end)) {
327 $filter['t.doc_date<='] = $search_date_end;
328 $tmp = dol_getdate($search_date_end);
329 $param .= '&search_date_endmonth='.((int) $tmp['mon']).'&search_date_endday='.((int) $tmp['mday']).'&search_date_endyear='.((int) $tmp['year']);
330 }
331 if (!empty($search_doc_date)) {
332 $filter['t.doc_date'] = $search_doc_date;
333 $tmp = dol_getdate($search_doc_date);
334 $param .= '&doc_datemonth='.((int) $tmp['mon']).'&doc_dateday='.((int) $tmp['mday']).'&doc_dateyear='.((int) $tmp['year']);
335 }
336 if (!empty($search_doc_type)) {
337 $filter['t.doc_type'] = $search_doc_type;
338 $param .= '&search_doc_type='.urlencode($search_doc_type);
339 }
340 if (!empty($search_doc_ref)) {
341 $filter['t.doc_ref'] = $search_doc_ref;
342 $param .= '&search_doc_ref='.urlencode($search_doc_ref);
343 }
344 if ($search_account_category != '-1' && !empty($search_account_category)) {
345 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancycategory.class.php';
346 $accountingcategory = new AccountancyCategory($db);
347
348 $listofaccountsforgroup = $accountingcategory->getCptsCat(0, 'fk_accounting_category = '.((int) $search_account_category));
349 $listofaccountsforgroup2 = array();
350 if (is_array($listofaccountsforgroup)) {
351 foreach ($listofaccountsforgroup as $tmpval) {
352 $listofaccountsforgroup2[] = "'".$db->escape((string) $tmpval['account_number'])."'";
353 }
354 }
355 if (!empty($listofaccountsforgroup2)) {
356 $filter['t.search_accounting_code_in'] = implode(',', $listofaccountsforgroup2);
357 } else {
358 $filter['t.search_accounting_code_in'] = "''";
359 setEventMessages($langs->trans("ThisCategoryHasNoItems"), null, 'warnings');
360 }
361 $param .= '&search_account_category='.urlencode((string) ($search_account_category));
362 }
363 if (!empty($search_accountancy_code)) {
364 $filter['t.numero_compte'] = $search_accountancy_code;
365 $param .= '&search_accountancy_code='.urlencode($search_accountancy_code);
366 }
367 if (!empty($search_accountancy_code_start)) {
368 $filter['t.numero_compte>='] = $search_accountancy_code_start;
369 $param .= '&search_accountancy_code_start='.urlencode($search_accountancy_code_start);
370 }
371 if (!empty($search_accountancy_code_end)) {
372 $filter['t.numero_compte<='] = $search_accountancy_code_end;
373 $param .= '&search_accountancy_code_end='.urlencode($search_accountancy_code_end);
374 }
375 if (!empty($search_accountancy_aux_code)) {
376 $filter['t.subledger_account'] = $search_accountancy_aux_code;
377 $param .= '&search_accountancy_aux_code='.urlencode($search_accountancy_aux_code);
378 }
379 if (!empty($search_accountancy_aux_code_start)) {
380 $filter['t.subledger_account>='] = $search_accountancy_aux_code_start;
381 $param .= '&search_accountancy_aux_code_start='.urlencode($search_accountancy_aux_code_start);
382 }
383 if (!empty($search_accountancy_aux_code_end)) {
384 $filter['t.subledger_account<='] = $search_accountancy_aux_code_end;
385 $param .= '&search_accountancy_aux_code_end='.urlencode($search_accountancy_aux_code_end);
386 }
387 if (!empty($search_mvt_label)) {
388 $filter['t.label_operation'] = $search_mvt_label;
389 $param .= '&search_mvt_label='.urlencode($search_mvt_label);
390 }
391 if (!empty($search_direction)) {
392 $filter['t.sens'] = $search_direction;
393 $param .= '&search_direction='.urlencode($search_direction);
394 }
395 if (!empty($search_ledger_code)) {
396 $filter['t.code_journal'] = $search_ledger_code;
397 foreach ($search_ledger_code as $code) {
398 $param .= '&search_ledger_code[]='.urlencode($code);
399 }
400 }
401 if (!empty($search_mvt_num)) {
402 $filter['t.piece_num'] = $search_mvt_num;
403 $param .= '&search_mvt_num='.urlencode((string) ($search_mvt_num));
404 }
405 if (!empty($search_date_creation_start)) {
406 $filter['t.date_creation>='] = $search_date_creation_start;
407 $tmp = dol_getdate($search_date_creation_start);
408 $param .= '&search_date_creation_startmonth='.((int) $tmp['mon']).'&search_date_creation_startday='.((int) $tmp['mday']).'&search_date_creation_startyear='.((int) $tmp['year']);
409 }
410 if (!empty($search_date_creation_end)) {
411 $filter['t.date_creation<='] = $search_date_creation_end;
412 $tmp = dol_getdate($search_date_creation_end);
413 $param .= '&search_date_creation_endmonth='.((int) $tmp['mon']).'&search_date_creation_endday='.((int) $tmp['mday']).'&search_date_creation_endyear='.((int) $tmp['year']);
414 }
415 if (!empty($search_date_modification_start)) {
416 $filter['t.tms>='] = $search_date_modification_start;
417 $tmp = dol_getdate($search_date_modification_start);
418 $param .= '&search_date_modification_startmonth='.((int) $tmp['mon']).'&search_date_modification_startday='.((int) $tmp['mday']).'&search_date_modification_startyear='.((int) $tmp['year']);
419 }
420 if (!empty($search_date_modification_end)) {
421 $filter['t.tms<='] = $search_date_modification_end;
422 $tmp = dol_getdate($search_date_modification_end);
423 $param .= '&search_date_modification_endmonth='.((int) $tmp['mon']).'&search_date_modification_endday='.((int) $tmp['mday']).'&search_date_modification_endyear='.((int) $tmp['year']);
424 }
425 if (!empty($search_date_export_start)) {
426 $filter['t.date_export>='] = $search_date_export_start;
427 $tmp = dol_getdate($search_date_export_start);
428 $param .= '&search_date_export_startmonth='.((int) $tmp['mon']).'&search_date_export_startday='.((int) $tmp['mday']).'&search_date_export_startyear='.((int) $tmp['year']);
429 }
430 if (!empty($search_date_export_end)) {
431 $filter['t.date_export<='] = $search_date_export_end;
432 $tmp = dol_getdate($search_date_export_end);
433 $param .= '&search_date_export_endmonth='.((int) $tmp['mon']).'&search_date_export_endday='.((int) $tmp['mday']).'&search_date_export_endyear='.((int) $tmp['year']);
434 }
435 if (!empty($search_date_validation_start)) {
436 $filter['t.date_validated>='] = $search_date_validation_start;
437 $tmp = dol_getdate($search_date_validation_start);
438 $param .= '&search_date_validation_startmonth='.((int) $tmp['mon']).'&search_date_validation_startday='.((int) $tmp['mday']).'&search_date_validation_startyear='.((int) $tmp['year']);
439 }
440 if (!empty($search_date_validation_end)) {
441 $filter['t.date_validated<='] = $search_date_validation_end;
442 $tmp = dol_getdate($search_date_validation_end);
443 $param .= '&search_date_validation_endmonth='.((int) $tmp['mon']).'&search_date_validation_endday='.((int) $tmp['mday']).'&search_date_validation_endyear='.((int) $tmp['year']);
444 }
445 // Due date start
446 if (!empty($search_date_due_start)) {
447 $filter['t.date_lim_reglement>='] = $search_date_due_start;
448 $param .= '&search_date_due_start_day='.$search_date_due_start_day.'&search_date_due_start_month='.$search_date_due_start_month.'&search_date_due_start_year='.$search_date_due_start_year;
449 }
450 // Due date end
451 if (!empty($search_date_due_end)) {
452 $filter['t.date_lim_reglement<='] = $search_date_due_end;
453 $param .= '&search_date_due_end_day='.$search_date_due_end_day.'&search_date_due_end_month='.$search_date_due_end_month.'&search_date_due_end_year='.$search_date_due_end_year;
454 }
455 if (!empty($search_debit)) {
456 $filter['t.debit'] = $search_debit;
457 $param .= '&search_debit='.urlencode($search_debit);
458 }
459 if (!empty($search_credit)) {
460 $filter['t.credit'] = $search_credit;
461 $param .= '&search_credit='.urlencode($search_credit);
462 }
463 if (!empty($search_lettering_code)) {
464 $filter['t.lettering_code'] = $search_lettering_code;
465 $param .= '&search_lettering_code='.urlencode($search_lettering_code);
466 }
467 if (!empty($search_not_reconciled)) {
468 $filter['t.reconciled_option'] = $search_not_reconciled;
469 $param .= '&search_not_reconciled='.urlencode($search_not_reconciled);
470 }
471 if (!empty($search_import_key)) {
472 $filter['t.import_key'] = $search_import_key;
473 $param .= '&search_import_key='.urlencode($search_import_key);
474 }
475
476 // Actions
477 if ($action === 'exporttopdf' && $permissiontoadd) {
478 $object->fetchAll('ASC,ASC,ASC', 'code_journal,doc_date,piece_num', 0, 0, $filter);
479 require_once DOL_DOCUMENT_ROOT . '/core/modules/accountancy/doc/pdf_bookkeeping.modules.php';
480 $pdf = new pdf_bookkeeping($db);
481 $pdf->fromDate = $search_date_start;
482 $pdf->toDate = $search_date_end;
483
484 $result = $pdf->write_file($object, $langs);
485
486 if ($result < 0) {
487 setEventMessage($pdf->error, "errors");
488 } else {
489 // Generated PDF is directly sent to the browser
490 exit;
491 }
492 }
493
494 // Mass actions
495 $objectclass = 'Bookkeeping';
496 $objectlabel = 'Bookkeeping';
497 $uploaddir = $conf->societe->dir_output;
498
499 global $error;
501 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
502
503 if (!$error && $action == 'deletebookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'supprimer')) {
504 $db->begin();
505
506 if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
507 $lettering = new Lettering($db);
508 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true);
509 if ($nb_lettering < 0) {
510 setEventMessages('', $lettering->errors, 'errors');
511 $error += 1;
512 }
513 }
514
515 $nbok = 0;
516 $result = 0;
517 if (!$error) {
518 foreach ($toselect as $toselectid) {
519 $result = $object->fetch($toselectid);
520 if ($result > 0 && (!isset($object->date_validation) || $object->date_validation === '')) {
521 $result = $object->deleteMvtNum($object->piece_num);
522 if ($result > 0) {
523 $nbok++;
524 } elseif ($result == 0) {
525 setEventMessages($langs->trans("ErrorBookkeepingDocDateNotOnActiveFiscalPeriod"), null, 'errors');
526 $error += 1;
527 break;
528 } else {
529 setEventMessages($object->error, $object->errors, 'errors');
530 $error += 1;
531 break;
532 }
533 } elseif ($result < 0) {
534 setEventMessages($object->error, $object->errors, 'errors');
535 $error += 1;
536 break;
537 } elseif (isset($object->date_validation) && $object->date_validation != '') {
538 setEventMessages($langs->trans("ValidatedRecordWhereFound"), null, 'errors');
539 $error += 1;
540 break;
541 }
542 }
543 }
544
545 if (!$error) {
546 $db->commit();
547
548 // Message for elements well deleted
549 if ($nbok > 1) {
550 setEventMessages($langs->trans("RecordsDeleted", $nbok), null, 'mesgs');
551 } elseif ($nbok > 0) {
552 setEventMessages($langs->trans("RecordDeleted", $nbok), null, 'mesgs');
553 } else {
554 setEventMessages($langs->trans("NoRecordDeleted"), null, 'mesgs');
555 }
556
557 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
558 exit;
559 } else {
560 $db->rollback();
561 }
562 }
563
564 // massaction cloning
565 if (!$error && $action == 'clonebookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
566 $result = $object->newCloneMass($toselect, $journal_code, $massdate);
567 if ($result == -1) {
568 $error += 1;
569 }
570 if (!$error) {
571 $db->commit();
572 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
573 exit;
574 } else {
575 $db->rollback();
576 }
577 }
578
579 // massaction assign new account
580 if (!$error && $action == 'assignaccountbookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
581 $result = $object->assignAccountMass($toselect, (int) $account);
582 if ($result == -1) {
583 $error += 1;
584 }
585 if (!$error) {
586 $db->commit();
587 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
588 exit();
589 } else {
590 $db->rollback();
591 }
592 }
593
594 // mass action return account
595 if (!$error && $action == 'returnaccountbookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
596 $result = $object->newReturnAccount($toselect, $journal_code, $massdate);
597 if ($result == -1) {
598 $error += 1;
599 }
600 if (!$error) {
601 $db->commit();
602 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
603 exit();
604 } else {
605 $db->rollback();
606 }
607 }
608
609 // mass actions on matching
610 if (!$error && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
611 if ($massaction == 'generalmatchingmanual' && $permissiontoadd) {
612 $lettering = new Lettering($db);
613 $result = $lettering->updateGeneralMatching($toselect);
614 if ($result < 0) {
615 setEventMessages('', $lettering->errors, 'errors');
616 } else {
617 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoMachingModified' : 'AccountancyOneMatchingModifiedSuccessfully'), array(), 'mesgs');
618 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
619 exit();
620 }
621 } elseif ($massaction == 'generalmatchingpartial' && $permissiontoadd) {
622 $lettering = new Lettering($db);
623 $result = $lettering->updateGeneralMatching($toselect, true);
624 if ($result < 0) {
625 setEventMessages('', $lettering->errors, 'errors');
626 } else {
627 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoMachingModified' : 'AccountancyOneMatchingModifiedSuccessfully'), array(), 'mesgs');
628 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
629 exit;
630 }
631 } elseif ($action == 'generalunmatchingmanual' && $confirm == 'yes' && $permissiontodelete) {
632 $lettering = new Lettering($db);
633 $result = $lettering->deleteGeneralMatching($toselect);
634 if ($result < 0) {
635 setEventMessages('', $lettering->errors, 'errors');
636 } else {
637 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoUnmatchingModified' : 'AccountancyOneUnmatchingModifiedSuccessfully'), [], 'mesgs');
638 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
639 exit;
640 }
641 }
642 }
643}
644
645// Build and execute select (used by page and export action)
646// must de set after the action that set $filter
647// --------------------------------------------------------------------
648
649$sql = 'SELECT';
650$sql .= ' t.rowid,';
651$sql .= " t.doc_date,";
652$sql .= " t.doc_type,";
653$sql .= " t.doc_ref,";
654$sql .= " t.fk_doc,";
655$sql .= " t.fk_docdet,";
656$sql .= " t.thirdparty_code,";
657$sql .= " t.subledger_account,";
658$sql .= " t.subledger_label,";
659$sql .= " t.numero_compte,";
660$sql .= " t.label_compte,";
661$sql .= " t.label_operation,";
662$sql .= " t.debit,";
663$sql .= " t.credit,";
664$sql .= " t.lettering_code,";
665$sql .= " t.matching_general,";
666$sql .= " t.montant as amount,";
667$sql .= " t.sens,";
668$sql .= " t.fk_user_author,";
669$sql .= " t.import_key,";
670$sql .= " t.code_journal,";
671$sql .= " t.journal_label,";
672$sql .= " t.piece_num,";
673$sql .= " t.ref,";
674$sql .= " t.date_creation,";
675$sql .= " t.tms as date_modification,";
676$sql .= " t.date_export,";
677$sql .= " t.date_validated as date_validation,";
678$sql .= " t.date_lim_reglement,";
679$sql .= " t.import_key";
680
681$sqlfields = $sql; // $sql fields to remove for count total
682
683$sql .= ' FROM '.MAIN_DB_PREFIX.$object->table_element.' as t';
684// Manage filter
685$sqlwhere = array();
686if (count($filter) > 0) {
687 foreach ($filter as $key => $value) {
688 if ($key == 't.doc_date') {
689 $sqlwhere[] = $db->sanitize($key)." = '".$db->idate($value)."'";
690 } elseif ($key == 't.doc_date>=') {
691 $sqlwhere[] = "t.doc_date >= '".$db->idate($value)."'";
692 } elseif ($key == 't.doc_date<=') {
693 $sqlwhere[] = "t.doc_date <= '".$db->idate($value)."'";
694 } elseif ($key == 't.numero_compte>=') {
695 $sqlwhere[] = "t.numero_compte >= '".$db->escape($value)."'";
696 } elseif ($key == 't.numero_compte<=') {
697 $sqlwhere[] = "t.numero_compte <= '".$db->escape($value)."'";
698 } elseif ($key == 't.subledger_account>=') {
699 $sqlwhere[] = "t.subledger_account >= '".$db->escape($value)."'";
700 } elseif ($key == 't.subledger_account<=') {
701 $sqlwhere[] = "t.subledger_account <= '".$db->escape($value)."'";
702 } elseif ($key == 't.piece_num') {
703 // piece_num is an integer column, a LIKE on it is translated to ILIKE by the pgsql driver and fails
704 $sqlwhere[] = natural_search($key, $value, 1, 1);
705 } elseif ($key == 't.subledger_account' || $key == 't.numero_compte') {
706 $sqlwhere[] = $db->sanitize($key)." LIKE '".$db->escape($db->escapeforlike($value))."%'";
707 /* } elseif ($key == 't.subledger_account') { // test is always false
708 $sqlwhere[] = natural_search($key, $value, 0, 1); */
709 } elseif ($key == 't.tms>=') {
710 $sqlwhere[] = "t.tms >= '".$db->idate($value)."'";
711 } elseif ($key == 't.tms<=') {
712 $sqlwhere[] = "t.tms <= '".$db->idate($value)."'";
713 } elseif ($key == 't.date_creation>=') {
714 $sqlwhere[] = "t.date_creation >= '".$db->idate($value)."'";
715 } elseif ($key == 't.date_creation<=') {
716 $sqlwhere[] = "t.date_creation <= '".$db->idate($value)."'";
717 } elseif ($key == 't.date_export>=') {
718 $sqlwhere[] = "t.date_export >= '".$db->idate($value)."'";
719 } elseif ($key == 't.date_export<=') {
720 $sqlwhere[] = "t.date_export <= '".$db->idate($value)."'";
721 } elseif ($key == 't.date_validated>=') {
722 $sqlwhere[] = "t.date_validated >= '".$db->idate($value)."'";
723 } elseif ($key == 't.date_validated<=') {
724 $sqlwhere[] = "t.date_validated <= '".$db->idate($value)."'";
725 } elseif ($key == 't.date_lim_reglement>=') {
726 $sqlwhere[] = "t.date_lim_reglement >= '".$db->idate($value)."'";
727 } elseif ($key == 't.date_lim_reglement<=') {
728 $sqlwhere[] = "t.date_lim_reglement <= '".$db->idate($value)."'";
729 } elseif ($key == 't.credit' || $key == 't.debit') {
730 $sqlwhere[] = natural_search($key, $value, 1, 1);
731 } elseif ($key == 't.reconciled_option') {
732 $sqlwhere[] = 't.lettering_code IS NULL';
733 } elseif ($key == 't.code_journal' && !empty($value)) { // @phpstan-ignore-line false positive on !empty
734 if (is_array($value)) {
735 $sqlwhere[] = natural_search("t.code_journal", implode(',', $value), 3, 1);
736 } else {
737 $sqlwhere[] = natural_search("t.code_journal", $value, 3, 1);
738 }
739 } elseif ($key == 't.search_accounting_code_in' && !empty($value)) { // @phpstan-ignore-line false positive on !empty
740 $sqlwhere[] = 't.numero_compte IN ('.$db->sanitize($value, 1).')';
741 } else {
742 $sqlwhere[] = natural_search($key, $value, 0, 1);
743 }
744 }
745}
746$sql .= ' WHERE t.entity IN ('.getEntity('accountancy').')';
747
748if (count($sqlwhere) > 0) {
749 $sql .= ' AND '.implode(' AND ', $sqlwhere);
750}
751//print $sql;
752
753/*
754 * View
755 */
756
757$formother = new FormOther($db);
758$formfile = new FormFile($db);
759
760$title_page = $langs->trans("Operations").' - '.$langs->trans("Journals");
761
762// Count total nb of records
763$nbtotalofrecords = '';
764if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
765 /* The fast and low memory method to get and count full list converts the sql into a sql count */
766 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
767 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
768 $resql = $db->query($sqlforcount);
769 if ($resql) {
770 $objforcount = $db->fetch_object($resql);
771 $nbtotalofrecords = $objforcount->nbtotalofrecords;
772 } else {
774 }
775
776 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
777 $page = 0;
778 $offset = 0;
779 }
780 $db->free($resql);
781}
782
783
784// Complete request and execute it with limit
785$sql .= $db->order($sortfield, $sortorder);
786if ($limit) {
787 $sql .= $db->plimit($limit + 1, $offset);
788}
789
790$resql = $db->query($sql);
791if (!$resql) {
793 exit;
794}
795
796$num = $db->num_rows($resql);
797
798$arrayofselected = is_array($toselect) ? $toselect : array();
799
800// Output page
801// --------------------------------------------------------------------
802$help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double';
803llxHeader('', $title_page, $help_url, '', 0, 0, '', '', '', 'mod-accountancy accountancy-consultation page-journal');
804
805$formconfirm = '';
806
807// Print form confirm
808print $formconfirm;
809
810//$param=''; param started before
811if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
812 $param .= '&contextpage='.urlencode($contextpage);
813}
814if ($limit > 0 && $limit != $conf->liste_limit) {
815 $param .= '&limit='.((int) $limit);
816}
817
818// List of mass actions available
819$arrayofmassactions = array();
820if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && $user->hasRight('accounting', 'mouvements', 'creer')) {
821 $arrayofmassactions['generalmatchingmanual'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('GeneralMatchingManual');
822 $arrayofmassactions['generalmatchingpartial'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('GeneralMatchingPartial');
823 $arrayofmassactions['pregeneralunmatchingmanual'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('GeneralUnmatchingManual');
824}
825if ($user->hasRight('accounting', 'mouvements', 'creer')) {
826 $arrayofmassactions['preclonebookkeepingwriting'] = img_picto('', 'clone', 'class="pictofixedwidth"').$langs->trans("Clone");
827}
828if ($user->hasRight('accounting', 'mouvements', 'creer')) {
829 $arrayofmassactions['preassignaccountbookkeepingwriting'] = img_picto('', 'fa-exchange-alt', 'class="pictofixedwidth"').$langs->trans("AssignAccount");
830}
831if ($user->hasRight('accounting', 'mouvements', 'creer')) {
832 $arrayofmassactions['prereturnaccountbookkeepingwriting'] = img_picto('', 'undo', 'class="pictofixedwidth"').$langs->trans("ReturnAccount");
833}
834if ($user->hasRight('accounting', 'mouvements', 'supprimer')) {
835 $arrayofmassactions['predeletebookkeepingwriting'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
836}
837
838if (GETPOSTINT('nomassaction')
839 || in_array($massaction,
840 array(
841 'pregeneralunmatchingmanual',
842 'predeletebookkeepingwriting',
843 'preclonebookkeepingwriting',
844 'preassignaccountbookkeepingwriting',
845 'prereturnaccountbookkeepingwriting'
846 )
847 )) {
848 $arrayofmassactions = array();
849}
850$massactionbutton = $form->selectMassAction($massaction, $arrayofmassactions);
851
852print '<form method="POST" id="searchFormList" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
853print '<input type="hidden" name="token" value="'.newToken().'">';
854print '<input type="hidden" name="action" value="list">';
855if ($optioncss != '') {
856 print '<input type="hidden" name="optioncss" value="'.urlencode($optioncss).'">';
857}
858print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
859print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
860print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
861print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
862
863if (count($filter)) {
864 $buttonLabel = $langs->trans("ExportFilteredList");
865} else {
866 $buttonLabel = $langs->trans("ExportList");
867}
868
869$parameters = array('param' => $param);
870$reshook = $hookmanager->executeHooks('addMoreActionsButtonsList', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
871if ($reshook < 0) {
872 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
873}
874
875$newcardbutton = empty($hookmanager->resPrint) ? '' : $hookmanager->resPrint;
876
877if (empty($reshook)) {
878 $newcardbutton .= dolGetButtonTitle($langs->trans('ViewFlatList'), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?'.$param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected'));
879 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?'.$param, '', 1, array('morecss' => 'marginleftonly'));
880 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?type=sub'.$param, '', 1, array('morecss' => 'marginleftonly'));
881 $newcardbutton .= dolGetButtonTitle($langs->trans('ExportToPdf'), '', 'fa fa-file-pdf paddingleft', $_SERVER['PHP_SELF'] . '?token=' . newToken() . '&action=exporttopdf&' . $param, '', $permissiontoexport, array('morecss' => 'marginleftonly'));
882
883 $url = './card.php?action=create'.(!empty($type) ? '&type=sub' : '').'&backtopage='.urlencode($_SERVER['PHP_SELF']);
884 if (!empty($socid)) {
885 $url .= '&socid='.$socid;
886 }
887 $newcardbutton .= dolGetButtonTitleSeparator();
888 $newcardbutton .= dolGetButtonTitle($langs->trans('NewAccountingMvt'), '', 'fa fa-plus-circle paddingleft', $url, '', $permissiontoadd);
889}
890
891print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1);
892
893if ($massaction == 'pregeneralunmatchingmanual') {
894 print $form->formconfirm($_SERVER['PHP_SELF'], $langs->trans('ConfirmMassGeneralUnmatchingManual'), $langs->trans("ConfirmMassGeneralUnmatchingQuestion", count($toselect)), "generalunmatchingmanual", null, '', 0, 200, 500, 1);
895} elseif ($massaction == 'predeletebookkeepingwriting') {
896 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDeleteBookkeepingWriting"), $langs->trans("ConfirmMassDeleteBookkeepingWritingQuestion", count($toselect)), "deletebookkeepingwriting", null, '', 0, 200, 500, 1);
897} elseif ($massaction == 'preassignaccountbookkeepingwriting') {
898 $input = $formaccounting->select_account('', 'account', 1);
899 $formquestion = array(array('type' => 'other', 'name' => 'account', 'label' => '<span class="fieldrequired">' . $langs->trans("AccountAccountingShort") . '</span>', 'value' => $input),);
900 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("confirmMassAssignAccountBookkeepingWritingConfirm"), $langs->trans("ConfirmMassAssignAccountBookkeepingWritingQuestion", count($toselect)), "assignaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
901} elseif ($massaction == 'preclonebookkeepingwriting') {
902 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
903 $input2 = $formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1) . '</td>';
904 $formquestion = array(
905 array(
906 'type' => 'other',
907 'name' => 'massdate',
908 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>',
909 'value' => $input1
910 )
911 );
912
913 if (getDolGlobalString('ACCOUNTING_CLONING_ENABLE_INPUT_JOURNAL')) {
914 $formquestion[] = array(
915 'type' => 'text',
916 'name' => 'code_journal',
917 'label' => '<span class="fieldrequired">' . $langs->trans("Codejournal") . '</span>',
918 'value' => $input2
919 );
920 }
921
922 print $form->formconfirm(
923 $_SERVER["PHP_SELF"],
924 $langs->trans("ConfirmMassCloneBookkeepingWriting"),
925 $langs->trans("ConfirmMassCloneBookkeepingWritingQuestion", count($toselect)),
926 "clonebookkeepingwriting",
927 $formquestion,
928 '', 0, 200, 500, 1
929 );
930} elseif ($massaction == 'prereturnaccountbookkeepingwriting') {
931 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
932 $formquestion = array(array('type' => 'other', 'name' => 'massdate', 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>', 'value' => $input1));
933 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassReturnAccountBookkeepingWriting"), $langs->trans("ConfirmMassReturnAccountBookkeepingWritingQuestion", count($toselect)), "returnaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
934}
935
936//$topicmail = "Information";
937//$modelmail = "accountingbookkeeping";
938//$objecttmp = new BookKeeping($db);
939//$trackid = 'bk'.$object->id;
940include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
941
942$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
943$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column); // This also change content of $arrayfields
944if ($massactionbutton && $contextpage != 'poslist') {
945 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
946}
947
948$moreforfilter = '';
949$moreforfilter .= '<div class="divsearchfield">';
950$moreforfilter .= $langs->trans('AccountingCategory').': ';
951$moreforfilter .= '<div class="nowrap inline-block">';
952$moreforfilter .= $formaccounting->select_accounting_category($search_account_category, 'search_account_category', 1, 0, 0, 0);
953$moreforfilter .= '</div>';
954$moreforfilter .= '</div>';
955
956$parameters = array();
957$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
958if (empty($reshook)) {
959 $moreforfilter .= $hookmanager->resPrint;
960} else {
961 $moreforfilter = $hookmanager->resPrint;
962}
963
964print '<div class="liste_titre liste_titre_bydiv centpercent">';
965print $moreforfilter;
966print '</div>';
967
968print '<div class="div-table-responsive">';
969print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">';
970
971// Filters lines
972print '<tr class="liste_titre_filter">';
973// Action column
974if ($conf->main_checkbox_left_column) {
975 print '<td class="liste_titre center">';
976 $searchpicto = $form->showFilterButtons('left');
977 print $searchpicto;
978 print '</td>';
979}
980// Movement number
981if (!empty($arrayfields['t.piece_num']['checked'])) {
982 print '<td class="liste_titre"><input type="text" name="search_mvt_num" size="6" value="'.dol_escape_htmltag($search_mvt_num).'"></td>';
983}
984// Code journal
985if (!empty($arrayfields['t.code_journal']['checked'])) {
986 print '<td class="liste_titre center">';
987 print $formaccounting->multi_select_journal($search_ledger_code, 'search_ledger_code', 0, 1, 1, 1, 'maxwidth75');
988 print '</td>';
989}
990// Date document
991if (!empty($arrayfields['t.doc_date']['checked'])) {
992 print '<td class="liste_titre center">';
993 print '<div class="nowrapfordate">';
994 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
995 print '</div>';
996 print '<div class="nowrapfordate">';
997 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
998 print '</div>';
999 print '</td>';
1000}
1001// Ref document
1002if (!empty($arrayfields['t.doc_ref']['checked'])) {
1003 print '<td class="liste_titre"><input type="text" name="search_doc_ref" class="width75" value="'.dol_escape_htmltag($search_doc_ref).'"></td>';
1004}
1005// Accountancy account
1006if (!empty($arrayfields['t.numero_compte']['checked'])) {
1007 print '<td class="liste_titre">';
1008 print '<div class="nowrap">';
1009 print $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth150', 'account');
1010 print '</div>';
1011 print '<div class="nowrap">';
1012 print $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth150', 'account');
1013 print '</div>';
1014 print '</td>';
1015}
1016// Subledger account
1017if (!empty($arrayfields['t.subledger_account']['checked'])) {
1018 print '<td class="liste_titre">';
1019 print '<div class="nowrap">';
1020 print $formaccounting->select_auxaccount($search_accountancy_aux_code_start, 'search_accountancy_aux_code_start', $langs->trans('From'), 'maxwidth250', 'subledgeraccount');
1021 print '</div>';
1022 print '<div class="nowrap">';
1023 print $formaccounting->select_auxaccount($search_accountancy_aux_code_end, 'search_accountancy_aux_code_end', $langs->trans('to'), 'maxwidth250', 'subledgeraccount');
1024 print '</div>';
1025 print '</td>';
1026}
1027// Label operation
1028if (!empty($arrayfields['t.label_operation']['checked'])) {
1029 print '<td class="liste_titre">';
1030 print '<input type="text" size="7" class="flat" name="search_mvt_label" value="'.dol_escape_htmltag($search_mvt_label).'"/>';
1031 print '</td>';
1032}
1033// Debit
1034if (!empty($arrayfields['t.debit']['checked'])) {
1035 print '<td class="liste_titre right">';
1036 print '<input type="text" class="flat" name="search_debit" size="4" value="'.dol_escape_htmltag($search_debit).'">';
1037 print '</td>';
1038}
1039// Credit
1040if (!empty($arrayfields['t.credit']['checked'])) {
1041 print '<td class="liste_titre right">';
1042 print '<input type="text" class="flat" name="search_credit" size="4" value="'.dol_escape_htmltag($search_credit).'">';
1043 print '</td>';
1044}
1045// Matching code
1046if (!empty($arrayfields['t.lettering_code']['checked'])) {
1047 print '<td class="liste_titre center">';
1048 print '<input type="text" size="3" class="flat" name="search_lettering_code" value="'.dol_escape_htmltag($search_lettering_code).'"/>';
1049 print '<br><span class="nowrap"><input type="checkbox" name="search_not_reconciled" value="notreconciled"'.($search_not_reconciled == 'notreconciled' ? ' checked' : '').'>'.$langs->trans("NotReconciled").'</span>';
1050 print '</td>';
1051}
1052
1053// Fields from hook
1054$parameters = array('arrayfields' => $arrayfields);
1055$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1056print $hookmanager->resPrint;
1057
1058// Date creation
1059if (!empty($arrayfields['t.date_creation']['checked'])) {
1060 print '<td class="liste_titre center">';
1061 print '<div class="nowrapfordate">';
1062 print $form->selectDate($search_date_creation_start, 'search_date_creation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1063 print '</div>';
1064 print '<div class="nowrapfordate">';
1065 print $form->selectDate($search_date_creation_end, 'search_date_creation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1066 print '</div>';
1067 print '</td>';
1068}
1069// Date modification
1070if (!empty($arrayfields['t.tms']['checked'])) {
1071 print '<td class="liste_titre center">';
1072 print '<div class="nowrapfordate">';
1073 print $form->selectDate($search_date_modification_start, 'search_date_modification_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1074 print '</div>';
1075 print '<div class="nowrapfordate">';
1076 print $form->selectDate($search_date_modification_end, 'search_date_modification_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1077 print '</div>';
1078 print '</td>';
1079}
1080// Date export
1081if (!empty($arrayfields['t.date_export']['checked'])) {
1082 print '<td class="liste_titre center">';
1083 print '<div class="nowrapfordate">';
1084 print $form->selectDate($search_date_export_start, 'search_date_export_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1085 print '</div>';
1086 print '<div class="nowrapfordate">';
1087 print $form->selectDate($search_date_export_end, 'search_date_export_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1088 print '</div>';
1089 print '</td>';
1090}
1091// Date validation
1092if (!empty($arrayfields['t.date_validated']['checked'])) {
1093 print '<td class="liste_titre center">';
1094 print '<div class="nowrapfordate">';
1095 print $form->selectDate($search_date_validation_start, 'search_date_validation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1096 print '</div>';
1097 print '<div class="nowrapfordate">';
1098 print $form->selectDate($search_date_validation_end, 'search_date_validation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1099 print '</div>';
1100 print '</td>';
1101}
1102// Due date start and end
1103if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1104 print '<td class="liste_titre center">';
1105 print '<div class="nowrapfordate">';
1106 print $form->selectDate($search_date_due_start, 'search_date_due_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1107 print '</div>';
1108 print '<div class="nowrapfordate">';
1109 print $form->selectDate($search_date_due_end, 'search_date_due_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1110 print '</div>';
1111 print '</td>';
1112}
1113if (!empty($arrayfields['t.import_key']['checked'])) {
1114 print '<td class="liste_titre center">';
1115 print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="'.dol_escape_htmltag($search_import_key).'">';
1116 print '</td>';
1117}
1118// Action column
1119if (!$conf->main_checkbox_left_column) {
1120 print '<td class="liste_titre center">';
1121 $searchpicto = $form->showFilterButtons();
1122 print $searchpicto;
1123 print '</td>';
1124}
1125print "</tr>\n";
1126
1127print '<tr class="liste_titre">';
1128if ($conf->main_checkbox_left_column) {
1129 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch actioncolumn ');
1130}
1131if (!empty($arrayfields['t.piece_num']['checked'])) {
1132 print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, "", $sortfield, $sortorder);
1133}
1134if (!empty($arrayfields['t.code_journal']['checked'])) {
1135 print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center ');
1136}
1137if (!empty($arrayfields['t.doc_date']['checked'])) {
1138 print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1139}
1140if (!empty($arrayfields['t.doc_ref']['checked'])) {
1141 print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder);
1142}
1143if (!empty($arrayfields['t.numero_compte']['checked'])) {
1144 print_liste_field_titre($arrayfields['t.numero_compte']['label'], $_SERVER['PHP_SELF'], "t.numero_compte", "", $param, "", $sortfield, $sortorder);
1145}
1146if (!empty($arrayfields['t.subledger_account']['checked'])) {
1147 print_liste_field_titre($arrayfields['t.subledger_account']['label'], $_SERVER['PHP_SELF'], "t.subledger_account", "", $param, "", $sortfield, $sortorder);
1148}
1149if (!empty($arrayfields['t.label_operation']['checked'])) {
1150 print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder);
1151}
1152if (!empty($arrayfields['t.debit']['checked'])) {
1153 print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right ');
1154}
1155if (!empty($arrayfields['t.credit']['checked'])) {
1156 print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right ');
1157}
1158if (!empty($arrayfields['t.lettering_code']['checked'])) {
1159 print_liste_field_titre($arrayfields['t.lettering_code']['label'], $_SERVER['PHP_SELF'], "t.lettering_code", "", $param, '', $sortfield, $sortorder, 'center ');
1160}
1161// Hook fields
1162$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1163$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1164print $hookmanager->resPrint;
1165if (!empty($arrayfields['t.date_creation']['checked'])) {
1166 print_liste_field_titre($arrayfields['t.date_creation']['label'], $_SERVER['PHP_SELF'], "t.date_creation", "", $param, '', $sortfield, $sortorder, 'center ');
1167}
1168if (!empty($arrayfields['t.tms']['checked'])) {
1169 print_liste_field_titre($arrayfields['t.tms']['label'], $_SERVER['PHP_SELF'], "t.tms", "", $param, '', $sortfield, $sortorder, 'center ');
1170}
1171if (!empty($arrayfields['t.date_export']['checked'])) {
1172 print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export,t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1173}
1174if (!empty($arrayfields['t.date_validated']['checked'])) {
1175 print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated,t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1176}
1177// Due date
1178if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1179 print_liste_field_titre($arrayfields['t.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], 't.date_lim_reglement', '', $param, '', $sortfield, $sortorder, 'center ');
1180}
1181if (!empty($arrayfields['t.import_key']['checked'])) {
1182 print_liste_field_titre($arrayfields['t.import_key']['label'], $_SERVER["PHP_SELF"], "t.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
1183}
1184if (!$conf->main_checkbox_left_column) {
1185 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1186}
1187print "</tr>\n";
1188
1189
1190$line = new BookKeepingLine($db);
1191
1192// Loop on record
1193// --------------------------------------------------------------------
1194$i = 0;
1195$totalarray = array();
1196$totalarray['nbfield'] = 0;
1197$totalarray['val'] = array();
1198$totalarray['val']['totaldebit'] = 0;
1199$totalarray['val']['totalcredit'] = 0;
1200
1201while ($i < min($num, $limit)) {
1202 $obj = $db->fetch_object($resql);
1203 if (empty($obj)) {
1204 break; // Should not happen
1205 }
1206
1207 $line->id = $obj->rowid;
1208 $line->doc_date = $db->jdate($obj->doc_date);
1209 $line->doc_type = $obj->doc_type;
1210 $line->doc_ref = $obj->doc_ref;
1211 $line->fk_doc = $obj->fk_doc;
1212 $line->fk_docdet = $obj->fk_docdet;
1213 $line->thirdparty_code = $obj->thirdparty_code;
1214 $line->subledger_account = $obj->subledger_account;
1215 $line->subledger_label = $obj->subledger_label;
1216 $line->numero_compte = $obj->numero_compte;
1217 $line->label_compte = $obj->label_compte;
1218 $line->label_operation = $obj->label_operation;
1219 $line->debit = $obj->debit;
1220 $line->credit = $obj->credit;
1221 $line->montant = $obj->amount; // deprecated
1222 $line->amount = $obj->amount;
1223 $line->sens = $obj->sens;
1224 $line->lettering_code = $obj->lettering_code;
1225 $line->matching_general = $obj->matching_general;
1226 $line->fk_user_author = $obj->fk_user_author;
1227 $line->import_key = $obj->import_key;
1228 $line->code_journal = $obj->code_journal;
1229 $line->journal_label = $obj->journal_label;
1230 $line->piece_num = $obj->piece_num;
1231 $line->ref = $obj->ref;
1232 $line->date_creation = $db->jdate($obj->date_creation);
1233 $line->date_modification = $db->jdate($obj->date_modification);
1234 $line->date_export = $db->jdate($obj->date_export);
1235 $line->date_validation = $db->jdate($obj->date_validation);
1236 // Due date
1237 $line->date_lim_reglement = $db->jdate($obj->date_lim_reglement);
1238
1239 print '<tr class="oddeven">';
1240 // Action column
1241 if ($conf->main_checkbox_left_column) {
1242 print '<td class="nowraponall center">';
1243 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
1244 $selected = 0;
1245 if (in_array($line->id, $arrayofselected)) {
1246 $selected = 1;
1247 }
1248 print '<input id="cb'.$line->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$line->id.'"'.($selected ? ' checked="checked"' : '').' />';
1249 }
1250 print '</td>';
1251 if (!$i) {
1252 $totalarray['nbfield']++;
1253 }
1254 }
1255
1256 // Piece number
1257 if (!empty($arrayfields['t.piece_num']['checked'])) {
1258 print '<td class="nowraponall">';
1259 $object->id = $line->id;
1260 $object->piece_num = $line->piece_num;
1261 $object->ref = $line->ref;
1262 print $object->getNomUrl(1, '', 0, '', 1);
1263 print '<span class="hideonsmartphone">';
1264 if (!empty($line->date_export)) {
1265 print img_picto($langs->trans("DateExport").": ".dol_print_date($line->date_export, 'dayhour')." (".$langs->trans("TransactionExportDesc").")", 'fa-file-export', 'class="paddingleft pictofixedwidth opacitymedium"');
1266 }
1267 if (!empty($line->date_validation)) {
1268 print img_picto($langs->trans("DateValidation").": ".dol_print_date($line->date_validation, 'dayhour')." (".$langs->trans("TransactionBlockedLockedDesc").")", 'fa-lock', 'class="paddingleft pictofixedwidth opacitymedium"');
1269 }
1270 print '</span>';
1271 print '</td>';
1272 if (!$i) {
1273 $totalarray['nbfield']++;
1274 }
1275 }
1276
1277 // Journal code
1278 if (!empty($arrayfields['t.code_journal']['checked'])) {
1279 if (empty($conf->cache['accountingjournal'][$line->code_journal])) {
1280 $accountingjournal = new AccountingJournal($db);
1281 $accountingjournal->fetch(0, $line->code_journal);
1282 $conf->cache['accountingjournal'][$line->code_journal] = $accountingjournal;
1283 } else {
1284 $accountingjournal = $conf->cache['accountingjournal'][$line->code_journal];
1285 }
1286
1287 $journaltoshow = (($accountingjournal->id > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal);
1288 print '<td class="center tdoverflowmax150">'.$journaltoshow.'</td>';
1289 if (!$i) {
1290 $totalarray['nbfield']++;
1291 }
1292 }
1293
1294 // Document date
1295 if (!empty($arrayfields['t.doc_date']['checked'])) {
1296 print '<td class="center">'.dol_print_date($line->doc_date, 'day').'</td>';
1297 if (!$i) {
1298 $totalarray['nbfield']++;
1299 }
1300 }
1301
1302 // Document ref
1303 $modulepart = ''; // may be used by include*.tpl.php
1304 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1305 $documentlink = '';
1306 $objectstatic = null;
1307
1308 if ($line->doc_type === 'customer_invoice') {
1309 $langs->loadLangs(array('bills'));
1310
1311 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1312 $objectstatic = new Facture($db);
1313 $objectstatic->fetch($line->fk_doc);
1314 //$modulepart = 'facture';
1315
1316 $filename = dol_sanitizeFileName($line->doc_ref);
1317 $filedir = $conf->invoice->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1318 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1319 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1320 } elseif ($line->doc_type === 'supplier_invoice') {
1321 $langs->loadLangs(array('bills'));
1322
1323 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1324 $objectstatic = new FactureFournisseur($db);
1325 $objectstatic->fetch($line->fk_doc);
1326
1327 $modulepart = 'invoice_supplier';
1328 $filename = dol_sanitizeFileName($line->doc_ref);
1329
1330 //$filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($line->fk_doc, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1331 //$subdir = get_exdir($objectstatic->id, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1332 $filedir = getMultidirOutput($objectstatic, '', 1).dol_sanitizeFileName($line->doc_ref);
1333 $subdir = getMultidirOutput($objectstatic, '', 1, 'outputrel').dol_sanitizeFileName($line->doc_ref);
1334 //var_dump($filedir); var_dump($subdir);
1335
1336 if ($objectstatic->id > 0) {
1337 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $subdir, $filedir);
1338 } else {
1339 $documentlink = $line->doc_ref;
1340 }
1341 } elseif ($line->doc_type === 'expense_report') {
1342 $langs->loadLangs(array('trips'));
1343
1344 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
1345 $objectstatic = new ExpenseReport($db);
1346 $objectstatic->fetch($line->fk_doc);
1347 //$modulepart = 'expensereport';
1348
1349 $filename = dol_sanitizeFileName($line->doc_ref);
1350 $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1351 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1352 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1353 } elseif ($line->doc_type === 'bank') {
1354 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1355 $objectstatic = new AccountLine($db);
1356 $objectstatic->fetch($line->fk_doc);
1357 } else {
1358 // Other type
1359 }
1360
1361 $labeltoshow = '';
1362 $labeltoshowalt = '';
1363 $classforlabel = '';
1364 if (($line->doc_type === 'customer_invoice' || $line->doc_type === 'supplier_invoice' || $line->doc_type === 'expense_report') && is_object($objectstatic)) {
1365 $labeltoshow .= $objectstatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1);
1366 $labeltoshow .= $documentlink;
1367 $labeltoshowalt .= $objectstatic->ref;
1368 } elseif ($line->doc_type === 'bank' && is_object($objectstatic)) {
1369 $labeltoshow .= $objectstatic->getNomUrl(1);
1370 $labeltoshowalt .= $objectstatic->ref;
1371 $bank_ref = strstr($line->doc_ref, '-');
1372 $labeltoshow .= " " . $bank_ref;
1373 $labeltoshowalt .= " " . $bank_ref;
1374 } else {
1375 $labeltoshow .= $line->doc_ref;
1376 $labeltoshowalt .= $line->doc_ref;
1377 $classforlabel = 'tdoverflowmax250';
1378 }
1379
1380 print '<td class="nowraponall'.($classforlabel ? ' '.$classforlabel : '').'" title="'.dol_escape_htmltag($labeltoshowalt).'">';
1381 print $labeltoshow;
1382 print "</td>\n";
1383 if (!$i) {
1384 $totalarray['nbfield']++;
1385 }
1386 }
1387
1388 // Account number
1389 if (!empty($arrayfields['t.numero_compte']['checked'])) {
1390 print '<td>'.length_accountg($line->numero_compte).'</td>';
1391 if (!$i) {
1392 $totalarray['nbfield']++;
1393 }
1394 }
1395
1396 // Subledger account
1397 if (!empty($arrayfields['t.subledger_account']['checked'])) {
1398 print '<td>'.length_accounta($line->subledger_account).'</td>';
1399 if (!$i) {
1400 $totalarray['nbfield']++;
1401 }
1402 }
1403
1404 // Label operation
1405 if (!empty($arrayfields['t.label_operation']['checked'])) {
1406 print '<td class="small tdoverflowmax200" title="'.dol_escape_htmltag($line->label_operation).'">'.dol_escape_htmltag($line->label_operation).'</td>';
1407 if (!$i) {
1408 $totalarray['nbfield']++;
1409 }
1410 }
1411
1412 // Amount debit
1413 if (!empty($arrayfields['t.debit']['checked'])) {
1414 print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
1415 if (!$i) {
1416 $totalarray['nbfield']++;
1417 }
1418 if (!$i) {
1419 $totalarray['pos'][$totalarray['nbfield']] = 'totaldebit';
1420 }
1421 $totalarray['val']['totaldebit'] += $line->debit;
1422 }
1423
1424 // Amount credit
1425 if (!empty($arrayfields['t.credit']['checked'])) {
1426 print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
1427 if (!$i) {
1428 $totalarray['nbfield']++;
1429 }
1430 if (!$i) {
1431 $totalarray['pos'][$totalarray['nbfield']] = 'totalcredit';
1432 }
1433 $totalarray['val']['totalcredit'] += $line->credit;
1434 }
1435
1436 // Matching code
1437 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1438 $tooltipText = "";
1439 $icon = "";
1440 $badge = "";
1441 if (!empty($line->matching_general)) {
1442 $tooltipText .= $langs->trans('GeneralMatching');
1443 $icon .= "fa-book";
1444 $badge .= "badge-status4";
1445 } elseif (empty($line->matching_general) && !empty($line->lettering_code)) {
1446 $tooltipText .= $langs->trans('AuxiliaryMatching');
1447 $icon .= "fa-user";
1448 $badge .= "badge-status1";
1449 }
1450 print '<td class="center classfortooltip" title="'.$tooltipText.'"><span class="badge '.$badge.'"><i class="fas '.$icon.' fa-xs"></i> '.$line->lettering_code.'</span></td>';
1451 if (!$i) {
1452 $totalarray['nbfield']++;
1453 }
1454 }
1455
1456 // Fields from hook
1457 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1458 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1459 print $hookmanager->resPrint;
1460
1461 // Creation operation date
1462 if (!empty($arrayfields['t.date_creation']['checked'])) {
1463 print '<td class="center">'.dol_print_date($line->date_creation, 'dayhour', 'tzuserrel').'</td>';
1464 if (!$i) {
1465 $totalarray['nbfield']++;
1466 }
1467 }
1468
1469 // Modification operation date
1470 if (!empty($arrayfields['t.tms']['checked'])) {
1471 print '<td class="center">'.dol_print_date($line->date_modification, 'dayhour', 'tzuserrel').'</td>';
1472 if (!$i) {
1473 $totalarray['nbfield']++;
1474 }
1475 }
1476
1477 // Exported operation date
1478 if (!empty($arrayfields['t.date_export']['checked'])) {
1479 print '<td class="center nowraponall">'.dol_print_date($line->date_export, 'dayhour', 'tzuserrel').'</td>';
1480 if (!$i) {
1481 $totalarray['nbfield']++;
1482 }
1483 }
1484
1485 // Validated operation date
1486 if (!empty($arrayfields['t.date_validated']['checked'])) {
1487 print '<td class="center nowraponall">'.dol_print_date($line->date_validation, 'dayhour', 'tzuserrel').'</td>';
1488 if (!$i) {
1489 $totalarray['nbfield']++;
1490 }
1491 }
1492
1493 // Due date
1494 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1495 print '<td class="center">'.dol_print_date($line->date_lim_reglement, 'day').'</td>';
1496 if (!$i) {
1497 $totalarray['nbfield']++;
1498 }
1499 }
1500
1501 if (!empty($arrayfields['t.import_key']['checked'])) {
1502 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($obj->import_key).'">'.dol_escape_htmltag($obj->import_key)."</td>\n";
1503 if (!$i) {
1504 $totalarray['nbfield']++;
1505 }
1506 }
1507
1508 // Action column
1509 if (!$conf->main_checkbox_left_column) {
1510 print '<td class="nowraponall center">';
1511 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
1512 $selected = 0;
1513 if (in_array($line->id, $arrayofselected)) {
1514 $selected = 1;
1515 }
1516 print '<input id="cb'.$line->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$line->id.'"'.($selected ? ' checked="checked"' : '').' />';
1517 }
1518 print '</td>';
1519 if (!$i) {
1520 $totalarray['nbfield']++;
1521 }
1522 }
1523
1524
1525 print "</tr>\n";
1526
1527 $i++;
1528}
1529
1530// Show total line
1531include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1532
1533// If no record found
1534if ($num == 0) {
1535 $colspan = 1;
1536 foreach ($arrayfields as $key => $val) {
1537 if (!empty($val['checked'])) {
1538 $colspan++;
1539 }
1540 }
1541 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1542}
1543
1544$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1545$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1546print $hookmanager->resPrint;
1547
1548print "</table>";
1549print '</div>';
1550
1551print '</form>';
1552
1553// End of page
1554llxFooter();
1555
1556$db->close();
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition list.php:501
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to manage bank transaction lines.
Class to manage categories of an accounting account.
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 for accounting management.
Class to manage generation of HTML components Only common components must be here.
Class to help generate other html components Only common components are here.
Class Lettering.
Class to build sending documents with model Espadon.
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:639
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
GETPOSTDATE($prefix, $hourTime='', $gm='auto', $saverestore='')
Helper function that combines values of a dolibarr DatePicker (such as Form\selectDate) for year,...
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
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.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
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.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getMultidirOutput($object, $module='', $forobject=0, $mode='output')
Return the full path of the directory where a module (or an object of a module) stores its files.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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 a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
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...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.