dolibarr 22.0.5
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-2024 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"));
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');
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;
498 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
499
500 if (!$error && $action == 'deletebookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'supprimer')) {
501 $db->begin();
502
503 if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
504 $lettering = new Lettering($db);
505 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true);
506 if ($nb_lettering < 0) {
507 setEventMessages('', $lettering->errors, 'errors');
508 $error++;
509 }
510 }
511
512 $nbok = 0;
513 if (!$error) {
514 foreach ($toselect as $toselectid) {
515 $result = $object->fetch($toselectid);
516 if ($result > 0 && (!isset($object->date_validation) || $object->date_validation === '')) {
517 $result = $object->deleteMvtNum($object->piece_num);
518 if ($result > 0) {
519 $nbok++;
520 } elseif ($result == 0) {
521 setEventMessages($langs->trans("ErrorBookkeepingDocDateNotOnActiveFiscalPeriod"), null, 'errors');
522 $error += 1;
523 break;
524 } else {
525 setEventMessages($object->error, $object->errors, 'errors');
526 $error++;
527 break;
528 }
529 } elseif ($result < 0) {
530 setEventMessages($object->error, $object->errors, 'errors');
531 $error++;
532 break;
533 } elseif (isset($object->date_validation) && $object->date_validation != '') {
534 setEventMessages($langs->trans("ValidatedRecordWhereFound"), null, 'errors');
535 $error++;
536 break;
537 }
538 }
539 }
540
541 if (!$error) {
542 $db->commit();
543
544 // Message for elements well deleted
545 if ($nbok > 1) {
546 setEventMessages($langs->trans("RecordsDeleted", $nbok), null, 'mesgs');
547 } elseif ($nbok > 0) {
548 setEventMessages($langs->trans("RecordDeleted", $nbok), null, 'mesgs');
549 } elseif (!$error) {
550 setEventMessages($langs->trans("NoRecordDeleted"), null, 'mesgs');
551 }
552
553 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
554 exit;
555 } else {
556 $db->rollback();
557 }
558 }
559
560 // massaction cloning
561 if (!$error && $action == 'clonebookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
562 $result = $object->newCloneMass($toselect, $journal_code, $massdate);
563 if ($result == -1) {
564 $error++;
565 }
566 if ($error) {
567 $db->commit();
568 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
569 exit;
570 } else {
571 $db->rollback();
572 }
573 }
574
575 // massaction assign new account
576 if (!$error && $action == 'assignaccountbookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
577 $result = $object->assignAccountMass($toselect, (int) $account);
578 if ($result == -1) {
579 $error++;
580 }
581 if (!$error) {
582 $db->commit();
583 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
584 exit();
585 } else {
586 $db->rollback();
587 }
588 }
589
590 // mass action return account
591 if (!$error && $action == 'returnaccountbookkeepingwriting' && $confirm == "yes" && $user->hasRight('accounting', 'mouvements', 'creer')) {
592 $result = $object->newReturnAccount($toselect, $journal_code, $massdate);
593 if ($result == -1) {
594 $error++;
595 }
596 if (!$error) {
597 $db->commit();
598 header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : ''));
599 exit();
600 } else {
601 $db->rollback();
602 }
603 }
604
605 // others mass actions
606 if (!$error && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) {
607 if ($massaction == 'letteringauto' && $permissiontoadd) {
608 $lettering = new Lettering($db);
609 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect);
610 if ($nb_lettering < 0) {
611 setEventMessages('', $lettering->errors, 'errors');
612 $error++;
613 $nb_lettering = max(0, abs($nb_lettering) - 2);
614 } elseif ($nb_lettering == 0) {
615 $nb_lettering = 0;
616 setEventMessages($langs->trans('AccountancyNoLetteringModified'), array(), 'mesgs');
617 }
618 if ($nb_lettering == 1) {
619 setEventMessages($langs->trans('AccountancyOneLetteringModifiedSuccessfully'), array(), 'mesgs');
620 } elseif ($nb_lettering > 1) {
621 setEventMessages($langs->trans('AccountancyLetteringModifiedSuccessfully', $nb_lettering), array(), 'mesgs');
622 }
623
624 if (!$error) {
625 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
626 exit();
627 }
628 } elseif ($massaction == 'letteringmanual' && $permissiontoadd) {
629 $lettering = new Lettering($db);
630 $result = $lettering->updateLettering($toselect);
631 if ($result < 0) {
632 setEventMessages('', $lettering->errors, 'errors');
633 } else {
634 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoLetteringModified' : 'AccountancyOneLetteringModifiedSuccessfully'), array(), 'mesgs');
635 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
636 exit();
637 }
638 } elseif ($type == 'sub' && $massaction == 'letteringpartial') {
639 $lettering = new Lettering($db);
640 $result = $lettering->updateLettering($toselect, 0, true);
641 if ($result < 0) {
642 setEventMessages('', $lettering->errors, 'errors');
643 } else {
644 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoLetteringModified' : 'AccountancyOneLetteringModifiedSuccessfully'), array(), 'mesgs');
645 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
646 exit();
647 }
648 } elseif ($action == 'unletteringauto' && $confirm == "yes" && $permissiontoadd) {
649 $lettering = new Lettering($db);
650 $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true);
651 if ($nb_lettering < 0) {
652 setEventMessages('', $lettering->errors, 'errors');
653 $error++;
654 $nb_lettering = max(0, abs($nb_lettering) - 2);
655 } elseif ($nb_lettering == 0) {
656 $nb_lettering = 0;
657 setEventMessages($langs->trans('AccountancyNoUnletteringModified'), array(), 'mesgs');
658 }
659 if ($nb_lettering == 1) {
660 setEventMessages($langs->trans('AccountancyOneUnletteringModifiedSuccessfully'), array(), 'mesgs');
661 } elseif ($nb_lettering > 1) {
662 setEventMessages($langs->trans('AccountancyUnletteringModifiedSuccessfully', $nb_lettering), array(), 'mesgs');
663 }
664
665 if (!$error) {
666 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
667 exit();
668 }
669 } elseif ($action == 'unletteringmanual' && $confirm == "yes" && $permissiontoadd) {
670 $lettering = new Lettering($db);
671 $nb_lettering = $lettering->deleteLettering($toselect);
672 if ($result < 0) {
673 setEventMessages('', $lettering->errors, 'errors');
674 } else {
675 setEventMessages($langs->trans($result == 0 ? 'AccountancyNoUnletteringModified' : 'AccountancyOneUnletteringModifiedSuccessfully'), array(), 'mesgs');
676 header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param);
677 exit();
678 }
679 }
680 }
681}
682
683
684/*
685 * View
686 */
687
688$formaccounting = new FormAccounting($db);
689$formfile = new FormFile($db);
690$formother = new FormOther($db);
691$form = new Form($db);
692
693$title_page = $langs->trans("Operations").' - '.$langs->trans("VueByAccountAccounting").' (';
694if ($type == 'sub') {
695 $title_page .= $langs->trans("BookkeepingSubAccount");
696} else {
697 $title_page .= $langs->trans("Bookkeeping");
698}
699$title_page .= ')';
700$help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double';
701llxHeader('', $title_page, $help_url, '', 0, 0, '', '', '', 'mod-accountancy accountancy-consultation page-'.(($type == 'sub') ? 'sub' : '').'ledger');
702
703if (!empty($socid)) {
704 $companystatic = new Societe($db);
705 $res = $companystatic->fetch($socid);
706 if ($res > 0) {
707 $tmpobject = $object;
708 $object = $companystatic; // $object must be of type Societe when calling societe_prepare_head
709 $head = societe_prepare_head($companystatic);
710 $object = $tmpobject;
711
712 print dol_get_fiche_head($head, 'accounting', $langs->trans("ThirdParty"), -1, 'company');
713
714 $linkback = '<a href="'.DOL_URL_ROOT.'/societe/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
715
716 dol_banner_tab($companystatic, 'socid', $linkback, ($user->socid ? 0 : 1), 'rowid', 'nom');
717
718 print '<div class="fichecenter">';
719
720 print '<div class="underbanner clearboth"></div>';
721 print '<table class="border centpercent tableforfield">';
722
723 // Type Prospect/Customer/Supplier
724 print '<tr><td class="titlefield">'.$langs->trans('NatureOfThirdParty').'</td><td>';
725 print $companystatic->getTypeUrl(1);
726 print '</td></tr>';
727
728 // Customer code
729 if ($companystatic->client && !empty($companystatic->code_client)) {
730 print '<tr><td class="titlefield">';
731 print $langs->trans('CustomerCode').'</td><td>';
732 print showValueWithClipboardCPButton(dol_escape_htmltag($companystatic->code_client));
733 $tmpcheck = $companystatic->check_codeclient();
734 if ($tmpcheck != 0 && $tmpcheck != -5) {
735 print ' <span class="error">('.$langs->trans("WrongCustomerCode").')</span>';
736 }
737 print '</td>';
738 print '</tr>';
739 }
740 // Supplier code
741 if ($companystatic->fournisseur && !empty($companystatic->code_fournisseur)) {
742 print '<tr><td class="titlefield">';
743 print $langs->trans('SupplierCode').'</td><td>';
744 print showValueWithClipboardCPButton(dol_escape_htmltag($companystatic->code_fournisseur));
745 $tmpcheck = $companystatic->check_codefournisseur();
746 if ($tmpcheck != 0 && $tmpcheck != -5) {
747 print ' <span class="error">('.$langs->trans("WrongSupplierCode").')</span>';
748 }
749 print '</td>';
750 print '</tr>';
751 }
752
753 print '</table>';
754 print '</div>';
755 print dol_get_fiche_end();
756
757 print info_admin($langs->trans("WarningThisPageContainsOnlyEntriesTransferredInAccounting")).'';
758
759 // Choice of mode (customer / supplier)
760 if (!empty($conf->dol_use_jmobile)) {
761 print "\n".'<div class="fichecenter"><div class="nowrap">'."\n";
762 }
763
764 if ($companystatic->client && !empty($companystatic->code_compta_client)) {
765 if ($mode != 'customer') {
766 if (!empty($companystatic->code_compta_client)) {
767 $subledger_start_account = $subledger_end_account = $companystatic->code_compta_client;
768 } else {
769 $subledger_start_account = $subledger_end_account = '';
770 }
771 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.'">';
772 } else {
773 print '<span class="a-mesure marginleftonly marginrightonly">';
774 }
775
776 print $langs->trans("CustomerAccountancyCodeShort");
777 if ($mode != 'customer') {
778 print '</a>';
779 } else {
780 print '</span>';
781 }
782 }
783
784 if ($companystatic->fournisseur && !empty($companystatic->code_compta_fournisseur)) {
785 if ($mode != 'supplier') {
786 if (!empty($companystatic->code_compta_fournisseur)) {
787 $subledger_start_account = $subledger_end_account = $companystatic->code_compta_fournisseur;
788 } else {
789 $subledger_start_account = $subledger_end_account = '';
790 }
791 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.'">';
792 } else {
793 print '<span class="a-mesure marginleftonly marginrightonly">';
794 }
795 print $langs->trans("SupplierAccountancyCodeShort");
796 if ($mode != 'supplier') {
797 print '</a>';
798 } else {
799 print '</span>';
800 }
801 }
802
803 if (!empty($conf->dol_use_jmobile)) {
804 print '</div></div>';
805 } else {
806 print '<br>';
807 }
808 print '<br>';
809 }
810}
811
812// List
813$nbtotalofrecords = '';
814if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
815 // TODO Perf Replace this by a count
816 if ($type == 'sub') {
817 $nbtotalofrecords = $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter, 'AND', 1, 1);
818 } else {
819 $nbtotalofrecords = $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter, 'AND', 0, 1);
820 }
821
822 if ($nbtotalofrecords < 0) {
823 setEventMessages($object->error, $object->errors, 'errors');
824 $error++;
825 }
826}
827
828$num = 0;
829if (!$error) {
830 if ($type == 'sub') {
831 $result = $object->fetchAllByAccount($sortorder, $sortfield, $limit, $offset, $filter, 'AND', 1);
832 } else {
833 $result = $object->fetchAllByAccount($sortorder, $sortfield, $limit, $offset, $filter, 'AND', 0);
834 }
835 //$num = count($object->lines);
836 $num = $result; // $result is total nb of lines, or limit + 1, but $object->lines is always limited to $limit
837
838 if ($result < 0) {
839 setEventMessages($object->error, $object->errors, 'errors');
840 }
841}
842
843$arrayofselected = is_array($toselect) ? $toselect : array();
844
845// Print form confirm
846$formconfirm = '';
847print $formconfirm;
848
849// List of mass actions available
850$arrayofmassactions = array();
851if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && $user->hasRight('accounting', 'mouvements', 'creer')) {
852 $arrayofmassactions['letteringauto'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringAuto');
853 $arrayofmassactions['preunletteringauto'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('UnletteringAuto');
854 $arrayofmassactions['letteringmanual'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringManual');
855 if ($type == 'sub') {
856 $arrayofmassactions['letteringpartial'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringPartial');
857 }
858 $arrayofmassactions['preunletteringmanual'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('UnletteringManual');
859}
860if ($user->hasRight('accounting', 'mouvements', 'creer')) {
861 $arrayofmassactions['preclonebookkeepingwriting'] = img_picto('', 'clone', 'class="pictofixedwidth"').$langs->trans("Clone");
862}
863if ($user->hasRight('accounting', 'mouvements', 'creer')) {
864 $arrayofmassactions['preassignaccountbookkeepingwriting'] = img_picto('', 'fa-exchange-alt', 'class="pictofixedwidth"').$langs->trans("AssignAccount");
865}
866if ($user->hasRight('accounting', 'mouvements', 'creer')) {
867 $arrayofmassactions['prereturnaccountbookkeepingwriting'] = img_picto('', 'undo', 'class="pictofixedwidth"').$langs->trans("ReturnAccount");
868}
869if ($user->hasRight('accounting', 'mouvements', 'supprimer')) {
870 $arrayofmassactions['predeletebookkeepingwriting'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
871}
872
873if (GETPOSTINT('nomassaction') || in_array($massaction, array('preunletteringauto', 'preunletteringmanual', 'predeletebookkeepingwriting', 'preclonebookkeepingwriting', 'preassignaccountbookkeepingwriting', 'prereturnaccountbookkeepingwriting'))) {
874 $arrayofmassactions = array();
875}
876$massactionbutton = $form->selectMassAction($massaction, $arrayofmassactions);
877
878print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">';
879print '<input type="hidden" name="token" value="'.newToken().'">';
880print '<input type="hidden" name="action" value="list">';
881if ($optioncss != '') {
882 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
883}
884print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
885print '<input type="hidden" name="type" value="'.$type.'">';
886if (!empty($socid)) {
887 print '<input type="hidden" name="socid" value="' . $socid . '">';
888}
889print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
890print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
891print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
892
893$parameters = array('param' => $param);
894$reshook = $hookmanager->executeHooks('addMoreActionsButtonsList', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
895if ($reshook < 0) {
896 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
897}
898
899$newcardbutton = empty($hookmanager->resPrint) ? '' : $hookmanager->resPrint;
900
901if (empty($reshook)) {
902 // Remove navigation buttons if in thirdparty tab mode, except for PDF printing
903 if (empty($socid)) {
904 $newcardbutton = dolGetButtonTitle($langs->trans('ViewFlatList'), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/list.php?' . $param);
905 if ($type == 'sub') {
906 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?' . $url_param, '', 1, array('morecss' => 'marginleftonly'));
907 $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'));
908 } else {
909 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?' . $url_param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected'));
910 $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'));
911 }
912 }
913 $newcardbutton .= dolGetButtonTitle($langs->trans('ExportToPdf'), '', 'fa fa-file-pdf paddingleft', $_SERVER['PHP_SELF'] . '?action=exporttopdf'.(!empty($type) ? '&type=sub' : '').'&' . $url_param, '', $permissiontoexport, array('morecss' => 'marginleftonly'));
914
915 $newcardbutton .= dolGetButtonTitleSeparator();
916
917 $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);
918}
919
920if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
921 $param .= '&contextpage='.urlencode($contextpage);
922}
923if ($limit > 0 && $limit != $conf->liste_limit) {
924 $param .= '&limit='.((int) $limit);
925}
926
927print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1);
928
929if ($massaction == 'preunletteringauto') {
930 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnletteringAuto"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unletteringauto", null, '', 0, 200, 500, 1);
931} elseif ($massaction == 'preunletteringmanual') {
932 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnletteringManual"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unletteringmanual", null, '', 0, 200, 500, 1);
933} elseif ($massaction == 'predeletebookkeepingwriting') {
934 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDeleteBookkeepingWriting"), $langs->trans("ConfirmMassDeleteBookkeepingWritingQuestion", count($toselect)), "deletebookkeepingwriting", null, '', 0, 200, 500, 1);
935} elseif ($massaction == 'preassignaccountbookkeepingwriting') {
936 $input = $formaccounting->select_account('', 'account', 1);
937 $formquestion = array(array('type' => 'other', 'name' => 'account', 'label' => '<span class="fieldrequired">' . $langs->trans("AccountAccountingShort") . '</span>', 'value' => $input),);
938 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("confirmMassAssignAccountBookkeepingWritingConfirm"), $langs->trans("ConfirmMassAssignAccountBookkeepingWritingQuestion", count($toselect)), "assignaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
939} elseif ($massaction == 'preclonebookkeepingwriting') {
940 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
941 $input2 = $formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1).'</td>';
942 $formquestion = array(
943 array(
944 'type' => 'other',
945 'name' => 'massdate',
946 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>',
947 'value' => $input1
948 )
949 );
950
951 if (getDolGlobalString('ACCOUNTING_CLONING_ENABLE_INPUT_JOURNAL')) {
952 $formquestion[] = array(
953 'type' => 'text',
954 'name' => 'code_journal',
955 'label' => '<span class="fieldrequired">' . $langs->trans("Codejournal") . '</span>',
956 'value' => $input2
957 );
958 }
959
960 print $form->formconfirm(
961 $_SERVER["PHP_SELF"],
962 $langs->trans("ConfirmMassCloneBookkeepingWriting"),
963 $langs->trans("ConfirmMassCloneBookkeepingWritingQuestion", count($toselect)),
964 "clonebookkeepingwriting",
965 $formquestion,
966 '', 0, 200, 500, 1
967 );
968} elseif ($massaction == 'prereturnaccountbookkeepingwriting') {
969 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
970 $formquestion = array(array('type' => 'other', 'name' => 'massdate', 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>', 'value' => $input1));
971 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassReturnAccountBookkeepingWriting"), $langs->trans("ConfirmMassReturnAccountBookkeepingWritingQuestion", count($toselect)), "returnaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
972}
973
974include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
975
976$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
977$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
978if ($massactionbutton && $contextpage != 'poslist') {
979 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
980}
981
982// Reverse sort order
983if (preg_match('/^asc/i', $sortorder)) {
984 $sortorder = "asc";
985} else {
986 $sortorder = "desc";
987}
988
989// Warning to explain why the list of record is not consistent with the other list view (missing a lot of lines)
990if ($type == 'sub' && !$socid) {
991 print info_admin($langs->trans("WarningRecordWithoutSubledgerAreExcluded"));
992 print '<br>';
993}
994
995$moreforfilter = '';
996
997// Search on accountancy custom groups or account
998$moreforfilter .= '<div class="divsearchfield">';
999$moreforfilter .= $langs->trans('AccountAccounting').': ';
1000$moreforfilter .= '<div class="nowrap inline-block">';
1001if ($type == 'sub') {
1002 if (getDolGlobalString('ACCOUNTANCY_COMBO_FOR_AUX')) {
1003 $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), 'maxwidth200');
1004 } else {
1005 $moreforfilter .= '<input type="text" class="maxwidth150" name="search_accountancy_code_start" value="'.dol_escape_htmltag($search_accountancy_code_start).'" placeholder="'.$langs->trans('From').'">';
1006 }
1007} else {
1008 $moreforfilter .= $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth200');
1009}
1010$moreforfilter .= ' ';
1011if ($type == 'sub') {
1012 if (getDolGlobalString('ACCOUNTANCY_COMBO_FOR_AUX')) {
1013 $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), 'maxwidth200');
1014 } else {
1015 $moreforfilter .= '<input type="text" class="maxwidth150" name="search_accountancy_code_end" value="'.dol_escape_htmltag($search_accountancy_code_end).'" placeholder="'.$langs->trans('to').'">';
1016 }
1017} else {
1018 $moreforfilter .= $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth200');
1019}
1020
1021if (empty($socid)) {
1022 $stringforfirstkey = $langs->trans("KeyboardShortcut");
1023 if ($conf->browser->name == 'chrome') {
1024 $stringforfirstkey .= ' ALT +';
1025 } elseif ($conf->browser->name == 'firefox') {
1026 $stringforfirstkey .= ' ALT + SHIFT +';
1027 } else {
1028 $stringforfirstkey .= ' CTL +';
1029 }
1030 $moreforfilter .= '&nbsp;&nbsp;&nbsp;<a id="previous_account" accesskey="p" title="' . $stringforfirstkey . ' p" class="classfortooltip" href="#"><i class="fa fa-chevron-left"></i></a>';
1031 $moreforfilter .= '&nbsp;&nbsp;&nbsp;<a id="next_account" accesskey="n" title="' . $stringforfirstkey . ' n" class="classfortooltip" href="#"><i class="fa fa-chevron-right"></i></a>';
1032 $moreforfilter .= <<<SCRIPT
1033<script type="text/javascript">
1034 jQuery(document).ready(function() {
1035 var searchFormList = $('#searchFormList');
1036 var searchAccountancyCodeStart = $('#search_accountancy_code_start');
1037 var searchAccountancyCodeEnd = $('#search_accountancy_code_end');
1038 jQuery('#previous_account').on('click', function() {
1039 var previousOption = searchAccountancyCodeStart.find('option:selected').prev('option');
1040 if (previousOption.length == 1) searchAccountancyCodeStart.val(previousOption.attr('value'));
1041 searchAccountancyCodeEnd.val(searchAccountancyCodeStart.val());
1042 searchFormList.submit();
1043 });
1044 jQuery('#next_account').on('click', function() {
1045 var nextOption = searchAccountancyCodeStart.find('option:selected').next('option');
1046 if (nextOption.length == 1) searchAccountancyCodeStart.val(nextOption.attr('value'));
1047 searchAccountancyCodeEnd.val(searchAccountancyCodeStart.val());
1048 searchFormList.submit();
1049 });
1050 jQuery('input[name="search_mvt_num"]').on("keypress", function(event) {
1051 console.log(event);
1052 });
1053 });
1054</script>
1055SCRIPT;
1056}
1057$moreforfilter .= '</div>';
1058$moreforfilter .= '</div>';
1059
1060if (empty($socid)) {
1061 $moreforfilter .= '<div class="divsearchfield">';
1062 $moreforfilter .= $langs->trans('AccountingCategory') . ': ';
1063 $moreforfilter .= '<div class="nowrap inline-block">';
1064 $moreforfilter .= $formaccounting->select_accounting_category($search_account_category, 'search_account_category', 1, 0, 0, 0);
1065 $moreforfilter .= '</div>';
1066 $moreforfilter .= '</div>';
1067}
1068
1069$parameters = array();
1070$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1071if (empty($reshook)) {
1072 $moreforfilter .= $hookmanager->resPrint;
1073} else {
1074 $moreforfilter = $hookmanager->resPrint;
1075}
1076
1077print '<div class="liste_titre liste_titre_bydiv centpercent">';
1078print $moreforfilter;
1079print '</div>';
1080
1081print '<div class="div-table-responsive">';
1082print '<table class="tagtable liste centpercent listwithfilterbefore">';
1083
1084// Filters lines
1085print '<tr class="liste_titre_filter">';
1086// Action column
1087if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1088 print '<td class="liste_titre center">';
1089 $searchpicto = $form->showFilterButtons('left');
1090 print $searchpicto;
1091 print '</td>';
1092}
1093// Movement number
1094if (!empty($arrayfields['t.piece_num']['checked'])) {
1095 print '<td class="liste_titre"><input type="text" name="search_mvt_num" class="width50" value="'.dol_escape_htmltag($search_mvt_num).'"></td>';
1096}
1097// Code journal
1098if (!empty($arrayfields['t.code_journal']['checked'])) {
1099 print '<td class="liste_titre center">';
1100 print $formaccounting->multi_select_journal($search_ledger_code, 'search_ledger_code', 0, 1, 1, 1, 'maxwidth75');
1101 print '</td>';
1102}
1103// Date document
1104if (!empty($arrayfields['t.doc_date']['checked'])) {
1105 print '<td class="liste_titre center">';
1106 print '<div class="nowrapfordate">';
1107 print $form->selectDate($search_date_start, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1108 print '</div>';
1109 print '<div class="nowrapfordate">';
1110 print $form->selectDate($search_date_end, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1111 print '</div>';
1112 print '</td>';
1113}
1114// Ref document
1115if (!empty($arrayfields['t.doc_ref']['checked'])) {
1116 print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_doc_ref" value="'.dol_escape_htmltag($search_doc_ref).'"/></td>';
1117}
1118// Label operation
1119if (!empty($arrayfields['t.label_operation']['checked'])) {
1120 print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_label_operation" value="'.dol_escape_htmltag($search_label_operation).'"/></td>';
1121}
1122// Lettering code
1123if (!empty($arrayfields['t.lettering_code']['checked'])) {
1124 print '<td class="liste_titre center">';
1125 print '<input type="text" size="3" class="flat" name="search_lettering_code" value="'.$search_lettering_code.'"/>';
1126 print '<br><span class="nowrap"><input type="checkbox" name="search_not_reconciled" value="notreconciled"'.($search_not_reconciled == 'notreconciled' ? ' checked' : '').'>'.$langs->trans("NotReconciled").'</span>';
1127 print '</td>';
1128}
1129// Debit
1130if (!empty($arrayfields['t.debit']['checked'])) {
1131 print '<td class="liste_titre right"><input type="text" class="flat" name="search_debit" size="4" value="'.dol_escape_htmltag($search_debit).'"></td>';
1132}
1133// Credit
1134if (!empty($arrayfields['t.credit']['checked'])) {
1135 print '<td class="liste_titre right"><input type="text" class="flat" name="search_credit" size="4" value="'.dol_escape_htmltag($search_credit).'"></td>';
1136}
1137// Balance
1138if (!empty($arrayfields['t.balance']['checked'])) {
1139 print '<td></td>';
1140}
1141// Date export
1142if (!empty($arrayfields['t.date_export']['checked'])) {
1143 print '<td class="liste_titre center">';
1144 print '<div class="nowrapfordate">';
1145 print $form->selectDate($search_date_export_start, 'search_date_export_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1146 print '</div>';
1147 print '<div class="nowrapfordate">';
1148 print $form->selectDate($search_date_export_end, 'search_date_export_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1149 print '</div>';
1150 print '</td>';
1151}
1152// Date validation
1153if (!empty($arrayfields['t.date_validated']['checked'])) {
1154 print '<td class="liste_titre center">';
1155 print '<div class="nowrapfordate">';
1156 print $form->selectDate($search_date_validation_start, 'search_date_validation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1157 print '</div>';
1158 print '<div class="nowrapfordate">';
1159 print $form->selectDate($search_date_validation_end, 'search_date_validation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1160 print '</div>';
1161 print '</td>';
1162}
1163// Due date start and end
1164if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1165 print '<td class="liste_titre center">';
1166 print '<div class="nowrapfordate">';
1167 print $form->selectDate($search_date_due_start, 'search_date_due_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1168 print '</div>';
1169 print '<div class="nowrapfordate">';
1170 print $form->selectDate($search_date_due_end, 'search_date_due_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1171 print '</div>';
1172 print '</td>';
1173}
1174if (!empty($arrayfields['t.import_key']['checked'])) {
1175 print '<td class="liste_titre center">';
1176 print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="'.dol_escape_htmltag($search_import_key).'">';
1177 print '</td>';
1178}
1179
1180// Fields from hook
1181$parameters = array('arrayfields' => $arrayfields);
1182$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1183print $hookmanager->resPrint;
1184
1185// Action column
1186if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1187 print '<td class="liste_titre center">';
1188 $searchpicto = $form->showFilterButtons();
1189 print $searchpicto;
1190 print '</td>';
1191}
1192print "</tr>\n";
1193
1194print '<tr class="liste_titre">';
1195if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1196 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1197}
1198if (!empty($arrayfields['t.piece_num']['checked'])) {
1199 print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder, 'tdoverflowmax80imp ');
1200}
1201if (!empty($arrayfields['t.code_journal']['checked'])) {
1202 print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center ');
1203}
1204if (!empty($arrayfields['t.doc_date']['checked'])) {
1205 print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1206}
1207if (!empty($arrayfields['t.doc_ref']['checked'])) {
1208 print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder);
1209}
1210if (!empty($arrayfields['t.label_operation']['checked'])) {
1211 print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder);
1212}
1213if (!empty($arrayfields['t.lettering_code']['checked'])) {
1214 print_liste_field_titre($arrayfields['t.lettering_code']['label'], $_SERVER['PHP_SELF'], "t.lettering_code", "", $param, '', $sortfield, $sortorder, 'center ');
1215}
1216if (!empty($arrayfields['t.debit']['checked'])) {
1217 print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right ');
1218}
1219if (!empty($arrayfields['t.credit']['checked'])) {
1220 print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right ');
1221}
1222if (!empty($arrayfields['t.balance']['checked'])) {
1223 print_liste_field_titre($arrayfields['t.balance']['label'], "", "", "", $param, '', $sortfield, $sortorder, 'right ');
1224}
1225if (!empty($arrayfields['t.date_export']['checked'])) {
1226 print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export", "", $param, '', $sortfield, $sortorder, 'center ');
1227}
1228if (!empty($arrayfields['t.date_validated']['checked'])) {
1229 print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated", "", $param, '', $sortfield, $sortorder, 'center ');
1230}
1231// Due date
1232if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1233 print_liste_field_titre($arrayfields['t.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], 't.date_lim_reglement', '', $param, '', $sortfield, $sortorder, 'center ');
1234}
1235if (!empty($arrayfields['t.import_key']['checked'])) {
1236 print_liste_field_titre($arrayfields['t.import_key']['label'], $_SERVER["PHP_SELF"], "t.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
1237}
1238// Hook fields
1239$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1240$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1241print $hookmanager->resPrint;
1242if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1243 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1244}
1245print "</tr>\n";
1246
1247$displayed_account_number = null; // Start with undefined to be able to distinguish with empty
1248
1249$objectstatic = null; // Init for static analysis
1250$objectlink = ''; // Init for static analysis
1251$result = -1; // Init for static analysis
1252
1253// Loop on record
1254// --------------------------------------------------------------------
1255$i = 0;
1256
1257$totalarray = array();
1258$totalarray['nbfield'] = 0;
1259$sous_total_debit = 0;
1260$sous_total_credit = 0;
1261$totalarray['val'] = array();
1262$totalarray['val']['totaldebit'] = 0;
1263$totalarray['val']['totalcredit'] = 0;
1264$totalarray['val']['totalbalance'] = 0;
1265
1266// Init for static analysis
1267$colspan = 0; // colspan before field 'label of operation'
1268$colspanend = 0; // colspan after debit/credit
1269$accountg = '-';
1270
1271$colspan = 0; // colspan before field 'label of operation'
1272$colspanend = 3; // colspan after debit/credit
1273if (!empty($arrayfields['t.piece_num']['checked'])) { $colspan++; }
1274if (!empty($arrayfields['t.code_journal']['checked'])) { $colspan++; }
1275if (!empty($arrayfields['t.doc_date']['checked'])) { $colspan++; }
1276if (!empty($arrayfields['t.doc_ref']['checked'])) { $colspan++; }
1277if (!empty($arrayfields['t.label_operation']['checked'])) { $colspan++; }
1278if (!empty($arrayfields['t.date_export']['checked'])) { $colspanend++; }
1279if (!empty($arrayfields['t.date_validated']['checked'])) { $colspanend++; }
1280if (!empty($arrayfields['t.lettering_code']['checked'])) { $colspanend++; }
1281if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1282 $colspan++;
1283 $colspanend--;
1284}
1285
1286while ($i < min($num, $limit)) {
1287 $line = $object->lines[$i];
1288
1289 if ($type == 'sub') {
1290 $accountg = length_accounta($line->subledger_account);
1291 } else {
1292 $accountg = length_accountg($line->numero_compte);
1293 }
1294 //if (empty($accountg)) $accountg = '-';
1295
1296 $colspan = 0; // colspan before field 'label of operation'
1297 $colspanend = 0; // colspan after debit/credit
1298 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1299 $colspan++;
1300 }
1301 if (!empty($arrayfields['t.piece_num']['checked'])) {
1302 $colspan++;
1303 }
1304 if (!empty($arrayfields['t.code_journal']['checked'])) {
1305 $colspan++;
1306 }
1307 if (!empty($arrayfields['t.doc_date']['checked'])) {
1308 $colspan++;
1309 }
1310 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1311 $colspan++;
1312 }
1313 if (!empty($arrayfields['t.label_operation']['checked'])) {
1314 $colspan++;
1315 }
1316 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1317 $colspan++;
1318 }
1319
1320 if (!empty($arrayfields['t.balance']['checked'])) {
1321 $colspanend++;
1322 }
1323 if (!empty($arrayfields['t.date_export']['checked'])) {
1324 $colspanend++;
1325 }
1326 if (!empty($arrayfields['t.date_validated']['checked'])) {
1327 $colspanend++;
1328 }
1329 // Due date
1330 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1331 $colspanend++;
1332 }
1333 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1334 $colspanend++;
1335 }
1336 if (!empty($arrayfields['t.import_key']['checked'])) {
1337 $colspanend++;
1338 }
1339 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1340 $colspan++;
1341 $colspanend--;
1342 }
1343
1344 // Is it a break ?
1345 if ($accountg != $displayed_account_number || !isset($displayed_account_number)) {
1346 // Show a subtotal by accounting account
1347 if (isset($displayed_account_number)) {
1348 print '<tr class="liste_total">';
1349 if ($type == 'sub') {
1350 print '<td class="right" colspan="' . $colspan . '">' . $langs->trans("TotalForAccount") . ' ' . length_accounta($displayed_account_number) . ':</td>';
1351 } else {
1352 print '<td class="right" colspan="' . $colspan . '">' . $langs->trans("TotalForAccount") . ' ' . length_accountg($displayed_account_number) . ':</td>';
1353 }
1354 print '<td class="nowrap right">'.price(price2num($sous_total_debit, 'MT')).'</td>';
1355 print '<td class="nowrap right">'.price(price2num($sous_total_credit, 'MT')).'</td>';
1356 if ($colspanend > 0) {
1357 print '<td colspan="'.$colspanend.'"></td>';
1358 }
1359 print '</tr>';
1360 // Show balance of last shown account
1361 $balance = $sous_total_debit - $sous_total_credit;
1362 print '<tr class="liste_total">';
1363 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("Balance").':</td>';
1364 if ($balance > 0) {
1365 print '<td class="nowraponall right">';
1366 print price(price2num($sous_total_debit - $sous_total_credit, 'MT'));
1367 print '</td>';
1368 print '<td></td>';
1369 } else {
1370 print '<td></td>';
1371 print '<td class="nowraponall right">';
1372 print price(price2num($sous_total_credit - $sous_total_debit, 'MT'));
1373 print '</td>';
1374 }
1375 if ($colspanend > 0) {
1376 print '<td colspan="'.$colspanend.'"></td>';
1377 }
1378 print '</tr>';
1379 }
1380
1381 // Show the break account
1382 print '<tr class="trforbreaknobg">';
1383 print '<td colspan="'.($totalarray['nbfield'] ? $totalarray['nbfield'] : count($arrayfields) + 1).'" class="tdforbreak">';
1384 if ($type == 'sub') {
1385 if ($line->subledger_account != "" && $line->subledger_account != '-1') {
1386 print empty($line->subledger_label) ? '<span class="error">'.$langs->trans("Unknown").'</span>' : $line->subledger_label;
1387 print ' : ';
1388 print length_accounta($line->subledger_account);
1389 } else {
1390 // Should not happen: subledger account must be null or a non empty value
1391 print '<span class="error">' . $langs->trans("Unknown");
1392 if ($line->subledger_label) {
1393 print ' (' . $line->subledger_label . ')';
1394 $htmltext = 'EmptyStringForSubledgerAccountButSubledgerLabelDefined';
1395 } else {
1396 $htmltext = 'EmptyStringForSubledgerAccountAndSubledgerLabel';
1397 }
1398 print $form->textwithpicto('', $htmltext);
1399 print '</span>';
1400 }
1401 } else {
1402 if ($line->numero_compte != "" && $line->numero_compte != '-1') {
1403 print length_accountg($line->numero_compte) . ' : ' . $object->get_compte_desc($line->numero_compte);
1404 } else {
1405 print '<span class="error">' . $langs->trans("Unknown") . '</span>';
1406 }
1407 }
1408 print '</td>';
1409 print '</tr>';
1410
1411 $displayed_account_number = $accountg;
1412 //if (empty($displayed_account_number)) $displayed_account_number='-';
1413 $sous_total_debit = 0;
1414 $sous_total_credit = 0;
1415 }
1416
1417 print '<tr class="oddeven">';
1418 // Action column
1419 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1420 print '<td class="nowraponall center">';
1421 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
1422 $selected = 0;
1423 if (in_array($line->id, $arrayofselected)) {
1424 $selected = 1;
1425 }
1426 print '<input id="cb' . $line->id . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $line->id . '"' . ($selected ? ' checked="checked"' : '') . ' />';
1427 }
1428 print '</td>';
1429 if (!$i) {
1430 $totalarray['nbfield']++;
1431 }
1432 }
1433 // Piece number
1434 if (!empty($arrayfields['t.piece_num']['checked'])) {
1435 print '<td>';
1436 $object->id = $line->id;
1437 $object->piece_num = $line->piece_num;
1438 $object->ref = $line->ref;
1439 print $object->getNomUrl(1, '', 0, '', 1);
1440 print '</td>';
1441 if (!$i) {
1442 $totalarray['nbfield']++;
1443 }
1444 }
1445
1446 // Journal code
1447 if (!empty($arrayfields['t.code_journal']['checked'])) {
1448 $accountingjournal = new AccountingJournal($db);
1449 $result = $accountingjournal->fetch(0, $line->code_journal);
1450 $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal);
1451 print '<td class="center tdoverflowmax80">'.$journaltoshow.'</td>';
1452 if (!$i) {
1453 $totalarray['nbfield']++;
1454 }
1455 }
1456
1457 // Document date
1458 if (!empty($arrayfields['t.doc_date']['checked'])) {
1459 print '<td class="center">'.dol_print_date($line->doc_date, 'day').'</td>';
1460 if (!$i) {
1461 $totalarray['nbfield']++;
1462 }
1463 }
1464
1465 // Document ref
1466 $modulepart = '';
1467 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1468 if ($line->doc_type == 'customer_invoice') {
1469 $langs->loadLangs(array('bills'));
1470
1471 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1472 $objectstatic = new Facture($db);
1473 $objectstatic->fetch($line->fk_doc);
1474 //$modulepart = 'facture';
1475
1476 $filename = dol_sanitizeFileName($line->doc_ref);
1477 $filedir = $conf->facture->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1478 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1479 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1480 } elseif ($line->doc_type == 'supplier_invoice') {
1481 $langs->loadLangs(array('bills'));
1482
1483 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1484 $objectstatic = new FactureFournisseur($db);
1485 $objectstatic->fetch($line->fk_doc);
1486
1487 $modulepart = 'invoice_supplier';
1488 $filename = dol_sanitizeFileName($line->doc_ref);
1489 $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($line->fk_doc, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1490 $subdir = get_exdir($objectstatic->id, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1491 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $subdir, $filedir);
1492 } elseif ($line->doc_type == 'expense_report') {
1493 $langs->loadLangs(array('trips'));
1494
1495 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
1496 $objectstatic = new ExpenseReport($db);
1497 $objectstatic->fetch($line->fk_doc);
1498 //$modulepart = 'expensereport';
1499
1500 $filename = dol_sanitizeFileName($line->doc_ref);
1501 $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1502 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1503 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1504 } elseif ($line->doc_type == 'bank') {
1505 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1506 $objectstatic = new AccountLine($db);
1507 $objectstatic->fetch($line->fk_doc);
1508 } else {
1509 // Other type
1510 }
1511
1512 print '<td class="tdoverflowmax250">';
1513
1514 // Picto + Ref
1515 if ($line->doc_type == 'customer_invoice' || $line->doc_type == 'supplier_invoice' || $line->doc_type == 'expense_report') {
1516 print $objectstatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1);
1517 print $documentlink;
1518 } elseif ($line->doc_type == 'bank') {
1519 print $objectstatic->getNomUrl(1);
1520 $bank_ref = strstr($line->doc_ref, '-');
1521 print ' <span class="classfortooltip" title="'.dol_escape_htmltag($line->doc_ref).'">'.dol_escape_htmltag($bank_ref).'</span>';
1522 } else {
1523 print $line->doc_ref;
1524 }
1525
1526 print "</td>\n";
1527 if (!$i) {
1528 $totalarray['nbfield']++;
1529 }
1530 }
1531
1532 // Label operation
1533 if (!empty($arrayfields['t.label_operation']['checked'])) {
1534 // Show a link to the customer/supplier invoice
1535 $doc_ref = preg_replace('/\‍(.*\‍)/', '', $line->doc_ref);
1536 if (strlen(length_accounta($line->subledger_account)) == 0) {
1537 print '<td class="small tdoverflowmax350 classfortooltip" title="'.dol_escape_htmltag($line->label_operation).'">'.dol_escape_htmltag($line->label_operation).'</td>';
1538 } else {
1539 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>';
1540 }
1541 if (!$i) {
1542 $totalarray['nbfield']++;
1543 }
1544 }
1545
1546 // Lettering code
1547 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1548 print '<td class="center">'.dol_escape_htmltag((string) $line->lettering_code).'</td>';
1549 if (!$i) {
1550 $totalarray['nbfield']++;
1551 }
1552 }
1553
1554 // Amount debit
1555 if (!empty($arrayfields['t.debit']['checked'])) {
1556 print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
1557 if (!$i) {
1558 $totalarray['nbfield']++;
1559 }
1560 if (!$i) {
1561 $totalarray['pos'][$totalarray['nbfield']] = 'totaldebit';
1562 }
1563 $totalarray['val']['totaldebit'] += (float) $line->debit;
1564 }
1565
1566 // Amount credit
1567 if (!empty($arrayfields['t.credit']['checked'])) {
1568 print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
1569 if (!$i) {
1570 $totalarray['nbfield']++;
1571 }
1572 if (!$i) {
1573 $totalarray['pos'][$totalarray['nbfield']] = 'totalcredit';
1574 }
1575 $totalarray['val']['totalcredit'] += (float) $line->credit;
1576 }
1577
1578 // Amount balance
1579 if (!empty($arrayfields['t.balance']['checked'])) {
1580 print '<td class="right nowraponall amount">'.price(price2num($sous_total_debit + $line->debit - $sous_total_credit - $line->credit, 'MT')).'</td>';
1581 if (!$i) {
1582 $totalarray['nbfield']++;
1583 }
1584 if (!$i) {
1585 $totalarray['pos'][$totalarray['nbfield']] = 'totalbalance';
1586 };
1587 $totalarray['val']['totalbalance'] += $line->debit - $line->credit;
1588 }
1589
1590 // Exported operation date
1591 if (!empty($arrayfields['t.date_export']['checked'])) {
1592 print '<td class="center">'.dol_print_date($line->date_export, 'dayhour').'</td>';
1593 if (!$i) {
1594 $totalarray['nbfield']++;
1595 }
1596 }
1597
1598 // Validated operation date
1599 if (!empty($arrayfields['t.date_validated']['checked'])) {
1600 print '<td class="center">'.dol_print_date($line->date_validation, 'dayhour').'</td>';
1601 if (!$i) {
1602 $totalarray['nbfield']++;
1603 }
1604 }
1605
1606 // Due date
1607 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1608 print '<td class="center">'.dol_print_date($line->date_lim_reglement, 'day').'</td>';
1609 if (!$i) {
1610 $totalarray['nbfield']++;
1611 }
1612 }
1613
1614 if (!empty($arrayfields['t.import_key']['checked'])) {
1615 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($line->import_key).'">'.dol_escape_htmltag($line->import_key)."</td>\n";
1616 if (!$i) {
1617 $totalarray['nbfield']++;
1618 }
1619 }
1620
1621 // Fields from hook
1622 $parameters = array('arrayfields' => $arrayfields, 'obj' => $line);
1623 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1624 print $hookmanager->resPrint;
1625
1626 // Action column
1627 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1628 print '<td class="nowraponall center">';
1629 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
1630 $selected = 0;
1631 if (in_array($line->id, $arrayofselected)) {
1632 $selected = 1;
1633 }
1634 print '<input id="cb' . $line->id . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $line->id . '"' . ($selected ? ' checked="checked"' : '') . ' />';
1635 }
1636 print '</td>';
1637 if (!$i) {
1638 $totalarray['nbfield']++;
1639 }
1640 }
1641
1642 // Comptabilise le sous-total
1643 $sous_total_debit += $line->debit;
1644 $sous_total_credit += $line->credit;
1645
1646 print "</tr>\n";
1647
1648 $i++;
1649}
1650
1651if ($num > 0 && $colspan > 0) {
1652 print '<tr class="liste_total">';
1653 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("TotalForAccount").' '.$accountg.':</td>';
1654 print '<td class="nowrap right">'.price(price2num($sous_total_debit, 'MT')).'</td>';
1655 print '<td class="nowrap right">'.price(price2num($sous_total_credit, 'MT')).'</td>';
1656 if ($colspanend > 0) {
1657 print '<td colspan="'.$colspanend.'"></td>';
1658 }
1659 print '</tr>';
1660
1661 // Show balance of last shown account
1662 $balance = $sous_total_debit - $sous_total_credit;
1663 print '<tr class="liste_total">';
1664 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("Balance").':</td>';
1665 if ($balance > 0) {
1666 print '<td class="nowraponall right">';
1667 print price(price2num($sous_total_debit - $sous_total_credit, 'MT'));
1668 print '</td>';
1669 print '<td></td>';
1670 } else {
1671 print '<td></td>';
1672 print '<td class="nowraponall right">';
1673 print price(price2num($sous_total_credit - $sous_total_debit, 'MT'));
1674 print '</td>';
1675 }
1676 if ($colspanend > 0) {
1677 print '<td colspan="'.$colspanend.'"></td>';
1678 }
1679 print '</tr>';
1680}
1681
1682
1683// Clean total values to round them
1684if (!empty($totalarray['val']['totaldebit'])) {
1685 $totalarray['val']['totaldebit'] = (float) price2num($totalarray['val']['totaldebit'], 'MT');
1686}
1687if (!empty($totalarray['val']['totalcredit'])) {
1688 $totalarray['val']['totalcredit'] = (float) price2num($totalarray['val']['totalcredit'], 'MT');
1689}
1690if (!empty($totalarray['val']['totalbalance'])) {
1691 $totalarray['val']['totalbalance'] = (float) price2num($totalarray['val']['totaldebit'] - $totalarray['val']['totalcredit'], 'MT');
1692}
1693
1694// Show total line
1695$trforbreaknobg = 1; // used in list_print_total.tpl.php
1696include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1697
1698// If no record found
1699if ($num == 0) {
1700 $colspan = 1;
1701 foreach ($arrayfields as $key => $val) {
1702 if (!empty($val['checked'])) {
1703 $colspan++;
1704 }
1705 }
1706 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1707}
1708
1709$parameters = array('arrayfields' => $arrayfields);
1710$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1711print $hookmanager->resPrint;
1712
1713print "</table>";
1714print '</div>';
1715
1716print '</form>';
1717
1718// End of page
1719llxFooter();
1720$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:67
$totalarray
Definition export.php:1206
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 permettant la generation de composants html autre 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)
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:619
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.
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)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
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.
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...
$objectlink
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:158
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.