dolibarr 23.0.4
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
214if (!getDolGlobalString('ACCOUNTING_ENABLE_LETTERING')) {
215 unset($arrayfields['t.lettering_code']);
216}
217
218$error = 0;
219
220if (!isModEnabled('accounting')) {
222}
223if ($user->socid > 0) {
225}
226if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
228}
229
230// Permissions
231$permissiontoread = $user->hasRight('accounting', 'mouvements', 'lire');
232$permissiontoadd = $user->hasRight('accounting', 'mouvements', 'creer');
233$permissiontodelete = $user->hasRight('accounting', 'mouvements', 'supprimer');
234$permissiontoexport = $user->hasRight('accounting', 'mouvements', 'export');
235
236
237/*
238 * Actions
239 */
240
241$param = '';
242$filter = array();
243
244if (GETPOST('cancel', 'alpha')) {
245 $action = 'list';
246 $massaction = '';
247}
248if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'preunletteringauto' && $massaction != 'preunletteringmanual' && $massaction != 'predeletebookkeepingwriting' && $massaction != 'preclonebookkeepingwriting' && $massaction != 'preassignaccountbookkeepingwriting' && $massaction != 'prereturnaccountbookkeepingwriting') {
249 $massaction = '';
250}
251
252$parameters = array('socid' => $socid);
253$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
254if ($reshook < 0) {
255 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
256}
257
258if (empty($reshook)) {
259 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
260
261 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
262 $search_mvt_num = '';
263 $search_doc_type = '';
264 $search_doc_ref = '';
265 $search_doc_date = '';
266 $search_account_category = '';
267 $search_accountancy_code = '';
268 $search_accountancy_code_start = '';
269 $search_accountancy_code_end = '';
270 $search_accountancy_aux_code = '';
271 $search_accountancy_aux_code_start = '';
272 $search_accountancy_aux_code_end = '';
273 $search_mvt_label = '';
274 $search_direction = '';
275 $search_ledger_code = array();
276 $search_date_start = '';
277 $search_date_end = '';
278 $search_date_creation_start = '';
279 $search_date_creation_end = '';
280 $search_date_modification_start = '';
281 $search_date_modification_end = '';
282 $search_date_export_start = '';
283 $search_date_export_end = '';
284 $search_date_validation_start = '';
285 $search_date_validation_end = '';
286 // Due date start
287 $search_date_due_start_day = '';
288 $search_date_due_start_month = '';
289 $search_date_due_start_year = '';
290 $search_date_due_start = '';
291 // Due date end
292 $search_date_due_end_day = '';
293 $search_date_due_end_month = '';
294 $search_date_due_end_year = '';
295 $search_date_due_end = '';
296 $search_debit = '';
297 $search_credit = '';
298 $search_lettering_code = '';
299 $search_not_reconciled = '';
300 $search_import_key = '';
301 $toselect = array();
302 unset($_SESSION['DOLDATE_search_date_start_accountancy_day']);
303 unset($_SESSION['DOLDATE_search_date_start_accountancy_month']);
304 unset($_SESSION['DOLDATE_search_date_start_accountancy_year']);
305 unset($_SESSION['DOLDATE_search_date_end_accountancy_day']);
306 unset($_SESSION['DOLDATE_search_date_end_accountancy_month']);
307 unset($_SESSION['DOLDATE_search_date_end_accountancy_year']);
308 }
309
310 // Must be after the remove filter action, before the export.
311 if (!empty($search_date_start)) {
312 $filter['t.doc_date>='] = $search_date_start;
313 $tmp = dol_getdate($search_date_start);
314 $param .= '&search_date_startmonth='.((int) $tmp['mon']).'&search_date_startday='.((int) $tmp['mday']).'&search_date_startyear='.((int) $tmp['year']);
315 }
316 if (!empty($search_date_end)) {
317 $filter['t.doc_date<='] = $search_date_end;
318 $tmp = dol_getdate($search_date_end);
319 $param .= '&search_date_endmonth='.((int) $tmp['mon']).'&search_date_endday='.((int) $tmp['mday']).'&search_date_endyear='.((int) $tmp['year']);
320 }
321 if (!empty($search_doc_date)) {
322 $filter['t.doc_date'] = $search_doc_date;
323 $tmp = dol_getdate($search_doc_date);
324 $param .= '&doc_datemonth='.((int) $tmp['mon']).'&doc_dateday='.((int) $tmp['mday']).'&doc_dateyear='.((int) $tmp['year']);
325 }
326 if (!empty($search_doc_type)) {
327 $filter['t.doc_type'] = $search_doc_type;
328 $param .= '&search_doc_type='.urlencode($search_doc_type);
329 }
330 if (!empty($search_doc_ref)) {
331 $filter['t.doc_ref'] = $search_doc_ref;
332 $param .= '&search_doc_ref='.urlencode($search_doc_ref);
333 }
334 if ($search_account_category != '-1' && !empty($search_account_category)) {
335 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancycategory.class.php';
336 $accountingcategory = new AccountancyCategory($db);
337
338 $listofaccountsforgroup = $accountingcategory->getCptsCat(0, 'fk_accounting_category = '.((int) $search_account_category));
339 $listofaccountsforgroup2 = array();
340 if (is_array($listofaccountsforgroup)) {
341 foreach ($listofaccountsforgroup as $tmpval) {
342 $listofaccountsforgroup2[] = "'".$db->escape((string) $tmpval['account_number'])."'";
343 }
344 }
345 if (!empty($listofaccountsforgroup2)) {
346 $filter['t.search_accounting_code_in'] = implode(',', $listofaccountsforgroup2);
347 } else {
348 $filter['t.search_accounting_code_in'] = "''";
349 setEventMessages($langs->trans("ThisCategoryHasNoItems"), null, 'warnings');
350 }
351 $param .= '&search_account_category='.urlencode((string) ($search_account_category));
352 }
353 if (!empty($search_accountancy_code)) {
354 $filter['t.numero_compte'] = $search_accountancy_code;
355 $param .= '&search_accountancy_code='.urlencode($search_accountancy_code);
356 }
357 if (!empty($search_accountancy_code_start)) {
358 $filter['t.numero_compte>='] = $search_accountancy_code_start;
359 $param .= '&search_accountancy_code_start='.urlencode($search_accountancy_code_start);
360 }
361 if (!empty($search_accountancy_code_end)) {
362 $filter['t.numero_compte<='] = $search_accountancy_code_end;
363 $param .= '&search_accountancy_code_end='.urlencode($search_accountancy_code_end);
364 }
365 if (!empty($search_accountancy_aux_code)) {
366 $filter['t.subledger_account'] = $search_accountancy_aux_code;
367 $param .= '&search_accountancy_aux_code='.urlencode($search_accountancy_aux_code);
368 }
369 if (!empty($search_accountancy_aux_code_start)) {
370 $filter['t.subledger_account>='] = $search_accountancy_aux_code_start;
371 $param .= '&search_accountancy_aux_code_start='.urlencode($search_accountancy_aux_code_start);
372 }
373 if (!empty($search_accountancy_aux_code_end)) {
374 $filter['t.subledger_account<='] = $search_accountancy_aux_code_end;
375 $param .= '&search_accountancy_aux_code_end='.urlencode($search_accountancy_aux_code_end);
376 }
377 if (!empty($search_mvt_label)) {
378 $filter['t.label_operation'] = $search_mvt_label;
379 $param .= '&search_mvt_label='.urlencode($search_mvt_label);
380 }
381 if (!empty($search_direction)) {
382 $filter['t.sens'] = $search_direction;
383 $param .= '&search_direction='.urlencode($search_direction);
384 }
385 if (!empty($search_ledger_code)) {
386 $filter['t.code_journal'] = $search_ledger_code;
387 foreach ($search_ledger_code as $code) {
388 $param .= '&search_ledger_code[]='.urlencode($code);
389 }
390 }
391 if (!empty($search_mvt_num)) {
392 $filter['t.piece_num'] = $search_mvt_num;
393 $param .= '&search_mvt_num='.urlencode((string) ($search_mvt_num));
394 }
395 if (!empty($search_date_creation_start)) {
396 $filter['t.date_creation>='] = $search_date_creation_start;
397 $tmp = dol_getdate($search_date_creation_start);
398 $param .= '&search_date_creation_startmonth='.((int) $tmp['mon']).'&search_date_creation_startday='.((int) $tmp['mday']).'&search_date_creation_startyear='.((int) $tmp['year']);
399 }
400 if (!empty($search_date_creation_end)) {
401 $filter['t.date_creation<='] = $search_date_creation_end;
402 $tmp = dol_getdate($search_date_creation_end);
403 $param .= '&search_date_creation_endmonth='.((int) $tmp['mon']).'&search_date_creation_endday='.((int) $tmp['mday']).'&search_date_creation_endyear='.((int) $tmp['year']);
404 }
405 if (!empty($search_date_modification_start)) {
406 $filter['t.tms>='] = $search_date_modification_start;
407 $tmp = dol_getdate($search_date_modification_start);
408 $param .= '&search_date_modification_startmonth='.((int) $tmp['mon']).'&search_date_modification_startday='.((int) $tmp['mday']).'&search_date_modification_startyear='.((int) $tmp['year']);
409 }
410 if (!empty($search_date_modification_end)) {
411 $filter['t.tms<='] = $search_date_modification_end;
412 $tmp = dol_getdate($search_date_modification_end);
413 $param .= '&search_date_modification_endmonth='.((int) $tmp['mon']).'&search_date_modification_endday='.((int) $tmp['mday']).'&search_date_modification_endyear='.((int) $tmp['year']);
414 }
415 if (!empty($search_date_export_start)) {
416 $filter['t.date_export>='] = $search_date_export_start;
417 $tmp = dol_getdate($search_date_export_start);
418 $param .= '&search_date_export_startmonth='.((int) $tmp['mon']).'&search_date_export_startday='.((int) $tmp['mday']).'&search_date_export_startyear='.((int) $tmp['year']);
419 }
420 if (!empty($search_date_export_end)) {
421 $filter['t.date_export<='] = $search_date_export_end;
422 $tmp = dol_getdate($search_date_export_end);
423 $param .= '&search_date_export_endmonth='.((int) $tmp['mon']).'&search_date_export_endday='.((int) $tmp['mday']).'&search_date_export_endyear='.((int) $tmp['year']);
424 }
425 if (!empty($search_date_validation_start)) {
426 $filter['t.date_validated>='] = $search_date_validation_start;
427 $tmp = dol_getdate($search_date_validation_start);
428 $param .= '&search_date_validation_startmonth='.((int) $tmp['mon']).'&search_date_validation_startday='.((int) $tmp['mday']).'&search_date_validation_startyear='.((int) $tmp['year']);
429 }
430 if (!empty($search_date_validation_end)) {
431 $filter['t.date_validated<='] = $search_date_validation_end;
432 $tmp = dol_getdate($search_date_validation_end);
433 $param .= '&search_date_validation_endmonth='.((int) $tmp['mon']).'&search_date_validation_endday='.((int) $tmp['mday']).'&search_date_validation_endyear='.((int) $tmp['year']);
434 }
435 // Due date start
436 if (!empty($search_date_due_start)) {
437 $filter['t.date_lim_reglement>='] = $search_date_due_start;
438 $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;
439 }
440 // Due date end
441 if (!empty($search_date_due_end)) {
442 $filter['t.date_lim_reglement<='] = $search_date_due_end;
443 $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;
444 }
445 if (!empty($search_debit)) {
446 $filter['t.debit'] = $search_debit;
447 $param .= '&search_debit='.urlencode($search_debit);
448 }
449 if (!empty($search_credit)) {
450 $filter['t.credit'] = $search_credit;
451 $param .= '&search_credit='.urlencode($search_credit);
452 }
453 if (!empty($search_lettering_code)) {
454 $filter['t.lettering_code'] = $search_lettering_code;
455 $param .= '&search_lettering_code='.urlencode($search_lettering_code);
456 }
457 if (!empty($search_not_reconciled)) {
458 $filter['t.reconciled_option'] = $search_not_reconciled;
459 $param .= '&search_not_reconciled='.urlencode($search_not_reconciled);
460 }
461 if (!empty($search_import_key)) {
462 $filter['t.import_key'] = $search_import_key;
463 $param .= '&search_import_key='.urlencode($search_import_key);
464 }
465
466 // Actions
467 if ($action === 'exporttopdf' && $permissiontoadd) {
468 $object->fetchAll('ASC,ASC,ASC', 'code_journal,doc_date,piece_num', 0, 0, $filter);
469 require_once DOL_DOCUMENT_ROOT . '/core/modules/accountancy/doc/pdf_bookkeeping.modules.php';
470 $pdf = new pdf_bookkeeping($db);
471 $pdf->fromDate = $search_date_start;
472 $pdf->toDate = $search_date_end;
473
474 $result = $pdf->write_file($object, $langs);
475
476 if ($result < 0) {
477 setEventMessage($pdf->error, "errors");
478 } else {
479 // Generated PDF is directly sent to the browser
480 exit;
481 }
482 }
483
484 // Mass actions
485 $objectclass = 'Bookkeeping';
486 $objectlabel = 'Bookkeeping';
487 $uploaddir = $conf->societe->dir_output;
488
489 global $error;
491 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
492
493 if (!$error && $action == 'deletebookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'supprimer')) {
494 $db->begin();
495
496 if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
497 $lettering = new Lettering($db);
498 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true);
499 if ($nb_lettering < 0) {
500 setEventMessages('', $lettering->errors, 'errors');
501 $error++;
502 }
503 }
504
505 $nbok = 0;
506 $result = 0;
507 if (!$error) {
508 foreach ($toselect as $toselectid) {
509 $result = $object->fetch($toselectid);
510 if ($result > 0 && (!isset($object->date_validation) || $object->date_validation === '')) {
511 $result = $object->deleteMvtNum($object->piece_num);
512 if ($result > 0) {
513 $nbok++;
514 } elseif ($result == 0) {
515 setEventMessages($langs->trans("ErrorBookkeepingDocDateNotOnActiveFiscalPeriod"), null, 'errors');
516 $error += 1;
517 break;
518 } else {
519 setEventMessages($object->error, $object->errors, 'errors');
520 $error++;
521 break;
522 }
523 } elseif ($result < 0) {
524 setEventMessages($object->error, $object->errors, 'errors');
525 $error++;
526 break;
527 } elseif (isset($object->date_validation) && $object->date_validation != '') {
528 setEventMessages($langs->trans("ValidatedRecordWhereFound"), null, 'errors');
529 $error++;
530 break;
531 }
532 }
533 }
534
535 if (!$error) {
536 $db->commit();
537
538 // Message for elements well deleted
539 if ($nbok > 1) {
540 setEventMessages($langs->trans("RecordsDeleted", $nbok), null, 'mesgs');
541 } elseif ($nbok > 0) {
542 setEventMessages($langs->trans("RecordDeleted", $nbok), null, 'mesgs');
543 } else {
544 setEventMessages($langs->trans("NoRecordDeleted"), null, 'mesgs');
545 }
546
547 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
548 exit;
549 } else {
550 $db->rollback();
551 }
552 }
553
554 // massaction cloning
555 if (!$error && $action == 'clonebookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
556 $result = $object->newCloneMass($toselect, $journal_code, $massdate);
557 if ($result == -1) {
558 $error++;
559 }
560 if ($error) {
561 $db->commit();
562 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
563 exit;
564 } else {
565 $db->rollback();
566 }
567 }
568
569 // massaction assign new account
570 if (!$error && $action == 'assignaccountbookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
571 $result = $object->assignAccountMass($toselect, (int) $account);
572 if ($result == -1) {
573 $error++;
574 }
575 if (!$error) {
576 $db->commit();
577 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
578 exit();
579 } else {
580 $db->rollback();
581 }
582 }
583
584 // mass action return account
585 if (!$error && $action == 'returnaccountbookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
586 $result = $object->newReturnAccount($toselect, $journal_code, $massdate);
587 if ($result == -1) {
588 $error++;
589 }
590 if (!$error) {
591 $db->commit();
592 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
593 exit();
594 } else {
595 $db->rollback();
596 }
597 }
598
599 // mass actions on lettering
600 if (!$error && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
601 if ($massaction == 'letteringauto' && $permissiontoadd) {
602 $lettering = new Lettering($db);
603 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect);
604 if ($nb_lettering < 0) {
605 setEventMessages('', $lettering->errors, 'errors');
606 $error++;
607 $nb_lettering = max(0, abs($nb_lettering) - 2);
608 } elseif ($nb_lettering == 0) {
609 $nb_lettering = 0;
610 setEventMessages($langs->trans('AccountancyNoLetteringModified'), array(), 'mesgs');
611 }
612 if ($nb_lettering == 1) {
613 setEventMessages($langs->trans('AccountancyOneLetteringModifiedSuccessfully'), array(), 'mesgs');
614 } elseif ($nb_lettering > 1) {
615 setEventMessages($langs->trans('AccountancyLetteringModifiedSuccessfully', $nb_lettering), array(), 'mesgs');
616 }
617
618 if (!$error) {
619 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
620 exit();
621 }
622 } elseif ($massaction == 'letteringmanual' && $permissiontoadd) {
623 $lettering = new Lettering($db);
624 $result = $lettering->updateLettering($toselect);
625 if ($result < 0) {
626 setEventMessages('', $lettering->errors, 'errors');
627 } else {
628 setEventMessages($langs->trans('AccountancyOneLetteringModifiedSuccessfully'), array(), 'mesgs');
629 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
630 exit();
631 }
632 } elseif ($action == 'unletteringauto' && $confirm == "yes" && $permissiontoadd) {
633 $lettering = new Lettering($db);
634 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true);
635 if ($nb_lettering < 0) {
636 setEventMessages('', $lettering->errors, 'errors');
637 $error++;
638 $nb_lettering = max(0, abs($nb_lettering) - 2);
639 } elseif ($nb_lettering == 0) {
640 $nb_lettering = 0;
641 setEventMessages($langs->trans('AccountancyNoUnletteringModified'), array(), 'mesgs');
642 }
643 if ($nb_lettering == 1) {
644 setEventMessages($langs->trans('AccountancyOneUnletteringModifiedSuccessfully'), array(), 'mesgs');
645 } elseif ($nb_lettering > 1) {
646 setEventMessages($langs->trans('AccountancyUnletteringModifiedSuccessfully', $nb_lettering), array(), 'mesgs');
647 }
648
649 if (!$error) {
650 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
651 exit();
652 }
653 } elseif ($action == 'unletteringmanual' && $confirm == "yes" && $permissiontoadd) {
654 $lettering = new Lettering($db);
655 $nb_lettering = $lettering->deleteLettering($toselect);
656 if ($nb_lettering < 0) {
657 setEventMessages('', $lettering->errors, 'errors');
658 } else {
659 setEventMessages($langs->trans('AccountancyOneUnletteringModifiedSuccessfully'), array(), 'mesgs');
660 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
661 exit();
662 }
663 }
664 }
665}
666
667// Build and execute select (used by page and export action)
668// must de set after the action that set $filter
669// --------------------------------------------------------------------
670
671$sql = 'SELECT';
672$sql .= ' t.rowid,';
673$sql .= " t.doc_date,";
674$sql .= " t.doc_type,";
675$sql .= " t.doc_ref,";
676$sql .= " t.fk_doc,";
677$sql .= " t.fk_docdet,";
678$sql .= " t.thirdparty_code,";
679$sql .= " t.subledger_account,";
680$sql .= " t.subledger_label,";
681$sql .= " t.numero_compte,";
682$sql .= " t.label_compte,";
683$sql .= " t.label_operation,";
684$sql .= " t.debit,";
685$sql .= " t.credit,";
686$sql .= " t.lettering_code,";
687$sql .= " t.montant as amount,";
688$sql .= " t.sens,";
689$sql .= " t.fk_user_author,";
690$sql .= " t.import_key,";
691$sql .= " t.code_journal,";
692$sql .= " t.journal_label,";
693$sql .= " t.piece_num,";
694$sql .= " t.ref,";
695$sql .= " t.date_creation,";
696$sql .= " t.tms as date_modification,";
697$sql .= " t.date_export,";
698$sql .= " t.date_validated as date_validation,";
699$sql .= " t.date_lim_reglement,";
700$sql .= " t.import_key";
701
702$sqlfields = $sql; // $sql fields to remove for count total
703
704$sql .= ' FROM '.MAIN_DB_PREFIX.$object->table_element.' as t';
705// Manage filter
706$sqlwhere = array();
707if (count($filter) > 0) {
708 foreach ($filter as $key => $value) {
709 if ($key == 't.doc_date') {
710 $sqlwhere[] = $db->sanitize($key)." = '".$db->idate($value)."'";
711 } elseif ($key == 't.doc_date>=') {
712 $sqlwhere[] = "t.doc_date >= '".$db->idate($value)."'";
713 } elseif ($key == 't.doc_date<=') {
714 $sqlwhere[] = "t.doc_date <= '".$db->idate($value)."'";
715 } elseif ($key == 't.numero_compte>=') {
716 $sqlwhere[] = "t.numero_compte >= '".$db->escape($value)."'";
717 } elseif ($key == 't.numero_compte<=') {
718 $sqlwhere[] = "t.numero_compte <= '".$db->escape($value)."'";
719 } elseif ($key == 't.subledger_account>=') {
720 $sqlwhere[] = "t.subledger_account >= '".$db->escape($value)."'";
721 } elseif ($key == 't.subledger_account<=') {
722 $sqlwhere[] = "t.subledger_account <= '".$db->escape($value)."'";
723 } elseif ($key == 't.piece_num') {
724 // piece_num is an integer column, a LIKE on it is translated to ILIKE by the pgsql driver and fails
725 $sqlwhere[] = natural_search($key, $value, 1, 1);
726 } elseif ($key == 't.subledger_account' || $key == 't.numero_compte') {
727 $sqlwhere[] = $db->sanitize($key)." LIKE '".$db->escape($db->escapeforlike($value))."%'";
728 /* } elseif ($key == 't.subledger_account') { // test is always false
729 $sqlwhere[] = natural_search($key, $value, 0, 1); */
730 } elseif ($key == 't.tms>=') {
731 $sqlwhere[] = "t.tms >= '".$db->idate($value)."'";
732 } elseif ($key == 't.tms<=') {
733 $sqlwhere[] = "t.tms <= '".$db->idate($value)."'";
734 } elseif ($key == 't.date_creation>=') {
735 $sqlwhere[] = "t.date_creation >= '".$db->idate($value)."'";
736 } elseif ($key == 't.date_creation<=') {
737 $sqlwhere[] = "t.date_creation <= '".$db->idate($value)."'";
738 } elseif ($key == 't.date_export>=') {
739 $sqlwhere[] = "t.date_export >= '".$db->idate($value)."'";
740 } elseif ($key == 't.date_export<=') {
741 $sqlwhere[] = "t.date_export <= '".$db->idate($value)."'";
742 } elseif ($key == 't.date_validated>=') {
743 $sqlwhere[] = "t.date_validated >= '".$db->idate($value)."'";
744 } elseif ($key == 't.date_validated<=') {
745 $sqlwhere[] = "t.date_validated <= '".$db->idate($value)."'";
746 } elseif ($key == 't.date_lim_reglement>=') {
747 $sqlwhere[] = "t.date_lim_reglement >= '".$db->idate($value)."'";
748 } elseif ($key == 't.date_lim_reglement<=') {
749 $sqlwhere[] = "t.date_lim_reglement <= '".$db->idate($value)."'";
750 } elseif ($key == 't.credit' || $key == 't.debit') {
751 $sqlwhere[] = natural_search($key, $value, 1, 1);
752 } elseif ($key == 't.reconciled_option') {
753 $sqlwhere[] = 't.lettering_code IS NULL';
754 } elseif ($key == 't.code_journal' && !empty($value)) { // @phpstan-ignore-line false positive on !empty
755 if (is_array($value)) {
756 $sqlwhere[] = natural_search("t.code_journal", implode(',', $value), 3, 1);
757 } else {
758 $sqlwhere[] = natural_search("t.code_journal", $value, 3, 1);
759 }
760 } elseif ($key == 't.search_accounting_code_in' && !empty($value)) { // @phpstan-ignore-line false positive on !empty
761 $sqlwhere[] = 't.numero_compte IN ('.$db->sanitize($value, 1).')';
762 } else {
763 $sqlwhere[] = natural_search($key, $value, 0, 1);
764 }
765 }
766}
767$sql .= ' WHERE t.entity IN ('.getEntity('accountancy').')';
768
769if (count($sqlwhere) > 0) {
770 $sql .= ' AND '.implode(' AND ', $sqlwhere);
771}
772//print $sql;
773
774/*
775 * View
776 */
777
778$formother = new FormOther($db);
779$formfile = new FormFile($db);
780
781$title_page = $langs->trans("Operations").' - '.$langs->trans("Journals");
782
783// Count total nb of records
784$nbtotalofrecords = '';
785if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
786 /* The fast and low memory method to get and count full list converts the sql into a sql count */
787 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
788 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
789 $resql = $db->query($sqlforcount);
790 if ($resql) {
791 $objforcount = $db->fetch_object($resql);
792 $nbtotalofrecords = $objforcount->nbtotalofrecords;
793 } else {
794 dol_print_error($db);
795 }
796
797 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
798 $page = 0;
799 $offset = 0;
800 }
801 $db->free($resql);
802}
803
804
805// Complete request and execute it with limit
806$sql .= $db->order($sortfield, $sortorder);
807if ($limit) {
808 $sql .= $db->plimit($limit + 1, $offset);
809}
810
811$resql = $db->query($sql);
812if (!$resql) {
813 dol_print_error($db);
814 exit;
815}
816
817$num = $db->num_rows($resql);
818
819$arrayofselected = is_array($toselect) ? $toselect : array();
820
821// Output page
822// --------------------------------------------------------------------
823$help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double';
824llxHeader('', $title_page, $help_url, '', 0, 0, '', '', '', 'mod-accountancy accountancy-consultation page-journal');
825
826$formconfirm = '';
827
828// Print form confirm
829print $formconfirm;
830
831//$param=''; param started before
832if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
833 $param .= '&contextpage='.urlencode($contextpage);
834}
835if ($limit > 0 && $limit != $conf->liste_limit) {
836 $param .= '&limit='.((int) $limit);
837}
838
839// List of mass actions available
840$arrayofmassactions = array();
841if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && $user->hasRight('accounting', 'mouvements', 'creer')) {
842 $arrayofmassactions['letteringauto'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringAuto');
843 $arrayofmassactions['preunletteringauto'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('UnletteringAuto');
844 $arrayofmassactions['letteringmanual'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringManual');
845 $arrayofmassactions['preunletteringmanual'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('UnletteringManual');
846}
847if ($user->hasRight('accounting', 'mouvements', 'creer')) {
848 $arrayofmassactions['preclonebookkeepingwriting'] = img_picto('', 'clone', 'class="pictofixedwidth"').$langs->trans("Clone");
849}
850if ($user->hasRight('accounting', 'mouvements', 'creer')) {
851 $arrayofmassactions['preassignaccountbookkeepingwriting'] = img_picto('', 'fa-exchange-alt', 'class="pictofixedwidth"').$langs->trans("AssignAccount");
852}
853if ($user->hasRight('accounting', 'mouvements', 'creer')) {
854 $arrayofmassactions['prereturnaccountbookkeepingwriting'] = img_picto('', 'undo', 'class="pictofixedwidth"').$langs->trans("ReturnAccount");
855}
856if ($user->hasRight('accounting', 'mouvements', 'supprimer')) {
857 $arrayofmassactions['predeletebookkeepingwriting'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
858}
859
860if (GETPOSTINT('nomassaction') || in_array($massaction, array('preunletteringauto', 'preunletteringmanual', 'predeletebookkeepingwriting', 'preclonebookkeepingwriting', 'preassignaccountbookkeepingwriting', 'prereturnaccountbookkeepingwriting'))) {
861 $arrayofmassactions = array();
862}
863$massactionbutton = $form->selectMassAction($massaction, $arrayofmassactions);
864
865print '<form method="POST" id="searchFormList" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
866print '<input type="hidden" name="token" value="'.newToken().'">';
867print '<input type="hidden" name="action" value="list">';
868if ($optioncss != '') {
869 print '<input type="hidden" name="optioncss" value="'.urlencode($optioncss).'">';
870}
871print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
872print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
873print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
874print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
875
876if (count($filter)) {
877 $buttonLabel = $langs->trans("ExportFilteredList");
878} else {
879 $buttonLabel = $langs->trans("ExportList");
880}
881
882$parameters = array('param' => $param);
883$reshook = $hookmanager->executeHooks('addMoreActionsButtonsList', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
884if ($reshook < 0) {
885 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
886}
887
888$newcardbutton = empty($hookmanager->resPrint) ? '' : $hookmanager->resPrint;
889
890if (empty($reshook)) {
891 $newcardbutton .= dolGetButtonTitle($langs->trans('ViewFlatList'), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?'.$param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected'));
892 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?'.$param, '', 1, array('morecss' => 'marginleftonly'));
893 $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'));
894 $newcardbutton .= dolGetButtonTitle($langs->trans('ExportToPdf'), '', 'fa fa-file-pdf paddingleft', $_SERVER['PHP_SELF'] . '?action=exporttopdf&' . $param, '', $permissiontoexport, array('morecss' => 'marginleftonly'));
895
896 $url = './card.php?action=create'.(!empty($type) ? '&type=sub' : '').'&backtopage='.urlencode($_SERVER['PHP_SELF']);
897 if (!empty($socid)) {
898 $url .= '&socid='.$socid;
899 }
900 $newcardbutton .= dolGetButtonTitleSeparator();
901 $newcardbutton .= dolGetButtonTitle($langs->trans('NewAccountingMvt'), '', 'fa fa-plus-circle paddingleft', $url, '', $permissiontoadd);
902}
903
904print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1);
905
906if ($massaction == 'preunletteringauto') {
907 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnletteringAuto"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unletteringauto", null, '', 0, 200, 500, 1);
908} elseif ($massaction == 'preunletteringmanual') {
909 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnletteringManual"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unletteringmanual", null, '', 0, 200, 500, 1);
910} elseif ($massaction == 'predeletebookkeepingwriting') {
911 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDeleteBookkeepingWriting"), $langs->trans("ConfirmMassDeleteBookkeepingWritingQuestion", count($toselect)), "deletebookkeepingwriting", null, '', 0, 200, 500, 1);
912} elseif ($massaction == 'preassignaccountbookkeepingwriting') {
913 $input = $formaccounting->select_account('', 'account', 1);
914 $formquestion = array(array('type' => 'other', 'name' => 'account', 'label' => '<span class="fieldrequired">' . $langs->trans("AccountAccountingShort") . '</span>', 'value' => $input),);
915 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("confirmMassAssignAccountBookkeepingWritingConfirm"), $langs->trans("ConfirmMassAssignAccountBookkeepingWritingQuestion", count($toselect)), "assignaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
916} elseif ($massaction == 'preclonebookkeepingwriting') {
917 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
918 $input2 = $formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1) . '</td>';
919 $formquestion = array(
920 array(
921 'type' => 'other',
922 'name' => 'massdate',
923 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>',
924 'value' => $input1
925 )
926 );
927
928 if (getDolGlobalString('ACCOUNTING_CLONING_ENABLE_INPUT_JOURNAL')) {
929 $formquestion[] = array(
930 'type' => 'text',
931 'name' => 'code_journal',
932 'label' => '<span class="fieldrequired">' . $langs->trans("Codejournal") . '</span>',
933 'value' => $input2
934 );
935 }
936
937 print $form->formconfirm(
938 $_SERVER["PHP_SELF"],
939 $langs->trans("ConfirmMassCloneBookkeepingWriting"),
940 $langs->trans("ConfirmMassCloneBookkeepingWritingQuestion", count($toselect)),
941 "clonebookkeepingwriting",
942 $formquestion,
943 '', 0, 200, 500, 1
944 );
945} elseif ($massaction == 'prereturnaccountbookkeepingwriting') {
946 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
947 $formquestion = array(array('type' => 'other', 'name' => 'massdate', 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>', 'value' => $input1));
948 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassReturnAccountBookkeepingWriting"), $langs->trans("ConfirmMassReturnAccountBookkeepingWritingQuestion", count($toselect)), "returnaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
949}
950
951//$topicmail = "Information";
952//$modelmail = "accountingbookkeeping";
953//$objecttmp = new BookKeeping($db);
954//$trackid = 'bk'.$object->id;
955include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
956
957$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
958$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
959if ($massactionbutton && $contextpage != 'poslist') {
960 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
961}
962
963$moreforfilter = '';
964$moreforfilter .= '<div class="divsearchfield">';
965$moreforfilter .= $langs->trans('AccountingCategory').': ';
966$moreforfilter .= '<div class="nowrap inline-block">';
967$moreforfilter .= $formaccounting->select_accounting_category($search_account_category, 'search_account_category', 1, 0, 0, 0);
968$moreforfilter .= '</div>';
969$moreforfilter .= '</div>';
970
971$parameters = array();
972$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
973if (empty($reshook)) {
974 $moreforfilter .= $hookmanager->resPrint;
975} else {
976 $moreforfilter = $hookmanager->resPrint;
977}
978
979print '<div class="liste_titre liste_titre_bydiv centpercent">';
980print $moreforfilter;
981print '</div>';
982
983print '<div class="div-table-responsive">';
984print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">';
985
986// Filters lines
987print '<tr class="liste_titre_filter">';
988// Action column
989if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
990 print '<td class="liste_titre center">';
991 $searchpicto = $form->showFilterButtons('left');
992 print $searchpicto;
993 print '</td>';
994}
995// Movement number
996if (!empty($arrayfields['t.piece_num']['checked'])) {
997 print '<td class="liste_titre"><input type="text" name="search_mvt_num" size="6" value="'.dol_escape_htmltag($search_mvt_num).'"></td>';
998}
999// Code journal
1000if (!empty($arrayfields['t.code_journal']['checked'])) {
1001 print '<td class="liste_titre center">';
1002 print $formaccounting->multi_select_journal($search_ledger_code, 'search_ledger_code', 0, 1, 1, 1, 'maxwidth75');
1003 print '</td>';
1004}
1005// Date document
1006if (!empty($arrayfields['t.doc_date']['checked'])) {
1007 print '<td class="liste_titre center">';
1008 print '<div class="nowrapfordate">';
1009 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1010 print '</div>';
1011 print '<div class="nowrapfordate">';
1012 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1013 print '</div>';
1014 print '</td>';
1015}
1016// Ref document
1017if (!empty($arrayfields['t.doc_ref']['checked'])) {
1018 print '<td class="liste_titre"><input type="text" name="search_doc_ref" class="width75" value="'.dol_escape_htmltag($search_doc_ref).'"></td>';
1019}
1020// Accountancy account
1021if (!empty($arrayfields['t.numero_compte']['checked'])) {
1022 print '<td class="liste_titre">';
1023 print '<div class="nowrap">';
1024 print $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth150', 'account');
1025 print '</div>';
1026 print '<div class="nowrap">';
1027 print $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth150', 'account');
1028 print '</div>';
1029 print '</td>';
1030}
1031// Subledger account
1032if (!empty($arrayfields['t.subledger_account']['checked'])) {
1033 print '<td class="liste_titre">';
1034 // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because it does not
1035 // use setup of keypress to select thirdparty and this hang browser on large database.
1036 if (getDolGlobalString('ACCOUNTANCY_COMBO_FOR_AUX')) {
1037 print '<div class="nowrap">';
1038 //print $langs->trans('From').' ';
1039 print $formaccounting->select_auxaccount($search_accountancy_aux_code_start, 'search_accountancy_aux_code_start', $langs->trans('From'), 'maxwidth250', 'subledgeraccount');
1040 print '</div>';
1041 print '<div class="nowrap">';
1042 print $formaccounting->select_auxaccount($search_accountancy_aux_code_end, 'search_accountancy_aux_code_end', $langs->trans('to'), 'maxwidth250', 'subledgeraccount');
1043 print '</div>';
1044 } else {
1045 print '<input type="text" class="maxwidth75" name="search_accountancy_aux_code" value="'.dol_escape_htmltag($search_accountancy_aux_code).'">';
1046 }
1047 print '</td>';
1048}
1049// Label operation
1050if (!empty($arrayfields['t.label_operation']['checked'])) {
1051 print '<td class="liste_titre">';
1052 print '<input type="text" size="7" class="flat" name="search_mvt_label" value="'.dol_escape_htmltag($search_mvt_label).'"/>';
1053 print '</td>';
1054}
1055// Debit
1056if (!empty($arrayfields['t.debit']['checked'])) {
1057 print '<td class="liste_titre right">';
1058 print '<input type="text" class="flat" name="search_debit" size="4" value="'.dol_escape_htmltag($search_debit).'">';
1059 print '</td>';
1060}
1061// Credit
1062if (!empty($arrayfields['t.credit']['checked'])) {
1063 print '<td class="liste_titre right">';
1064 print '<input type="text" class="flat" name="search_credit" size="4" value="'.dol_escape_htmltag($search_credit).'">';
1065 print '</td>';
1066}
1067// Matching code
1068if (!empty($arrayfields['t.lettering_code']['checked'])) {
1069 print '<td class="liste_titre center">';
1070 print '<input type="text" size="3" class="flat" name="search_lettering_code" value="'.dol_escape_htmltag($search_lettering_code).'"/>';
1071 print '<br><span class="nowrap"><input type="checkbox" name="search_not_reconciled" value="notreconciled"'.($search_not_reconciled == 'notreconciled' ? ' checked' : '').'>'.$langs->trans("NotReconciled").'</span>';
1072 print '</td>';
1073}
1074
1075// Fields from hook
1076$parameters = array('arrayfields' => $arrayfields);
1077$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1078print $hookmanager->resPrint;
1079
1080// Date creation
1081if (!empty($arrayfields['t.date_creation']['checked'])) {
1082 print '<td class="liste_titre center">';
1083 print '<div class="nowrapfordate">';
1084 print $form->selectDate($search_date_creation_start, 'search_date_creation_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_creation_end, 'search_date_creation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1088 print '</div>';
1089 print '</td>';
1090}
1091// Date modification
1092if (!empty($arrayfields['t.tms']['checked'])) {
1093 print '<td class="liste_titre center">';
1094 print '<div class="nowrapfordate">';
1095 print $form->selectDate($search_date_modification_start, 'search_date_modification_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_modification_end, 'search_date_modification_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1099 print '</div>';
1100 print '</td>';
1101}
1102// Date export
1103if (!empty($arrayfields['t.date_export']['checked'])) {
1104 print '<td class="liste_titre center">';
1105 print '<div class="nowrapfordate">';
1106 print $form->selectDate($search_date_export_start, 'search_date_export_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_export_end, 'search_date_export_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1110 print '</div>';
1111 print '</td>';
1112}
1113// Date validation
1114if (!empty($arrayfields['t.date_validated']['checked'])) {
1115 print '<td class="liste_titre center">';
1116 print '<div class="nowrapfordate">';
1117 print $form->selectDate($search_date_validation_start, 'search_date_validation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1118 print '</div>';
1119 print '<div class="nowrapfordate">';
1120 print $form->selectDate($search_date_validation_end, 'search_date_validation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1121 print '</div>';
1122 print '</td>';
1123}
1124// Due date start and end
1125if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1126 print '<td class="liste_titre center">';
1127 print '<div class="nowrapfordate">';
1128 print $form->selectDate($search_date_due_start, 'search_date_due_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1129 print '</div>';
1130 print '<div class="nowrapfordate">';
1131 print $form->selectDate($search_date_due_end, 'search_date_due_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1132 print '</div>';
1133 print '</td>';
1134}
1135if (!empty($arrayfields['t.import_key']['checked'])) {
1136 print '<td class="liste_titre center">';
1137 print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="'.dol_escape_htmltag($search_import_key).'">';
1138 print '</td>';
1139}
1140// Action column
1141if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1142 print '<td class="liste_titre center">';
1143 $searchpicto = $form->showFilterButtons();
1144 print $searchpicto;
1145 print '</td>';
1146}
1147print "</tr>\n";
1148
1149print '<tr class="liste_titre">';
1150if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1151 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch actioncolumn ');
1152}
1153if (!empty($arrayfields['t.piece_num']['checked'])) {
1154 print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, "", $sortfield, $sortorder);
1155}
1156if (!empty($arrayfields['t.code_journal']['checked'])) {
1157 print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center ');
1158}
1159if (!empty($arrayfields['t.doc_date']['checked'])) {
1160 print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1161}
1162if (!empty($arrayfields['t.doc_ref']['checked'])) {
1163 print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder);
1164}
1165if (!empty($arrayfields['t.numero_compte']['checked'])) {
1166 print_liste_field_titre($arrayfields['t.numero_compte']['label'], $_SERVER['PHP_SELF'], "t.numero_compte", "", $param, "", $sortfield, $sortorder);
1167}
1168if (!empty($arrayfields['t.subledger_account']['checked'])) {
1169 print_liste_field_titre($arrayfields['t.subledger_account']['label'], $_SERVER['PHP_SELF'], "t.subledger_account", "", $param, "", $sortfield, $sortorder);
1170}
1171if (!empty($arrayfields['t.label_operation']['checked'])) {
1172 print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder);
1173}
1174if (!empty($arrayfields['t.debit']['checked'])) {
1175 print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right ');
1176}
1177if (!empty($arrayfields['t.credit']['checked'])) {
1178 print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right ');
1179}
1180if (!empty($arrayfields['t.lettering_code']['checked'])) {
1181 print_liste_field_titre($arrayfields['t.lettering_code']['label'], $_SERVER['PHP_SELF'], "t.lettering_code", "", $param, '', $sortfield, $sortorder, 'center ');
1182}
1183// Hook fields
1184$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1185$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1186print $hookmanager->resPrint;
1187if (!empty($arrayfields['t.date_creation']['checked'])) {
1188 print_liste_field_titre($arrayfields['t.date_creation']['label'], $_SERVER['PHP_SELF'], "t.date_creation", "", $param, '', $sortfield, $sortorder, 'center ');
1189}
1190if (!empty($arrayfields['t.tms']['checked'])) {
1191 print_liste_field_titre($arrayfields['t.tms']['label'], $_SERVER['PHP_SELF'], "t.tms", "", $param, '', $sortfield, $sortorder, 'center ');
1192}
1193if (!empty($arrayfields['t.date_export']['checked'])) {
1194 print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export,t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1195}
1196if (!empty($arrayfields['t.date_validated']['checked'])) {
1197 print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated,t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1198}
1199// Due date
1200if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1201 print_liste_field_titre($arrayfields['t.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], 't.date_lim_reglement', '', $param, '', $sortfield, $sortorder, 'center ');
1202}
1203if (!empty($arrayfields['t.import_key']['checked'])) {
1204 print_liste_field_titre($arrayfields['t.import_key']['label'], $_SERVER["PHP_SELF"], "t.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
1205}
1206if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1207 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1208}
1209print "</tr>\n";
1210
1211
1212$line = new BookKeepingLine($db);
1213
1214// Loop on record
1215// --------------------------------------------------------------------
1216$i = 0;
1217$totalarray = array();
1218$totalarray['nbfield'] = 0;
1219$totalarray['val'] = array();
1220$totalarray['val']['totaldebit'] = 0;
1221$totalarray['val']['totalcredit'] = 0;
1222
1223while ($i < min($num, $limit)) {
1224 $obj = $db->fetch_object($resql);
1225 if (empty($obj)) {
1226 break; // Should not happen
1227 }
1228
1229 $line->id = $obj->rowid;
1230 $line->doc_date = $db->jdate($obj->doc_date);
1231 $line->doc_type = $obj->doc_type;
1232 $line->doc_ref = $obj->doc_ref;
1233 $line->fk_doc = $obj->fk_doc;
1234 $line->fk_docdet = $obj->fk_docdet;
1235 $line->thirdparty_code = $obj->thirdparty_code;
1236 $line->subledger_account = $obj->subledger_account;
1237 $line->subledger_label = $obj->subledger_label;
1238 $line->numero_compte = $obj->numero_compte;
1239 $line->label_compte = $obj->label_compte;
1240 $line->label_operation = $obj->label_operation;
1241 $line->debit = $obj->debit;
1242 $line->credit = $obj->credit;
1243 $line->montant = $obj->amount; // deprecated
1244 $line->amount = $obj->amount;
1245 $line->sens = $obj->sens;
1246 $line->lettering_code = $obj->lettering_code;
1247 $line->fk_user_author = $obj->fk_user_author;
1248 $line->import_key = $obj->import_key;
1249 $line->code_journal = $obj->code_journal;
1250 $line->journal_label = $obj->journal_label;
1251 $line->piece_num = $obj->piece_num;
1252 $line->ref = $obj->ref;
1253 $line->date_creation = $db->jdate($obj->date_creation);
1254 $line->date_modification = $db->jdate($obj->date_modification);
1255 $line->date_export = $db->jdate($obj->date_export);
1256 $line->date_validation = $db->jdate($obj->date_validation);
1257 // Due date
1258 $line->date_lim_reglement = $db->jdate($obj->date_lim_reglement);
1259
1260 print '<tr class="oddeven">';
1261 // Action column
1262 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1263 print '<td class="nowraponall center">';
1264 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
1265 $selected = 0;
1266 if (in_array($line->id, $arrayofselected)) {
1267 $selected = 1;
1268 }
1269 print '<input id="cb'.$line->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$line->id.'"'.($selected ? ' checked="checked"' : '').' />';
1270 }
1271 print '</td>';
1272 if (!$i) {
1273 $totalarray['nbfield']++;
1274 }
1275 }
1276
1277 // Piece number
1278 if (!empty($arrayfields['t.piece_num']['checked'])) {
1279 print '<td class="nowraponall">';
1280 $object->id = $line->id;
1281 $object->piece_num = $line->piece_num;
1282 $object->ref = $line->ref;
1283 print $object->getNomUrl(1, '', 0, '', 1);
1284 print '<span class="hideonsmartphone">';
1285 if (!empty($line->date_export)) {
1286 print img_picto($langs->trans("DateExport").": ".dol_print_date($line->date_export, 'dayhour')." (".$langs->trans("TransactionExportDesc").")", 'fa-file-export', 'class="paddingleft pictofixedwidth opacitymedium"');
1287 }
1288 if (!empty($line->date_validation)) {
1289 print img_picto($langs->trans("DateValidation").": ".dol_print_date($line->date_validation, 'dayhour')." (".$langs->trans("TransactionBlockedLockedDesc").")", 'fa-lock', 'class="paddingleft pictofixedwidth opacitymedium"');
1290 }
1291 print '</span>';
1292 print '</td>';
1293 if (!$i) {
1294 $totalarray['nbfield']++;
1295 }
1296 }
1297
1298 // Journal code
1299 if (!empty($arrayfields['t.code_journal']['checked'])) {
1300 if (empty($conf->cache['accountingjournal'][$line->code_journal])) {
1301 $accountingjournal = new AccountingJournal($db);
1302 $accountingjournal->fetch(0, $line->code_journal);
1303 $conf->cache['accountingjournal'][$line->code_journal] = $accountingjournal;
1304 } else {
1305 $accountingjournal = $conf->cache['accountingjournal'][$line->code_journal];
1306 }
1307
1308 $journaltoshow = (($accountingjournal->id > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal);
1309 print '<td class="center tdoverflowmax150">'.$journaltoshow.'</td>';
1310 if (!$i) {
1311 $totalarray['nbfield']++;
1312 }
1313 }
1314
1315 // Document date
1316 if (!empty($arrayfields['t.doc_date']['checked'])) {
1317 print '<td class="center">'.dol_print_date($line->doc_date, 'day').'</td>';
1318 if (!$i) {
1319 $totalarray['nbfield']++;
1320 }
1321 }
1322
1323 // Document ref
1324 $modulepart = ''; // may be used by include*.tpl.php
1325 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1326 $documentlink = '';
1327 $objectstatic = null;
1328
1329 if ($line->doc_type === 'customer_invoice') {
1330 $langs->loadLangs(array('bills'));
1331
1332 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1333 $objectstatic = new Facture($db);
1334 $objectstatic->fetch($line->fk_doc);
1335 //$modulepart = 'facture';
1336
1337 $filename = dol_sanitizeFileName($line->doc_ref);
1338 $filedir = $conf->invoice->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1339 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1340 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1341 } elseif ($line->doc_type === 'supplier_invoice') {
1342 $langs->loadLangs(array('bills'));
1343
1344 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1345 $objectstatic = new FactureFournisseur($db);
1346 $objectstatic->fetch($line->fk_doc);
1347
1348 $modulepart = 'invoice_supplier';
1349 $filename = dol_sanitizeFileName($line->doc_ref);
1350
1351 //$filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($line->fk_doc, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1352 //$subdir = get_exdir($objectstatic->id, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1353 $filedir = getMultidirOutput($objectstatic, '', 1).dol_sanitizeFileName($line->doc_ref);
1354 $subdir = getMultidirOutput($objectstatic, '', 1, 'outputrel').dol_sanitizeFileName($line->doc_ref);
1355 //var_dump($filedir); var_dump($subdir);
1356
1357 if ($objectstatic->id > 0) {
1358 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $subdir, $filedir);
1359 } else {
1360 $documentlink = $line->doc_ref;
1361 }
1362 } elseif ($line->doc_type === 'expense_report') {
1363 $langs->loadLangs(array('trips'));
1364
1365 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
1366 $objectstatic = new ExpenseReport($db);
1367 $objectstatic->fetch($line->fk_doc);
1368 //$modulepart = 'expensereport';
1369
1370 $filename = dol_sanitizeFileName($line->doc_ref);
1371 $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1372 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1373 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1374 } elseif ($line->doc_type === 'bank') {
1375 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1376 $objectstatic = new AccountLine($db);
1377 $objectstatic->fetch($line->fk_doc);
1378 } else {
1379 // Other type
1380 }
1381
1382 $labeltoshow = '';
1383 $labeltoshowalt = '';
1384 $classforlabel = '';
1385 if (($line->doc_type === 'customer_invoice' || $line->doc_type === 'supplier_invoice' || $line->doc_type === 'expense_report') && is_object($objectstatic)) {
1386 $labeltoshow .= $objectstatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1);
1387 $labeltoshow .= $documentlink;
1388 $labeltoshowalt .= $objectstatic->ref;
1389 } elseif ($line->doc_type === 'bank' && is_object($objectstatic)) {
1390 $labeltoshow .= $objectstatic->getNomUrl(1);
1391 $labeltoshowalt .= $objectstatic->ref;
1392 $bank_ref = strstr($line->doc_ref, '-');
1393 $labeltoshow .= " " . $bank_ref;
1394 $labeltoshowalt .= " " . $bank_ref;
1395 } else {
1396 $labeltoshow .= $line->doc_ref;
1397 $labeltoshowalt .= $line->doc_ref;
1398 $classforlabel = 'tdoverflowmax250';
1399 }
1400
1401 print '<td class="nowraponall'.($classforlabel ? ' '.$classforlabel : '').'" title="'.dol_escape_htmltag($labeltoshowalt).'">';
1402 print $labeltoshow;
1403 print "</td>\n";
1404 if (!$i) {
1405 $totalarray['nbfield']++;
1406 }
1407 }
1408
1409 // Account number
1410 if (!empty($arrayfields['t.numero_compte']['checked'])) {
1411 print '<td>'.length_accountg($line->numero_compte).'</td>';
1412 if (!$i) {
1413 $totalarray['nbfield']++;
1414 }
1415 }
1416
1417 // Subledger account
1418 if (!empty($arrayfields['t.subledger_account']['checked'])) {
1419 print '<td>'.length_accounta($line->subledger_account).'</td>';
1420 if (!$i) {
1421 $totalarray['nbfield']++;
1422 }
1423 }
1424
1425 // Label operation
1426 if (!empty($arrayfields['t.label_operation']['checked'])) {
1427 print '<td class="small tdoverflowmax200" title="'.dol_escape_htmltag($line->label_operation).'">'.dol_escape_htmltag($line->label_operation).'</td>';
1428 if (!$i) {
1429 $totalarray['nbfield']++;
1430 }
1431 }
1432
1433 // Amount debit
1434 if (!empty($arrayfields['t.debit']['checked'])) {
1435 print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
1436 if (!$i) {
1437 $totalarray['nbfield']++;
1438 }
1439 if (!$i) {
1440 $totalarray['pos'][$totalarray['nbfield']] = 'totaldebit';
1441 }
1442 $totalarray['val']['totaldebit'] += $line->debit;
1443 }
1444
1445 // Amount credit
1446 if (!empty($arrayfields['t.credit']['checked'])) {
1447 print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
1448 if (!$i) {
1449 $totalarray['nbfield']++;
1450 }
1451 if (!$i) {
1452 $totalarray['pos'][$totalarray['nbfield']] = 'totalcredit';
1453 }
1454 $totalarray['val']['totalcredit'] += $line->credit;
1455 }
1456
1457 // Matching code
1458 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1459 print '<td class="center">'.$line->lettering_code.'</td>';
1460 if (!$i) {
1461 $totalarray['nbfield']++;
1462 }
1463 }
1464
1465 // Fields from hook
1466 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1467 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1468 print $hookmanager->resPrint;
1469
1470 // Creation operation date
1471 if (!empty($arrayfields['t.date_creation']['checked'])) {
1472 print '<td class="center">'.dol_print_date($line->date_creation, 'dayhour', 'tzuserrel').'</td>';
1473 if (!$i) {
1474 $totalarray['nbfield']++;
1475 }
1476 }
1477
1478 // Modification operation date
1479 if (!empty($arrayfields['t.tms']['checked'])) {
1480 print '<td class="center">'.dol_print_date($line->date_modification, 'dayhour', 'tzuserrel').'</td>';
1481 if (!$i) {
1482 $totalarray['nbfield']++;
1483 }
1484 }
1485
1486 // Exported operation date
1487 if (!empty($arrayfields['t.date_export']['checked'])) {
1488 print '<td class="center nowraponall">'.dol_print_date($line->date_export, 'dayhour', 'tzuserrel').'</td>';
1489 if (!$i) {
1490 $totalarray['nbfield']++;
1491 }
1492 }
1493
1494 // Validated operation date
1495 if (!empty($arrayfields['t.date_validated']['checked'])) {
1496 print '<td class="center nowraponall">'.dol_print_date($line->date_validation, 'dayhour', 'tzuserrel').'</td>';
1497 if (!$i) {
1498 $totalarray['nbfield']++;
1499 }
1500 }
1501
1502 // Due date
1503 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1504 print '<td class="center">'.dol_print_date($line->date_lim_reglement, 'day').'</td>';
1505 if (!$i) {
1506 $totalarray['nbfield']++;
1507 }
1508 }
1509
1510 if (!empty($arrayfields['t.import_key']['checked'])) {
1511 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($obj->import_key).'">'.dol_escape_htmltag($obj->import_key)."</td>\n";
1512 if (!$i) {
1513 $totalarray['nbfield']++;
1514 }
1515 }
1516
1517 // Action column
1518 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1519 print '<td class="nowraponall center">';
1520 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
1521 $selected = 0;
1522 if (in_array($line->id, $arrayofselected)) {
1523 $selected = 1;
1524 }
1525 print '<input id="cb'.$line->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$line->id.'"'.($selected ? ' checked="checked"' : '').' />';
1526 }
1527 print '</td>';
1528 if (!$i) {
1529 $totalarray['nbfield']++;
1530 }
1531 }
1532
1533
1534 print "</tr>\n";
1535
1536 $i++;
1537}
1538
1539// Show total line
1540include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1541
1542// If no record found
1543if ($num == 0) {
1544 $colspan = 1;
1545 foreach ($arrayfields as $key => $val) {
1546 if (!empty($val['checked'])) {
1547 $colspan++;
1548 }
1549 }
1550 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1551}
1552
1553$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1554$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1555print $hookmanager->resPrint;
1556
1557print "</table>";
1558print '</div>';
1559
1560print '</form>';
1561
1562// End of page
1563llxFooter();
1564
1565$db->close();
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition export.php:1216
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 permettant la generation de composants html autre 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:637
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)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
if(!function_exists( 'utf8_encode')) if(!function_exists('utf8_decode')) if(!function_exists( 'str_starts_with')) if(!function_exists('str_ends_with')) if(!function_exists( 'str_contains')) 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.
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...
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.