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