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