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 } else {
515 setEventMessages($object->error, $object->errors, 'errors');
516 $error++;
517 break;
518 }
519 } elseif ($result < 0) {
520 setEventMessages($object->error, $object->errors, 'errors');
521 $error++;
522 break;
523 } elseif (isset($object->date_validation) && $object->date_validation != '') {
524 setEventMessages($langs->trans("ValidatedRecordWhereFound"), null, 'errors');
525 $error++;
526 break;
527 }
528 }
529 }
530
531 if (!$error) {
532 $db->commit();
533
534 // Message for elements well deleted
535 if ($nbok > 1) {
536 setEventMessages($langs->trans("RecordsDeleted", $nbok), null, 'mesgs');
537 } elseif ($nbok > 0) {
538 setEventMessages($langs->trans("RecordDeleted", $nbok), null, 'mesgs');
539 } else {
540 setEventMessages($langs->trans("NoRecordDeleted"), null, 'mesgs');
541 }
542
543 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
544 exit;
545 } else {
546 $db->rollback();
547 }
548 }
549
550 // massaction cloning
551 if (!$error && $action == 'clonebookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
552 $result = $object->newCloneMass($toselect, $journal_code, $massdate);
553 if ($result == -1) {
554 $error++;
555 }
556 if ($error) {
557 $db->commit();
558 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
559 exit;
560 } else {
561 $db->rollback();
562 }
563 }
564
565 // massaction assign new account
566 if (!$error && $action == 'assignaccountbookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
567 $result = $object->assignAccountMass($toselect, (int) $account);
568 if ($result == -1) {
569 $error++;
570 }
571 if (!$error) {
572 $db->commit();
573 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
574 exit();
575 } else {
576 $db->rollback();
577 }
578 }
579
580 // mass action return account
581 if (!$error && $action == 'returnaccountbookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
582 $result = $object->newReturnAccount($toselect, $journal_code, $massdate);
583 if ($result == -1) {
584 $error++;
585 }
586 if (!$error) {
587 $db->commit();
588 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
589 exit();
590 } else {
591 $db->rollback();
592 }
593 }
594
595 // mass actions on lettering
596 if (!$error && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
597 if ($massaction == 'letteringauto' && $permissiontoadd) {
598 $lettering = new Lettering($db);
599 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect);
600 if ($nb_lettering < 0) {
601 setEventMessages('', $lettering->errors, 'errors');
602 $error++;
603 $nb_lettering = max(0, abs($nb_lettering) - 2);
604 } elseif ($nb_lettering == 0) {
605 $nb_lettering = 0;
606 setEventMessages($langs->trans('AccountancyNoLetteringModified'), array(), 'mesgs');
607 }
608 if ($nb_lettering == 1) {
609 setEventMessages($langs->trans('AccountancyOneLetteringModifiedSuccessfully'), array(), 'mesgs');
610 } elseif ($nb_lettering > 1) {
611 setEventMessages($langs->trans('AccountancyLetteringModifiedSuccessfully', $nb_lettering), array(), 'mesgs');
612 }
613
614 if (!$error) {
615 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
616 exit();
617 }
618 } elseif ($massaction == 'letteringmanual' && $permissiontoadd) {
619 $lettering = new Lettering($db);
620 $result = $lettering->updateLettering($toselect);
621 if ($result < 0) {
622 setEventMessages('', $lettering->errors, 'errors');
623 } else {
624 setEventMessages($langs->trans('AccountancyOneLetteringModifiedSuccessfully'), array(), 'mesgs');
625 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
626 exit();
627 }
628 } elseif ($action == 'unletteringauto' && $confirm == "yes" && $permissiontoadd) {
629 $lettering = new Lettering($db);
630 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true);
631 if ($nb_lettering < 0) {
632 setEventMessages('', $lettering->errors, 'errors');
633 $error++;
634 $nb_lettering = max(0, abs($nb_lettering) - 2);
635 } elseif ($nb_lettering == 0) {
636 $nb_lettering = 0;
637 setEventMessages($langs->trans('AccountancyNoUnletteringModified'), array(), 'mesgs');
638 }
639 if ($nb_lettering == 1) {
640 setEventMessages($langs->trans('AccountancyOneUnletteringModifiedSuccessfully'), array(), 'mesgs');
641 } elseif ($nb_lettering > 1) {
642 setEventMessages($langs->trans('AccountancyUnletteringModifiedSuccessfully', $nb_lettering), array(), 'mesgs');
643 }
644
645 if (!$error) {
646 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
647 exit();
648 }
649 } elseif ($action == 'unletteringmanual' && $confirm == "yes" && $permissiontoadd) {
650 $lettering = new Lettering($db);
651 $nb_lettering = $lettering->deleteLettering($toselect);
652 if ($nb_lettering < 0) {
653 setEventMessages('', $lettering->errors, 'errors');
654 } else {
655 setEventMessages($langs->trans('AccountancyOneUnletteringModifiedSuccessfully'), array(), 'mesgs');
656 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
657 exit();
658 }
659 }
660 }
661}
662
663// Build and execute select (used by page and export action)
664// must de set after the action that set $filter
665// --------------------------------------------------------------------
666
667$sql = 'SELECT';
668$sql .= ' t.rowid,';
669$sql .= " t.doc_date,";
670$sql .= " t.doc_type,";
671$sql .= " t.doc_ref,";
672$sql .= " t.fk_doc,";
673$sql .= " t.fk_docdet,";
674$sql .= " t.thirdparty_code,";
675$sql .= " t.subledger_account,";
676$sql .= " t.subledger_label,";
677$sql .= " t.numero_compte,";
678$sql .= " t.label_compte,";
679$sql .= " t.label_operation,";
680$sql .= " t.debit,";
681$sql .= " t.credit,";
682$sql .= " t.lettering_code,";
683$sql .= " t.montant as amount,";
684$sql .= " t.sens,";
685$sql .= " t.fk_user_author,";
686$sql .= " t.import_key,";
687$sql .= " t.code_journal,";
688$sql .= " t.journal_label,";
689$sql .= " t.piece_num,";
690$sql .= " t.ref,";
691$sql .= " t.date_creation,";
692$sql .= " t.tms as date_modification,";
693$sql .= " t.date_export,";
694$sql .= " t.date_validated as date_validation,";
695$sql .= " t.date_lim_reglement,";
696$sql .= " t.import_key";
697
698$sqlfields = $sql; // $sql fields to remove for count total
699
700$sql .= ' FROM '.MAIN_DB_PREFIX.$object->table_element.' as t';
701// Manage filter
702$sqlwhere = array();
703if (count($filter) > 0) {
704 foreach ($filter as $key => $value) {
705 if ($key == 't.doc_date') {
706 $sqlwhere[] = $db->sanitize($key)." = '".$db->idate($value)."'";
707 } elseif ($key == 't.doc_date>=') {
708 $sqlwhere[] = "t.doc_date >= '".$db->idate($value)."'";
709 } elseif ($key == 't.doc_date<=') {
710 $sqlwhere[] = "t.doc_date <= '".$db->idate($value)."'";
711 } elseif ($key == 't.numero_compte>=') {
712 $sqlwhere[] = "t.numero_compte >= '".$db->escape($value)."'";
713 } elseif ($key == 't.numero_compte<=') {
714 $sqlwhere[] = "t.numero_compte <= '".$db->escape($value)."'";
715 } elseif ($key == 't.subledger_account>=') {
716 $sqlwhere[] = "t.subledger_account >= '".$db->escape($value)."'";
717 } elseif ($key == 't.subledger_account<=') {
718 $sqlwhere[] = "t.subledger_account <= '".$db->escape($value)."'";
719 } elseif ($key == 't.piece_num') {
720 // piece_num is an integer column, a LIKE on it is translated to ILIKE by the pgsql driver and fails
721 $sqlwhere[] = natural_search($key, $value, 1, 1);
722 } elseif ($key == 't.subledger_account' || $key == 't.numero_compte') {
723 $sqlwhere[] = $db->sanitize($key)." LIKE '".$db->escape($db->escapeforlike($value))."%'";
724 /* } elseif ($key == 't.subledger_account') { // test is always false
725 $sqlwhere[] = natural_search($key, $value, 0, 1); */
726 } elseif ($key == 't.tms>=') {
727 $sqlwhere[] = "t.tms >= '".$db->idate($value)."'";
728 } elseif ($key == 't.tms<=') {
729 $sqlwhere[] = "t.tms <= '".$db->idate($value)."'";
730 } elseif ($key == 't.date_creation>=') {
731 $sqlwhere[] = "t.date_creation >= '".$db->idate($value)."'";
732 } elseif ($key == 't.date_creation<=') {
733 $sqlwhere[] = "t.date_creation <= '".$db->idate($value)."'";
734 } elseif ($key == 't.date_export>=') {
735 $sqlwhere[] = "t.date_export >= '".$db->idate($value)."'";
736 } elseif ($key == 't.date_export<=') {
737 $sqlwhere[] = "t.date_export <= '".$db->idate($value)."'";
738 } elseif ($key == 't.date_validated>=') {
739 $sqlwhere[] = "t.date_validated >= '".$db->idate($value)."'";
740 } elseif ($key == 't.date_validated<=') {
741 $sqlwhere[] = "t.date_validated <= '".$db->idate($value)."'";
742 } elseif ($key == 't.date_lim_reglement>=') {
743 $sqlwhere[] = "t.date_lim_reglement >= '".$db->idate($value)."'";
744 } elseif ($key == 't.date_lim_reglement<=') {
745 $sqlwhere[] = "t.date_lim_reglement <= '".$db->idate($value)."'";
746 } elseif ($key == 't.credit' || $key == 't.debit') {
747 $sqlwhere[] = natural_search($key, $value, 1, 1);
748 } elseif ($key == 't.reconciled_option') {
749 $sqlwhere[] = 't.lettering_code IS NULL';
750 } elseif ($key == 't.code_journal' && !empty($value)) { // @phpstan-ignore-line false positive on !empty
751 if (is_array($value)) {
752 $sqlwhere[] = natural_search("t.code_journal", implode(',', $value), 3, 1);
753 } else {
754 $sqlwhere[] = natural_search("t.code_journal", $value, 3, 1);
755 }
756 } elseif ($key == 't.search_accounting_code_in' && !empty($value)) { // @phpstan-ignore-line false positive on !empty
757 $sqlwhere[] = 't.numero_compte IN ('.$db->sanitize($value, 1).')';
758 } else {
759 $sqlwhere[] = natural_search($key, $value, 0, 1);
760 }
761 }
762}
763$sql .= ' WHERE t.entity IN ('.getEntity('accountancy').')';
764
765if (count($sqlwhere) > 0) {
766 $sql .= ' AND '.implode(' AND ', $sqlwhere);
767}
768//print $sql;
769
770/*
771 * View
772 */
773
774$formother = new FormOther($db);
775$formfile = new FormFile($db);
776
777$title_page = $langs->trans("Operations").' - '.$langs->trans("Journals");
778
779// Count total nb of records
780$nbtotalofrecords = '';
781if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
782 /* The fast and low memory method to get and count full list converts the sql into a sql count */
783 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
784 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
785 $resql = $db->query($sqlforcount);
786 if ($resql) {
787 $objforcount = $db->fetch_object($resql);
788 $nbtotalofrecords = $objforcount->nbtotalofrecords;
789 } else {
790 dol_print_error($db);
791 }
792
793 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
794 $page = 0;
795 $offset = 0;
796 }
797 $db->free($resql);
798}
799
800
801// Complete request and execute it with limit
802$sql .= $db->order($sortfield, $sortorder);
803if ($limit) {
804 $sql .= $db->plimit($limit + 1, $offset);
805}
806
807$resql = $db->query($sql);
808if (!$resql) {
809 dol_print_error($db);
810 exit;
811}
812
813$num = $db->num_rows($resql);
814
815$arrayofselected = is_array($toselect) ? $toselect : array();
816
817// Output page
818// --------------------------------------------------------------------
819$help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double';
820llxHeader('', $title_page, $help_url, '', 0, 0, '', '', '', 'mod-accountancy accountancy-consultation page-journal');
821
822$formconfirm = '';
823
824// Print form confirm
825print $formconfirm;
826
827//$param=''; param started before
828if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
829 $param .= '&contextpage='.urlencode($contextpage);
830}
831if ($limit > 0 && $limit != $conf->liste_limit) {
832 $param .= '&limit='.((int) $limit);
833}
834
835// List of mass actions available
836$arrayofmassactions = array();
837if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && $user->hasRight('accounting', 'mouvements', 'creer')) {
838 $arrayofmassactions['letteringauto'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringAuto');
839 $arrayofmassactions['preunletteringauto'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('UnletteringAuto');
840 $arrayofmassactions['letteringmanual'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringManual');
841 $arrayofmassactions['preunletteringmanual'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('UnletteringManual');
842}
843if ($user->hasRight('accounting', 'mouvements', 'creer')) {
844 $arrayofmassactions['preclonebookkeepingwriting'] = img_picto('', 'clone', 'class="pictofixedwidth"').$langs->trans("Clone");
845}
846if ($user->hasRight('accounting', 'mouvements', 'creer')) {
847 $arrayofmassactions['preassignaccountbookkeepingwriting'] = img_picto('', 'fa-exchange-alt', 'class="pictofixedwidth"').$langs->trans("AssignAccount");
848}
849if ($user->hasRight('accounting', 'mouvements', 'creer')) {
850 $arrayofmassactions['prereturnaccountbookkeepingwriting'] = img_picto('', 'undo', 'class="pictofixedwidth"').$langs->trans("ReturnAccount");
851}
852if ($user->hasRight('accounting', 'mouvements', 'supprimer')) {
853 $arrayofmassactions['predeletebookkeepingwriting'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
854}
855
856if (GETPOSTINT('nomassaction') || in_array($massaction, array('preunletteringauto', 'preunletteringmanual', 'predeletebookkeepingwriting', 'preclonebookkeepingwriting', 'preassignaccountbookkeepingwriting', 'prereturnaccountbookkeepingwriting'))) {
857 $arrayofmassactions = array();
858}
859$massactionbutton = $form->selectMassAction($massaction, $arrayofmassactions);
860
861print '<form method="POST" id="searchFormList" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
862print '<input type="hidden" name="token" value="'.newToken().'">';
863print '<input type="hidden" name="action" value="list">';
864if ($optioncss != '') {
865 print '<input type="hidden" name="optioncss" value="'.urlencode($optioncss).'">';
866}
867print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
868print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
869print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
870print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
871
872if (count($filter)) {
873 $buttonLabel = $langs->trans("ExportFilteredList");
874} else {
875 $buttonLabel = $langs->trans("ExportList");
876}
877
878$parameters = array('param' => $param);
879$reshook = $hookmanager->executeHooks('addMoreActionsButtonsList', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
880if ($reshook < 0) {
881 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
882}
883
884$newcardbutton = empty($hookmanager->resPrint) ? '' : $hookmanager->resPrint;
885
886if (empty($reshook)) {
887 $newcardbutton .= dolGetButtonTitle($langs->trans('ViewFlatList'), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?'.$param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected'));
888 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?'.$param, '', 1, array('morecss' => 'marginleftonly'));
889 $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'));
890 $newcardbutton .= dolGetButtonTitle($langs->trans('ExportToPdf'), '', 'fa fa-file-pdf paddingleft', $_SERVER['PHP_SELF'] . '?action=exporttopdf&' . $param, '', $permissiontoexport, array('morecss' => 'marginleftonly'));
891
892 $url = './card.php?action=create'.(!empty($type) ? '&type=sub' : '').'&backtopage='.urlencode($_SERVER['PHP_SELF']);
893 if (!empty($socid)) {
894 $url .= '&socid='.$socid;
895 }
896 $newcardbutton .= dolGetButtonTitleSeparator();
897 $newcardbutton .= dolGetButtonTitle($langs->trans('NewAccountingMvt'), '', 'fa fa-plus-circle paddingleft', $url, '', $permissiontoadd);
898}
899
900print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1);
901
902if ($massaction == 'preunletteringauto') {
903 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnletteringAuto"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unletteringauto", null, '', 0, 200, 500, 1);
904} elseif ($massaction == 'preunletteringmanual') {
905 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnletteringManual"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unletteringmanual", null, '', 0, 200, 500, 1);
906} elseif ($massaction == 'predeletebookkeepingwriting') {
907 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDeleteBookkeepingWriting"), $langs->trans("ConfirmMassDeleteBookkeepingWritingQuestion", count($toselect)), "deletebookkeepingwriting", null, '', 0, 200, 500, 1);
908} elseif ($massaction == 'preassignaccountbookkeepingwriting') {
909 $input = $formaccounting->select_account('', 'account', 1);
910 $formquestion = array(array('type' => 'other', 'name' => 'account', 'label' => '<span class="fieldrequired">' . $langs->trans("AccountAccountingShort") . '</span>', 'value' => $input),);
911 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("confirmMassAssignAccountBookkeepingWritingConfirm"), $langs->trans("ConfirmMassAssignAccountBookkeepingWritingQuestion", count($toselect)), "assignaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
912} elseif ($massaction == 'preclonebookkeepingwriting') {
913 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
914 $input2 = $formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1) . '</td>';
915 $formquestion = array(
916 array(
917 'type' => 'other',
918 'name' => 'massdate',
919 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>',
920 'value' => $input1
921 )
922 );
923
924 if (getDolGlobalString('ACCOUNTING_CLONING_ENABLE_INPUT_JOURNAL')) {
925 $formquestion[] = array(
926 'type' => 'text',
927 'name' => 'code_journal',
928 'label' => '<span class="fieldrequired">' . $langs->trans("Codejournal") . '</span>',
929 'value' => $input2
930 );
931 }
932
933 print $form->formconfirm(
934 $_SERVER["PHP_SELF"],
935 $langs->trans("ConfirmMassCloneBookkeepingWriting"),
936 $langs->trans("ConfirmMassCloneBookkeepingWritingQuestion", count($toselect)),
937 "clonebookkeepingwriting",
938 $formquestion,
939 '', 0, 200, 500, 1
940 );
941} elseif ($massaction == 'prereturnaccountbookkeepingwriting') {
942 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
943 $formquestion = array(array('type' => 'other', 'name' => 'massdate', 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>', 'value' => $input1));
944 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassReturnAccountBookkeepingWriting"), $langs->trans("ConfirmMassReturnAccountBookkeepingWritingQuestion", count($toselect)), "returnaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
945}
946
947//$topicmail = "Information";
948//$modelmail = "accountingbookkeeping";
949//$objecttmp = new BookKeeping($db);
950//$trackid = 'bk'.$object->id;
951include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
952
953$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
954$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
955if ($massactionbutton && $contextpage != 'poslist') {
956 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
957}
958
959$moreforfilter = '';
960$moreforfilter .= '<div class="divsearchfield">';
961$moreforfilter .= $langs->trans('AccountingCategory').': ';
962$moreforfilter .= '<div class="nowrap inline-block">';
963$moreforfilter .= $formaccounting->select_accounting_category($search_account_category, 'search_account_category', 1, 0, 0, 0);
964$moreforfilter .= '</div>';
965$moreforfilter .= '</div>';
966
967$parameters = array();
968$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
969if (empty($reshook)) {
970 $moreforfilter .= $hookmanager->resPrint;
971} else {
972 $moreforfilter = $hookmanager->resPrint;
973}
974
975print '<div class="liste_titre liste_titre_bydiv centpercent">';
976print $moreforfilter;
977print '</div>';
978
979print '<div class="div-table-responsive">';
980print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">';
981
982// Filters lines
983print '<tr class="liste_titre_filter">';
984// Action column
985if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
986 print '<td class="liste_titre center">';
987 $searchpicto = $form->showFilterButtons('left');
988 print $searchpicto;
989 print '</td>';
990}
991// Movement number
992if (!empty($arrayfields['t.piece_num']['checked'])) {
993 print '<td class="liste_titre"><input type="text" name="search_mvt_num" size="6" value="'.dol_escape_htmltag($search_mvt_num).'"></td>';
994}
995// Code journal
996if (!empty($arrayfields['t.code_journal']['checked'])) {
997 print '<td class="liste_titre center">';
998 print $formaccounting->multi_select_journal($search_ledger_code, 'search_ledger_code', 0, 1, 1, 1, 'maxwidth75');
999 print '</td>';
1000}
1001// Date document
1002if (!empty($arrayfields['t.doc_date']['checked'])) {
1003 print '<td class="liste_titre center">';
1004 print '<div class="nowrapfordate">';
1005 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1006 print '</div>';
1007 print '<div class="nowrapfordate">';
1008 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1009 print '</div>';
1010 print '</td>';
1011}
1012// Ref document
1013if (!empty($arrayfields['t.doc_ref']['checked'])) {
1014 print '<td class="liste_titre"><input type="text" name="search_doc_ref" class="width75" value="'.dol_escape_htmltag($search_doc_ref).'"></td>';
1015}
1016// Accountancy account
1017if (!empty($arrayfields['t.numero_compte']['checked'])) {
1018 print '<td class="liste_titre">';
1019 print '<div class="nowrap">';
1020 print $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth150', 'account');
1021 print '</div>';
1022 print '<div class="nowrap">';
1023 print $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth150', 'account');
1024 print '</div>';
1025 print '</td>';
1026}
1027// Subledger account
1028if (!empty($arrayfields['t.subledger_account']['checked'])) {
1029 print '<td class="liste_titre">';
1030 // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because it does not
1031 // use setup of keypress to select thirdparty and this hang browser on large database.
1032 if (getDolGlobalString('ACCOUNTANCY_COMBO_FOR_AUX')) {
1033 print '<div class="nowrap">';
1034 //print $langs->trans('From').' ';
1035 print $formaccounting->select_auxaccount($search_accountancy_aux_code_start, 'search_accountancy_aux_code_start', $langs->trans('From'), 'maxwidth250', 'subledgeraccount');
1036 print '</div>';
1037 print '<div class="nowrap">';
1038 print $formaccounting->select_auxaccount($search_accountancy_aux_code_end, 'search_accountancy_aux_code_end', $langs->trans('to'), 'maxwidth250', 'subledgeraccount');
1039 print '</div>';
1040 } else {
1041 print '<input type="text" class="maxwidth75" name="search_accountancy_aux_code" value="'.dol_escape_htmltag($search_accountancy_aux_code).'">';
1042 }
1043 print '</td>';
1044}
1045// Label operation
1046if (!empty($arrayfields['t.label_operation']['checked'])) {
1047 print '<td class="liste_titre">';
1048 print '<input type="text" size="7" class="flat" name="search_mvt_label" value="'.dol_escape_htmltag($search_mvt_label).'"/>';
1049 print '</td>';
1050}
1051// Debit
1052if (!empty($arrayfields['t.debit']['checked'])) {
1053 print '<td class="liste_titre right">';
1054 print '<input type="text" class="flat" name="search_debit" size="4" value="'.dol_escape_htmltag($search_debit).'">';
1055 print '</td>';
1056}
1057// Credit
1058if (!empty($arrayfields['t.credit']['checked'])) {
1059 print '<td class="liste_titre right">';
1060 print '<input type="text" class="flat" name="search_credit" size="4" value="'.dol_escape_htmltag($search_credit).'">';
1061 print '</td>';
1062}
1063// Matching code
1064if (!empty($arrayfields['t.lettering_code']['checked'])) {
1065 print '<td class="liste_titre center">';
1066 print '<input type="text" size="3" class="flat" name="search_lettering_code" value="'.dol_escape_htmltag($search_lettering_code).'"/>';
1067 print '<br><span class="nowrap"><input type="checkbox" name="search_not_reconciled" value="notreconciled"'.($search_not_reconciled == 'notreconciled' ? ' checked' : '').'>'.$langs->trans("NotReconciled").'</span>';
1068 print '</td>';
1069}
1070
1071// Fields from hook
1072$parameters = array('arrayfields' => $arrayfields);
1073$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1074print $hookmanager->resPrint;
1075
1076// Date creation
1077if (!empty($arrayfields['t.date_creation']['checked'])) {
1078 print '<td class="liste_titre center">';
1079 print '<div class="nowrapfordate">';
1080 print $form->selectDate($search_date_creation_start, 'search_date_creation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1081 print '</div>';
1082 print '<div class="nowrapfordate">';
1083 print $form->selectDate($search_date_creation_end, 'search_date_creation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1084 print '</div>';
1085 print '</td>';
1086}
1087// Date modification
1088if (!empty($arrayfields['t.tms']['checked'])) {
1089 print '<td class="liste_titre center">';
1090 print '<div class="nowrapfordate">';
1091 print $form->selectDate($search_date_modification_start, 'search_date_modification_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1092 print '</div>';
1093 print '<div class="nowrapfordate">';
1094 print $form->selectDate($search_date_modification_end, 'search_date_modification_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1095 print '</div>';
1096 print '</td>';
1097}
1098// Date export
1099if (!empty($arrayfields['t.date_export']['checked'])) {
1100 print '<td class="liste_titre center">';
1101 print '<div class="nowrapfordate">';
1102 print $form->selectDate($search_date_export_start, 'search_date_export_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1103 print '</div>';
1104 print '<div class="nowrapfordate">';
1105 print $form->selectDate($search_date_export_end, 'search_date_export_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1106 print '</div>';
1107 print '</td>';
1108}
1109// Date validation
1110if (!empty($arrayfields['t.date_validated']['checked'])) {
1111 print '<td class="liste_titre center">';
1112 print '<div class="nowrapfordate">';
1113 print $form->selectDate($search_date_validation_start, 'search_date_validation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1114 print '</div>';
1115 print '<div class="nowrapfordate">';
1116 print $form->selectDate($search_date_validation_end, 'search_date_validation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1117 print '</div>';
1118 print '</td>';
1119}
1120// Due date start and end
1121if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1122 print '<td class="liste_titre center">';
1123 print '<div class="nowrapfordate">';
1124 print $form->selectDate($search_date_due_start, 'search_date_due_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1125 print '</div>';
1126 print '<div class="nowrapfordate">';
1127 print $form->selectDate($search_date_due_end, 'search_date_due_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1128 print '</div>';
1129 print '</td>';
1130}
1131if (!empty($arrayfields['t.import_key']['checked'])) {
1132 print '<td class="liste_titre center">';
1133 print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="'.dol_escape_htmltag($search_import_key).'">';
1134 print '</td>';
1135}
1136// Action column
1137if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1138 print '<td class="liste_titre center">';
1139 $searchpicto = $form->showFilterButtons();
1140 print $searchpicto;
1141 print '</td>';
1142}
1143print "</tr>\n";
1144
1145print '<tr class="liste_titre">';
1146if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1147 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch actioncolumn ');
1148}
1149if (!empty($arrayfields['t.piece_num']['checked'])) {
1150 print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, "", $sortfield, $sortorder);
1151}
1152if (!empty($arrayfields['t.code_journal']['checked'])) {
1153 print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center ');
1154}
1155if (!empty($arrayfields['t.doc_date']['checked'])) {
1156 print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1157}
1158if (!empty($arrayfields['t.doc_ref']['checked'])) {
1159 print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder);
1160}
1161if (!empty($arrayfields['t.numero_compte']['checked'])) {
1162 print_liste_field_titre($arrayfields['t.numero_compte']['label'], $_SERVER['PHP_SELF'], "t.numero_compte", "", $param, "", $sortfield, $sortorder);
1163}
1164if (!empty($arrayfields['t.subledger_account']['checked'])) {
1165 print_liste_field_titre($arrayfields['t.subledger_account']['label'], $_SERVER['PHP_SELF'], "t.subledger_account", "", $param, "", $sortfield, $sortorder);
1166}
1167if (!empty($arrayfields['t.label_operation']['checked'])) {
1168 print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder);
1169}
1170if (!empty($arrayfields['t.debit']['checked'])) {
1171 print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right ');
1172}
1173if (!empty($arrayfields['t.credit']['checked'])) {
1174 print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right ');
1175}
1176if (!empty($arrayfields['t.lettering_code']['checked'])) {
1177 print_liste_field_titre($arrayfields['t.lettering_code']['label'], $_SERVER['PHP_SELF'], "t.lettering_code", "", $param, '', $sortfield, $sortorder, 'center ');
1178}
1179// Hook fields
1180$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1181$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1182print $hookmanager->resPrint;
1183if (!empty($arrayfields['t.date_creation']['checked'])) {
1184 print_liste_field_titre($arrayfields['t.date_creation']['label'], $_SERVER['PHP_SELF'], "t.date_creation", "", $param, '', $sortfield, $sortorder, 'center ');
1185}
1186if (!empty($arrayfields['t.tms']['checked'])) {
1187 print_liste_field_titre($arrayfields['t.tms']['label'], $_SERVER['PHP_SELF'], "t.tms", "", $param, '', $sortfield, $sortorder, 'center ');
1188}
1189if (!empty($arrayfields['t.date_export']['checked'])) {
1190 print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export,t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1191}
1192if (!empty($arrayfields['t.date_validated']['checked'])) {
1193 print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated,t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1194}
1195// Due date
1196if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1197 print_liste_field_titre($arrayfields['t.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], 't.date_lim_reglement', '', $param, '', $sortfield, $sortorder, 'center ');
1198}
1199if (!empty($arrayfields['t.import_key']['checked'])) {
1200 print_liste_field_titre($arrayfields['t.import_key']['label'], $_SERVER["PHP_SELF"], "t.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
1201}
1202if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1203 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1204}
1205print "</tr>\n";
1206
1207
1208$line = new BookKeepingLine($db);
1209
1210// Loop on record
1211// --------------------------------------------------------------------
1212$i = 0;
1213$totalarray = array();
1214$totalarray['nbfield'] = 0;
1215$totalarray['val'] = array();
1216$totalarray['val']['totaldebit'] = 0;
1217$totalarray['val']['totalcredit'] = 0;
1218
1219while ($i < min($num, $limit)) {
1220 $obj = $db->fetch_object($resql);
1221 if (empty($obj)) {
1222 break; // Should not happen
1223 }
1224
1225 $line->id = $obj->rowid;
1226 $line->doc_date = $db->jdate($obj->doc_date);
1227 $line->doc_type = $obj->doc_type;
1228 $line->doc_ref = $obj->doc_ref;
1229 $line->fk_doc = $obj->fk_doc;
1230 $line->fk_docdet = $obj->fk_docdet;
1231 $line->thirdparty_code = $obj->thirdparty_code;
1232 $line->subledger_account = $obj->subledger_account;
1233 $line->subledger_label = $obj->subledger_label;
1234 $line->numero_compte = $obj->numero_compte;
1235 $line->label_compte = $obj->label_compte;
1236 $line->label_operation = $obj->label_operation;
1237 $line->debit = $obj->debit;
1238 $line->credit = $obj->credit;
1239 $line->montant = $obj->amount; // deprecated
1240 $line->amount = $obj->amount;
1241 $line->sens = $obj->sens;
1242 $line->lettering_code = $obj->lettering_code;
1243 $line->fk_user_author = $obj->fk_user_author;
1244 $line->import_key = $obj->import_key;
1245 $line->code_journal = $obj->code_journal;
1246 $line->journal_label = $obj->journal_label;
1247 $line->piece_num = $obj->piece_num;
1248 $line->ref = $obj->ref;
1249 $line->date_creation = $db->jdate($obj->date_creation);
1250 $line->date_modification = $db->jdate($obj->date_modification);
1251 $line->date_export = $db->jdate($obj->date_export);
1252 $line->date_validation = $db->jdate($obj->date_validation);
1253 // Due date
1254 $line->date_lim_reglement = $db->jdate($obj->date_lim_reglement);
1255
1256 print '<tr class="oddeven">';
1257 // Action column
1258 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1259 print '<td class="nowraponall center">';
1260 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
1261 $selected = 0;
1262 if (in_array($line->id, $arrayofselected)) {
1263 $selected = 1;
1264 }
1265 print '<input id="cb'.$line->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$line->id.'"'.($selected ? ' checked="checked"' : '').' />';
1266 }
1267 print '</td>';
1268 if (!$i) {
1269 $totalarray['nbfield']++;
1270 }
1271 }
1272
1273 // Piece number
1274 if (!empty($arrayfields['t.piece_num']['checked'])) {
1275 print '<td class="nowraponall">';
1276 $object->id = $line->id;
1277 $object->piece_num = $line->piece_num;
1278 $object->ref = $line->ref;
1279 print $object->getNomUrl(1, '', 0, '', 1);
1280 print '<span class="hideonsmartphone">';
1281 if (!empty($line->date_export)) {
1282 print img_picto($langs->trans("DateExport").": ".dol_print_date($line->date_export, 'dayhour')." (".$langs->trans("TransactionExportDesc").")", 'fa-file-export', 'class="paddingleft pictofixedwidth opacitymedium"');
1283 }
1284 if (!empty($line->date_validation)) {
1285 print img_picto($langs->trans("DateValidation").": ".dol_print_date($line->date_validation, 'dayhour')." (".$langs->trans("TransactionBlockedLockedDesc").")", 'fa-lock', 'class="paddingleft pictofixedwidth opacitymedium"');
1286 }
1287 print '</span>';
1288 print '</td>';
1289 if (!$i) {
1290 $totalarray['nbfield']++;
1291 }
1292 }
1293
1294 // Journal code
1295 if (!empty($arrayfields['t.code_journal']['checked'])) {
1296 if (empty($conf->cache['accountingjournal'][$line->code_journal])) {
1297 $accountingjournal = new AccountingJournal($db);
1298 $accountingjournal->fetch(0, $line->code_journal);
1299 $conf->cache['accountingjournal'][$line->code_journal] = $accountingjournal;
1300 } else {
1301 $accountingjournal = $conf->cache['accountingjournal'][$line->code_journal];
1302 }
1303
1304 $journaltoshow = (($accountingjournal->id > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal);
1305 print '<td class="center tdoverflowmax150">'.$journaltoshow.'</td>';
1306 if (!$i) {
1307 $totalarray['nbfield']++;
1308 }
1309 }
1310
1311 // Document date
1312 if (!empty($arrayfields['t.doc_date']['checked'])) {
1313 print '<td class="center">'.dol_print_date($line->doc_date, 'day').'</td>';
1314 if (!$i) {
1315 $totalarray['nbfield']++;
1316 }
1317 }
1318
1319 // Document ref
1320 $modulepart = ''; // may be used by include*.tpl.php
1321 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1322 $documentlink = '';
1323 $objectstatic = null;
1324
1325 if ($line->doc_type === 'customer_invoice') {
1326 $langs->loadLangs(array('bills'));
1327
1328 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1329 $objectstatic = new Facture($db);
1330 $objectstatic->fetch($line->fk_doc);
1331 //$modulepart = 'facture';
1332
1333 $filename = dol_sanitizeFileName($line->doc_ref);
1334 $filedir = $conf->invoice->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1335 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1336 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1337 } elseif ($line->doc_type === 'supplier_invoice') {
1338 $langs->loadLangs(array('bills'));
1339
1340 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1341 $objectstatic = new FactureFournisseur($db);
1342 $objectstatic->fetch($line->fk_doc);
1343
1344 $modulepart = 'invoice_supplier';
1345 $filename = dol_sanitizeFileName($line->doc_ref);
1346
1347 //$filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($line->fk_doc, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1348 //$subdir = get_exdir($objectstatic->id, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1349 $filedir = getMultidirOutput($objectstatic, '', 1).dol_sanitizeFileName($line->doc_ref);
1350 $subdir = getMultidirOutput($objectstatic, '', 1, 'outputrel').dol_sanitizeFileName($line->doc_ref);
1351 //var_dump($filedir); var_dump($subdir);
1352
1353 if ($objectstatic->id > 0) {
1354 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $subdir, $filedir);
1355 } else {
1356 $documentlink = $line->doc_ref;
1357 }
1358 } elseif ($line->doc_type === 'expense_report') {
1359 $langs->loadLangs(array('trips'));
1360
1361 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
1362 $objectstatic = new ExpenseReport($db);
1363 $objectstatic->fetch($line->fk_doc);
1364 //$modulepart = 'expensereport';
1365
1366 $filename = dol_sanitizeFileName($line->doc_ref);
1367 $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1368 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1369 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1370 } elseif ($line->doc_type === 'bank') {
1371 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1372 $objectstatic = new AccountLine($db);
1373 $objectstatic->fetch($line->fk_doc);
1374 } else {
1375 // Other type
1376 }
1377
1378 $labeltoshow = '';
1379 $labeltoshowalt = '';
1380 $classforlabel = '';
1381 if (($line->doc_type === 'customer_invoice' || $line->doc_type === 'supplier_invoice' || $line->doc_type === 'expense_report') && is_object($objectstatic)) {
1382 $labeltoshow .= $objectstatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1);
1383 $labeltoshow .= $documentlink;
1384 $labeltoshowalt .= $objectstatic->ref;
1385 } elseif ($line->doc_type === 'bank' && is_object($objectstatic)) {
1386 $labeltoshow .= $objectstatic->getNomUrl(1);
1387 $labeltoshowalt .= $objectstatic->ref;
1388 $bank_ref = strstr($line->doc_ref, '-');
1389 $labeltoshow .= " " . $bank_ref;
1390 $labeltoshowalt .= " " . $bank_ref;
1391 } else {
1392 $labeltoshow .= $line->doc_ref;
1393 $labeltoshowalt .= $line->doc_ref;
1394 $classforlabel = 'tdoverflowmax250';
1395 }
1396
1397 print '<td class="nowraponall'.($classforlabel ? ' '.$classforlabel : '').'" title="'.dol_escape_htmltag($labeltoshowalt).'">';
1398 print $labeltoshow;
1399 print "</td>\n";
1400 if (!$i) {
1401 $totalarray['nbfield']++;
1402 }
1403 }
1404
1405 // Account number
1406 if (!empty($arrayfields['t.numero_compte']['checked'])) {
1407 print '<td>'.length_accountg($line->numero_compte).'</td>';
1408 if (!$i) {
1409 $totalarray['nbfield']++;
1410 }
1411 }
1412
1413 // Subledger account
1414 if (!empty($arrayfields['t.subledger_account']['checked'])) {
1415 print '<td>'.length_accounta($line->subledger_account).'</td>';
1416 if (!$i) {
1417 $totalarray['nbfield']++;
1418 }
1419 }
1420
1421 // Label operation
1422 if (!empty($arrayfields['t.label_operation']['checked'])) {
1423 print '<td class="small tdoverflowmax200" title="'.dol_escape_htmltag($line->label_operation).'">'.dol_escape_htmltag($line->label_operation).'</td>';
1424 if (!$i) {
1425 $totalarray['nbfield']++;
1426 }
1427 }
1428
1429 // Amount debit
1430 if (!empty($arrayfields['t.debit']['checked'])) {
1431 print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
1432 if (!$i) {
1433 $totalarray['nbfield']++;
1434 }
1435 if (!$i) {
1436 $totalarray['pos'][$totalarray['nbfield']] = 'totaldebit';
1437 }
1438 $totalarray['val']['totaldebit'] += $line->debit;
1439 }
1440
1441 // Amount credit
1442 if (!empty($arrayfields['t.credit']['checked'])) {
1443 print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
1444 if (!$i) {
1445 $totalarray['nbfield']++;
1446 }
1447 if (!$i) {
1448 $totalarray['pos'][$totalarray['nbfield']] = 'totalcredit';
1449 }
1450 $totalarray['val']['totalcredit'] += $line->credit;
1451 }
1452
1453 // Matching code
1454 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1455 print '<td class="center">'.$line->lettering_code.'</td>';
1456 if (!$i) {
1457 $totalarray['nbfield']++;
1458 }
1459 }
1460
1461 // Fields from hook
1462 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1463 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1464 print $hookmanager->resPrint;
1465
1466 // Creation operation date
1467 if (!empty($arrayfields['t.date_creation']['checked'])) {
1468 print '<td class="center">'.dol_print_date($line->date_creation, 'dayhour', 'tzuserrel').'</td>';
1469 if (!$i) {
1470 $totalarray['nbfield']++;
1471 }
1472 }
1473
1474 // Modification operation date
1475 if (!empty($arrayfields['t.tms']['checked'])) {
1476 print '<td class="center">'.dol_print_date($line->date_modification, 'dayhour', 'tzuserrel').'</td>';
1477 if (!$i) {
1478 $totalarray['nbfield']++;
1479 }
1480 }
1481
1482 // Exported operation date
1483 if (!empty($arrayfields['t.date_export']['checked'])) {
1484 print '<td class="center nowraponall">'.dol_print_date($line->date_export, 'dayhour', 'tzuserrel').'</td>';
1485 if (!$i) {
1486 $totalarray['nbfield']++;
1487 }
1488 }
1489
1490 // Validated operation date
1491 if (!empty($arrayfields['t.date_validated']['checked'])) {
1492 print '<td class="center nowraponall">'.dol_print_date($line->date_validation, 'dayhour', 'tzuserrel').'</td>';
1493 if (!$i) {
1494 $totalarray['nbfield']++;
1495 }
1496 }
1497
1498 // Due date
1499 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1500 print '<td class="center">'.dol_print_date($line->date_lim_reglement, 'day').'</td>';
1501 if (!$i) {
1502 $totalarray['nbfield']++;
1503 }
1504 }
1505
1506 if (!empty($arrayfields['t.import_key']['checked'])) {
1507 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($obj->import_key).'">'.dol_escape_htmltag($obj->import_key)."</td>\n";
1508 if (!$i) {
1509 $totalarray['nbfield']++;
1510 }
1511 }
1512
1513 // Action column
1514 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1515 print '<td class="nowraponall center">';
1516 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
1517 $selected = 0;
1518 if (in_array($line->id, $arrayofselected)) {
1519 $selected = 1;
1520 }
1521 print '<input id="cb'.$line->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$line->id.'"'.($selected ? ' checked="checked"' : '').' />';
1522 }
1523 print '</td>';
1524 if (!$i) {
1525 $totalarray['nbfield']++;
1526 }
1527 }
1528
1529
1530 print "</tr>\n";
1531
1532 $i++;
1533}
1534
1535// Show total line
1536include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1537
1538// If no record found
1539if ($num == 0) {
1540 $colspan = 1;
1541 foreach ($arrayfields as $key => $val) {
1542 if (!empty($val['checked'])) {
1543 $colspan++;
1544 }
1545 }
1546 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1547}
1548
1549$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1550$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1551print $hookmanager->resPrint;
1552
1553print "</table>";
1554print '</div>';
1555
1556print '</form>';
1557
1558// End of page
1559llxFooter();
1560
1561$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:622
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.