dolibarr 25.0.0-alpha
listbyaccount.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2016 Neil Orley <neil.orley@oeris.fr>
3 * Copyright (C) 2013-2016 Olivier Geffroy <jeff@jeffinfo.com>
4 * Copyright (C) 2013-2020 Florian Henry <florian.henry@open-concept.pro>
5 * Copyright (C) 2013-2026 Alexandre Spangaro <alexandre@inovea-conseil.com>
6 * Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
7 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
8 * Copyright (C) 2025 Nicolas Barrouillet <nicolas@pragma-tech.fr>
9 * Copyright (C) 2026 Jose Martinez <jose.martinez@pichinov.com>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
31// Load Dolibarr environment
32require '../../main.inc.php';
33
34require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/accountancy/class/lettering.class.php';
37require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php';
38require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
41require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
42require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
43
52// Load translation files required by the page
53$langs->loadLangs(array("accountancy", "categories", "compta", "other"));
54
55$journal_code = GETPOST('code_journal', 'alpha');
56$account = GETPOST("account", 'int');
57$massdate = dol_mktime(0, 0, 0, GETPOSTINT('massdatemonth'), GETPOSTINT('massdateday'), GETPOSTINT('massdateyear'));
58
59$action = GETPOST('action', 'aZ09');
60$socid = GETPOSTINT('socid');
61$mode = (GETPOST('mode', 'alpha') ? GETPOST('mode', 'alpha') : 'customer'); // Only for tab view
62$massaction = GETPOST('massaction', 'alpha');
63$confirm = GETPOST('confirm', 'alpha');
64$toselect = GETPOST('toselect', 'array:int');
65$type = GETPOST('type', 'alpha');
66if ($type == 'sub') {
67 $context_default = 'bookkeepingbysubaccountlist';
68} else {
69 $context_default = 'bookkeepingbyaccountlist';
70}
71$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : $context_default;
72
73$search_doc_date = GETPOSTDATE('doc_date', 'getpost'); // deprecated. Can use 'search_date_start/end'
74
75$search_date_startyear = GETPOSTINT('search_date_startyear');
76$search_date_startmonth = GETPOSTINT('search_date_startmonth');
77$search_date_startday = GETPOSTINT('search_date_startday');
78$search_date_start = GETPOSTDATE('search_date_start', 'getpost', 'auto', 'search_date_start_accountancy');
79
80$search_date_endyear = GETPOSTINT('search_date_endyear');
81$search_date_endmonth = GETPOSTINT('search_date_endmonth');
82$search_date_endday = GETPOSTINT('search_date_endday');
83$search_date_end = GETPOSTDATE('search_date_end', 'getpostend', 'auto', 'search_date_end_accountancy');
84
85$search_date_export_startyear = GETPOSTINT('search_date_export_startyear');
86$search_date_export_startmonth = GETPOSTINT('search_date_export_startmonth');
87$search_date_export_startday = GETPOSTINT('search_date_export_startday');
88$search_date_export_start = GETPOSTDATE('search_date_export_start', 'getpost');
89
90$search_date_export_endyear = GETPOSTINT('search_date_export_endyear');
91$search_date_export_endmonth = GETPOSTINT('search_date_export_endmonth');
92$search_date_export_endday = GETPOSTINT('search_date_export_endday');
93$search_date_export_end = GETPOSTDATE('search_date_export_start', 'getpostend');
94
95$search_date_validation_startyear = GETPOSTINT('search_date_validation_startyear');
96$search_date_validation_startmonth = GETPOSTINT('search_date_validation_startmonth');
97$search_date_validation_startday = GETPOSTINT('search_date_validation_startday');
98$search_date_validation_start = GETPOSTDATE('search_date_validation_start', 'getpost');
99
100$search_date_validation_endyear = GETPOSTINT('search_date_validation_endyear');
101$search_date_validation_endmonth = GETPOSTINT('search_date_validation_endmonth');
102$search_date_validation_endday = GETPOSTINT('search_date_validation_endday');
103$search_date_validation_end = GETPOSTDATE('search_date_validation_end', 'getpostend');
104
105// Due date start
106$search_date_due_start_day = GETPOSTINT('search_date_due_start_day');
107$search_date_due_start_month = GETPOSTINT('search_date_due_start_month');
108$search_date_due_start_year = GETPOSTINT('search_date_due_start_year');
109$search_date_due_start = GETPOSTDATE('search_date_due_start_', 'getpost');
110
111// Due date end
112$search_date_due_end_day = GETPOSTINT('search_date_due_end_day');
113$search_date_due_end_month = GETPOSTINT('search_date_due_end_month');
114$search_date_due_end_year = GETPOSTINT('search_date_due_end_year');
115$search_date_due_end = GETPOSTDATE('search_date_due_end_', 'getpostend');
116
117$search_import_key = GETPOST("search_import_key", 'alpha');
118
119$search_account_category = GETPOSTINT('search_account_category');
120
121$search_accountancy_code_start = GETPOST('search_accountancy_code_start', 'alpha');
122if ($search_accountancy_code_start == - 1) {
123 $search_accountancy_code_start = '';
124}
125$search_accountancy_code_end = GETPOST('search_accountancy_code_end', 'alpha');
126if ($search_accountancy_code_end == - 1) {
127 $search_accountancy_code_end = '';
128}
129$search_doc_ref = GETPOST('search_doc_ref', 'alpha');
130$search_label_operation = GETPOST('search_label_operation', 'alpha');
131$search_mvt_num = GETPOST('search_mvt_num', 'alpha');
132$search_direction = GETPOST('search_direction', 'alpha');
133$search_ledger_code = GETPOST('search_ledger_code', 'array');
134$search_debit = GETPOST('search_debit', 'alpha');
135$search_credit = GETPOST('search_credit', 'alpha');
136$search_lettering_code = GETPOST('search_lettering_code', 'alpha');
137$search_not_reconciled = GETPOST('search_not_reconciled', 'alpha');
138
139if (GETPOST("button_delmvt_x") || GETPOST("button_delmvt.x") || GETPOST("button_delmvt")) {
140 $action = 'delbookkeepingyear';
141}
142
143// Load variable for pagination
144$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : getDolGlobalString('ACCOUNTING_LIMIT_LIST_VENTILATION', $conf->liste_limit);
145$sortfield = GETPOST('sortfield', 'aZ09comma');
146$sortorder = GETPOST('sortorder', 'aZ09comma');
147$optioncss = GETPOST('optioncss', 'alpha');
148$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
149if (empty($page) || $page < 0) {
150 $page = 0;
151}
152$offset = $limit * $page;
153$pageprev = $page - 1;
154$pagenext = $page + 1;
155if ($sortorder == "") {
156 $sortorder = "ASC";
157}
158if ($sortfield == "") {
159 $sortfield = "t.doc_date,t.rowid";
160}
161
162// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
163$object = new BookKeeping($db);
164$formfile = new FormFile($db);
165$hookmanager->initHooks(array($context_default));
166
167$formaccounting = new FormAccounting($db);
168$form = new Form($db);
169
170if (empty($search_date_start) && empty($search_date_end) && !GETPOSTISSET('search_date_startday') && !GETPOSTISSET('search_date_startmonth') && !GETPOSTISSET('search_date_starthour')) {
171 $sql = "SELECT date_start, date_end";
172 $sql .= " FROM ".MAIN_DB_PREFIX."accounting_fiscalyear ";
173 if (getDolGlobalInt('ACCOUNTANCY_FISCALYEAR_DEFAULT')) {
174 $sql .= " WHERE rowid = " . getDolGlobalInt('ACCOUNTANCY_FISCALYEAR_DEFAULT');
175 } else {
176 $sql .= " WHERE date_start < '" . $db->idate(dol_now()) . "' and date_end > '" . $db->idate(dol_now()) . "'";
177 }
178 $sql .= $db->plimit(1);
179 $res = $db->query($sql);
180
181 if ($res !== false && $db->num_rows($res) > 0) {
182 $fiscalYear = $db->fetch_object($res);
183 $search_date_start = strtotime($fiscalYear->date_start);
184 $search_date_end = strtotime($fiscalYear->date_end);
185 } else {
186 $month_start = getDolGlobalInt('SOCIETE_FISCAL_MONTH_START', 1);
187 $year_start = (int) dol_print_date(dol_now(), '%Y');
188 if (dol_print_date(dol_now(), '%m') < $month_start) {
189 $year_start--; // If current month is lower that starting fiscal month, we start last year
190 }
191 $year_end = $year_start + 1;
192 $month_end = $month_start - 1;
193 if ($month_end < 1) {
194 $month_end = 12;
195 $year_end--;
196 }
197 $search_date_start = dol_mktime(0, 0, 0, $month_start, 1, $year_start);
198 $search_date_end = dol_get_last_day($year_end, $month_end);
199 }
200}
201
202$arrayfields = array(
203 // 't.subledger_account'=>array('label'=>$langs->trans("SubledgerAccount"), 'checked'=>1),
204 't.piece_num' => array('label' => "TransactionNumShort", 'checked' => '1'),
205 't.code_journal' => array('label' => "Codejournal", 'checked' => '1'),
206 't.doc_date' => array('label' => "Docdate", 'checked' => '1'),
207 't.doc_ref' => array('label' => "Piece", 'checked' => '1'),
208 't.label_operation' => array('label' => "Label", 'checked' => '1'),
209 't.lettering_code' => array('label' => "Lettering", 'checked' => '1'),
210 't.debit' => array('label' => "AccountingDebit", 'checked' => '1'),
211 't.credit' => array('label' => "AccountingCredit", 'checked' => '1'),
212 't.balance' => array('label' => "Balance", 'checked' => '1'),
213 't.date_export' => array('label' => "DateExport", 'checked' => '-1'),
214 't.date_validated' => array('label' => "DateValidation", 'checked' => '-1', 'enabled' => (string) (int) !getDolGlobalString("ACCOUNTANCY_DISABLE_CLOSURE_LINE_BY_LINE")),
215 't.date_lim_reglement' => array('label' => "DateDue", 'checked' => '0'),
216 't.import_key' => array('label' => "ImportId", 'checked' => '-1', 'position' => 1100),
217);
218
219if (!getDolGlobalString('ACCOUNTING_ENABLE_LETTERING')) {
220 unset($arrayfields['t.lettering_code']);
221}
222
223if ($search_date_start && empty($search_date_startyear)) {
224 $tmparray = dol_getdate($search_date_start);
225 $search_date_startyear = $tmparray['year'];
226 $search_date_startmonth = $tmparray['mon'];
227 $search_date_startday = $tmparray['mday'];
228}
229if ($search_date_end && empty($search_date_endyear)) {
230 $tmparray = dol_getdate($search_date_end);
231 $search_date_endyear = $tmparray['year'];
232 $search_date_endmonth = $tmparray['mon'];
233 $search_date_endday = $tmparray['mday'];
234}
235
236if (!isModEnabled('accounting')) {
238}
239if ($user->socid > 0) {
241}
242if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
244}
245
246$error = 0;
247$result = -1; // For static analysis
248$documentlink = ''; // For static analysis
249
250// Permissions
251$permissiontoread = $user->hasRight('accounting', 'mouvements', 'lire');
252$permissiontoadd = $user->hasRight('accounting', 'mouvements', 'creer');
253$permissiontodelete = $user->hasRight('accounting', 'mouvements', 'supprimer');
254$permissiontoexport = $user->hasRight('accounting', 'mouvements', 'export');
255
256
257/*
258 * Action
259 */
260
261$filter = array();
262$param = '';
263$url_param = '';
264
265if (GETPOST('cancel', 'alpha')) {
266 $action = 'list';
267 $massaction = '';
268}
269if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'preunletteringauto' && $massaction != 'preunletteringmanual' && $massaction != 'predeletebookkeepingwriting') {
270 $massaction = '';
271}
272
273$parameters = array('socid' => $socid);
274$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
275if ($reshook < 0) {
276 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
277}
278
279if (empty($reshook)) {
280 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
281
282 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
283 $search_doc_date = '';
284 $search_account_category = '';
285 $search_accountancy_code_start = '';
286 $search_accountancy_code_end = '';
287 $search_label_account = '';
288 $search_doc_ref = '';
289 $search_label_operation = '';
290 $search_mvt_num = '';
291 $search_direction = '';
292 $search_ledger_code = array();
293 $search_date_start = '';
294 $search_date_end = '';
295 $search_date_startyear = '';
296 $search_date_startmonth = '';
297 $search_date_startday = '';
298 $search_date_endyear = '';
299 $search_date_endmonth = '';
300 $search_date_endday = '';
301 $search_date_export_start = '';
302 $search_date_export_end = '';
303 $search_date_export_startyear = '';
304 $search_date_export_startmonth = '';
305 $search_date_export_startday = '';
306 $search_date_export_endyear = '';
307 $search_date_export_endmonth = '';
308 $search_date_export_endday = '';
309 $search_date_validation_start = '';
310 $search_date_validation_end = '';
311 $search_date_validation_startyear = '';
312 $search_date_validation_startmonth = '';
313 $search_date_validation_startday = '';
314 $search_date_validation_endyear = '';
315 $search_date_validation_endmonth = '';
316 $search_date_validation_endday = '';
317 // Due date start
318 $search_date_due_start_day = '';
319 $search_date_due_start_month = '';
320 $search_date_due_start_year = '';
321 $search_date_due_start = '';
322 // Due date end
323 $search_date_due_end_day = '';
324 $search_date_due_end_month = '';
325 $search_date_due_end_year = '';
326 $search_date_due_end = '';
327 $search_lettering_code = '';
328 $search_debit = '';
329 $search_credit = '';
330 $search_not_reconciled = '';
331 $search_import_key = '';
332 $toselect = array();
333 unset($_SESSION['DOLDATE_search_date_start_accountancy_day']);
334 unset($_SESSION['DOLDATE_search_date_start_accountancy_month']);
335 unset($_SESSION['DOLDATE_search_date_start_accountancy_year']);
336 unset($_SESSION['DOLDATE_search_date_end_accountancy_day']);
337 unset($_SESSION['DOLDATE_search_date_end_accountancy_month']);
338 unset($_SESSION['DOLDATE_search_date_end_accountancy_year']);
339 }
340
341 if (!empty($socid)) {
342 $param = '&socid='.$socid;
343 }
344 if (!empty($search_date_start)) {
345 $filter['t.doc_date>='] = $search_date_start;
346 $param .= '&search_date_startmonth='.$search_date_startmonth.'&search_date_startday='.$search_date_startday.'&search_date_startyear='.$search_date_startyear;
347 }
348 if (!empty($search_date_end)) {
349 $filter['t.doc_date<='] = $search_date_end;
350 $param .= '&search_date_endmonth='.$search_date_endmonth.'&search_date_endday='.$search_date_endday.'&search_date_endyear='.$search_date_endyear;
351 }
352 if (!empty($search_doc_date)) {
353 $filter['t.doc_date'] = $search_doc_date;
354 $param .= '&doc_datemonth='.GETPOSTINT('doc_datemonth').'&doc_dateday='.GETPOSTINT('doc_dateday').'&doc_dateyear='.GETPOSTINT('doc_dateyear');
355 }
356 if ($search_account_category != '-1' && !empty($search_account_category)) {
357 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancycategory.class.php';
358 $accountingcategory = new AccountancyCategory($db);
359
360 $listofaccountsforgroup = $accountingcategory->getCptsCat(0, 'fk_accounting_category = '.((int) $search_account_category));
361 $listofaccountsforgroup2 = array();
362 if (is_array($listofaccountsforgroup)) {
363 foreach ($listofaccountsforgroup as $tmpval) {
364 $listofaccountsforgroup2[] = "'".$db->escape((string) $tmpval['account_number'])."'";
365 }
366 }
367 if (!empty($listofaccountsforgroup2)) {
368 $filter['t.search_accounting_code_in'] = implode(',', $listofaccountsforgroup2);
369 } else {
370 $filter['t.search_accounting_code_in'] = "''";
371 setEventMessages($langs->trans("ThisCategoryHasNoItems"), null, 'warnings');
372 }
373 $param .= '&search_account_category='.urlencode((string) ($search_account_category));
374 }
375 if (!empty($search_accountancy_code_start)) {
376 if ($type == 'sub') {
377 $filter['t.subledger_account>='] = $search_accountancy_code_start;
378 } else {
379 $filter['t.numero_compte>='] = $search_accountancy_code_start;
380 }
381 $param .= '&search_accountancy_code_start=' . urlencode($search_accountancy_code_start);
382 }
383 if (!empty($search_accountancy_code_end)) {
384 if ($type == 'sub') {
385 $filter['t.subledger_account<='] = $search_accountancy_code_end;
386 } else {
387 $filter['t.numero_compte<='] = $search_accountancy_code_end;
388 }
389 $param .= '&search_accountancy_code_end=' . urlencode($search_accountancy_code_end);
390 }
391 if (!empty($search_label_account)) {
392 $filter['t.label_compte'] = $search_label_account;
393 $param .= '&search_label_compte='.urlencode($search_label_account);
394 }
395 if (!empty($search_mvt_num)) {
396 $filter['t.piece_num'] = $search_mvt_num;
397 $param .= '&search_mvt_num='.urlencode((string) ($search_mvt_num));
398 }
399 if (!empty($search_doc_ref)) {
400 $filter['t.doc_ref'] = $search_doc_ref;
401 $param .= '&search_doc_ref='.urlencode($search_doc_ref);
402 }
403 if (!empty($search_label_operation)) {
404 $filter['t.label_operation'] = $search_label_operation;
405 $param .= '&search_label_operation='.urlencode($search_label_operation);
406 }
407 if (!empty($search_direction)) {
408 $filter['t.sens'] = $search_direction;
409 $param .= '&search_direction='.urlencode($search_direction);
410 }
411 if (!empty($search_ledger_code)) {
412 $filter['t.code_journal'] = $search_ledger_code;
413 foreach ($search_ledger_code as $code) {
414 $param .= '&search_ledger_code[]='.urlencode($code);
415 }
416 }
417 if (!empty($search_lettering_code)) {
418 $filter['t.lettering_code'] = $search_lettering_code;
419 $param .= '&search_lettering_code='.urlencode($search_lettering_code);
420 }
421 if (!empty($search_debit)) {
422 $filter['t.debit'] = $search_debit;
423 $param .= '&search_debit='.urlencode($search_debit);
424 }
425 if (!empty($search_credit)) {
426 $filter['t.credit'] = $search_credit;
427 $param .= '&search_credit='.urlencode($search_credit);
428 }
429 if (!empty($search_not_reconciled)) {
430 $filter['t.reconciled_option'] = $search_not_reconciled;
431 $param .= '&search_not_reconciled='.urlencode($search_not_reconciled);
432 }
433 if (!empty($search_date_export_start)) {
434 $filter['t.date_export>='] = $search_date_export_start;
435 $param .= '&search_date_export_startmonth='.$search_date_export_startmonth.'&search_date_export_startday='.$search_date_export_startday.'&search_date_export_startyear='.$search_date_export_startyear;
436 }
437 if (!empty($search_date_export_end)) {
438 $filter['t.date_export<='] = $search_date_export_end;
439 $param .= '&search_date_export_endmonth='.$search_date_export_endmonth.'&search_date_export_endday='.$search_date_export_endday.'&search_date_export_endyear='.$search_date_export_endyear;
440 }
441 if (!empty($search_date_validation_start)) {
442 $filter['t.date_validated>='] = $search_date_validation_start;
443 $param .= '&search_date_validation_startmonth='.$search_date_validation_startmonth.'&search_date_validation_startday='.$search_date_validation_startday.'&search_date_validation_startyear='.$search_date_validation_startyear;
444 }
445 if (!empty($search_date_validation_end)) {
446 $filter['t.date_validated<='] = $search_date_validation_end;
447 $param .= '&search_date_validation_endmonth='.$search_date_validation_endmonth.'&search_date_validation_endday='.$search_date_validation_endday.'&search_date_validation_endyear='.$search_date_validation_endyear;
448 }
449 // Due date start
450 if (!empty($search_date_due_start)) {
451 $filter['t.date_lim_reglement>='] = $search_date_due_start;
452 $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;
453 }
454 // Due date end
455 if (!empty($search_date_due_end)) {
456 $filter['t.date_lim_reglement<='] = $search_date_due_end;
457 $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;
458 }
459 if (!empty($search_import_key)) {
460 $filter['t.import_key'] = $search_import_key;
461 $param .= '&search_import_key='.urlencode($search_import_key);
462 }
463 // param with type of list
464 $url_param = substr($param, 1); // remove first "&"
465 if (!empty($type)) {
466 $param = '&type='.$type.$param;
467 }
468
469 // Actions
470 if ($action === 'exporttopdf' && $permissiontoadd) {
471 if ($type == "sub") {
472 $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter, 'AND', 1);
473 } else {
474 $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter);
475 }
476 require_once DOL_DOCUMENT_ROOT . '/core/modules/accountancy/doc/pdf_ledger.modules.php';
477 $pdf = new pdf_ledger($db);
478 $pdf->fromDate = $search_date_start;
479 $pdf->toDate = $search_date_end;
480 $pdf->ledgerType = $type;
481
482 $result = $pdf->write_file($object, $langs);
483
484 if ($result < 0) {
485 setEventMessage($pdf->error, "errors");
486 } else {
487 // Generated PDF is directly sent to the browser
488 exit;
489 }
490 }
491
492 // Mass actions
493 $objectclass = 'Bookkeeping';
494 $objectlabel = 'Bookkeeping';
495 $uploaddir = $conf->societe->dir_output;
496
497 global $error;
499 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
500
501 if (!$error && $action == 'deletebookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'supprimer')) {
502 $db->begin();
503
504 if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
505 $lettering = new Lettering($db);
506 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true);
507 if ($nb_lettering < 0) {
508 setEventMessages('', $lettering->errors, 'errors');
509 $error += 1;
510 }
511 }
512
513 $nbok = 0;
514 if (!$error) {
515 foreach ($toselect as $toselectid) {
516 $result = $object->fetch($toselectid);
517 if ($result > 0 && (!isset($object->date_validation) || $object->date_validation === '')) {
518 $result = $object->deleteMvtNum($object->piece_num);
519 if ($result > 0) {
520 $nbok++;
521 } else {
522 setEventMessages($object->error, $object->errors, 'errors');
523 $error += 1;
524 break;
525 }
526 } elseif ($result < 0) {
527 setEventMessages($object->error, $object->errors, 'errors');
528 $error += 1;
529 break;
530 } elseif (isset($object->date_validation) && $object->date_validation != '') {
531 setEventMessages($langs->trans("ValidatedRecordWhereFound"), null, 'errors');
532 $error += 1;
533 break;
534 }
535 }
536 }
537
538 if (!$error) {
539 $db->commit();
540
541 // Message for elements well deleted
542 if ($nbok > 1) {
543 setEventMessages($langs->trans("RecordsDeleted", $nbok), null, 'mesgs');
544 } elseif ($nbok > 0) {
545 setEventMessages($langs->trans("RecordDeleted", $nbok), null, 'mesgs');
546 } elseif (!$error) {
547 setEventMessages($langs->trans("NoRecordDeleted"), null, 'mesgs');
548 }
549
550 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
551 exit;
552 } else {
553 $db->rollback();
554 }
555 }
556
557 // massaction cloning
558 if (!$error && $action == 'clonebookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
559 $result = $object->newCloneMass($toselect, $journal_code, $massdate);
560 if ($result == -1) {
561 $error += 1;
562 }
563 if ($error) {
564 $db->commit();
565 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
566 exit;
567 } else {
568 $db->rollback();
569 }
570 }
571
572 // massaction assign new account
573 if (!$error && $action == 'assignaccountbookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
574 $result = $object->assignAccountMass($toselect, (int) $account);
575 if ($result == -1) {
576 $error += 1;
577 }
578 if (!$error) {
579 $db->commit();
580 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
581 exit();
582 } else {
583 $db->rollback();
584 }
585 }
586
587 // mass action return account
588 if (!$error && $action == 'returnaccountbookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
589 $result = $object->newReturnAccount($toselect, $journal_code, $massdate);
590 if ($result == -1) {
591 $error += 1;
592 }
593 if (!$error) {
594 $db->commit();
595 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
596 exit();
597 } else {
598 $db->rollback();
599 }
600 }
601
602 // others mass actions
603 if (!$error && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
604 if ($massaction == 'generalmatchingmanual' && $permissiontoadd) {
605 $lettering = new Lettering($db);
606 $result = $lettering->updateGeneralMatching($toselect);
607 if ($result < 0) {
608 setEventMessages('', $lettering->errors, 'errors');
609 } else {
610 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoMachingModified' : 'AccountancyOneMatchingModifiedSuccessfully'), array(), 'mesgs');
611 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
612 exit;
613 }
614 } elseif ($massaction == 'generalmatchingpartial' && $permissiontoadd) {
615 $lettering = new Lettering($db);
616 $result = $lettering->updateGeneralMatching($toselect, true);
617 if ($result < 0) {
618 setEventMessages('', $lettering->errors, 'errors');
619 } else {
620 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoMachingModified' : 'AccountancyOneMatchingModifiedSuccessfully'), array(), 'mesgs');
621 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
622 exit;
623 }
624 } elseif ($action == 'generalunmatchingmanual' && $confirm == 'yes' && $permissiontodelete) {
625 $lettering = new Lettering($db);
626 $result = $lettering->deleteGeneralMatching($toselect);
627 if ($result < 0) {
628 setEventMessages('', $lettering->errors, 'errors');
629 } else {
630 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoUnmatchingModified' : 'AccountancyOneUnmatchingModifiedSuccessfully'), array(), 'mesgs');
631 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
632 exit;
633 }
634 } elseif ($type == 'sub' && $massaction == 'letteringauto' && $permissiontoadd) {
635 $lettering = new Lettering($db);
636 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect);
637 if ($nb_lettering < 0) {
638 setEventMessages('', $lettering->errors, 'errors');
639 $error += 1;
640 $nb_lettering = max(0, abs($nb_lettering) - 2);
641 } elseif ($nb_lettering == 0) {
642 $nb_lettering = 0;
643 setEventMessages($langs->trans('AccountancyNoMatchingModified'), array(), 'mesgs');
644 }
645 if ($nb_lettering == 1) {
646 setEventMessages($langs->trans('AccountancyOneMatchingModifiedSuccessfully'), array(), 'mesgs');
647 } elseif ($nb_lettering > 1) {
648 setEventMessages($langs->trans('AccountancyMatchingModifiedSuccessfully', $nb_lettering), array(), 'mesgs');
649 }
650
651 if (!$error) {
652 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
653 exit();
654 }
655 } elseif ($type == 'sub' && $massaction == 'letteringmanual' && $permissiontoadd) {
656 $lettering = new Lettering($db);
657 $result = $lettering->updateLettering($toselect);
658 if ($result < 0) {
659 setEventMessages('', $lettering->errors, 'errors');
660 } else {
661 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoMatchingModified' : 'AccountancyOneMatchingModifiedSuccessfully'), array(), 'mesgs');
662 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
663 exit();
664 }
665 } elseif ($type == 'sub' && $massaction == 'letteringpartial' && $permissiontoadd) {
666 $lettering = new Lettering($db);
667 $result = $lettering->updateLettering($toselect, 0, true);
668 if ($result < 0) {
669 setEventMessages('', $lettering->errors, 'errors');
670 } else {
671 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoMatchingModified' : 'AccountancyOneMatchingModifiedSuccessfully'), array(), 'mesgs');
672 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
673 exit();
674 }
675 } elseif ($type == 'sub' && $action == 'unletteringauto' && $confirm == "yes" && $permissiontoadd) {
676 $lettering = new Lettering($db);
677 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true);
678 if ($nb_lettering < 0) {
679 setEventMessages('', $lettering->errors, 'errors');
680 $error += 1;
681 $nb_lettering = max(0, abs($nb_lettering) - 2);
682 } elseif ($nb_lettering == 0) {
683 $nb_lettering = 0;
684 setEventMessages($langs->trans('AccountancyNoUnmatchingModified'), array(), 'mesgs');
685 }
686 if ($nb_lettering == 1) {
687 setEventMessages($langs->trans('AccountancyOneUnmatchingModifiedSuccessfully'), array(), 'mesgs');
688 } elseif ($nb_lettering > 1) {
689 setEventMessages($langs->trans('AccountancyUnmatchingModifiedSuccessfully', $nb_lettering), array(), 'mesgs');
690 }
691
692 if (!$error) {
693 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
694 exit();
695 }
696 } elseif ($type == 'sub' && $action == 'unletteringmanual' && $confirm == "yes" && $permissiontoadd) {
697 $lettering = new Lettering($db);
698 $nb_lettering = $lettering->deleteLettering($toselect);
699 if ($result < 0) {
700 setEventMessages('', $lettering->errors, 'errors');
701 } else {
702 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoUnmatchingModified' : 'AccountancyOneUnmatchingModifiedSuccessfully'), array(), 'mesgs');
703 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
704 exit();
705 }
706 }
707 }
708}
709
710
711/*
712 * View
713 */
714
715$formaccounting = new FormAccounting($db);
716$formfile = new FormFile($db);
717$formother = new FormOther($db);
718$form = new Form($db);
719
720$title_page = $langs->trans("Operations").' - '.$langs->trans("VueByAccountAccounting").' (';
721if ($type == 'sub') {
722 $title_page .= $langs->trans("BookkeepingSubAccount");
723} else {
724 $title_page .= $langs->trans("Bookkeeping");
725}
726$title_page .= ')';
727$help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double';
728llxHeader('', $title_page, $help_url, '', 0, 0, '', '', '', 'mod-accountancy accountancy-consultation page-'.(($type == 'sub') ? 'sub' : '').'ledger');
729
730if (!empty($socid)) {
731 $companystatic = new Societe($db);
732 $res = $companystatic->fetch($socid);
733 if ($res > 0) {
734 $tmpobject = $object;
735 $object = $companystatic; // $object must be of type Societe when calling societe_prepare_head
736 $head = societe_prepare_head($companystatic);
737 $object = $tmpobject;
738
739 print dol_get_fiche_head($head, 'accounting', $langs->trans("ThirdParty"), -1, 'company');
740
741 $linkback = '<a href="'.DOL_URL_ROOT.'/societe/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
742
743 dol_banner_tab($companystatic, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom');
744
745 print '<div class="fichecenter">';
746
747 print '<div class="underbanner clearboth"></div>';
748 print '<table class="border centpercent tableforfield">';
749
750 // Type Prospect/Customer/Supplier
751 print '<tr><td class="titlefield">'.$langs->trans('NatureOfThirdParty').'</td><td>';
752 print $companystatic->getTypeUrl(1);
753 print '</td></tr>';
754
755 // Customer code
756 if ($companystatic->client && !empty($companystatic->code_client)) {
757 print '<tr><td class="titlefield">';
758 print $langs->trans('CustomerCode').'</td><td>';
759 print showValueWithClipboardCPButton(dol_escape_htmltag($companystatic->code_client));
760 $tmpcheck = $companystatic->check_codeclient();
761 if ($tmpcheck != 0 && $tmpcheck != -5) {
762 print ' <span class="error">('.$langs->trans("WrongCustomerCode").')</span>';
763 }
764 print '</td>';
765 print '</tr>';
766 }
767 // Supplier code
768 if ($companystatic->fournisseur && !empty($companystatic->code_fournisseur)) {
769 print '<tr><td class="titlefield">';
770 print $langs->trans('SupplierCode').'</td><td>';
771 print showValueWithClipboardCPButton(dol_escape_htmltag($companystatic->code_fournisseur));
772 $tmpcheck = $companystatic->check_codefournisseur();
773 if ($tmpcheck != 0 && $tmpcheck != -5) {
774 print ' <span class="error">('.$langs->trans("WrongSupplierCode").')</span>';
775 }
776 print '</td>';
777 print '</tr>';
778 }
779
780 print '</table>';
781 print '</div>';
782 print dol_get_fiche_end();
783
784 print info_admin($langs->trans("WarningThisPageContainsOnlyEntriesTransferredInAccounting"));
785 print '<br>';
786
787 // Choice of mode (customer / supplier)
788 if (!empty($conf->dol_use_jmobile)) {
789 print "\n".'<div class="fichecenter"><div class="nowrap">'."\n";
790 }
791
792 if ($companystatic->client && !empty($companystatic->code_compta_client)) {
793 if ($mode != 'customer') {
794 if (!empty($companystatic->code_compta_client)) {
795 $subledger_start_account = $subledger_end_account = $companystatic->code_compta_client;
796 } else {
797 $subledger_start_account = $subledger_end_account = '';
798 }
799 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="' . $_SERVER["PHP_SELF"] . '?mode=customer&socid='.$socid.'&type=sub&search_accountancy_code_start='.$subledger_start_account.'&search_accountancy_code_end='.$subledger_end_account.'">';
800 } else {
801 print '<span class="a-mesure marginleftonly marginrightonly">';
802 }
803
804 print $langs->trans("CustomerAccountancyCodeShort");
805 if ($mode != 'customer') {
806 print '</a>';
807 } else {
808 print '</span>';
809 }
810 }
811
812 if ($companystatic->fournisseur && !empty($companystatic->code_compta_fournisseur)) {
813 if ($mode != 'supplier') {
814 if (!empty($companystatic->code_compta_fournisseur)) {
815 $subledger_start_account = $subledger_end_account = $companystatic->code_compta_fournisseur;
816 } else {
817 $subledger_start_account = $subledger_end_account = '';
818 }
819 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="' . $_SERVER["PHP_SELF"] . '?mode=supplier&socid='.$socid.'&type=sub&search_accountancy_code_start='.$subledger_start_account.'&search_accountancy_code_end='.$subledger_end_account.'">';
820 } else {
821 print '<span class="a-mesure marginleftonly marginrightonly">';
822 }
823 print $langs->trans("SupplierAccountancyCodeShort");
824 if ($mode != 'supplier') {
825 print '</a>';
826 } else {
827 print '</span>';
828 }
829 }
830
831 if (!empty($conf->dol_use_jmobile)) {
832 print '</div></div>';
833 } else {
834 print '<br>';
835 }
836 print '<br>';
837 }
838}
839
840// List
841$nbtotalofrecords = '';
842if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
843 // TODO Perf Replace this by a count
844 if ($type == 'sub') {
845 $nbtotalofrecords = $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter, 'AND', 1, 1);
846 } else {
847 $nbtotalofrecords = $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter, 'AND', 0, 1);
848 }
849
850 if ($nbtotalofrecords < 0) {
851 setEventMessages($object->error, $object->errors, 'errors');
852 $error += 1;
853 }
854}
855
856$num = 0;
857if (!$error) {
858 if ($type == 'sub') {
859 $result = $object->fetchAllByAccount($sortorder, $sortfield, $limit, $offset, $filter, 'AND', 1);
860 } else {
861 $result = $object->fetchAllByAccount($sortorder, $sortfield, $limit, $offset, $filter, 'AND', 0);
862 }
863 //$num = count($object->lines);
864 $num = $result; // $result is total nb of lines, or limit + 1, but $object->lines is always limited to $limit
865
866 if ($result < 0) {
867 setEventMessages($object->error, $object->errors, 'errors');
868 }
869}
870
871$arrayofselected = is_array($toselect) ? $toselect : array();
872
873// Print form confirm
874$formconfirm = '';
875print $formconfirm;
876
877// List of mass actions available
878$arrayofmassactions = array();
879if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && $user->hasRight('accounting', 'mouvements', 'creer')) {
880 if ($type == 'sub') {
881 // Auxiliary ledger matching only
882 $arrayofmassactions['letteringauto'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringAuto');
883 $arrayofmassactions['preunletteringauto'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('UnletteringAuto');
884 $arrayofmassactions['letteringmanual'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringManual');
885 $arrayofmassactions['letteringpartial'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringPartial');
886 $arrayofmassactions['preunletteringmanual'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('UnletteringManual');
887 } else {
888 // General ledger matching only
889 $arrayofmassactions['generalmatchingmanual'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('GeneralMatchingManual');
890 $arrayofmassactions['generalmatchingpartial'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('GeneralMatchingPartial');
891 $arrayofmassactions['pregeneralunmatchingmanual'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('GeneralUnmatchingManual');
892 }
893}
894if ($user->hasRight('accounting', 'mouvements', 'creer')) {
895 $arrayofmassactions['preclonebookkeepingwriting'] = img_picto('', 'clone', 'class="pictofixedwidth"').$langs->trans("Clone");
896}
897if ($user->hasRight('accounting', 'mouvements', 'creer')) {
898 $arrayofmassactions['preassignaccountbookkeepingwriting'] = img_picto('', 'fa-exchange-alt', 'class="pictofixedwidth"').$langs->trans("AssignAccount");
899}
900if ($user->hasRight('accounting', 'mouvements', 'creer')) {
901 $arrayofmassactions['prereturnaccountbookkeepingwriting'] = img_picto('', 'undo', 'class="pictofixedwidth"').$langs->trans("ReturnAccount");
902}
903if ($user->hasRight('accounting', 'mouvements', 'supprimer')) {
904 $arrayofmassactions['predeletebookkeepingwriting'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
905}
906
907if (GETPOSTINT('nomassaction') || in_array($massaction, array('preunletteringauto', 'preunletteringmanual', 'pregeneralunmatchingmanual', 'predeletebookkeepingwriting', 'preclonebookkeepingwriting', 'preassignaccountbookkeepingwriting', 'prereturnaccountbookkeepingwriting'))) {
908 $arrayofmassactions = array();
909}
910$massactionbutton = $form->selectMassAction($massaction, $arrayofmassactions);
911
912print '<form method="POST" id="searchFormList" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
913print '<input type="hidden" name="token" value="'.newToken().'">';
914print '<input type="hidden" name="action" value="list">';
915if ($optioncss != '') {
916 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
917}
918print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
919print '<input type="hidden" name="type" value="'.$type.'">';
920if (!empty($socid)) {
921 print '<input type="hidden" name="socid" value="' . $socid . '">';
922}
923print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
924print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
925print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
926
927$parameters = array('param' => $param);
928$reshook = $hookmanager->executeHooks('addMoreActionsButtonsList', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
929if ($reshook < 0) {
930 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
931}
932
933$newcardbutton = empty($hookmanager->resPrint) ? '' : $hookmanager->resPrint;
934
935if (empty($reshook)) {
936 // Remove navigation buttons if in thirdparty tab mode, except for PDF printing
937 if (empty($socid)) {
938 $newcardbutton = dolGetButtonTitle($langs->trans('ViewFlatList'), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/list.php?' . $param);
939 if ($type == 'sub') {
940 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?' . $url_param, '', 1, array('morecss' => 'marginleftonly'));
941 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?type=sub&' . $url_param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected'));
942 } else {
943 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?' . $url_param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected'));
944 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?type=sub&' . $url_param, '', 1, array('morecss' => 'marginleftonly'));
945 }
946 }
947 $newcardbutton .= dolGetButtonTitle($langs->trans('ExportToPdf'), '', 'fa fa-file-pdf paddingleft', $_SERVER['PHP_SELF'] . '?token=' . newToken() .'&action=exporttopdf'.(!empty($type) ? '&type=sub' : '').'&' . $url_param, '', $permissiontoexport, array('morecss' => 'marginleftonly'));
948
949 $newcardbutton .= dolGetButtonTitleSeparator();
950
951 $newcardbutton .= dolGetButtonTitle($langs->trans('NewAccountingMvt'), '', 'fa fa-plus-circle paddingleft', DOL_URL_ROOT.'/accountancy/bookkeeping/card.php?action=create'.(!empty($type) ? '&type=sub' : '').'&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
952}
953
954if ($contextpage != $_SERVER["PHP_SELF"]) {
955 $param .= '&contextpage='.urlencode($contextpage);
956}
957if ($limit > 0 && $limit != $conf->liste_limit) {
958 $param .= '&limit='.((int) $limit);
959}
960
961print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1);
962
963if ($massaction == 'preunletteringauto') {
964 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnletteringAuto"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unletteringauto", null, '', 0, 200, 500, 1);
965} elseif ($massaction == 'preunletteringmanual') {
966 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnletteringManual"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unletteringmanual", null, '', 0, 200, 500, 1);
967} elseif ($massaction == 'pregeneralunmatchingmanual') {
968 print $form->formconfirm($_SERVER['PHP_SELF'], $langs->trans('ConfirmMassGeneralUnmatchingManual'), $langs->trans('ConfirmMassGeneralUnmatchingQuestion', count($toselect)), 'generalunmatchingmanual', null, '', 0, 200, 500, 1);
969} elseif ($massaction == 'predeletebookkeepingwriting') {
970 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDeleteBookkeepingWriting"), $langs->trans("ConfirmMassDeleteBookkeepingWritingQuestion", count($toselect)), "deletebookkeepingwriting", null, '', 0, 200, 500, 1);
971} elseif ($massaction == 'preassignaccountbookkeepingwriting') {
972 $input = $formaccounting->select_account('', 'account', 1);
973 $formquestion = array(array('type' => 'other', 'name' => 'account', 'label' => '<span class="fieldrequired">' . $langs->trans("AccountAccountingShort") . '</span>', 'value' => $input),);
974 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("confirmMassAssignAccountBookkeepingWritingConfirm"), $langs->trans("ConfirmMassAssignAccountBookkeepingWritingQuestion", count($toselect)), "assignaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
975} elseif ($massaction == 'preclonebookkeepingwriting') {
976 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
977 $input2 = $formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1).'</td>';
978 $formquestion = array(
979 array(
980 'type' => 'other',
981 'name' => 'massdate',
982 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>',
983 'value' => $input1
984 )
985 );
986
987 if (getDolGlobalString('ACCOUNTING_CLONING_ENABLE_INPUT_JOURNAL')) {
988 $formquestion[] = array(
989 'type' => 'text',
990 'name' => 'code_journal',
991 'label' => '<span class="fieldrequired">' . $langs->trans("Codejournal") . '</span>',
992 'value' => $input2
993 );
994 }
995
996 print $form->formconfirm(
997 $_SERVER["PHP_SELF"],
998 $langs->trans("ConfirmMassCloneBookkeepingWriting"),
999 $langs->trans("ConfirmMassCloneBookkeepingWritingQuestion", count($toselect)),
1000 "clonebookkeepingwriting",
1001 $formquestion,
1002 '', 0, 200, 500, 1
1003 );
1004} elseif ($massaction == 'prereturnaccountbookkeepingwriting') {
1005 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
1006 $formquestion = array(array('type' => 'other', 'name' => 'massdate', 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>', 'value' => $input1));
1007 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassReturnAccountBookkeepingWriting"), $langs->trans("ConfirmMassReturnAccountBookkeepingWritingQuestion", count($toselect)), "returnaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
1008}
1009
1010include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
1011
1012$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1013$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column); // This also change content of $arrayfields
1014if ($massactionbutton && $contextpage != 'poslist') {
1015 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
1016}
1017
1018// Reverse sort order
1019if (preg_match('/^asc/i', $sortorder)) {
1020 $sortorder = "asc";
1021} else {
1022 $sortorder = "desc";
1023}
1024
1025// Warning to explain why the list of record is not consistent with the other list view (missing a lot of lines)
1026if ($type == 'sub' && !$socid) {
1027 print info_admin($langs->trans("WarningRecordWithoutSubledgerAreExcluded"));
1028 print '<br>';
1029}
1030
1031$moreforfilter = '';
1032
1033// Search on accountancy custom groups or account
1034$moreforfilter .= '<div class="divsearchfield">';
1035$moreforfilter .= $langs->trans('AccountAccounting').': ';
1036$moreforfilter .= '<div class="nowrap inline-block">';
1037if ($type == 'sub') {
1038 $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), 'maxwidth200');
1039} else {
1040 $moreforfilter .= $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth200');
1041}
1042$moreforfilter .= ' ';
1043if ($type == 'sub') {
1044 $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), 'maxwidth200');
1045} else {
1046 $moreforfilter .= $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth200');
1047}
1048
1049if (empty($socid)) {
1050 $moreforfilter .= '&nbsp;&nbsp;&nbsp;<a id="previous_account" accesskey="p" title="' . $conf->browser->stringforfirstkey . ' p" class="classfortooltip" href="#"><i class="fa fa-chevron-left"></i></a>';
1051 $moreforfilter .= '&nbsp;&nbsp;&nbsp;<a id="next_account" accesskey="n" title="' . $conf->browser->stringforfirstkey . ' n" class="classfortooltip" href="#"><i class="fa fa-chevron-right"></i></a>';
1052 $moreforfilter .= <<<SCRIPT
1053<script type="text/javascript">
1054 jQuery(document).ready(function() {
1055 var searchFormList = $('#searchFormList');
1056 var searchAccountancyCodeStart = $('#search_accountancy_code_start');
1057 var searchAccountancyCodeEnd = $('#search_accountancy_code_end');
1058 jQuery('#previous_account').on('click', function() {
1059 var previousOption = searchAccountancyCodeStart.find('option:selected').prev('option');
1060 if (previousOption.length == 1) searchAccountancyCodeStart.val(previousOption.attr('value'));
1061 searchAccountancyCodeEnd.val(searchAccountancyCodeStart.val());
1062 searchFormList.submit();
1063 });
1064 jQuery('#next_account').on('click', function() {
1065 var nextOption = searchAccountancyCodeStart.find('option:selected').next('option');
1066 if (nextOption.length == 1) searchAccountancyCodeStart.val(nextOption.attr('value'));
1067 searchAccountancyCodeEnd.val(searchAccountancyCodeStart.val());
1068 searchFormList.submit();
1069 });
1070 jQuery('input[name="search_mvt_num"]').on("keypress", function(event) {
1071 console.log(event);
1072 });
1073 });
1074</script>
1075SCRIPT;
1076}
1077$moreforfilter .= '</div>';
1078$moreforfilter .= '</div>';
1079
1080if (empty($socid)) {
1081 $moreforfilter .= '<div class="divsearchfield">';
1082 $moreforfilter .= $langs->trans('AccountingCategory') . ': ';
1083 $moreforfilter .= '<div class="nowrap inline-block">';
1084 $moreforfilter .= $formaccounting->select_accounting_category($search_account_category, 'search_account_category', 1, 0, 0, 0);
1085 $moreforfilter .= '</div>';
1086 $moreforfilter .= '</div>';
1087}
1088
1089$parameters = array();
1090$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1091if (empty($reshook)) {
1092 $moreforfilter .= $hookmanager->resPrint;
1093} else {
1094 $moreforfilter = $hookmanager->resPrint;
1095}
1096
1097print '<div class="liste_titre liste_titre_bydiv centpercent">';
1098print $moreforfilter;
1099print '</div>';
1100
1101print '<div class="div-table-responsive">';
1102print '<table class="tagtable liste centpercent listwithfilterbefore">';
1103
1104// Filters lines
1105print '<tr class="liste_titre_filter">';
1106// Action column
1107if ($conf->main_checkbox_left_column) {
1108 print '<td class="liste_titre center">';
1109 $searchpicto = $form->showFilterButtons('left');
1110 print $searchpicto;
1111 print '</td>';
1112}
1113// Movement number
1114if (!empty($arrayfields['t.piece_num']['checked'])) {
1115 print '<td class="liste_titre"><input type="text" name="search_mvt_num" class="width50" value="'.dol_escape_htmltag($search_mvt_num).'"></td>';
1116}
1117// Code journal
1118if (!empty($arrayfields['t.code_journal']['checked'])) {
1119 print '<td class="liste_titre center">';
1120 print $formaccounting->multi_select_journal($search_ledger_code, 'search_ledger_code', 0, 1, 1, 1, 'maxwidth75');
1121 print '</td>';
1122}
1123// Date document
1124if (!empty($arrayfields['t.doc_date']['checked'])) {
1125 print '<td class="liste_titre center">';
1126 print '<div class="nowrapfordate">';
1127 print $form->selectDate($search_date_start, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1128 print '</div>';
1129 print '<div class="nowrapfordate">';
1130 print $form->selectDate($search_date_end, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1131 print '</div>';
1132 print '</td>';
1133}
1134// Ref document
1135if (!empty($arrayfields['t.doc_ref']['checked'])) {
1136 print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_doc_ref" value="'.dol_escape_htmltag($search_doc_ref).'"/></td>';
1137}
1138// Label operation
1139if (!empty($arrayfields['t.label_operation']['checked'])) {
1140 print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_label_operation" value="'.dol_escape_htmltag($search_label_operation).'"/></td>';
1141}
1142// Matching code
1143if (!empty($arrayfields['t.lettering_code']['checked'])) {
1144 print '<td class="liste_titre center">';
1145 print '<input type="text" size="3" class="flat" name="search_lettering_code" value="'.$search_lettering_code.'"/>';
1146 print '<br><span class="nowrap"><input type="checkbox" name="search_not_reconciled" value="notreconciled"'.($search_not_reconciled == 'notreconciled' ? ' checked' : '').'>'.$langs->trans("NotReconciled").'</span>';
1147 print '</td>';
1148}
1149// Debit
1150if (!empty($arrayfields['t.debit']['checked'])) {
1151 print '<td class="liste_titre right"><input type="text" class="flat" name="search_debit" size="4" value="'.dol_escape_htmltag($search_debit).'"></td>';
1152}
1153// Credit
1154if (!empty($arrayfields['t.credit']['checked'])) {
1155 print '<td class="liste_titre right"><input type="text" class="flat" name="search_credit" size="4" value="'.dol_escape_htmltag($search_credit).'"></td>';
1156}
1157// Balance
1158if (!empty($arrayfields['t.balance']['checked'])) {
1159 print '<td></td>';
1160}
1161// Date export
1162if (!empty($arrayfields['t.date_export']['checked'])) {
1163 print '<td class="liste_titre center">';
1164 print '<div class="nowrapfordate">';
1165 print $form->selectDate($search_date_export_start, 'search_date_export_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1166 print '</div>';
1167 print '<div class="nowrapfordate">';
1168 print $form->selectDate($search_date_export_end, 'search_date_export_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1169 print '</div>';
1170 print '</td>';
1171}
1172// Date validation
1173if (!empty($arrayfields['t.date_validated']['checked'])) {
1174 print '<td class="liste_titre center">';
1175 print '<div class="nowrapfordate">';
1176 print $form->selectDate($search_date_validation_start, 'search_date_validation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1177 print '</div>';
1178 print '<div class="nowrapfordate">';
1179 print $form->selectDate($search_date_validation_end, 'search_date_validation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1180 print '</div>';
1181 print '</td>';
1182}
1183// Due date start and end
1184if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1185 print '<td class="liste_titre center">';
1186 print '<div class="nowrapfordate">';
1187 print $form->selectDate($search_date_due_start, 'search_date_due_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1188 print '</div>';
1189 print '<div class="nowrapfordate">';
1190 print $form->selectDate($search_date_due_end, 'search_date_due_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1191 print '</div>';
1192 print '</td>';
1193}
1194if (!empty($arrayfields['t.import_key']['checked'])) {
1195 print '<td class="liste_titre center">';
1196 print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="'.dol_escape_htmltag($search_import_key).'">';
1197 print '</td>';
1198}
1199
1200// Fields from hook
1201$parameters = array('arrayfields' => $arrayfields);
1202$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1203print $hookmanager->resPrint;
1204
1205// Action column
1206if (!$conf->main_checkbox_left_column) {
1207 print '<td class="liste_titre center">';
1208 $searchpicto = $form->showFilterButtons();
1209 print $searchpicto;
1210 print '</td>';
1211}
1212print "</tr>\n";
1213
1214print '<tr class="liste_titre">';
1215if ($conf->main_checkbox_left_column) {
1216 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1217}
1218if (!empty($arrayfields['t.piece_num']['checked'])) {
1219 print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder, 'tdoverflowmax80imp ');
1220}
1221if (!empty($arrayfields['t.code_journal']['checked'])) {
1222 print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center ');
1223}
1224if (!empty($arrayfields['t.doc_date']['checked'])) {
1225 print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1226}
1227if (!empty($arrayfields['t.doc_ref']['checked'])) {
1228 print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder);
1229}
1230if (!empty($arrayfields['t.label_operation']['checked'])) {
1231 print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder);
1232}
1233if (!empty($arrayfields['t.lettering_code']['checked'])) {
1234 print_liste_field_titre($arrayfields['t.lettering_code']['label'], $_SERVER['PHP_SELF'], "t.lettering_code", "", $param, '', $sortfield, $sortorder, 'center ');
1235}
1236if (!empty($arrayfields['t.debit']['checked'])) {
1237 print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right ');
1238}
1239if (!empty($arrayfields['t.credit']['checked'])) {
1240 print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right ');
1241}
1242if (!empty($arrayfields['t.balance']['checked'])) {
1243 print_liste_field_titre($arrayfields['t.balance']['label'], "", "", "", $param, '', $sortfield, $sortorder, 'right ');
1244}
1245if (!empty($arrayfields['t.date_export']['checked'])) {
1246 print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export", "", $param, '', $sortfield, $sortorder, 'center ');
1247}
1248if (!empty($arrayfields['t.date_validated']['checked'])) {
1249 print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated", "", $param, '', $sortfield, $sortorder, 'center ');
1250}
1251// Due date
1252if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1253 print_liste_field_titre($arrayfields['t.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], 't.date_lim_reglement', '', $param, '', $sortfield, $sortorder, 'center ');
1254}
1255if (!empty($arrayfields['t.import_key']['checked'])) {
1256 print_liste_field_titre($arrayfields['t.import_key']['label'], $_SERVER["PHP_SELF"], "t.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
1257}
1258// Hook fields
1259$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1260$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1261print $hookmanager->resPrint;
1262if (!$conf->main_checkbox_left_column) {
1263 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1264}
1265print "</tr>\n";
1266
1267$displayed_account_number = null; // Start with undefined to be able to distinguish with empty
1268
1269$objectstatic = null; // Init for static analysis
1270$objectlink = ''; // Init for static analysis
1271$result = -1; // Init for static analysis
1272
1273// Loop on record
1274// --------------------------------------------------------------------
1275$i = 0;
1276
1277$totalarray = array();
1278$totalarray['nbfield'] = 0;
1279$sous_total_debit = 0;
1280$sous_total_credit = 0;
1281$totalarray['val'] = array();
1282$totalarray['val']['totaldebit'] = 0;
1283$totalarray['val']['totalcredit'] = 0;
1284$totalarray['val']['totalbalance'] = 0;
1285
1286// Init for static analysis
1287$colspan = 0; // colspan before field 'label of operation'
1288$colspanend = 0; // colspan after debit/credit
1289$accountg = '-';
1290
1291$colspan = 0; // colspan before field 'label of operation'
1292$colspanend = 3; // colspan after debit/credit
1293if (!empty($arrayfields['t.piece_num']['checked'])) { $colspan++; }
1294if (!empty($arrayfields['t.code_journal']['checked'])) { $colspan++; }
1295if (!empty($arrayfields['t.doc_date']['checked'])) { $colspan++; }
1296if (!empty($arrayfields['t.doc_ref']['checked'])) { $colspan++; }
1297if (!empty($arrayfields['t.label_operation']['checked'])) { $colspan++; }
1298if (!empty($arrayfields['t.date_export']['checked'])) { $colspanend++; }
1299if (!empty($arrayfields['t.date_validated']['checked'])) { $colspanend++; }
1300if (!empty($arrayfields['t.lettering_code']['checked'])) { $colspanend++; }
1301if ($conf->main_checkbox_left_column) {
1302 $colspan++;
1303 $colspanend--;
1304}
1305
1306while ($i < min($num, $limit)) {
1307 $line = $object->lines[$i];
1308
1309 if ($type == 'sub') {
1310 $accountg = length_accounta($line->subledger_account);
1311 } else {
1312 $accountg = length_accountg($line->numero_compte);
1313 }
1314 //if (empty($accountg)) $accountg = '-';
1315
1316 $colspan = 0; // colspan before field 'label of operation'
1317 $colspanend = 0; // colspan after debit/credit
1318 if ($conf->main_checkbox_left_column) {
1319 $colspan++;
1320 }
1321 if (!empty($arrayfields['t.piece_num']['checked'])) {
1322 $colspan++;
1323 }
1324 if (!empty($arrayfields['t.code_journal']['checked'])) {
1325 $colspan++;
1326 }
1327 if (!empty($arrayfields['t.doc_date']['checked'])) {
1328 $colspan++;
1329 }
1330 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1331 $colspan++;
1332 }
1333 if (!empty($arrayfields['t.label_operation']['checked'])) {
1334 $colspan++;
1335 }
1336 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1337 $colspan++;
1338 }
1339
1340 if (!empty($arrayfields['t.balance']['checked'])) {
1341 $colspanend++;
1342 }
1343 if (!empty($arrayfields['t.date_export']['checked'])) {
1344 $colspanend++;
1345 }
1346 if (!empty($arrayfields['t.date_validated']['checked'])) {
1347 $colspanend++;
1348 }
1349 // Due date
1350 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1351 $colspanend++;
1352 }
1353 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1354 $colspanend++;
1355 }
1356 if (!empty($arrayfields['t.import_key']['checked'])) {
1357 $colspanend++;
1358 }
1359 if (!$conf->main_checkbox_left_column) {
1360 $colspan++;
1361 $colspanend--;
1362 }
1363
1364 // Is it a break ?
1365 if ($accountg != $displayed_account_number || !isset($displayed_account_number)) {
1366 // Show a subtotal by accounting account
1367 if (isset($displayed_account_number)) {
1368 print '<tr class="liste_total">';
1369 if ($type == 'sub') {
1370 print '<td class="right" colspan="' . $colspan . '">' . $langs->trans("TotalForAccount") . ' ' . length_accounta($displayed_account_number) . ':</td>';
1371 } else {
1372 print '<td class="right" colspan="' . $colspan . '">' . $langs->trans("TotalForAccount") . ' ' . length_accountg($displayed_account_number) . ':</td>';
1373 }
1374 print '<td class="nowrap right">'.price(price2num($sous_total_debit, 'MT')).'</td>';
1375 print '<td class="nowrap right">'.price(price2num($sous_total_credit, 'MT')).'</td>';
1376 if ($colspanend > 0) {
1377 print '<td colspan="'.$colspanend.'"></td>';
1378 }
1379 print '</tr>';
1380 // Show balance of last shown account
1381 $balance = $sous_total_debit - $sous_total_credit;
1382 print '<tr class="liste_total">';
1383 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("Balance").':</td>';
1384 if ($balance > 0) {
1385 print '<td class="nowraponall right">';
1386 print price(price2num($sous_total_debit - $sous_total_credit, 'MT'));
1387 print '</td>';
1388 print '<td></td>';
1389 } else {
1390 print '<td></td>';
1391 print '<td class="nowraponall right">';
1392 print price(price2num($sous_total_credit - $sous_total_debit, 'MT'));
1393 print '</td>';
1394 }
1395 if ($colspanend > 0) {
1396 print '<td colspan="'.$colspanend.'"></td>';
1397 }
1398 print '</tr>';
1399 }
1400
1401 // Show the break account
1402 print '<tr class="trforbreaknobg">';
1403 print '<td colspan="'.($totalarray['nbfield'] ? $totalarray['nbfield'] : count($arrayfields) + 1).'" class="tdforbreak">';
1404 if ($type == 'sub') {
1405 if ($line->subledger_account != "" && $line->subledger_account != '-1') {
1406 print empty($line->subledger_label) ? '<span class="error">'.$langs->trans("Unknown").'</span>' : $line->subledger_label;
1407 print ' : ';
1408 print length_accounta($line->subledger_account);
1409 } else {
1410 // Should not happen: subledger account must be null or a non empty value
1411 print '<span class="error">' . $langs->trans("Unknown");
1412 if ($line->subledger_label) {
1413 print ' (' . $line->subledger_label . ')';
1414 $htmltext = 'EmptyStringForSubledgerAccountButSubledgerLabelDefined';
1415 } else {
1416 $htmltext = 'EmptyStringForSubledgerAccountAndSubledgerLabel';
1417 }
1418 print $form->textwithpicto('', $htmltext);
1419 print '</span>';
1420 }
1421 } else {
1422 if ($line->numero_compte != "" && $line->numero_compte != '-1') {
1423 print length_accountg($line->numero_compte) . ' : ' . $object->get_compte_desc($line->numero_compte);
1424 } else {
1425 print '<span class="error">' . $langs->trans("Unknown") . '</span>';
1426 }
1427 }
1428 print '</td>';
1429 print '</tr>';
1430
1431 $displayed_account_number = $accountg;
1432 //if (empty($displayed_account_number)) $displayed_account_number='-';
1433 $sous_total_debit = 0;
1434 $sous_total_credit = 0;
1435 }
1436
1437 print '<tr class="oddeven">';
1438 // Action column
1439 if ($conf->main_checkbox_left_column) {
1440 print '<td class="nowraponall center">';
1441 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
1442 $selected = 0;
1443 if (in_array($line->id, $arrayofselected)) {
1444 $selected = 1;
1445 }
1446 print '<input id="cb' . $line->id . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $line->id . '"' . ($selected ? ' checked="checked"' : '') . ' />';
1447 }
1448 print '</td>';
1449 if (!$i) {
1450 $totalarray['nbfield']++;
1451 }
1452 }
1453 // Piece number
1454 if (!empty($arrayfields['t.piece_num']['checked'])) {
1455 print '<td class="nowraponall">';
1456 $object->id = $line->id;
1457 $object->piece_num = $line->piece_num;
1458 $object->ref = $line->ref;
1459 print $object->getNomUrl(1, '', 0, '', 1);
1460 print '<span class="hideonsmartphone">';
1461 if (!empty($line->date_export)) {
1462 print img_picto($langs->trans("DateExport").": ".dol_print_date($line->date_export, 'dayhour')." (".$langs->trans("TransactionExportDesc").")", 'fa-file-export', 'class="paddingleft pictofixedwidth opacitymedium"');
1463 }
1464 if (!empty($line->date_validation)) {
1465 print img_picto($langs->trans("DateValidation").": ".dol_print_date($line->date_validation, 'dayhour')." (".$langs->trans("TransactionBlockedLockedDesc").")", 'fa-lock', 'class="paddingleft pictofixedwidth opacitymedium"');
1466 }
1467 print '</span>';
1468 print '</td>';
1469 if (!$i) {
1470 $totalarray['nbfield']++;
1471 }
1472 }
1473
1474 // Journal code
1475 if (!empty($arrayfields['t.code_journal']['checked'])) {
1476 $accountingjournal = new AccountingJournal($db);
1477 $result = $accountingjournal->fetch(0, $line->code_journal);
1478 $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal);
1479 print '<td class="center tdoverflowmax80">'.$journaltoshow.'</td>';
1480 if (!$i) {
1481 $totalarray['nbfield']++;
1482 }
1483 }
1484
1485 // Document date
1486 if (!empty($arrayfields['t.doc_date']['checked'])) {
1487 print '<td class="center">'.dol_print_date($line->doc_date, 'day').'</td>';
1488 if (!$i) {
1489 $totalarray['nbfield']++;
1490 }
1491 }
1492
1493 // Document ref
1494 $modulepart = '';
1495 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1496 if ($line->doc_type == 'customer_invoice') {
1497 $langs->loadLangs(array('bills'));
1498
1499 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1500 $objectstatic = new Facture($db);
1501 $objectstatic->fetch($line->fk_doc);
1502 //$modulepart = 'facture';
1503
1504 $filename = dol_sanitizeFileName($line->doc_ref);
1505 $filedir = $conf->facture->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1506 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1507 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1508 } elseif ($line->doc_type == 'supplier_invoice') {
1509 $langs->loadLangs(array('bills'));
1510
1511 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1512 $objectstatic = new FactureFournisseur($db);
1513 $objectstatic->fetch($line->fk_doc);
1514
1515 $modulepart = 'invoice_supplier';
1516 $filename = dol_sanitizeFileName($line->doc_ref);
1517 $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($line->fk_doc, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1518 $subdir = get_exdir($objectstatic->id, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1519 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $subdir, $filedir);
1520 } elseif ($line->doc_type == 'expense_report') {
1521 $langs->loadLangs(array('trips'));
1522
1523 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
1524 $objectstatic = new ExpenseReport($db);
1525 $objectstatic->fetch($line->fk_doc);
1526 //$modulepart = 'expensereport';
1527
1528 $filename = dol_sanitizeFileName($line->doc_ref);
1529 $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1530 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1531 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1532 } elseif ($line->doc_type == 'bank') {
1533 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1534 $objectstatic = new AccountLine($db);
1535 $objectstatic->fetch($line->fk_doc);
1536 } else {
1537 // Other type
1538 }
1539
1540 print '<td class="tdoverflowmax250">';
1541
1542 // Picto + Ref
1543 if ($line->doc_type == 'customer_invoice' || $line->doc_type == 'supplier_invoice' || $line->doc_type == 'expense_report') {
1544 print $objectstatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1);
1545 print $documentlink;
1546 } elseif ($line->doc_type == 'bank') {
1547 print $objectstatic->getNomUrl(1);
1548 $bank_ref = strstr($line->doc_ref, '-');
1549 print ' <span class="classfortooltip" title="'.dol_escape_htmltag($line->doc_ref).'">'.dol_escape_htmltag($bank_ref).'</span>';
1550 } else {
1551 print $line->doc_ref;
1552 }
1553
1554 print "</td>\n";
1555 if (!$i) {
1556 $totalarray['nbfield']++;
1557 }
1558 }
1559
1560 // Label operation
1561 if (!empty($arrayfields['t.label_operation']['checked'])) {
1562 // Show a link to the customer/supplier invoice
1563 $doc_ref = preg_replace('/\‍(.*\‍)/', '', $line->doc_ref);
1564 if (strlen(length_accounta($line->subledger_account)) == 0) {
1565 print '<td class="small tdoverflowmax350 classfortooltip" title="'.dol_escape_htmltag($line->label_operation).'">'.dol_escape_htmltag($line->label_operation).'</td>';
1566 } else {
1567 print '<td class="small tdoverflowmax350 classfortooltip" title="'.dol_escape_htmltag($line->label_operation.($line->label_operation ? '<br>' : '').'<span style="font-size:0.8em">('.length_accounta($line->subledger_account).')').'">'.dol_escape_htmltag($line->label_operation).($line->label_operation ? '<br>' : '').'<span style="font-size:0.8em">('.dol_escape_htmltag(length_accounta($line->subledger_account)).')</span></td>';
1568 }
1569 if (!$i) {
1570 $totalarray['nbfield']++;
1571 }
1572 }
1573
1574 // Matching code
1575 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1576 $tooltipText = "";
1577 if (!empty($line->matching_general)) {
1578 $tooltipText .= $langs->trans('GeneralMatching');
1579 } elseif (empty($line->matching_general) && !empty($line->lettering_code)) {
1580 $tooltipText .= $langs->trans('AuxiliaryMatching');
1581 }
1582 print '<td class="center classfortooltip" title="'.$tooltipText.'">';
1583 if ($type == 'sub') {
1584 // Auxiliary account matching
1585 if (!empty($line->lettering_code)) {
1586 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable
1587 print '<span class="badge badge-status1"><i class="fas fa-user fa-xs"></i> ' . dol_escape_htmltag((string) $line->lettering_code) . '</span>';
1588 }
1589 } elseif (!empty($line->matching_general) && !empty($line->lettering_code)) {
1590 print '<span class="badge badge-status4"><i class="fas fa-book fa-xs"></i> ' . dol_escape_htmltag((string) $line->lettering_code) . '</span>';
1591 }
1592 print '</td>';
1593 if (!$i) $totalarray['nbfield']++;
1594 }
1595
1596 // Amount debit
1597 if (!empty($arrayfields['t.debit']['checked'])) {
1598 print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
1599 if (!$i) {
1600 $totalarray['nbfield']++;
1601 }
1602 if (!$i) {
1603 $totalarray['pos'][$totalarray['nbfield']] = 'totaldebit';
1604 }
1605 $totalarray['val']['totaldebit'] += (float) $line->debit;
1606 }
1607
1608 // Amount credit
1609 if (!empty($arrayfields['t.credit']['checked'])) {
1610 print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
1611 if (!$i) {
1612 $totalarray['nbfield']++;
1613 }
1614 if (!$i) {
1615 $totalarray['pos'][$totalarray['nbfield']] = 'totalcredit';
1616 }
1617 $totalarray['val']['totalcredit'] += (float) $line->credit;
1618 }
1619
1620 // Amount balance
1621 if (!empty($arrayfields['t.balance']['checked'])) {
1622 print '<td class="right nowraponall amount">'.price(price2num($sous_total_debit + $line->debit - $sous_total_credit - $line->credit, 'MT')).'</td>';
1623 if (!$i) {
1624 $totalarray['nbfield']++;
1625 }
1626 if (!$i) {
1627 $totalarray['pos'][$totalarray['nbfield']] = 'totalbalance';
1628 };
1629 $totalarray['val']['totalbalance'] += $line->debit - $line->credit;
1630 }
1631
1632 // Exported operation date
1633 if (!empty($arrayfields['t.date_export']['checked'])) {
1634 print '<td class="center">'.dol_print_date($line->date_export, 'dayhour').'</td>';
1635 if (!$i) {
1636 $totalarray['nbfield']++;
1637 }
1638 }
1639
1640 // Validated operation date
1641 if (!empty($arrayfields['t.date_validated']['checked'])) {
1642 print '<td class="center">'.dol_print_date($line->date_validation, 'dayhour').'</td>';
1643 if (!$i) {
1644 $totalarray['nbfield']++;
1645 }
1646 }
1647
1648 // Due date
1649 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1650 print '<td class="center">'.dol_print_date($line->date_lim_reglement, 'day').'</td>';
1651 if (!$i) {
1652 $totalarray['nbfield']++;
1653 }
1654 }
1655
1656 if (!empty($arrayfields['t.import_key']['checked'])) {
1657 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($line->import_key).'">'.dol_escape_htmltag($line->import_key)."</td>\n";
1658 if (!$i) {
1659 $totalarray['nbfield']++;
1660 }
1661 }
1662
1663 // Fields from hook
1664 $parameters = array('arrayfields' => $arrayfields, 'obj' => $line);
1665 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1666 print $hookmanager->resPrint;
1667
1668 // Action column
1669 if (!$conf->main_checkbox_left_column) {
1670 print '<td class="nowraponall center">';
1671 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
1672 $selected = 0;
1673 if (in_array($line->id, $arrayofselected)) {
1674 $selected = 1;
1675 }
1676 print '<input id="cb' . $line->id . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $line->id . '"' . ($selected ? ' checked="checked"' : '') . ' />';
1677 }
1678 print '</td>';
1679 if (!$i) {
1680 $totalarray['nbfield']++;
1681 }
1682 }
1683
1684 // Comptabilise le sous-total
1685 $sous_total_debit += $line->debit;
1686 $sous_total_credit += $line->credit;
1687
1688 print "</tr>\n";
1689
1690 $i++;
1691}
1692
1693if ($num > 0 && $colspan > 0) {
1694 print '<tr class="liste_total">';
1695 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("TotalForAccount").' '.$accountg.':</td>';
1696 print '<td class="nowrap right">'.price(price2num($sous_total_debit, 'MT')).'</td>';
1697 print '<td class="nowrap right">'.price(price2num($sous_total_credit, 'MT')).'</td>';
1698 if ($colspanend > 0) {
1699 print '<td colspan="'.$colspanend.'"></td>';
1700 }
1701 print '</tr>';
1702
1703 // Show balance of last shown account
1704 $balance = $sous_total_debit - $sous_total_credit;
1705 print '<tr class="liste_total">';
1706 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("Balance").':</td>';
1707 if ($balance > 0) {
1708 print '<td class="nowraponall right">';
1709 print price(price2num($sous_total_debit - $sous_total_credit, 'MT'));
1710 print '</td>';
1711 print '<td></td>';
1712 } else {
1713 print '<td></td>';
1714 print '<td class="nowraponall right">';
1715 print price(price2num($sous_total_credit - $sous_total_debit, 'MT'));
1716 print '</td>';
1717 }
1718 if ($colspanend > 0) {
1719 print '<td colspan="'.$colspanend.'"></td>';
1720 }
1721 print '</tr>';
1722}
1723
1724
1725// Clean total values to round them
1726if (!empty($totalarray['val']['totaldebit'])) {
1727 $totalarray['val']['totaldebit'] = (float) price2num($totalarray['val']['totaldebit'], 'MT');
1728}
1729if (!empty($totalarray['val']['totalcredit'])) {
1730 $totalarray['val']['totalcredit'] = (float) price2num($totalarray['val']['totalcredit'], 'MT');
1731}
1732if (!empty($totalarray['val']['totalbalance'])) {
1733 $totalarray['val']['totalbalance'] = (float) price2num($totalarray['val']['totaldebit'] - $totalarray['val']['totalcredit'], 'MT');
1734}
1735
1736// Show total line
1737$trforbreaknobg = 1; // used in list_print_total.tpl.php
1738include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1739
1740// If no record found
1741if ($num == 0) {
1742 $colspan = 1;
1743 foreach ($arrayfields as $key => $val) {
1744 if (!empty($val['checked'])) {
1745 $colspan++;
1746 }
1747 }
1748 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1749}
1750
1751$parameters = array('arrayfields' => $arrayfields);
1752$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1753print $hookmanager->resPrint;
1754
1755print "</table>";
1756print '</div>';
1757
1758print '</form>';
1759
1760// End of page
1761llxFooter();
1762$db->close();
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition list.php:501
length_accountg($account)
Return General accounting account with defined length (used for product and miscellaneous)
length_accounta($accounta)
Return Auxiliary accounting account of thirdparties with defined length.
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 to manage Trips and Expenses.
Class to manage suppliers invoices.
Class to manage invoices.
Class to manage generation of HTML components for accounting management.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to help generate other html components Only common components are here.
Class Lettering.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to build sending documents with model Espadon.
societe_prepare_head(Societe $object, $subtabs='')
Return array of tabs to used on pages for third parties cards.
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:624
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
GETPOSTDATE($prefix, $hourTime='', $gm='auto', $saverestore='')
Helper function that combines values of a dolibarr DatePicker (such as Form\selectDate) for year,...
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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.
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
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)
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
Definition html.lib.php:519
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.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
Definition html.lib.php:717
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
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...
Definition html.lib.php:172
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...
Definition repair.php:130
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.