dolibarr 21.0.3
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-2025 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 !== false && $db->num_rows($res) > 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['account_number'])."'";
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 if (getDolGlobalString('ACCOUNTANCY_COMBO_FOR_AUX')) {
805 $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), 'maxwidth200');
806 } else {
807 $moreforfilter .= '<input type="text" class="maxwidth150" name="search_accountancy_code_start" value="'.dol_escape_htmltag($search_accountancy_code_start).'" placeholder="'.$langs->trans('From').'">';
808 }
809} else {
810 $moreforfilter .= $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth200');
811}
812$moreforfilter .= ' ';
813if ($type == 'sub') {
814 if (getDolGlobalString('ACCOUNTANCY_COMBO_FOR_AUX')) {
815 $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), 'maxwidth200');
816 } else {
817 $moreforfilter .= '<input type="text" class="maxwidth150" name="search_accountancy_code_end" value="'.dol_escape_htmltag($search_accountancy_code_end).'" placeholder="'.$langs->trans('to').'">';
818 }
819} else {
820 $moreforfilter .= $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth200');
821}
822$stringforfirstkey = $langs->trans("KeyboardShortcut");
823if ($conf->browser->name == 'chrome') {
824 $stringforfirstkey .= ' ALT +';
825} elseif ($conf->browser->name == 'firefox') {
826 $stringforfirstkey .= ' ALT + SHIFT +';
827} else {
828 $stringforfirstkey .= ' CTL +';
829}
830$moreforfilter .= '&nbsp;&nbsp;&nbsp;<a id="previous_account" accesskey="p" title="' . $stringforfirstkey . ' p" class="classfortooltip" href="#"><i class="fa fa-chevron-left"></i></a>';
831$moreforfilter .= '&nbsp;&nbsp;&nbsp;<a id="next_account" accesskey="n" title="' . $stringforfirstkey . ' n" class="classfortooltip" href="#"><i class="fa fa-chevron-right"></i></a>';
832$moreforfilter .= <<<SCRIPT
833<script type="text/javascript">
834 jQuery(document).ready(function() {
835 var searchFormList = $('#searchFormList');
836 var searchAccountancyCodeStart = $('#search_accountancy_code_start');
837 var searchAccountancyCodeEnd = $('#search_accountancy_code_end');
838 jQuery('#previous_account').on('click', function() {
839 var previousOption = searchAccountancyCodeStart.find('option:selected').prev('option');
840 if (previousOption.length == 1) searchAccountancyCodeStart.val(previousOption.attr('value'));
841 searchAccountancyCodeEnd.val(searchAccountancyCodeStart.val());
842 searchFormList.submit();
843 });
844 jQuery('#next_account').on('click', function() {
845 var nextOption = searchAccountancyCodeStart.find('option:selected').next('option');
846 if (nextOption.length == 1) searchAccountancyCodeStart.val(nextOption.attr('value'));
847 searchAccountancyCodeEnd.val(searchAccountancyCodeStart.val());
848 searchFormList.submit();
849 });
850 jQuery('input[name="search_mvt_num"]').on("keypress", function(event) {
851 console.log(event);
852 });
853 });
854</script>
855SCRIPT;
856$moreforfilter .= '</div>';
857$moreforfilter .= '</div>';
858
859$moreforfilter .= '<div class="divsearchfield">';
860$moreforfilter .= $langs->trans('AccountingCategory').': ';
861$moreforfilter .= '<div class="nowrap inline-block">';
862$moreforfilter .= $formaccounting->select_accounting_category($search_account_category, 'search_account_category', 1, 0, 0, 0);
863$moreforfilter .= '</div>';
864$moreforfilter .= '</div>';
865
866$parameters = array();
867$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
868if (empty($reshook)) {
869 $moreforfilter .= $hookmanager->resPrint;
870} else {
871 $moreforfilter = $hookmanager->resPrint;
872}
873
874print '<div class="liste_titre liste_titre_bydiv centpercent">';
875print $moreforfilter;
876print '</div>';
877
878print '<div class="div-table-responsive">';
879print '<table class="tagtable liste centpercent listwithfilterbefore">';
880
881// Filters lines
882print '<tr class="liste_titre_filter">';
883// Action column
884if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
885 print '<td class="liste_titre center">';
886 $searchpicto = $form->showFilterButtons('left');
887 print $searchpicto;
888 print '</td>';
889}
890// Movement number
891if (!empty($arrayfields['t.piece_num']['checked'])) {
892 print '<td class="liste_titre"><input type="text" name="search_mvt_num" class="width50" value="'.dol_escape_htmltag($search_mvt_num).'"></td>';
893}
894// Code journal
895if (!empty($arrayfields['t.code_journal']['checked'])) {
896 print '<td class="liste_titre center">';
897 print $formaccounting->multi_select_journal($search_ledger_code, 'search_ledger_code', 0, 1, 1, 1, 'maxwidth75');
898 print '</td>';
899}
900// Date document
901if (!empty($arrayfields['t.doc_date']['checked'])) {
902 print '<td class="liste_titre center">';
903 print '<div class="nowrapfordate">';
904 print $form->selectDate($search_date_start, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
905 print '</div>';
906 print '<div class="nowrapfordate">';
907 print $form->selectDate($search_date_end, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
908 print '</div>';
909 print '</td>';
910}
911// Ref document
912if (!empty($arrayfields['t.doc_ref']['checked'])) {
913 print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_doc_ref" value="'.dol_escape_htmltag($search_doc_ref).'"/></td>';
914}
915// Label operation
916if (!empty($arrayfields['t.label_operation']['checked'])) {
917 print '<td class="liste_titre"><input type="text" size="7" class="flat" name="search_label_operation" value="'.dol_escape_htmltag($search_label_operation).'"/></td>';
918}
919// Lettering code
920if (!empty($arrayfields['t.lettering_code']['checked'])) {
921 print '<td class="liste_titre center">';
922 print '<input type="text" size="3" class="flat" name="search_lettering_code" value="'.$search_lettering_code.'"/>';
923 print '<br><span class="nowrap"><input type="checkbox" name="search_not_reconciled" value="notreconciled"'.($search_not_reconciled == 'notreconciled' ? ' checked' : '').'>'.$langs->trans("NotReconciled").'</span>';
924 print '</td>';
925}
926// Debit
927if (!empty($arrayfields['t.debit']['checked'])) {
928 print '<td class="liste_titre right"><input type="text" class="flat" name="search_debit" size="4" value="'.dol_escape_htmltag($search_debit).'"></td>';
929}
930// Credit
931if (!empty($arrayfields['t.credit']['checked'])) {
932 print '<td class="liste_titre right"><input type="text" class="flat" name="search_credit" size="4" value="'.dol_escape_htmltag($search_credit).'"></td>';
933}
934// Balance
935if (!empty($arrayfields['t.balance']['checked'])) {
936 print '<td></td>';
937}
938// Date export
939if (!empty($arrayfields['t.date_export']['checked'])) {
940 print '<td class="liste_titre center">';
941 print '<div class="nowrapfordate">';
942 print $form->selectDate($search_date_export_start, 'search_date_export_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
943 print '</div>';
944 print '<div class="nowrapfordate">';
945 print $form->selectDate($search_date_export_end, 'search_date_export_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
946 print '</div>';
947 print '</td>';
948}
949// Date validation
950if (!empty($arrayfields['t.date_validated']['checked'])) {
951 print '<td class="liste_titre center">';
952 print '<div class="nowrapfordate">';
953 print $form->selectDate($search_date_validation_start, 'search_date_validation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
954 print '</div>';
955 print '<div class="nowrapfordate">';
956 print $form->selectDate($search_date_validation_end, 'search_date_validation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
957 print '</div>';
958 print '</td>';
959}
960// Due date start and end
961if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
962 print '<td class="liste_titre center">';
963 print '<div class="nowrapfordate">';
964 print $form->selectDate($search_date_due_start, 'search_date_due_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
965 print '</div>';
966 print '<div class="nowrapfordate">';
967 print $form->selectDate($search_date_due_end, 'search_date_due_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
968 print '</div>';
969 print '</td>';
970}
971if (!empty($arrayfields['t.import_key']['checked'])) {
972 print '<td class="liste_titre center">';
973 print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="'.dol_escape_htmltag($search_import_key).'">';
974 print '</td>';
975}
976
977// Fields from hook
978$parameters = array('arrayfields' => $arrayfields);
979$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
980print $hookmanager->resPrint;
981
982// Action column
983if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
984 print '<td class="liste_titre center">';
985 $searchpicto = $form->showFilterButtons();
986 print $searchpicto;
987 print '</td>';
988}
989print "</tr>\n";
990
991print '<tr class="liste_titre">';
992if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
993 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
994}
995if (!empty($arrayfields['t.piece_num']['checked'])) {
996 print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder, 'tdoverflowmax80imp ');
997}
998if (!empty($arrayfields['t.code_journal']['checked'])) {
999 print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center ');
1000}
1001if (!empty($arrayfields['t.doc_date']['checked'])) {
1002 print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center ');
1003}
1004if (!empty($arrayfields['t.doc_ref']['checked'])) {
1005 print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder);
1006}
1007if (!empty($arrayfields['t.label_operation']['checked'])) {
1008 print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder);
1009}
1010if (!empty($arrayfields['t.lettering_code']['checked'])) {
1011 print_liste_field_titre($arrayfields['t.lettering_code']['label'], $_SERVER['PHP_SELF'], "t.lettering_code", "", $param, '', $sortfield, $sortorder, 'center ');
1012}
1013if (!empty($arrayfields['t.debit']['checked'])) {
1014 print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right ');
1015}
1016if (!empty($arrayfields['t.credit']['checked'])) {
1017 print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right ');
1018}
1019if (!empty($arrayfields['t.balance']['checked'])) {
1020 print_liste_field_titre($arrayfields['t.balance']['label'], "", "", "", $param, '', $sortfield, $sortorder, 'right ');
1021}
1022if (!empty($arrayfields['t.date_export']['checked'])) {
1023 print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export", "", $param, '', $sortfield, $sortorder, 'center ');
1024}
1025if (!empty($arrayfields['t.date_validated']['checked'])) {
1026 print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated", "", $param, '', $sortfield, $sortorder, 'center ');
1027}
1028// Due date
1029if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1030 print_liste_field_titre($arrayfields['t.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], 't.date_lim_reglement', '', $param, '', $sortfield, $sortorder, 'center ');
1031}
1032if (!empty($arrayfields['t.import_key']['checked'])) {
1033 print_liste_field_titre($arrayfields['t.import_key']['label'], $_SERVER["PHP_SELF"], "t.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
1034}
1035// Hook fields
1036$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1037$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1038print $hookmanager->resPrint;
1039if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1040 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1041}
1042print "</tr>\n";
1043
1044$displayed_account_number = null; // Start with undefined to be able to distinguish with empty
1045
1046$objectstatic = null; // Init for static analysis
1047$objectlink = ''; // Init for static analysis
1048$result = -1; // Init for static analysis
1049
1050// Loop on record
1051// --------------------------------------------------------------------
1052$i = 0;
1053
1054$totalarray = array();
1055$totalarray['nbfield'] = 0;
1056$sous_total_debit = 0;
1057$sous_total_credit = 0;
1058$totalarray['val'] = array();
1059$totalarray['val']['totaldebit'] = 0;
1060$totalarray['val']['totalcredit'] = 0;
1061$totalarray['val']['totalbalance'] = 0;
1062
1063// Init for static analysis
1064$colspan = 0; // colspan before field 'label of operation'
1065$colspanend = 0; // colspan after debit/credit
1066$accountg = '-';
1067
1068$colspan = 0; // colspan before field 'label of operation'
1069$colspanend = 3; // colspan after debit/credit
1070if (!empty($arrayfields['t.piece_num']['checked'])) { $colspan++; }
1071if (!empty($arrayfields['t.code_journal']['checked'])) { $colspan++; }
1072if (!empty($arrayfields['t.doc_date']['checked'])) { $colspan++; }
1073if (!empty($arrayfields['t.doc_ref']['checked'])) { $colspan++; }
1074if (!empty($arrayfields['t.label_operation']['checked'])) { $colspan++; }
1075if (!empty($arrayfields['t.date_export']['checked'])) { $colspanend++; }
1076if (!empty($arrayfields['t.date_validated']['checked'])) { $colspanend++; }
1077if (!empty($arrayfields['t.lettering_code']['checked'])) { $colspanend++; }
1078if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1079 $colspan++;
1080 $colspanend--;
1081}
1082
1083while ($i < min($num, $limit)) {
1084 $line = $object->lines[$i];
1085
1086 if ($type == 'sub') {
1087 $accountg = length_accounta($line->subledger_account);
1088 } else {
1089 $accountg = length_accountg($line->numero_compte);
1090 }
1091 //if (empty($accountg)) $accountg = '-';
1092
1093 $colspan = 0; // colspan before field 'label of operation'
1094 $colspanend = 0; // colspan after debit/credit
1095 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1096 $colspan++;
1097 }
1098 if (!empty($arrayfields['t.piece_num']['checked'])) {
1099 $colspan++;
1100 }
1101 if (!empty($arrayfields['t.code_journal']['checked'])) {
1102 $colspan++;
1103 }
1104 if (!empty($arrayfields['t.doc_date']['checked'])) {
1105 $colspan++;
1106 }
1107 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1108 $colspan++;
1109 }
1110 if (!empty($arrayfields['t.label_operation']['checked'])) {
1111 $colspan++;
1112 }
1113 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1114 $colspan++;
1115 }
1116
1117 if (!empty($arrayfields['t.balance']['checked'])) {
1118 $colspanend++;
1119 }
1120 if (!empty($arrayfields['t.date_export']['checked'])) {
1121 $colspanend++;
1122 }
1123 if (!empty($arrayfields['t.date_validated']['checked'])) {
1124 $colspanend++;
1125 }
1126 // Due date
1127 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1128 $colspanend++;
1129 }
1130 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1131 $colspanend++;
1132 }
1133 if (!empty($arrayfields['t.import_key']['checked'])) {
1134 $colspanend++;
1135 }
1136 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1137 $colspan++;
1138 $colspanend--;
1139 }
1140
1141 // Is it a break ?
1142 if ($accountg != $displayed_account_number || !isset($displayed_account_number)) {
1143 // Show a subtotal by accounting account
1144 if (isset($displayed_account_number)) {
1145 print '<tr class="liste_total">';
1146 if ($type == 'sub') {
1147 print '<td class="right" colspan="' . $colspan . '">' . $langs->trans("TotalForAccount") . ' ' . length_accounta($displayed_account_number) . ':</td>';
1148 } else {
1149 print '<td class="right" colspan="' . $colspan . '">' . $langs->trans("TotalForAccount") . ' ' . length_accountg($displayed_account_number) . ':</td>';
1150 }
1151 print '<td class="nowrap right">'.price(price2num($sous_total_debit, 'MT')).'</td>';
1152 print '<td class="nowrap right">'.price(price2num($sous_total_credit, 'MT')).'</td>';
1153 if ($colspanend > 0) {
1154 print '<td colspan="'.$colspanend.'"></td>';
1155 }
1156 print '</tr>';
1157 // Show balance of last shown account
1158 $balance = $sous_total_debit - $sous_total_credit;
1159 print '<tr class="liste_total">';
1160 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("Balance").':</td>';
1161 if ($balance > 0) {
1162 print '<td class="nowraponall right">';
1163 print price(price2num($sous_total_debit - $sous_total_credit, 'MT'));
1164 print '</td>';
1165 print '<td></td>';
1166 } else {
1167 print '<td></td>';
1168 print '<td class="nowraponall right">';
1169 print price(price2num($sous_total_credit - $sous_total_debit, 'MT'));
1170 print '</td>';
1171 }
1172 if ($colspanend > 0) {
1173 print '<td colspan="'.$colspanend.'"></td>';
1174 }
1175 print '</tr>';
1176 }
1177
1178 // Show the break account
1179 print '<tr class="trforbreak">';
1180 print '<td colspan="'.($totalarray['nbfield'] ? $totalarray['nbfield'] : count($arrayfields) + 1).'" class="tdforbreak">';
1181 if ($type == 'sub') {
1182 if ($line->subledger_account != "" && $line->subledger_account != '-1') {
1183 print empty($line->subledger_label) ? '<span class="error">'.$langs->trans("Unknown").'</span>' : $line->subledger_label;
1184 print ' : ';
1185 print length_accounta($line->subledger_account);
1186 } else {
1187 // Should not happen: subledger account must be null or a non empty value
1188 print '<span class="error">' . $langs->trans("Unknown");
1189 if ($line->subledger_label) {
1190 print ' (' . $line->subledger_label . ')';
1191 $htmltext = 'EmptyStringForSubledgerAccountButSubledgerLabelDefined';
1192 } else {
1193 $htmltext = 'EmptyStringForSubledgerAccountAndSubledgerLabel';
1194 }
1195 print $form->textwithpicto('', $htmltext);
1196 print '</span>';
1197 }
1198 } else {
1199 if ($line->numero_compte != "" && $line->numero_compte != '-1') {
1200 print length_accountg($line->numero_compte) . ' : ' . $object->get_compte_desc($line->numero_compte);
1201 } else {
1202 print '<span class="error">' . $langs->trans("Unknown") . '</span>';
1203 }
1204 }
1205 print '</td>';
1206 print '</tr>';
1207
1208 $displayed_account_number = $accountg;
1209 //if (empty($displayed_account_number)) $displayed_account_number='-';
1210 $sous_total_debit = 0;
1211 $sous_total_credit = 0;
1212 }
1213
1214 print '<tr class="oddeven">';
1215 // Action column
1216 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1217 print '<td class="nowraponall center">';
1218 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
1219 $selected = 0;
1220 if (in_array($line->id, $arrayofselected)) {
1221 $selected = 1;
1222 }
1223 print '<input id="cb' . $line->id . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $line->id . '"' . ($selected ? ' checked="checked"' : '') . ' />';
1224 }
1225 print '</td>';
1226 if (!$i) {
1227 $totalarray['nbfield']++;
1228 }
1229 }
1230 // Piece number
1231 if (!empty($arrayfields['t.piece_num']['checked'])) {
1232 print '<td>';
1233 $object->id = $line->id;
1234 $object->piece_num = $line->piece_num;
1235 print $object->getNomUrl(1, '', 0, '', 1);
1236 print '</td>';
1237 if (!$i) {
1238 $totalarray['nbfield']++;
1239 }
1240 }
1241
1242 // Journal code
1243 if (!empty($arrayfields['t.code_journal']['checked'])) {
1244 $accountingjournal = new AccountingJournal($db);
1245 $result = $accountingjournal->fetch(0, $line->code_journal);
1246 $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal);
1247 print '<td class="center tdoverflowmax80">'.$journaltoshow.'</td>';
1248 if (!$i) {
1249 $totalarray['nbfield']++;
1250 }
1251 }
1252
1253 // Document date
1254 if (!empty($arrayfields['t.doc_date']['checked'])) {
1255 print '<td class="center">'.dol_print_date($line->doc_date, 'day').'</td>';
1256 if (!$i) {
1257 $totalarray['nbfield']++;
1258 }
1259 }
1260
1261 // Document ref
1262 $modulepart = '';
1263 if (!empty($arrayfields['t.doc_ref']['checked'])) {
1264 if ($line->doc_type == 'customer_invoice') {
1265 $langs->loadLangs(array('bills'));
1266
1267 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1268 $objectstatic = new Facture($db);
1269 $objectstatic->fetch($line->fk_doc);
1270 //$modulepart = 'facture';
1271
1272 $filename = dol_sanitizeFileName($line->doc_ref);
1273 $filedir = $conf->facture->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1274 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1275 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1276 } elseif ($line->doc_type == 'supplier_invoice') {
1277 $langs->loadLangs(array('bills'));
1278
1279 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1280 $objectstatic = new FactureFournisseur($db);
1281 $objectstatic->fetch($line->fk_doc);
1282
1283 $modulepart = 'invoice_supplier';
1284 $filename = dol_sanitizeFileName($line->doc_ref);
1285 $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($line->fk_doc, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1286 $subdir = get_exdir($objectstatic->id, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref);
1287 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $subdir, $filedir);
1288 } elseif ($line->doc_type == 'expense_report') {
1289 $langs->loadLangs(array('trips'));
1290
1291 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
1292 $objectstatic = new ExpenseReport($db);
1293 $objectstatic->fetch($line->fk_doc);
1294 //$modulepart = 'expensereport';
1295
1296 $filename = dol_sanitizeFileName($line->doc_ref);
1297 $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($line->doc_ref);
1298 $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id;
1299 $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1300 } elseif ($line->doc_type == 'bank') {
1301 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1302 $objectstatic = new AccountLine($db);
1303 $objectstatic->fetch($line->fk_doc);
1304 } else {
1305 // Other type
1306 }
1307
1308 print '<td class="tdoverflowmax250">';
1309
1310 // Picto + Ref
1311 if ($line->doc_type == 'customer_invoice' || $line->doc_type == 'supplier_invoice' || $line->doc_type == 'expense_report') {
1312 print $objectstatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1);
1313 print $documentlink;
1314 } elseif ($line->doc_type == 'bank') {
1315 print $objectstatic->getNomUrl(1);
1316 $bank_ref = strstr($line->doc_ref, '-');
1317 print " " . $bank_ref;
1318 } else {
1319 print $line->doc_ref;
1320 }
1321
1322 print "</td>\n";
1323 if (!$i) {
1324 $totalarray['nbfield']++;
1325 }
1326 }
1327
1328 // Label operation
1329 if (!empty($arrayfields['t.label_operation']['checked'])) {
1330 // Show a link to the customer/supplier invoice
1331 $doc_ref = preg_replace('/\‍(.*\‍)/', '', $line->doc_ref);
1332 if (strlen(length_accounta($line->subledger_account)) == 0) {
1333 print '<td class="small tdoverflowmax350 classfortooltip" title="'.dol_escape_htmltag($line->label_operation).'">'.dol_escape_htmltag($line->label_operation).'</td>';
1334 } else {
1335 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>';
1336 }
1337 if (!$i) {
1338 $totalarray['nbfield']++;
1339 }
1340 }
1341
1342 // Lettering code
1343 if (!empty($arrayfields['t.lettering_code']['checked'])) {
1344 print '<td class="center">'.dol_escape_htmltag($line->lettering_code).'</td>';
1345 if (!$i) {
1346 $totalarray['nbfield']++;
1347 }
1348 }
1349
1350 // Amount debit
1351 if (!empty($arrayfields['t.debit']['checked'])) {
1352 print '<td class="right nowraponall amount">'.($line->debit != 0 ? price($line->debit) : '').'</td>';
1353 if (!$i) {
1354 $totalarray['nbfield']++;
1355 }
1356 if (!$i) {
1357 $totalarray['pos'][$totalarray['nbfield']] = 'totaldebit';
1358 }
1359 $totalarray['val']['totaldebit'] += (float) $line->debit;
1360 }
1361
1362 // Amount credit
1363 if (!empty($arrayfields['t.credit']['checked'])) {
1364 print '<td class="right nowraponall amount">'.($line->credit != 0 ? price($line->credit) : '').'</td>';
1365 if (!$i) {
1366 $totalarray['nbfield']++;
1367 }
1368 if (!$i) {
1369 $totalarray['pos'][$totalarray['nbfield']] = 'totalcredit';
1370 }
1371 $totalarray['val']['totalcredit'] += (float) $line->credit;
1372 }
1373
1374 // Amount balance
1375 if (!empty($arrayfields['t.balance']['checked'])) {
1376 print '<td class="right nowraponall amount">'.price(price2num($sous_total_debit + $line->debit - $sous_total_credit - $line->credit, 'MT')).'</td>';
1377 if (!$i) {
1378 $totalarray['nbfield']++;
1379 }
1380 if (!$i) {
1381 $totalarray['pos'][$totalarray['nbfield']] = 'totalbalance';
1382 };
1383 $totalarray['val']['totalbalance'] += $line->debit - $line->credit;
1384 }
1385
1386 // Exported operation date
1387 if (!empty($arrayfields['t.date_export']['checked'])) {
1388 print '<td class="center">'.dol_print_date($line->date_export, 'dayhour').'</td>';
1389 if (!$i) {
1390 $totalarray['nbfield']++;
1391 }
1392 }
1393
1394 // Validated operation date
1395 if (!empty($arrayfields['t.date_validated']['checked'])) {
1396 print '<td class="center">'.dol_print_date($line->date_validation, 'dayhour').'</td>';
1397 if (!$i) {
1398 $totalarray['nbfield']++;
1399 }
1400 }
1401
1402 // Due date
1403 if (!empty($arrayfields['t.date_lim_reglement']['checked'])) {
1404 print '<td class="center">'.dol_print_date($line->date_lim_reglement, 'day').'</td>';
1405 if (!$i) {
1406 $totalarray['nbfield']++;
1407 }
1408 }
1409
1410 if (!empty($arrayfields['t.import_key']['checked'])) {
1411 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($line->import_key).'">'.dol_escape_htmltag($line->import_key)."</td>\n";
1412 if (!$i) {
1413 $totalarray['nbfield']++;
1414 }
1415 }
1416
1417 // Fields from hook
1418 $parameters = array('arrayfields' => $arrayfields, 'obj' => $line);
1419 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1420 print $hookmanager->resPrint;
1421
1422 // Action column
1423 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1424 print '<td class="nowraponall center">';
1425 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
1426 $selected = 0;
1427 if (in_array($line->id, $arrayofselected)) {
1428 $selected = 1;
1429 }
1430 print '<input id="cb' . $line->id . '" class="flat checkforselect" type="checkbox" name="toselect[]" value="' . $line->id . '"' . ($selected ? ' checked="checked"' : '') . ' />';
1431 }
1432 print '</td>';
1433 if (!$i) {
1434 $totalarray['nbfield']++;
1435 }
1436 }
1437
1438 // Comptabilise le sous-total
1439 $sous_total_debit += $line->debit;
1440 $sous_total_credit += $line->credit;
1441
1442 print "</tr>\n";
1443
1444 $i++;
1445}
1446
1447if ($num > 0 && $colspan > 0) {
1448 print '<tr class="liste_total">';
1449 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("TotalForAccount").' '.$accountg.':</td>';
1450 print '<td class="nowrap right">'.price(price2num($sous_total_debit, 'MT')).'</td>';
1451 print '<td class="nowrap right">'.price(price2num($sous_total_credit, 'MT')).'</td>';
1452 if ($colspanend > 0) {
1453 print '<td colspan="'.$colspanend.'"></td>';
1454 }
1455 print '</tr>';
1456 // Show balance of last shown account
1457 $balance = $sous_total_debit - $sous_total_credit;
1458 print '<tr class="liste_total">';
1459 print '<td class="right" colspan="'.$colspan.'">'.$langs->trans("Balance").':</td>';
1460 if ($balance > 0) {
1461 print '<td class="nowraponall right">';
1462 print price(price2num($sous_total_debit - $sous_total_credit, 'MT'));
1463 print '</td>';
1464 print '<td></td>';
1465 } else {
1466 print '<td></td>';
1467 print '<td class="nowraponall right">';
1468 print price(price2num($sous_total_credit - $sous_total_debit, 'MT'));
1469 print '</td>';
1470 }
1471 if ($colspanend > 0) {
1472 print '<td colspan="'.$colspanend.'"></td>';
1473 }
1474 print '</tr>';
1475}
1476
1477
1478// Clean total values to round them
1479if (!empty($totalarray['val']['totaldebit'])) {
1480 $totalarray['val']['totaldebit'] = (float) price2num($totalarray['val']['totaldebit'], 'MT');
1481}
1482if (!empty($totalarray['val']['totalcredit'])) {
1483 $totalarray['val']['totalcredit'] = (float) price2num($totalarray['val']['totalcredit'], 'MT');
1484}
1485if (!empty($totalarray['val']['totalbalance'])) {
1486 $totalarray['val']['totalbalance'] = (float) price2num($totalarray['val']['totaldebit'] - $totalarray['val']['totalcredit'], 'MT');
1487}
1488
1489// Show total line
1490include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1491
1492// If no record found
1493if ($num == 0) {
1494 $colspan = 1;
1495 foreach ($arrayfields as $key => $val) {
1496 if (!empty($val['checked'])) {
1497 $colspan++;
1498 }
1499 }
1500 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1501}
1502
1503$parameters = array('arrayfields' => $arrayfields);
1504$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1505print $hookmanager->resPrint;
1506
1507print "</table>";
1508print '</div>';
1509
1510// TODO Replace this with mass delete action
1511//if ($user->hasRight('accounting', 'mouvements, 'supprimer_tous')) {
1512// print '<div class="tabsAction tabsActionNoBottom">'."\n";
1513// print '<a class="butActionDelete" name="button_delmvt" href="'.$_SERVER["PHP_SELF"].'?action=delbookkeepingyear&token='.newToken().($param ? '&'.$param : '').'">'.$langs->trans("DeleteMvt").'</a>';
1514// print '</div>';
1515//}
1516
1517print '</form>';
1518
1519// End of page
1520llxFooter();
1521$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.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:87
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
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, $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.
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, $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
$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:150
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.