dolibarr 20.0.2
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 <alexandre@inovea-conseil.com>
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
30require '../../main.inc.php';
31require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
32require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
35require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
36require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
37require_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
72if (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");
81if (empty($page) || $page < 0) {
82 $page = 0;
83}
84$offset = $limit * $page;
85$pageprev = $page - 1;
86$pagenext = $page + 1;
87if (!$sortfield) {
88 $sortfield = "erd.date, erd.rowid";
89}
90if (!$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
107if (!isModEnabled('accounting')) {
109}
110if ($user->socid > 0) {
112}
113if (!$user->hasRight('accounting', 'bind', 'write')) {
115}
116
117
118/*
119 * Actions
120 */
121
122if (GETPOST('cancel', 'alpha')) {
123 $action = 'list';
124 $massaction = '';
125}
126if (!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
132if ($reshook < 0) {
133 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
134}
135
136if (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
169if ($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
212if (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
228llxHeader('', $langs->trans("ExpenseReportsVentilation"), $help_url, '', 0, 0, '', '', '', 'bodyforlist mod-accountancy accountancy-expensereport page-list');
229
230if (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
254if (strlen($search_lineid)) {
255 $sql .= natural_search("er.rowid", $search_lineid, 1);
256}
257if (strlen(trim($search_login))) {
258 $sql .= natural_search("u.login", $search_login);
259}
260if (strlen(trim($search_expensereport))) {
261 $sql .= natural_search("er.ref", $search_expensereport);
262}
263if (strlen(trim($search_label))) {
264 $sql .= natural_search("f.label", $search_label);
265}
266if (strlen(trim($search_desc))) {
267 $sql .= natural_search("erd.comments", $search_desc);
268}
269if (strlen(trim($search_amount))) {
270 $sql .= natural_search("erd.total_ht", $search_amount, 1);
271}
272if (strlen(trim($search_account))) {
273 $sql .= natural_search("aa.account_number", $search_account);
274}
275if (strlen(trim($search_vat))) {
276 $sql .= natural_search("erd.tva_tx", $search_vat, 1);
277}
278if ($search_date_start) {
279 $sql .= " AND erd.date >= '".$db->idate($search_date_start)."'";
280}
281if ($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 = '';
295if (!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
307dol_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
310if ($db->type == 'mysqli') {
311 $db->query("SET SQL_BIG_SELECTS=1");
312}
313
314$result = $db->query($sql);
315if ($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 class="tdoverflowmax150">'.$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}
545if ($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
550print '<script type="text/javascript">
551jQuery(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
562llxFooter();
563$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).
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.
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.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
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.