dolibarr 21.0.0-alpha
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 a technical object to manage hooks of page. Note that conf->hooks_modules contains an 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, getDolGlobalString('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").'<br><span class="opacitymedium small">'.$langs->trans("DescVentilTodoExpenseReport").'</span>', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit, 0, 0, 1);
389
390 if (!empty($msg)) {
391 print $msg.'<br>';
392 }
393
394 $moreforfilter = '';
395
396 print '<div class="div-table-responsive">';
397 print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
398
399 // We add search filter
400 print '<tr class="liste_titre_filter">';
401 print '<td class="liste_titre"><input type="text" class="flat maxwidth40" name="search_lineid" value="'.dol_escape_htmltag($search_lineid).'"></td>';
402 print '<td class="liste_titre"><input type="text" name="search_login" class="maxwidth50" value="'.dol_escape_htmltag($search_login).'"></td>';
403 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_expensereport" value="'.dol_escape_htmltag($search_expensereport).'"></td>';
404 if (getDolGlobalString('ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE')) {
405 print '<td class="liste_titre"></td>';
406 }
407 print '<td class="liste_titre center">';
408 print '<div class="nowrapfordate">';
409 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
410 print '</div>';
411 print '<div class="nowrapfordate">';
412 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
413 print '</div>';
414 print '</td>';
415 print '<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_label" value="'.dol_escape_htmltag($search_label).'"></td>';
416 print '<td class="liste_titre"><input type="text" class="flat maxwidthonsmartphone" name="search_desc" value="'.dol_escape_htmltag($search_desc).'"></td>';
417 print '<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).'"></td>';
418 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>';
419 print '<td class="liste_titre"></td>';
420 print '<td class="liste_titre"></td>';
421 print '<td class="center liste_titre">';
422 $searchpicto = $form->showFilterButtons();
423 print $searchpicto;
424 print '</td>';
425 print '</tr>';
426
427 print '<tr class="liste_titre">';
428 print_liste_field_titre("LineId", $_SERVER["PHP_SELF"], "erd.rowid", "", $param, '', $sortfield, $sortorder);
429 print_liste_field_titre("Employee", $_SERVER['PHP_SELF'], "u.login", $param, "", "", $sortfield, $sortorder);
430 print_liste_field_titre("ExpenseReport", $_SERVER["PHP_SELF"], "er.ref", "", $param, '', $sortfield, $sortorder);
431 if (getDolGlobalString('ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE')) {
432 print_liste_field_titre("DateValidation", $_SERVER["PHP_SELF"], "er.date_valid", "", $param, '', $sortfield, $sortorder, 'center ');
433 }
434 print_liste_field_titre("DateOfLine", $_SERVER["PHP_SELF"], "erd.date, erd.rowid", "", $param, '', $sortfield, $sortorder, 'center ');
435 print_liste_field_titre("TypeFees", $_SERVER["PHP_SELF"], "f.label", "", $param, '', $sortfield, $sortorder);
436 print_liste_field_titre("Description", $_SERVER["PHP_SELF"], "erd.comments", "", $param, '', $sortfield, $sortorder);
437 print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "erd.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 ');
438 print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "erd.tva_tx", "", $param, '', $sortfield, $sortorder, 'right ');
439 print_liste_field_titre("DataUsedToSuggestAccount", '', '', '', '', '', '', '', 'nowraponall ');
440 print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', '');
441 $checkpicto = '';
442 if ($massactionbutton) {
443 $checkpicto = $form->showCheckAddButtons('checkforselect', 1);
444 }
445 print_liste_field_titre($checkpicto, '', '', '', '', '', '', '', 'center ');
446 print "</tr>\n";
447
448
449 $expensereport_static = new ExpenseReport($db);
450 $userstatic = new User($db);
451 $form = new Form($db);
452
453 while ($i < min($num_lines, $limit)) {
454 $objp = $db->fetch_object($result);
455
456 $objp->aarowid_suggest = '';
457 $objp->aarowid_suggest = $objp->aarowid;
458
459 $expensereport_static->ref = $objp->ref;
460 $expensereport_static->id = $objp->erid;
461
462 $userstatic->id = $objp->userid;
463 $userstatic->login = $objp->login;
464 $userstatic->status = $objp->statut;
465 $userstatic->email = $objp->email;
466 $userstatic->gender = $objp->gender;
467 $userstatic->firstname = $objp->firstname;
468 $userstatic->lastname = $objp->lastname;
469 $userstatic->employee = $objp->employee;
470 $userstatic->photo = $objp->photo;
471
472 print '<tr class="oddeven">';
473
474 // Line id
475 print '<td>'.$objp->rowid.'</td>';
476
477 // Login
478 print '<td class="nowraponall">';
479 print $userstatic->getNomUrl(-1, '', 0, 0, 24, 1, 'login', '', 1);
480 print '</td>';
481
482 // Ref Expense report
483 print '<td class="tdoverflowmax150">'.$expensereport_static->getNomUrl(1).'</td>';
484
485 // Date validation
486 if (getDolGlobalString('ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE')) {
487 print '<td class="center">'.dol_print_date($db->jdate($objp->date_valid), 'day').'</td>';
488 }
489
490 // Date
491 print '<td class="center">'.dol_print_date($db->jdate($objp->date), 'day').'</td>';
492
493 // Fees label
494 print '<td>';
495 print($langs->trans($objp->type_fees_code) == $objp->type_fees_code ? $objp->type_fees_label : $langs->trans(($objp->type_fees_code)));
496 print '</td>';
497
498 // Fees description -- Can be null
499 print '<td>';
500 $text = dolGetFirstLineOfText(dol_string_nohtmltag($objp->comments, 1));
501 $trunclength = getDolGlobalInt('ACCOUNTING_LENGTH_DESCRIPTION', 32);
502 print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->comments);
503 print '</td>';
504
505 // Amount without taxes
506 print '<td class="right nowraponall amount">';
507 print price($objp->price);
508 print '</td>';
509
510 // Vat rate
511 print '<td class="right">';
512 print vatrate($objp->tva_tx_line.($objp->vat_src_code ? ' ('.$objp->vat_src_code.')' : ''));
513 print '</td>';
514
515 // Current account
516 print '<td>';
517 print length_accountg(html_entity_decode($objp->code_buy));
518 print '</td>';
519
520 // Suggested accounting account
521 print '<td>';
522 print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone');
523 print '</td>';
524
525 print '<td class="center">';
526 print '<input type="checkbox" class="flat checkforselect checkforselect'.$objp->rowid.'" name="toselect[]" value="'.$objp->rowid."_".$i.'"'.($objp->aarowid ? "checked" : "").'/>';
527 print '</td>';
528
529 print "</tr>";
530 $i++;
531 }
532 if ($num_lines == 0) {
533 print '<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
534 }
535
536 print '</table>';
537 print "</div>";
538
539 print '</form>';
540} else {
541 print $db->error();
542}
543if ($db->type == 'mysqli') {
544 $db->query("SET SQL_BIG_SELECTS=0"); // Enable MAX_JOIN_SIZE limitation
545}
546
547// Add code to auto check the box when we select an account
548print '<script type="text/javascript">
549jQuery(document).ready(function() {
550 jQuery(".codeventil").change(function() {
551 var s=$(this).attr("id").replace("codeventil", "")
552 console.log(s+" "+$(this).val());
553 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
554 else jQuery(".checkforselect"+s).prop("checked", true);
555 });
556});
557</script>';
558
559// End of page
560llxFooter();
561$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($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
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.
Class permettant la generation de composants html autre Only common components are here.
Class to manage Dolibarr users.
llxFooter()
Footer empty.
Definition document.php:107
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...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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 a 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.