dolibarr  20.0.0-beta
list.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2013-2014 Olivier Geffroy <jeff@jeffinfo.com>
3  * Copyright (C) 2013-2024 Alexandre Spangaro <aspangaro@easya.solutions>
4  * Copyright (C) 2014-2015 Ari Elbaz (elarifr) <github@accedinfo.com>
5  * Copyright (C) 2013-2014 Florian Henry <florian.henry@open-concept.pro>
6  * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
7  * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
8  * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program. If not, see <https://www.gnu.org/licenses/>.
22  */
23 
30 require '../../main.inc.php';
31 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
35 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
37 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
38 
39 // Load translation files required by the page
40 $langs->loadLangs(array("bills", "companies", "compta", "accountancy", "other", "trips", "productbatch", "hrm"));
41 
42 $action = GETPOST('action', 'aZ09');
43 $massaction = GETPOST('massaction', 'alpha');
44 $confirm = GETPOST('confirm', 'alpha');
45 $toselect = GETPOST('toselect', 'array');
46 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'accountancyexpensereportlist'; // To manage different context of search
47 $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
48 
49 
50 // Select Box
51 $mesCasesCochees = GETPOST('toselect', 'array');
52 
53 // Search Getpost
54 $search_login = GETPOST('search_login', 'alpha');
55 $search_lineid = GETPOST('search_lineid', 'alpha');
56 $search_expensereport = GETPOST('search_expensereport', 'alpha');
57 $search_label = GETPOST('search_label', 'alpha');
58 $search_desc = GETPOST('search_desc', 'alpha');
59 $search_amount = GETPOST('search_amount', 'alpha');
60 $search_account = GETPOST('search_account', 'alpha');
61 $search_vat = GETPOST('search_vat', 'alpha');
62 $search_date_startday = GETPOSTINT('search_date_startday');
63 $search_date_startmonth = GETPOSTINT('search_date_startmonth');
64 $search_date_startyear = GETPOSTINT('search_date_startyear');
65 $search_date_endday = GETPOSTINT('search_date_endday');
66 $search_date_endmonth = GETPOSTINT('search_date_endmonth');
67 $search_date_endyear = GETPOSTINT('search_date_endyear');
68 $search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver
69 $search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
70 
71 // Define begin binding date
72 if (empty($search_date_start) && getDolGlobalString('ACCOUNTING_DATE_START_BINDING')) {
73  $search_date_start = $db->idate(getDolGlobalString('ACCOUNTING_DATE_START_BINDING'));
74 }
75 
76 // Load variable for pagination
77 $limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : getDolGlobalString('ACCOUNTING_LIMIT_LIST_VENTILATION', $conf->liste_limit);
78 $sortfield = GETPOST('sortfield', 'aZ09comma');
79 $sortorder = GETPOST('sortorder', 'aZ09comma');
80 $page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
81 if (empty($page) || $page < 0) {
82  $page = 0;
83 }
84 $offset = $limit * $page;
85 $pageprev = $page - 1;
86 $pagenext = $page + 1;
87 if (!$sortfield) {
88  $sortfield = "erd.date, erd.rowid";
89 }
90 if (!$sortorder) {
91  if (getDolGlobalInt('ACCOUNTING_LIST_SORT_VENTILATION_TODO') > 0) {
92  $sortorder = "DESC";
93  } else {
94  $sortorder = "ASC";
95  }
96 }
97 
98 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
99 $hookmanager->initHooks(array('accountancyexpensereportlist'));
100 
101 $formaccounting = new FormAccounting($db);
102 $accounting = new AccountingAccount($db);
103 
104 $chartaccountcode = dol_getIdFromCode($db, getDolGlobalInt('CHARTOFACCOUNTS'), 'accounting_system', 'rowid', 'pcg_version');
105 
106 // Security check
107 if (!isModEnabled('accounting')) {
108  accessforbidden();
109 }
110 if ($user->socid > 0) {
111  accessforbidden();
112 }
113 if (!$user->hasRight('accounting', 'bind', 'write')) {
114  accessforbidden();
115 }
116 
117 
118 /*
119  * Actions
120  */
121 
122 if (GETPOST('cancel', 'alpha')) {
123  $action = 'list';
124  $massaction = '';
125 }
126 if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
127  $massaction = '';
128 }
129 
130 $parameters = array();
131 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
132 if ($reshook < 0) {
133  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
134 }
135 
136 if (empty($reshook)) {
137  // Purge search criteria
138  if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
139  $search_lineid = '';
140  $search_login = '';
141  $search_expensereport = '';
142  $search_label = '';
143  $search_desc = '';
144  $search_amount = '';
145  $search_account = '';
146  $search_vat = '';
147  $search_date_startday = '';
148  $search_date_startmonth = '';
149  $search_date_startyear = '';
150  $search_date_endday = '';
151  $search_date_endmonth = '';
152  $search_date_endyear = '';
153  $search_date_start = '';
154  $search_date_end = '';
155  $search_country = '';
156  $search_tvaintra = '';
157  }
158 
159  // Mass actions
160  $objectclass = 'ExpenseReport';
161  $objectlabel = 'ExpenseReport';
162  $permissiontoread = $user->hasRight('accounting', 'read');
163  $permissiontodelete = $user->hasRight('accounting', 'delete');
164  $uploaddir = $conf->expensereport->dir_output;
165  include DOL_DOCUMENT_ROOT . '/core/actions_massactions.inc.php';
166 }
167 
168 
169 if ($massaction == 'ventil' && $user->hasRight('accounting', 'bind', 'write')) {
170  $msg = '';
171 
172  if (!empty($mesCasesCochees)) {
173  $msg = '<div>'.$langs->trans("SelectedLines").': '.count($mesCasesCochees).'</div>';
174  $msg .= '<div class="detail">';
175  $cpt = 0;
176  $ok = 0;
177  $ko = 0;
178 
179  foreach ($mesCasesCochees as $maLigneCochee) {
180  $maLigneCourante = explode("_", $maLigneCochee);
181  $monId = $maLigneCourante[0];
182  $monCompte = GETPOST('codeventil'.$monId);
183 
184  if ($monCompte <= 0) {
185  $msg .= '<div><span class="error">'.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("NoAccountSelected").'</span></div>';
186  $ko++;
187  } else {
188  $sql = " UPDATE ".MAIN_DB_PREFIX."expensereport_det";
189  $sql .= " SET fk_code_ventilation = ".((int) $monCompte);
190  $sql .= " WHERE rowid = ".((int) $monId);
191 
192  $accountventilated = new AccountingAccount($db);
193  $accountventilated->fetch($monCompte, '', 1);
194 
195  dol_syslog('accountancy/expensereport/list.php:: sql='.$sql, LOG_DEBUG);
196  if ($db->query($sql)) {
197  $msg .= '<div><span class="green">'.$langs->trans("LineOfExpenseReport").' '.$monId.' - '.$langs->trans("VentilatedinAccount").' : '.length_accountg($accountventilated->account_number).'</span></div>';
198  $ok++;
199  } else {
200  $msg .= '<div><span class="error">'.$langs->trans("ErrorDB").' : '.$langs->trans("Lineofinvoice").' '.$monId.' - '.$langs->trans("NotVentilatedinAccount").' : '.length_accountg($accountventilated->account_number).'<br> <pre>'.$sql.'</pre></span></div>';
201  $ko++;
202  }
203  }
204 
205  $cpt++;
206  }
207  $msg .= '</div>';
208  $msg .= '<div>'.$langs->trans("EndProcessing").'</div>';
209  }
210 }
211 
212 if (GETPOST('sortfield') == 'erd.date, erd.rowid') {
213  $value = (GETPOST('sortorder') == 'asc,asc' ? 0 : 1);
214  require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
215  $res = dolibarr_set_const($db, "ACCOUNTING_LIST_SORT_VENTILATION_TODO", $value, 'yesno', 0, '', $conf->entity);
216 }
217 
218 
219 /*
220  * View
221  */
222 
223 $form = new Form($db);
224 $formother = new FormOther($db);
225 
226 $help_url = 'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilit&eacute;_en_Partie_Double#Liaisons_comptables';
227 
228 llxHeader('', $langs->trans("ExpenseReportsVentilation"), $help_url);
229 
230 if (empty($chartaccountcode)) {
231  print $langs->trans("ErrorChartOfAccountSystemNotSelected");
232  // End of page
233  llxFooter();
234  $db->close();
235  exit;
236 }
237 
238 // Expense report lines
239 $sql = "SELECT er.ref, er.rowid as erid, er.date_debut, er.date_valid,";
240 $sql .= " erd.rowid, erd.fk_c_type_fees, erd.comments, erd.total_ht as price, erd.fk_code_ventilation, erd.tva_tx as tva_tx_line, erd.vat_src_code, erd.date,";
241 $sql .= " f.id as type_fees_id, f.code as type_fees_code, f.label as type_fees_label, f.accountancy_code as code_buy,";
242 $sql .= " u.rowid as userid, u.login, u.lastname, u.firstname, u.email, u.gender, u.employee, u.photo, u.statut,";
243 $sql .= " aa.rowid as aarowid";
244 $parameters = array();
245 $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
246 $sql .= $hookmanager->resPrint;
247 $sql .= " FROM ".MAIN_DB_PREFIX."expensereport as er";
248 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."expensereport_det as erd ON er.rowid = erd.fk_expensereport";
249 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_type_fees as f ON f.id = erd.fk_c_type_fees";
250 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON u.rowid = er.fk_user_author";
251 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as aa ON f.accountancy_code = aa.account_number AND aa.fk_pcg_version = '".$db->escape($chartaccountcode)."' AND aa.entity = ".$conf->entity;
252 $sql .= " WHERE er.fk_statut IN (".ExpenseReport::STATUS_APPROVED.", ".ExpenseReport::STATUS_CLOSED.") AND erd.fk_code_ventilation <= 0";
253 // Add search filter like
254 if (strlen($search_lineid)) {
255  $sql .= natural_search("er.rowid", $search_lineid, 1);
256 }
257 if (strlen(trim($search_login))) {
258  $sql .= natural_search("u.login", $search_login);
259 }
260 if (strlen(trim($search_expensereport))) {
261  $sql .= natural_search("er.ref", $search_expensereport);
262 }
263 if (strlen(trim($search_label))) {
264  $sql .= natural_search("f.label", $search_label);
265 }
266 if (strlen(trim($search_desc))) {
267  $sql .= natural_search("erd.comments", $search_desc);
268 }
269 if (strlen(trim($search_amount))) {
270  $sql .= natural_search("erd.total_ht", $search_amount, 1);
271 }
272 if (strlen(trim($search_account))) {
273  $sql .= natural_search("aa.account_number", $search_account);
274 }
275 if (strlen(trim($search_vat))) {
276  $sql .= natural_search("erd.tva_tx", $search_vat, 1);
277 }
278 if ($search_date_start) {
279  $sql .= " AND erd.date >= '".$db->idate($search_date_start)."'";
280 }
281 if ($search_date_end) {
282  $sql .= " AND erd.date <= '".$db->idate($search_date_end)."'";
283 }
284 $sql .= " AND er.entity IN (".getEntity('expensereport', 0).")"; // We don't share object for accountancy
285 
286 // Add where from hooks
287 $parameters = array();
288 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
289 $sql .= $hookmanager->resPrint;
290 
291 $sql .= $db->order($sortfield, $sortorder);
292 
293 // Count total nb of records
294 $nbtotalofrecords = '';
295 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
296  $result = $db->query($sql);
297  $nbtotalofrecords = $db->num_rows($result);
298  if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
299  $page = 0;
300  $offset = 0;
301  }
302 }
303 //print $sql;
304 
305 $sql .= $db->plimit($limit + 1, $offset);
306 
307 dol_syslog("accountancy/expensereport/list.php", LOG_DEBUG);
308 // MAX_JOIN_SIZE can be very low (ex: 300000) on some limited configurations (ex: https://www.online.net/fr/hosting/online-perso)
309 // This big SELECT command may exceed the MAX_JOIN_SIZE limit => Therefore we use SQL_BIG_SELECTS=1 to disable the MAX_JOIN_SIZE security
310 if ($db->type == 'mysqli') {
311  $db->query("SET SQL_BIG_SELECTS=1");
312 }
313 
314 $result = $db->query($sql);
315 if ($result) {
316  $num_lines = $db->num_rows($result);
317  $i = 0;
318 
319  $arrayofselected = is_array($toselect) ? $toselect : array();
320 
321  $param = '';
322  if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
323  $param .= '&contextpage='.urlencode($contextpage);
324  }
325  if ($limit > 0 && $limit != $conf->liste_limit) {
326  $param .= '&limit='.((int) $limit);
327  }
328  if ($search_lineid) {
329  $param .= '&search_lineid='.urlencode($search_lineid);
330  }
331  if ($search_login) {
332  $param .= '&search_login='.urlencode($search_login);
333  }
334  if ($search_date_startday) {
335  $param .= '&search_date_startday='.urlencode((string) ($search_date_startday));
336  }
337  if ($search_date_startmonth) {
338  $param .= '&search_date_startmonth='.urlencode((string) ($search_date_startmonth));
339  }
340  if ($search_date_startyear) {
341  $param .= '&search_date_startyear='.urlencode((string) ($search_date_startyear));
342  }
343  if ($search_date_endday) {
344  $param .= '&search_date_endday='.urlencode((string) ($search_date_endday));
345  }
346  if ($search_date_endmonth) {
347  $param .= '&search_date_endmonth='.urlencode((string) ($search_date_endmonth));
348  }
349  if ($search_date_endyear) {
350  $param .= '&search_date_endyear='.urlencode((string) ($search_date_endyear));
351  }
352  if ($search_expensereport) {
353  $param .= '&search_expensereport='.urlencode($search_expensereport);
354  }
355  if ($search_label) {
356  $param .= '&search_label='.urlencode($search_label);
357  }
358  if ($search_desc) {
359  $param .= '&search_desc='.urlencode($search_desc);
360  }
361  if ($search_amount) {
362  $param .= '&search_amount='.urlencode($search_amount);
363  }
364  if ($search_vat) {
365  $param .= '&search_vat='.urlencode($search_vat);
366  }
367 
368  $arrayofmassactions = array(
369  'ventil' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Ventilate")
370  );
371  $massactionbutton = '';
372  if ($massaction !== 'set_default_account') {
373  $massactionbutton = $form->selectMassAction('ventil', $arrayofmassactions, 1);
374  }
375 
376  print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">'."\n";
377  print '<input type="hidden" name="action" value="ventil">';
378  if ($optioncss != '') {
379  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
380  }
381  print '<input type="hidden" name="token" value="'.newToken().'">';
382  print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
383  print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
384  print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
385  print '<input type="hidden" name="page" value="'.$page.'">';
386 
387  // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
388  print_barre_liste($langs->trans("ExpenseReportLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit);
389 
390  print '<span class="opacitymedium">'.$langs->trans("DescVentilTodoExpenseReport").'</span></br><br>';
391 
392  if (!empty($msg)) {
393  print $msg.'<br>';
394  }
395 
396  $moreforfilter = '';
397 
398  print '<div class="div-table-responsive">';
399  print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
400 
401  // We add search filter
402  print '<tr class="liste_titre_filter">';
403  print '<td class="liste_titre"><input type="text" class="flat maxwidth40" name="search_lineid" value="'.dol_escape_htmltag($search_lineid).'"></td>';
404  print '<td class="liste_titre"><input type="text" name="search_login" class="maxwidth50" value="'.dol_escape_htmltag($search_login).'"></td>';
405  print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_expensereport" value="'.dol_escape_htmltag($search_expensereport).'"></td>';
406  if (getDolGlobalString('ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE')) {
407  print '<td class="liste_titre"></td>';
408  }
409  print '<td class="liste_titre center">';
410  print '<div class="nowrapfordate">';
411  print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
412  print '</div>';
413  print '<div class="nowrapfordate">';
414  print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
415  print '</div>';
416  print '</td>';
417  print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_label" value="'.dol_escape_htmltag($search_label).'"></td>';
418  print '<td class="liste_titre"><input type="text" class="flat maxwidthonsmartphone" name="search_desc" value="'.dol_escape_htmltag($search_desc).'"></td>';
419  print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).'"></td>';
420  print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_vat" placeholder="%" size="1" value="'.dol_escape_htmltag($search_vat).'"></td>';
421  print '<td class="liste_titre"></td>';
422  print '<td class="liste_titre"></td>';
423  print '<td class="center liste_titre">';
424  $searchpicto = $form->showFilterButtons();
425  print $searchpicto;
426  print '</td>';
427  print '</tr>';
428 
429  print '<tr class="liste_titre">';
430  print_liste_field_titre("LineId", $_SERVER["PHP_SELF"], "erd.rowid", "", $param, '', $sortfield, $sortorder);
431  print_liste_field_titre("Employee", $_SERVER['PHP_SELF'], "u.login", $param, "", "", $sortfield, $sortorder);
432  print_liste_field_titre("ExpenseReport", $_SERVER["PHP_SELF"], "er.ref", "", $param, '', $sortfield, $sortorder);
433  if (getDolGlobalString('ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE')) {
434  print_liste_field_titre("DateValidation", $_SERVER["PHP_SELF"], "er.date_valid", "", $param, '', $sortfield, $sortorder, 'center ');
435  }
436  print_liste_field_titre("DateOfLine", $_SERVER["PHP_SELF"], "erd.date, erd.rowid", "", $param, '', $sortfield, $sortorder, 'center ');
437  print_liste_field_titre("TypeFees", $_SERVER["PHP_SELF"], "f.label", "", $param, '', $sortfield, $sortorder);
438  print_liste_field_titre("Description", $_SERVER["PHP_SELF"], "erd.comments", "", $param, '', $sortfield, $sortorder);
439  print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "erd.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 ');
440  print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "erd.tva_tx", "", $param, '', $sortfield, $sortorder, 'right ');
441  print_liste_field_titre("DataUsedToSuggestAccount", '', '', '', '', '', '', '', 'nowraponall ');
442  print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', '');
443  $checkpicto = '';
444  if ($massactionbutton) {
445  $checkpicto = $form->showCheckAddButtons('checkforselect', 1);
446  }
447  print_liste_field_titre($checkpicto, '', '', '', '', '', '', '', 'center ');
448  print "</tr>\n";
449 
450 
451  $expensereport_static = new ExpenseReport($db);
452  $userstatic = new User($db);
453  $form = new Form($db);
454 
455  while ($i < min($num_lines, $limit)) {
456  $objp = $db->fetch_object($result);
457 
458  $objp->aarowid_suggest = '';
459  $objp->aarowid_suggest = $objp->aarowid;
460 
461  $expensereport_static->ref = $objp->ref;
462  $expensereport_static->id = $objp->erid;
463 
464  $userstatic->id = $objp->userid;
465  $userstatic->login = $objp->login;
466  $userstatic->status = $objp->statut;
467  $userstatic->email = $objp->email;
468  $userstatic->gender = $objp->gender;
469  $userstatic->firstname = $objp->firstname;
470  $userstatic->lastname = $objp->lastname;
471  $userstatic->employee = $objp->employee;
472  $userstatic->photo = $objp->photo;
473 
474  print '<tr class="oddeven">';
475 
476  // Line id
477  print '<td>'.$objp->rowid.'</td>';
478 
479  // Login
480  print '<td class="nowraponall">';
481  print $userstatic->getNomUrl(-1, '', 0, 0, 24, 1, 'login', '', 1);
482  print '</td>';
483 
484  // Ref Expense report
485  print '<td>'.$expensereport_static->getNomUrl(1).'</td>';
486 
487  // Date validation
488  if (getDolGlobalString('ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE')) {
489  print '<td class="center">'.dol_print_date($db->jdate($objp->date_valid), 'day').'</td>';
490  }
491 
492  // Date
493  print '<td class="center">'.dol_print_date($db->jdate($objp->date), 'day').'</td>';
494 
495  // Fees label
496  print '<td>';
497  print($langs->trans($objp->type_fees_code) == $objp->type_fees_code ? $objp->type_fees_label : $langs->trans(($objp->type_fees_code)));
498  print '</td>';
499 
500  // Fees description -- Can be null
501  print '<td>';
502  $text = dolGetFirstLineOfText(dol_string_nohtmltag($objp->comments, 1));
503  $trunclength = getDolGlobalInt('ACCOUNTING_LENGTH_DESCRIPTION', 32);
504  print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->comments);
505  print '</td>';
506 
507  // Amount without taxes
508  print '<td class="right nowraponall amount">';
509  print price($objp->price);
510  print '</td>';
511 
512  // Vat rate
513  print '<td class="right">';
514  print vatrate($objp->tva_tx_line.($objp->vat_src_code ? ' ('.$objp->vat_src_code.')' : ''));
515  print '</td>';
516 
517  // Current account
518  print '<td>';
519  print length_accountg(html_entity_decode($objp->code_buy));
520  print '</td>';
521 
522  // Suggested accounting account
523  print '<td>';
524  print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone');
525  print '</td>';
526 
527  print '<td class="center">';
528  print '<input type="checkbox" class="flat checkforselect checkforselect'.$objp->rowid.'" name="toselect[]" value="'.$objp->rowid."_".$i.'"'.($objp->aarowid ? "checked" : "").'/>';
529  print '</td>';
530 
531  print "</tr>";
532  $i++;
533  }
534  if ($num_lines == 0) {
535  print '<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
536  }
537 
538  print '</table>';
539  print "</div>";
540 
541  print '</form>';
542 } else {
543  print $db->error();
544 }
545 if ($db->type == 'mysqli') {
546  $db->query("SET SQL_BIG_SELECTS=0"); // Enable MAX_JOIN_SIZE limitation
547 }
548 
549 // Add code to auto check the box when we select an account
550 print '<script type="text/javascript">
551 jQuery(document).ready(function() {
552  jQuery(".codeventil").change(function() {
553  var s=$(this).attr("id").replace("codeventil", "")
554  console.log(s+" "+$(this).val());
555  if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
556  else jQuery(".checkforselect"+s).prop("checked", true);
557  });
558 });
559 </script>';
560 
561 // End of page
562 llxFooter();
563 $db->close();
if($user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition: card.php:58
length_accountg($account)
Return General accounting account with defined length (used for product and miscellaneous)
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
Definition: admin.lib.php:656
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:55
llxFooter()
Empty footer.
Definition: wrapper.php:69
Class to manage accounting accounts.
Class to manage Trips and Expenses.
const STATUS_CLOSED
Classified paid.
Class to manage generation of HTML components for accounting management.
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 to manage Dolibarr users.
Definition: user.class.php:50
if(isModEnabled('invoice') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&!getDolGlobalString('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') && $user->hasRight('tax', 'charges', 'lire')) if(isModEnabled('invoice') &&isModEnabled('order') && $user->hasRight("commande", "lire") &&!getDolGlobalString('WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER')) $sql
Social contributions to pay.
Definition: index.php:745
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...
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
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.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.