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