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