dolibarr 18.0.6
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
28require '../../main.inc.php';
29
30require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
31require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
34require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
36require_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');
75if (empty($page) || $page < 0) {
76 $page = 0;
77}
78$offset = $limit * $page;
79$pageprev = $page - 1;
80$pagenext = $page + 1;
81if (!$sortfield) {
82 $sortfield = "erd.date, erd.rowid";
83}
84if (!$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
101if (!isModEnabled('accounting')) {
103}
104if ($user->socid > 0) {
106}
107if (!$user->hasRight('accounting', 'mouvements', 'lire')) {
109}
110
111
112/*
113 * Actions
114 */
115
116if (GETPOST('cancel', 'alpha')) {
117 $action = 'list'; $massaction = '';
118}
119if (!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
125if ($reshook < 0) {
126 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
127}
128
129if (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
161if ($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
204if (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
218llxHeader('', $langs->trans("ExpenseReportsVentilation"));
219
220if (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
244if (!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
248if (strlen(trim($search_login))) {
249 $sql .= natural_search("u.login", $search_login);
250}
251if (strlen(trim($search_expensereport))) {
252 $sql .= natural_search("er.ref", $search_expensereport);
253}
254if (strlen(trim($search_label))) {
255 $sql .= natural_search("f.label", $search_label);
256}
257if (strlen(trim($search_desc))) {
258 $sql .= natural_search("erd.comments", $search_desc);
259}
260if (strlen(trim($search_amount))) {
261 $sql .= natural_search("erd.total_ht", $search_amount, 1);
262}
263if (strlen(trim($search_account))) {
264 $sql .= natural_search("aa.account_number", $search_account);
265}
266if (strlen(trim($search_vat))) {
267 $sql .= natural_search("erd.tva_tx", $search_vat, 1);
268}
269if ($search_date_start) {
270 $sql .= " AND erd.date >= '".$db->idate($search_date_start)."'";
271}
272if ($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 = '';
286if (!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
297dol_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
300if ($db->type == 'mysqli') {
301 $db->query("SET SQL_BIG_SELECTS=1");
302}
303
304$result = $db->query($sql);
305if ($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}
531if ($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
536print '<script type="text/javascript">
537jQuery(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
548llxFooter();
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).
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.
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.
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.