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