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 } 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
755 // Choice of mode (customer / supplier)
756 if (!empty($conf->dol_use_jmobile)) {
757 print "\n".'<div class="fichecenter"><div class="nowrap">'."\n";
758 }
759
760 if ($companystatic->client && !empty($companystatic->code_compta_client)) {
761 if ($mode != 'customer') {
762 if (!empty($companystatic->code_compta_client)) {
763 $subledger_start_account = $subledger_end_account = $companystatic->code_compta_client;
764 } else {
765 $subledger_start_account = $subledger_end_account = '';
766 }
767 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.'">';
768 } else {
769 print '<span class="a-mesure marginleftonly marginrightonly">';
770 }
771
772 print $langs->trans("CustomerAccountancyCodeShort");
773 if ($mode != 'customer') {
774 print '</a>';
775 } else {
776 print '</span>';
777 }
778 }
779
780 if ($companystatic->fournisseur && !empty($companystatic->code_compta_fournisseur)) {
781 if ($mode != 'supplier') {
782 if (!empty($companystatic->code_compta_fournisseur)) {
783 $subledger_start_account = $subledger_end_account = $companystatic->code_compta_fournisseur;
784 } else {
785 $subledger_start_account = $subledger_end_account = '';
786 }
787 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.'">';
788 } else {
789 print '<span class="a-mesure marginleftonly marginrightonly">';
790 }
791 print $langs->trans("SupplierAccountancyCodeShort");
792 if ($mode != 'supplier') {
793 print '</a>';
794 } else {
795 print '</span>';
796 }
797 }
798
799 if (!empty($conf->dol_use_jmobile)) {
800 print '</div></div>';
801 } else {
802 print '<br>';
803 }
804 print '<br>';
805 }
806}
807
808// List
809$nbtotalofrecords = '';
810if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
811 // TODO Perf Replace this by a count
812 if ($type == 'sub') {
813 $nbtotalofrecords = $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter, 'AND', 1, 1);
814 } else {
815 $nbtotalofrecords = $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter, 'AND', 0, 1);
816 }
817
818 if ($nbtotalofrecords < 0) {
819 setEventMessages($object->error, $object->errors, 'errors');
820 $error++;
821 }
822}
823
824$num = 0;
825if (!$error) {
826 if ($type == 'sub') {
827 $result = $object->fetchAllByAccount($sortorder, $sortfield, $limit, $offset, $filter, 'AND', 1);
828 } else {
829 $result = $object->fetchAllByAccount($sortorder, $sortfield, $limit, $offset, $filter, 'AND', 0);
830 }
831 //$num = count($object->lines);
832 $num = $result; // $result is total nb of lines, or limit + 1, but $object->lines is always limited to $limit
833
834 if ($result < 0) {
835 setEventMessages($object->error, $object->errors, 'errors');
836 }
837}
838
839$arrayofselected = is_array($toselect) ? $toselect : array();
840
841// Print form confirm
842$formconfirm = '';
843print $formconfirm;
844
845// List of mass actions available
846$arrayofmassactions = array();
847if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && $user->hasRight('accounting', 'mouvements', 'creer')) {
848 $arrayofmassactions['letteringauto'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringAuto');
849 $arrayofmassactions['preunletteringauto'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('UnletteringAuto');
850 $arrayofmassactions['letteringmanual'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringManual');
851 if ($type == 'sub') {
852 $arrayofmassactions['letteringpartial'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('LetteringPartial');
853 }
854 $arrayofmassactions['preunletteringmanual'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('UnletteringManual');
855}
856if ($user->hasRight('accounting', 'mouvements', 'creer')) {
857 $arrayofmassactions['preclonebookkeepingwriting'] = img_picto('', 'clone', 'class="pictofixedwidth"').$langs->trans("Clone");
858}
859if ($user->hasRight('accounting', 'mouvements', 'creer')) {
860 $arrayofmassactions['preassignaccountbookkeepingwriting'] = img_picto('', 'fa-exchange-alt', 'class="pictofixedwidth"').$langs->trans("AssignAccount");
861}
862if ($user->hasRight('accounting', 'mouvements', 'creer')) {
863 $arrayofmassactions['prereturnaccountbookkeepingwriting'] = img_picto('', 'undo', 'class="pictofixedwidth"').$langs->trans("ReturnAccount");
864}
865if ($user->hasRight('accounting', 'mouvements', 'supprimer')) {
866 $arrayofmassactions['predeletebookkeepingwriting'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
867}
868
869if (GETPOSTINT('nomassaction') || in_array($massaction, array('preunletteringauto', 'preunletteringmanual', 'predeletebookkeepingwriting', 'preclonebookkeepingwriting', 'preassignaccountbookkeepingwriting', 'prereturnaccountbookkeepingwriting'))) {
870 $arrayofmassactions = array();
871}
872$massactionbutton = $form->selectMassAction($massaction, $arrayofmassactions);
873
874print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">';
875print '<input type="hidden" name="token" value="'.newToken().'">';
876print '<input type="hidden" name="action" value="list">';
877if ($optioncss != '') {
878 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
879}
880print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
881print '<input type="hidden" name="type" value="'.$type.'">';
882if (!empty($socid)) {
883 print '<input type="hidden" name="socid" value="' . $socid . '">';
884}
885print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
886print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
887print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
888
889$parameters = array('param' => $param);
890$reshook = $hookmanager->executeHooks('addMoreActionsButtonsList', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
891if ($reshook < 0) {
892 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
893}
894
895$newcardbutton = empty($hookmanager->resPrint) ? '' : $hookmanager->resPrint;
896
897if (empty($reshook)) {
898 // Remove navigation buttons if in thirdparty tab mode, except for PDF printing
899 if (empty($socid)) {
900 $newcardbutton = dolGetButtonTitle($langs->trans('ViewFlatList'), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/list.php?' . $param);
901 if ($type == 'sub') {
902 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?' . $url_param, '', 1, array('morecss' => 'marginleftonly'));
903 $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'));
904 } else {
905 $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?' . $url_param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected'));
906 $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'));
907 }
908 }
909 $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'));
910
911 $newcardbutton .= dolGetButtonTitleSeparator();
912
913 $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);
914}
915
916if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
917 $param .= '&contextpage='.urlencode($contextpage);
918}
919if ($limit > 0 && $limit != $conf->liste_limit) {
920 $param .= '&limit='.((int) $limit);
921}
922
923print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1);
924
925if ($massaction == 'preunletteringauto') {
926 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnletteringAuto"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unletteringauto", null, '', 0, 200, 500, 1);
927} elseif ($massaction == 'preunletteringmanual') {
928 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnletteringManual"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unletteringmanual", null, '', 0, 200, 500, 1);
929} elseif ($massaction == 'predeletebookkeepingwriting') {
930 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDeleteBookkeepingWriting"), $langs->trans("ConfirmMassDeleteBookkeepingWritingQuestion", count($toselect)), "deletebookkeepingwriting", null, '', 0, 200, 500, 1);
931} elseif ($massaction == 'preassignaccountbookkeepingwriting') {
932 $input = $formaccounting->select_account('', 'account', 1);
933 $formquestion = array(array('type' => 'other', 'name' => 'account', 'label' => '<span class="fieldrequired">' . $langs->trans("AccountAccountingShort") . '</span>', 'value' => $input),);
934 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("confirmMassAssignAccountBookkeepingWritingConfirm"), $langs->trans("ConfirmMassAssignAccountBookkeepingWritingQuestion", count($toselect)), "assignaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
935} elseif ($massaction == 'preclonebookkeepingwriting') {
936 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
937 $input2 = $formaccounting->select_journal($journal_code, 'code_journal', 0, 0, 1, 1).'</td>';
938 $formquestion = array(
939 array(
940 'type' => 'other',
941 'name' => 'massdate',
942 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>',
943 'value' => $input1
944 )
945 );
946
947 if (getDolGlobalString('ACCOUNTING_CLONING_ENABLE_INPUT_JOURNAL')) {
948 $formquestion[] = array(
949 'type' => 'text',
950 'name' => 'code_journal',
951 'label' => '<span class="fieldrequired">' . $langs->trans("Codejournal") . '</span>',
952 'value' => $input2
953 );
954 }
955
956 print $form->formconfirm(
957 $_SERVER["PHP_SELF"],
958 $langs->trans("ConfirmMassCloneBookkeepingWriting"),
959 $langs->trans("ConfirmMassCloneBookkeepingWritingQuestion", count($toselect)),
960 "clonebookkeepingwriting",
961 $formquestion,
962 '', 0, 200, 500, 1
963 );
964} elseif ($massaction == 'prereturnaccountbookkeepingwriting') {
965 $input1 = $form->selectDate('', 'massdate', 0, 0, 0, "create_mvt", 1, 1);
966 $formquestion = array(array('type' => 'other', 'name' => 'massdate', 'label' => '<span class="fieldrequired">' . $langs->trans("Docdate") . '</span>', 'value' => $input1));
967 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassReturnAccountBookkeepingWriting"), $langs->trans("ConfirmMassReturnAccountBookkeepingWritingQuestion", count($toselect)), "returnaccountbookkeepingwriting", $formquestion, '', 0, 200, 500, 1);
968}
969
970include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
971
972$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
973$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
974if ($massactionbutton && $contextpage != 'poslist') {
975 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
976}
977
978// Reverse sort order
979if (preg_match('/^asc/i', $sortorder)) {
980 $sortorder = "asc";
981} else {
982 $sortorder = "desc";
983}
984
985// Warning to explain why the list of record is not consistent with the other list view (missing a lot of lines)
986if ($type == 'sub' && !$socid) {
987 print info_admin($langs->trans("WarningRecordWithoutSubledgerAreExcluded"));
988 print '<br>';
989}
990
991$moreforfilter = '';
992
993// Search on accountancy custom groups or account
994$moreforfilter .= '<div class="divsearchfield">';
995$moreforfilter .= $langs->trans('AccountAccounting').': ';
996$moreforfilter .= '<div class="nowrap inline-block">';
997if ($type == 'sub') {
998 if (getDolGlobalString('ACCOUNTANCY_COMBO_FOR_AUX')) {
999 $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), 'maxwidth200');
1000 } else {
1001 $moreforfilter .= '<input type="text" class="maxwidth150" name="search_accountancy_code_start" value="'.dol_escape_htmltag($search_accountancy_code_start).'" placeholder="'.$langs->trans('From').'">';
1002 }
1003} else {
1004 $moreforfilter .= $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth200');
1005}
1006$moreforfilter .= ' ';
1007if ($type == 'sub') {
1008 if (getDolGlobalString('ACCOUNTANCY_COMBO_FOR_AUX')) {
1009 $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), 'maxwidth200');
1010 } else {
1011 $moreforfilter .= '<input type="text" class="maxwidth150" name="search_accountancy_code_end" value="'.dol_escape_htmltag($search_accountancy_code_end).'" placeholder="'.$langs->trans('to').'">';
1012 }
1013} else {
1014 $moreforfilter .= $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth200');
1015}
1016
1017if (empty($socid)) {
1018 $stringforfirstkey = $langs->trans("KeyboardShortcut");
1019 if ($conf->browser->name == 'chrome') {
1020 $stringforfirstkey .= ' ALT +';
1021 } elseif ($conf->browser->name == 'firefox') {
1022 $stringforfirstkey .= ' ALT + SHIFT +';
1023 } else {
1024 $stringforfirstkey .= ' CTL +';
1025 }
1026 $moreforfilter .= '&nbsp;&nbsp;&nbsp;<a id="previous_account" accesskey="p" title="' . $stringforfirstkey . ' p" class="classfortooltip" href="#"><i class="fa fa-chevron-left"></i></a>';
1027 $moreforfilter .= '&nbsp;&nbsp;&nbsp;<a id="next_account" accesskey="n" title="' . $stringforfirstkey . ' n" class="classfortooltip" href="#"><i class="fa fa-chevron-right"></i></a>';
1028 $moreforfilter .= <<<SCRIPT
1029<script type="text/javascript">
1030 jQuery(document).ready(function() {
1031 var searchFormList = $('#searchFormList');
1032 var searchAccountancyCodeStart = $('#search_accountancy_code_start');
1033 var searchAccountancyCodeEnd = $('#search_accountancy_code_end');
1034 jQuery('#previous_account').on('click', function() {
1035 var previousOption = searchAccountancyCodeStart.find('option:selected').prev('option');
1036 if (previousOption.length == 1) searchAccountancyCodeStart.val(previousOption.attr('value'));
1037 searchAccountancyCodeEnd.val(searchAccountancyCodeStart.val());
1038 searchFormList.submit();
1039 });
1040 jQuery('#next_account').on('click', function() {
1041 var nextOption = searchAccountancyCodeStart.find('option:selected').next('option');
1042 if (nextOption.length == 1) searchAccountancyCodeStart.val(nextOption.attr('value'));
1043 searchAccountancyCodeEnd.val(searchAccountancyCodeStart.val());
1044 searchFormList.submit();
1045 });
1046 jQuery('input[name="search_mvt_num"]').on("keypress", function(event) {
1047 console.log(event);
1048 });
1049 });
1050</script>
1051SCRIPT;
1052}
1053$moreforfilter .= '</div>';
1054$moreforfilter .= '</div>';
1055
1056if (empty($socid)) {
1057 $moreforfilter .= '<div class="divsearchfield">';
1058 $moreforfilter .= $langs->trans('AccountingCategory') . ': ';
1059 $moreforfilter .= '<div class="nowrap inline-block">';
1060 $moreforfilter .= $formaccounting->select_accounting_category($search_account_category, 'search_account_category', 1, 0, 0, 0);
1061 $moreforfilter .= '</div>';
1062 $moreforfilter .= '</div>';
1063}
1064
1065$parameters = array();
1066$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1067if (empty($reshook)) {
1068 $moreforfilter .= $hookmanager->resPrint;
1069} else {
1070 $moreforfilter = $hookmanager->resPrint;
1071}
1072
1073print '<div class="liste_titre liste_titre_bydiv centpercent">';
1074print $moreforfilter;
1075print '</div>';
1076
1077print '<div class="div-table-responsive">';
1078print '<table class="tagtable liste centpercent listwithfilterbefore">';
1079
1080// Filters lines
1081print '<tr class="liste_titre_filter">';
1082// Action column
1083if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1084 print '<td class="liste_titre center">';
1085 $searchpicto = $form->showFilterButtons('left');
1086 print $searchpicto;
1087 print '</td>';
1088}
1089// Movement number
1090if (!empty($arrayfields['t.piece_num']['checked'])) {
1091 print '<td class="liste_titre"><input type="text" name="search_mvt_num" class="width50" value="'.dol_escape_htmltag($search_mvt_num).'"></td>';
1092}
1093// Code journal
1094if (!empty($arrayfields['t.code_journal']['checked'])) {
1095 print '<td class="liste_titre center">';
1096 print $formaccounting->multi_select_journal($search_ledger_code, 'search_ledger_code', 0, 1, 1, 1, 'maxwidth75');
1097 print '</td>';
1098}
1099// Date document
1100if (!empty($arrayfields['t.doc_date']['checked'])) {
1101 print '<td class="liste_titre center">';
1102 print '<div class="nowrapfordate">';
1103 print $form->selectDate($search_date_start, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1104 print '</div>';
1105 print '<div class="nowrapfordate">';
1106 print $form->selectDate($search_date_end, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1107 print '</div>';
1108 print '</td>';
1109}
1110// Ref document
1111if (!empty($arrayfields['t.doc_ref']['checked'])) {
1112 print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_doc_ref" value="'.dol_escape_htmltag($search_doc_ref).'"/></td>';
1113}
1114// Label operation
1115if (!empty($arrayfields['t.label_operation']['checked'])) {
1116 print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_label_operation" value="'.dol_escape_htmltag($search_label_operation).'"/></td>';
1117}
1118// Lettering code
1119if (!empty($arrayfields['t.lettering_code']['checked'])) {
1120 print '<td class="liste_titre center">';
1121 print '<input type="text" size="3" class="flat" name="search_lettering_code" value="'.$search_lettering_code.'"/>';
1122 print '<br><span class="nowrap"><input type="checkbox" name="search_not_reconciled" value="notreconciled"'.($search_not_reconciled == 'notreconciled' ? ' checked' : '').'>'.$langs->trans("NotReconciled").'</span>';
1123 print '</td>';
1124}
1125// Debit
1126if (!empty($arrayfields['t.debit']['checked'])) {
1127 print '<td class="liste_titre right"><input type="text" class="flat" name="search_debit" size="4" value="'.dol_escape_htmltag($search_debit).'"></td>';
1128}
1129// Credit
1130if (!empty($arrayfields['t.credit']['checked'])) {
1131 print '<td class="liste_titre right"><input type="text" class="flat" name="search_credit" size="4" value="'.dol_escape_htmltag($search_credit).'"></td>';
1132}
1133// Balance
1134if (!empty($arrayfields['t.balance']['checked'])) {
1135 print '<td></td>';
1136}
1137// Date export
1138if (!empty($arrayfields['t.date_export']['checked'])) {
1139 print '<td class="liste_titre center">';
1140 print '<div class="nowrapfordate">';
1141 print $form->selectDate($search_date_export_start, 'search_date_export_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1142 print '</div>';
1143 print '<div class="nowrapfordate">';
1144 print $form->selectDate($search_date_export_end, 'search_date_export_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1145 print '</div>';
1146 print '</td>';
1147}
1148// Date validation
1149if (!empty($arrayfields['t.date_validated']['checked'])) {
1150 print '<td class="liste_titre center">';
1151 print '<div class="nowrapfordate">';
1152 print $form->selectDate($search_date_validation_start, 'search_date_validation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1153 print '</div>';
1154 print '<div class="nowrapfordate">';
1155 print $form->selectDate($search_date_validation_end, 'search_date_validation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1156 print '</div>';
1157 print '</td>';
1158}
1159// Due date start and end
1160if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1161 print '<td class="liste_titre center">';
1162 print '<div class="nowrapfordate">';
1163 print $form->selectDate($search_date_due_start, 'search_date_due_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
1164 print '</div>';
1165 print '<div class="nowrapfordate">';
1166 print $form->selectDate($search_date_due_end, 'search_date_due_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1167 print '</div>';
1168 print '</td>';
1169}
1170if (!empty($arrayfields['t.import_key']['checked'])) {
1171 print '<td class="liste_titre center">';
1172 print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="'.dol_escape_htmltag($search_import_key).'">';
1173 print '</td>';
1174}
1175
1176// Fields from hook
1177$parameters = array('arrayfields' => $arrayfields);
1178$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1179print $hookmanager->resPrint;
1180
1181// Action column
1182if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1183 print '<td class="liste_titre center">';
1184 $searchpicto = $form->showFilterButtons();
1185 print $searchpicto;
1186 print '</td>';
1187}
1188print "</tr>\n";
1189
1190print '<tr class="liste_titre">';
1191if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1192 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1193}
1194if (!empty($arrayfields['t.piece_num']['checked'])) {
1195 print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder, 'tdoverflowmax80imp ');
1196}
1197if (!empty($arrayfields['t.code_journal']['checked'])) {
1198 print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center ');
1199}
1200if (!empty($arrayfields['t.doc_date']['checked'])) {
1201 print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1202}
1203if (!empty($arrayfields['t.doc_ref']['checked'])) {
1204 print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder);
1205}
1206if (!empty($arrayfields['t.label_operation']['checked'])) {
1207 print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder);
1208}
1209if (!empty($arrayfields['t.lettering_code']['checked'])) {
1210 print_liste_field_titre($arrayfields['t.lettering_code']['label'], $_SERVER['PHP_SELF'], "t.lettering_code", "", $param, '', $sortfield, $sortorder, 'center ');
1211}
1212if (!empty($arrayfields['t.debit']['checked'])) {
1213 print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right ');
1214}
1215if (!empty($arrayfields['t.credit']['checked'])) {
1216 print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right ');
1217}
1218if (!empty($arrayfields['t.balance']['checked'])) {
1219 print_liste_field_titre($arrayfields['t.balance']['label'], "", "", "", $param, '', $sortfield, $sortorder, 'right ');
1220}
1221if (!empty($arrayfields['t.date_export']['checked'])) {
1222 print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export", "", $param, '', $sortfield, $sortorder, 'center ');
1223}
1224if (!empty($arrayfields['t.date_validated']['checked'])) {
1225 print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated", "", $param, '', $sortfield, $sortorder, 'center ');
1226}
1227// Due date
1228if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1229 print_liste_field_titre($arrayfields['t.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], 't.date_lim_reglement', '', $param, '', $sortfield, $sortorder, 'center ');
1230}
1231if (!empty($arrayfields['t.import_key']['checked'])) {
1232 print_liste_field_titre($arrayfields['t.import_key']['label'], $_SERVER["PHP_SELF"], "t.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
1233}
1234// Hook fields
1235$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1236$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1237print $hookmanager->resPrint;
1238if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1239 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1240}
1241print "</tr>\n";
1242
1243$displayed_account_number = null; // Start with undefined to be able to distinguish with empty
1244
1245$objectstatic = null; // Init for static analysis
1246$objectlink = ''; // Init for static analysis
1247$result = -1; // Init for static analysis
1248
1249// Loop on record
1250// --------------------------------------------------------------------
1251$i = 0;
1252
1253$totalarray = array();
1254$totalarray['nbfield'] = 0;
1255$sous_total_debit = 0;
1256$sous_total_credit = 0;
1257$totalarray['val'] = array();
1258$totalarray['val']['totaldebit'] = 0;
1259$totalarray['val']['totalcredit'] = 0;
1260$totalarray['val']['totalbalance'] = 0;
1261
1262// Init for static analysis
1263$colspan = 0; // colspan before field 'label of operation'
1264$colspanend = 0; // colspan after debit/credit
1265$accountg = '-';
1266
1267$colspan = 0; // colspan before field 'label of operation'
1268$colspanend = 3; // colspan after debit/credit
1269if (!empty($arrayfields['t.piece_num']['checked'])) { $colspan++; }
1270if (!empty($arrayfields['t.code_journal']['checked'])) { $colspan++; }
1271if (!empty($arrayfields['t.doc_date']['checked'])) { $colspan++; }
1272if (!empty($arrayfields['t.doc_ref']['checked'])) { $colspan++; }
1273if (!empty($arrayfields['t.label_operation']['checked'])) { $colspan++; }
1274if (!empty($arrayfields['t.date_export']['checked'])) { $colspanend++; }
1275if (!empty($arrayfields['t.date_validated']['checked'])) { $colspanend++; }
1276if (!empty($arrayfields['t.lettering_code']['checked'])) { $colspanend++; }
1277if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1278 $colspan++;
1279 $colspanend--;
1280}
1281
1282while ($i < min($num, $limit)) {
1283 $line = $object->lines[$i];
1284
1285 if ($type == 'sub') {
1286 $accountg = length_accounta($line->subledger_account);
1287 } else {
1288 $accountg = length_accountg($line->numero_compte);
1289 }
1290 //if (empty($accountg)) $accountg = '-';
1291
1292 $colspan = 0; // colspan before field 'label of operation'
1293 $colspanend = 0; // colspan after debit/credit
1294 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1295 $colspan++;
1296 }
1297 if (!empty($arrayfields['t.piece_num']['checked'])) {
1298 $colspan++;
1299 }
1300 if (!empty($arrayfields['t.code_journal']['checked'])) {
1301 $colspan++;
1302 }
1303 if (!empty($arrayfields['t.doc_date']['checked'])) {
1304 $colspan++;
1305 }
1306 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1307 $colspan++;
1308 }
1309 if (!empty($arrayfields['t.label_operation']['checked'])) {
1310 $colspan++;
1311 }
1312 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1313 $colspan++;
1314 }
1315
1316 if (!empty($arrayfields['t.balance']['checked'])) {
1317 $colspanend++;
1318 }
1319 if (!empty($arrayfields['t.date_export']['checked'])) {
1320 $colspanend++;
1321 }
1322 if (!empty($arrayfields['t.date_validated']['checked'])) {
1323 $colspanend++;
1324 }
1325 // Due date
1326 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1327 $colspanend++;
1328 }
1329 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1330 $colspanend++;
1331 }
1332 if (!empty($arrayfields['t.import_key']['checked'])) {
1333 $colspanend++;
1334 }
1335 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1336 $colspan++;
1337 $colspanend--;
1338 }
1339
1340 // Is it a break ?
1341 if ($accountg != $displayed_account_number || !isset($displayed_account_number)) {
1342 // Show a subtotal by accounting account
1343 if (isset($displayed_account_number)) {
1344 print '<tr class="liste_total">';
1345 if ($type == 'sub') {
1346 print '<td class="right" colspan="' . $colspan . '">' . $langs->trans("TotalForAccount") . ' ' . length_accounta($displayed_account_number) . ':</td>';
1347 } else {
1348 print '<td class="right" colspan="' . $colspan . '">' . $langs->trans("TotalForAccount") . ' ' . length_accountg($displayed_account_number) . ':</td>';
1349 }
1350 print '<td class="nowrap right">'.price(price2num($sous_total_debit, 'MT')).'</td>';
1351 print '<td class="nowrap right">'.price(price2num($sous_total_credit, 'MT')).'</td>';
1352 if ($colspanend > 0) {
1353 print '<td colspan="'.$colspanend.'"></td>';
1354 }
1355 print '</tr>';
1356 // Show balance of last shown account
1357 $balance = $sous_total_debit - $sous_total_credit;
1358 print '<tr class="liste_total">';
1359 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("Balance").':</td>';
1360 if ($balance > 0) {
1361 print '<td class="nowraponall right">';
1362 print price(price2num($sous_total_debit - $sous_total_credit, 'MT'));
1363 print '</td>';
1364 print '<td></td>';
1365 } else {
1366 print '<td></td>';
1367 print '<td class="nowraponall right">';
1368 print price(price2num($sous_total_credit - $sous_total_debit, 'MT'));
1369 print '</td>';
1370 }
1371 if ($colspanend > 0) {
1372 print '<td colspan="'.$colspanend.'"></td>';
1373 }
1374 print '</tr>';
1375 }
1376
1377 // Show the break account
1378 print '<tr class="trforbreaknobg">';
1379 print '<td colspan="'.($totalarray['nbfield'] ? $totalarray['nbfield'] : count($arrayfields) + 1).'" class="tdforbreak">';
1380 if ($type == 'sub') {
1381 if ($line->subledger_account != "" && $line->subledger_account != '-1') {
1382 print empty($line->subledger_label) ? '<span class="error">'.$langs->trans("Unknown").'</span>' : $line->subledger_label;
1383 print ' : ';
1384 print length_accounta($line->subledger_account);
1385 } else {
1386 // Should not happen: subledger account must be null or a non empty value
1387 print '<span class="error">' . $langs->trans("Unknown");
1388 if ($line->subledger_label) {
1389 print ' (' . $line->subledger_label . ')';
1390 $htmltext = 'EmptyStringForSubledgerAccountButSubledgerLabelDefined';
1391 } else {
1392 $htmltext = 'EmptyStringForSubledgerAccountAndSubledgerLabel';
1393 }
1394 print $form->textwithpicto('', $htmltext);
1395 print '</span>';
1396 }
1397 } else {
1398 if ($line->numero_compte != "" && $line->numero_compte != '-1') {
1399 print length_accountg($line->numero_compte) . ' : ' . $object->get_compte_desc($line->numero_compte);
1400 } else {
1401 print '<span class="error">' . $langs->trans("Unknown") . '</span>';
1402 }
1403 }
1404 print '</td>';
1405 print '</tr>';
1406
1407 $displayed_account_number = $accountg;
1408 //if (empty($displayed_account_number)) $displayed_account_number='-';
1409 $sous_total_debit = 0;
1410 $sous_total_credit = 0;
1411 }
1412
1413 print '<tr class="oddeven">';
1414 // Action column
1415 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1416 print '<td class="nowraponall center">';
1417 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
1418 $selected = 0;
1419 if (in_array($line->id, $arrayofselected)) {
1420 $selected = 1;
1421 }
1422 print '<input id="cb' . $line->id . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $line->id . '"' . ($selected ? ' checked="checked"' : '') . ' />';
1423 }
1424 print '</td>';
1425 if (!$i) {
1426 $totalarray['nbfield']++;
1427 }
1428 }
1429 // Piece number
1430 if (!empty($arrayfields['t.piece_num']['checked'])) {
1431 print '<td>';
1432 $object->id = $line->id;
1433 $object->piece_num = $line->piece_num;
1434 $object->ref = $line->ref;
1435 print $object->getNomUrl(1, '', 0, '', 1);
1436 print '</td>';
1437 if (!$i) {
1438 $totalarray['nbfield']++;
1439 }
1440 }
1441
1442 // Journal code
1443 if (!empty($arrayfields['t.code_journal']['checked'])) {
1444 $accountingjournal = new AccountingJournal($db);
1445 $result = $accountingjournal->fetch(0, $line->code_journal);
1446 $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal);
1447 print '<td class="center tdoverflowmax80">'.$journaltoshow.'</td>';
1448 if (!$i) {
1449 $totalarray['nbfield']++;
1450 }
1451 }
1452
1453 // Document date
1454 if (!empty($arrayfields['t.doc_date']['checked'])) {
1455 print '<td class="center">'.dol_print_date($line->doc_date, 'day').'</td>';
1456 if (!$i) {
1457 $totalarray['nbfield']++;
1458 }
1459 }
1460
1461 // Document ref
1462 $modulepart = '';
1463 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1464 if ($line->doc_type == 'customer_invoice') {
1465 $langs->loadLangs(array('bills'));
1466
1467 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1468 $objectstatic = new Facture($db);
1469 $objectstatic->fetch($line->fk_doc);
1470 //$modulepart = 'facture';
1471
1472 $filename = dol_sanitizeFileName($line->doc_ref);
1473 $filedir = $conf->facture->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1474 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1475 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1476 } elseif ($line->doc_type == 'supplier_invoice') {
1477 $langs->loadLangs(array('bills'));
1478
1479 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1480 $objectstatic = new FactureFournisseur($db);
1481 $objectstatic->fetch($line->fk_doc);
1482
1483 $modulepart = 'invoice_supplier';
1484 $filename = dol_sanitizeFileName($line->doc_ref);
1485 $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($line->fk_doc, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1486 $subdir = get_exdir($objectstatic->id, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1487 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $subdir, $filedir);
1488 } elseif ($line->doc_type == 'expense_report') {
1489 $langs->loadLangs(array('trips'));
1490
1491 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
1492 $objectstatic = new ExpenseReport($db);
1493 $objectstatic->fetch($line->fk_doc);
1494 //$modulepart = 'expensereport';
1495
1496 $filename = dol_sanitizeFileName($line->doc_ref);
1497 $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1498 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1499 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1500 } elseif ($line->doc_type == 'bank') {
1501 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1502 $objectstatic = new AccountLine($db);
1503 $objectstatic->fetch($line->fk_doc);
1504 } else {
1505 // Other type
1506 }
1507
1508 print '<td class="tdoverflowmax250">';
1509
1510 // Picto + Ref
1511 if ($line->doc_type == 'customer_invoice' || $line->doc_type == 'supplier_invoice' || $line->doc_type == 'expense_report') {
1512 print $objectstatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1);
1513 print $documentlink;
1514 } elseif ($line->doc_type == 'bank') {
1515 print $objectstatic->getNomUrl(1);
1516 $bank_ref = strstr($line->doc_ref, '-');
1517 print ' <span class="classfortooltip" title="'.dol_escape_htmltag($line->doc_ref).'">'.dol_escape_htmltag($bank_ref).'</span>';
1518 } else {
1519 print $line->doc_ref;
1520 }
1521
1522 print "</td>\n";
1523 if (!$i) {
1524 $totalarray['nbfield']++;
1525 }
1526 }
1527
1528 // Label operation
1529 if (!empty($arrayfields['t.label_operation']['checked'])) {
1530 // Show a link to the customer/supplier invoice
1531 $doc_ref = preg_replace('/\‍(.*\‍)/', '', $line->doc_ref);
1532 if (strlen(length_accounta($line->subledger_account)) == 0) {
1533 print '<td class="small tdoverflowmax350 classfortooltip" title="'.dol_escape_htmltag($line->label_operation).'">'.dol_escape_htmltag($line->label_operation).'</td>';
1534 } else {
1535 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>';
1536 }
1537 if (!$i) {
1538 $totalarray['nbfield']++;
1539 }
1540 }
1541
1542 // Lettering code
1543 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1544 print '<td class="center">'.dol_escape_htmltag((string) $line->lettering_code).'</td>';
1545 if (!$i) {
1546 $totalarray['nbfield']++;
1547 }
1548 }
1549
1550 // Amount debit
1551 if (!empty($arrayfields['t.debit']['checked'])) {
1552 print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
1553 if (!$i) {
1554 $totalarray['nbfield']++;
1555 }
1556 if (!$i) {
1557 $totalarray['pos'][$totalarray['nbfield']] = 'totaldebit';
1558 }
1559 $totalarray['val']['totaldebit'] += (float) $line->debit;
1560 }
1561
1562 // Amount credit
1563 if (!empty($arrayfields['t.credit']['checked'])) {
1564 print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
1565 if (!$i) {
1566 $totalarray['nbfield']++;
1567 }
1568 if (!$i) {
1569 $totalarray['pos'][$totalarray['nbfield']] = 'totalcredit';
1570 }
1571 $totalarray['val']['totalcredit'] += (float) $line->credit;
1572 }
1573
1574 // Amount balance
1575 if (!empty($arrayfields['t.balance']['checked'])) {
1576 print '<td class="right nowraponall amount">'.price(price2num($sous_total_debit + $line->debit - $sous_total_credit - $line->credit, 'MT')).'</td>';
1577 if (!$i) {
1578 $totalarray['nbfield']++;
1579 }
1580 if (!$i) {
1581 $totalarray['pos'][$totalarray['nbfield']] = 'totalbalance';
1582 };
1583 $totalarray['val']['totalbalance'] += $line->debit - $line->credit;
1584 }
1585
1586 // Exported operation date
1587 if (!empty($arrayfields['t.date_export']['checked'])) {
1588 print '<td class="center">'.dol_print_date($line->date_export, 'dayhour').'</td>';
1589 if (!$i) {
1590 $totalarray['nbfield']++;
1591 }
1592 }
1593
1594 // Validated operation date
1595 if (!empty($arrayfields['t.date_validated']['checked'])) {
1596 print '<td class="center">'.dol_print_date($line->date_validation, 'dayhour').'</td>';
1597 if (!$i) {
1598 $totalarray['nbfield']++;
1599 }
1600 }
1601
1602 // Due date
1603 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1604 print '<td class="center">'.dol_print_date($line->date_lim_reglement, 'day').'</td>';
1605 if (!$i) {
1606 $totalarray['nbfield']++;
1607 }
1608 }
1609
1610 if (!empty($arrayfields['t.import_key']['checked'])) {
1611 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($line->import_key).'">'.dol_escape_htmltag($line->import_key)."</td>\n";
1612 if (!$i) {
1613 $totalarray['nbfield']++;
1614 }
1615 }
1616
1617 // Fields from hook
1618 $parameters = array('arrayfields' => $arrayfields, 'obj' => $line);
1619 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1620 print $hookmanager->resPrint;
1621
1622 // Action column
1623 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1624 print '<td class="nowraponall center">';
1625 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
1626 $selected = 0;
1627 if (in_array($line->id, $arrayofselected)) {
1628 $selected = 1;
1629 }
1630 print '<input id="cb' . $line->id . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $line->id . '"' . ($selected ? ' checked="checked"' : '') . ' />';
1631 }
1632 print '</td>';
1633 if (!$i) {
1634 $totalarray['nbfield']++;
1635 }
1636 }
1637
1638 // Comptabilise le sous-total
1639 $sous_total_debit += $line->debit;
1640 $sous_total_credit += $line->credit;
1641
1642 print "</tr>\n";
1643
1644 $i++;
1645}
1646
1647if ($num > 0 && $colspan > 0) {
1648 print '<tr class="liste_total">';
1649 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("TotalForAccount").' '.$accountg.':</td>';
1650 print '<td class="nowrap right">'.price(price2num($sous_total_debit, 'MT')).'</td>';
1651 print '<td class="nowrap right">'.price(price2num($sous_total_credit, 'MT')).'</td>';
1652 if ($colspanend > 0) {
1653 print '<td colspan="'.$colspanend.'"></td>';
1654 }
1655 print '</tr>';
1656
1657 // Show balance of last shown account
1658 $balance = $sous_total_debit - $sous_total_credit;
1659 print '<tr class="liste_total">';
1660 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("Balance").':</td>';
1661 if ($balance > 0) {
1662 print '<td class="nowraponall right">';
1663 print price(price2num($sous_total_debit - $sous_total_credit, 'MT'));
1664 print '</td>';
1665 print '<td></td>';
1666 } else {
1667 print '<td></td>';
1668 print '<td class="nowraponall right">';
1669 print price(price2num($sous_total_credit - $sous_total_debit, 'MT'));
1670 print '</td>';
1671 }
1672 if ($colspanend > 0) {
1673 print '<td colspan="'.$colspanend.'"></td>';
1674 }
1675 print '</tr>';
1676}
1677
1678
1679// Clean total values to round them
1680if (!empty($totalarray['val']['totaldebit'])) {
1681 $totalarray['val']['totaldebit'] = (float) price2num($totalarray['val']['totaldebit'], 'MT');
1682}
1683if (!empty($totalarray['val']['totalcredit'])) {
1684 $totalarray['val']['totalcredit'] = (float) price2num($totalarray['val']['totalcredit'], 'MT');
1685}
1686if (!empty($totalarray['val']['totalbalance'])) {
1687 $totalarray['val']['totalbalance'] = (float) price2num($totalarray['val']['totaldebit'] - $totalarray['val']['totalcredit'], 'MT');
1688}
1689
1690// Show total line
1691$trforbreaknobg = 1; // used in list_print_total.tpl.php
1692include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1693
1694// If no record found
1695if ($num == 0) {
1696 $colspan = 1;
1697 foreach ($arrayfields as $key => $val) {
1698 if (!empty($val['checked'])) {
1699 $colspan++;
1700 }
1701 }
1702 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1703}
1704
1705$parameters = array('arrayfields' => $arrayfields);
1706$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1707print $hookmanager->resPrint;
1708
1709print "</table>";
1710print '</div>';
1711
1712print '</form>';
1713
1714// End of page
1715llxFooter();
1716$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.