28 require
'../../main.inc.php';
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';
39 $langs->loadLangs(array(
"bills",
"companies",
"compta",
"accountancy",
"other",
"trips",
"productbatch",
"hrm"));
41 $action =
GETPOST(
'action',
'aZ09');
42 $massaction =
GETPOST(
'massaction',
'alpha');
43 $show_files =
GETPOST(
'show_files',
'int');
44 $confirm =
GETPOST(
'confirm',
'alpha');
45 $toselect =
GETPOST(
'toselect',
'array');
46 $contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'expensereportlist';
47 $optioncss =
GETPOST(
'optioncss',
'aZ');
51 $mesCasesCochees =
GETPOST(
'toselect',
'array');
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 =
GETPOST(
'search_date_startday',
'int');
63 $search_date_startmonth =
GETPOST(
'search_date_startmonth',
'int');
64 $search_date_startyear =
GETPOST(
'search_date_startyear',
'int');
65 $search_date_endday =
GETPOST(
'search_date_endday',
'int');
66 $search_date_endmonth =
GETPOST(
'search_date_endmonth',
'int');
67 $search_date_endyear =
GETPOST(
'search_date_endyear',
'int');
68 $search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
69 $search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
72 $limit =
GETPOST(
'limit',
'int') ?
GETPOST(
'limit',
'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION) ? $conf->liste_limit : $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION);
73 $sortfield =
GETPOST(
'sortfield',
'aZ09comma');
74 $sortorder =
GETPOST(
'sortorder',
'aZ09comma');
76 if (empty($page) || $page < 0) {
79 $offset = $limit * $page;
80 $pageprev = $page - 1;
81 $pagenext = $page + 1;
83 $sortfield =
"erd.date, erd.rowid";
86 if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_TODO > 0) {
92 $hookmanager->initHooks(array(
'accountancyexpensereportlist'));
97 $chartaccountcode =
dol_getIdFromCode($db, $conf->global->CHARTOFACCOUNTS,
'accounting_system',
'rowid',
'pcg_version');
103 if ($user->socid > 0) {
106 if (empty($user->rights->accounting->mouvements->lire)) {
115 if (
GETPOST(
'cancel',
'alpha')) {
116 $action =
'list'; $massaction =
'';
118 if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
122 $parameters = array();
123 $reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
128 if (empty($reshook)) {
130 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
132 $search_expensereport =
'';
136 $search_account =
'';
138 $search_date_startday =
'';
139 $search_date_startmonth =
'';
140 $search_date_startyear =
'';
141 $search_date_endday =
'';
142 $search_date_endmonth =
'';
143 $search_date_endyear =
'';
144 $search_date_start =
'';
145 $search_date_end =
'';
146 $search_country =
'';
147 $search_tvaintra =
'';
151 $objectclass =
'ExpenseReport';
152 $objectlabel =
'ExpenseReport';
153 $permissiontoread = $user->hasRight(
'accounting',
'read');
154 $permissiontodelete = $user->hasRight(
'accounting',
'delete');
155 $uploaddir = $conf->expensereport->dir_output;
156 include DOL_DOCUMENT_ROOT .
'/core/actions_massactions.inc.php';
160 if ($massaction ==
'ventil' && $user->rights->accounting->bind->write) {
164 if (!empty($mesCasesCochees)) {
165 $msg =
'<div>'.$langs->trans(
"SelectedLines").
': '.count($mesCasesCochees).
'</div>';
166 $msg .=
'<div class="detail">';
171 foreach ($mesCasesCochees as $maLigneCochee) {
172 $maLigneCourante = explode(
"_", $maLigneCochee);
173 $monId = $maLigneCourante[0];
174 $monCompte =
GETPOST(
'codeventil'.$monId);
176 if ($monCompte <= 0) {
177 $msg .=
'<div><span style="color:red">'.$langs->trans(
"Lineofinvoice").
' '.$monId.
' - '.$langs->trans(
"NoAccountSelected").
'</span></div>';
180 $sql =
" UPDATE ".MAIN_DB_PREFIX.
"expensereport_det";
181 $sql .=
" SET fk_code_ventilation = ".((int) $monCompte);
182 $sql .=
" WHERE rowid = ".((int) $monId);
185 $accountventilated->fetch($monCompte,
'', 1);
187 dol_syslog(
'accountancy/expensereport/list.php:: sql='.$sql, LOG_DEBUG);
188 if ($db->query($sql)) {
189 $msg .=
'<div><span style="color:green">'.$langs->trans(
"LineOfExpenseReport").
' '.$monId.
' - '.$langs->trans(
"VentilatedinAccount").
' : '.
length_accountg($accountventilated->account_number).
'</span></div>';
192 $msg .=
'<div><span style="color:red">'.$langs->trans(
"ErrorDB").
' : '.$langs->trans(
"Lineofinvoice").
' '.$monId.
' - '.$langs->trans(
"NotVentilatedinAccount").
' : '.
length_accountg($accountventilated->account_number).
'<br> <pre>'.$sql.
'</pre></span></div>';
200 $msg .=
'<div>'.$langs->trans(
"EndProcessing").
'</div>';
213 llxHeader(
'', $langs->trans(
"ExpenseReportsVentilation"));
215 if (empty($chartaccountcode)) {
216 print $langs->trans(
"ErrorChartOfAccountSystemNotSelected");
224 $sql =
"SELECT er.ref, er.rowid as erid, er.date_debut, er.date_valid,";
225 $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,";
226 $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,";
227 $sql .=
" u.rowid as userid, u.login, u.lastname, u.firstname, u.email, u.gender, u.employee, u.photo, u.statut,";
228 $sql .=
" aa.rowid as aarowid";
229 $parameters = array();
230 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters);
231 $sql .= $hookmanager->resPrint;
232 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as er";
233 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"expensereport_det as erd ON er.rowid = erd.fk_expensereport";
234 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_type_fees as f ON f.id = erd.fk_c_type_fees";
235 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u ON u.rowid = er.fk_user_author";
236 $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;
237 $sql .=
" WHERE er.fk_statut IN (".ExpenseReport::STATUS_APPROVED.
", ".
ExpenseReport::STATUS_CLOSED.
") AND erd.fk_code_ventilation <= 0";
239 if (!empty($conf->global->ACCOUNTING_DATE_START_BINDING)) {
240 $sql .=
" AND er.date_debut >= '".$db->idate($conf->global->ACCOUNTING_DATE_START_BINDING).
"'";
243 if (strlen(trim($search_login))) {
246 if (strlen(trim($search_expensereport))) {
249 if (strlen(trim($search_label))) {
252 if (strlen(trim($search_desc))) {
255 if (strlen(trim($search_amount))) {
258 if (strlen(trim($search_account))) {
261 if (strlen(trim($search_vat))) {
264 if ($search_date_start) {
265 $sql .=
" AND erd.date >= '".$db->idate($search_date_start).
"'";
267 if ($search_date_end) {
268 $sql .=
" AND erd.date <= '".$db->idate($search_date_end).
"'";
270 $sql .=
" AND er.entity IN (".getEntity(
'expensereport', 0).
")";
273 $parameters = array();
274 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters);
275 $sql .= $hookmanager->resPrint;
277 $sql .= $db->order($sortfield, $sortorder);
281 if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
282 $result = $db->query($sql);
290 $sql .= $db->plimit($limit + 1, $offset);
292 dol_syslog(
"accountancy/expensereport/list.php", LOG_DEBUG);
295 if ($db->type ==
'mysqli') {
296 $db->query(
"SET SQL_BIG_SELECTS=1");
299 $result = $db->query($sql);
301 $num_lines = $db->num_rows($result);
304 $arrayofselected = is_array($toselect) ? $toselect : array();
307 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
308 $param .=
'&contextpage='.urlencode($contextpage);
310 if ($limit > 0 && $limit != $conf->liste_limit) {
311 $param .=
'&limit='.urlencode($limit);
314 $param .=
'&search_login='.urlencode($search_login);
316 if ($search_lineid) {
317 $param .=
'&search_lineid='.urlencode($search_lineid);
319 if ($search_date_startday) {
320 $param .=
'&search_date_startday='.urlencode($search_date_startday);
322 if ($search_date_startmonth) {
323 $param .=
'&search_date_startmonth='.urlencode($search_date_startmonth);
325 if ($search_date_startyear) {
326 $param .=
'&search_date_startyear='.urlencode($search_date_startyear);
328 if ($search_date_endday) {
329 $param .=
'&search_date_endday='.urlencode($search_date_endday);
331 if ($search_date_endmonth) {
332 $param .=
'&search_date_endmonth='.urlencode($search_date_endmonth);
334 if ($search_date_endyear) {
335 $param .=
'&search_date_endyear='.urlencode($search_date_endyear);
337 if ($search_expensereport) {
338 $param .=
'&search_expensereport='.urlencode($search_expensereport);
341 $param .=
'&search_label='.urlencode($search_label);
344 $param .=
'&search_desc='.urlencode($search_desc);
346 if ($search_amount) {
347 $param .=
'&search_amount='.urlencode($search_amount);
350 $param .=
'&search_vat='.urlencode($search_vat);
353 $arrayofmassactions = array(
354 'ventil' =>
img_picto(
'',
'check',
'class="pictofixedwidth"').$langs->trans(
"Ventilate")
356 $massactionbutton =
$form->selectMassAction(
'ventil', $arrayofmassactions, 1);
358 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="post">'.
"\n";
359 print
'<input type="hidden" name="action" value="ventil">';
360 if ($optioncss !=
'') {
361 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
363 print
'<input type="hidden" name="token" value="'.newToken().
'">';
364 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
365 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
366 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
367 print
'<input type="hidden" name="page" value="'.$page.
'">';
369 print_barre_liste($langs->trans(
"ExpenseReportLines"), $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines,
$nbtotalofrecords,
'title_accountancy', 0,
'',
'', $limit);
371 print
'<span class="opacitymedium">'.$langs->trans(
"DescVentilTodoExpenseReport").
'</span></br><br>';
379 print
'<div class="div-table-responsive">';
380 print
'<table class="tagtable liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
383 print
'<tr class="liste_titre_filter">';
384 print
'<td class="liste_titre"><input type="text" name="search_login" class="maxwidth50" value="'.$search_login.
'"></td>';
385 print
'<td class="liste_titre"></td>';
386 print
'<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_expensereport" value="'.dol_escape_htmltag($search_expensereport).
'"></td>';
387 if (!empty($conf->global->ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE)) {
388 print
'<td class="liste_titre"></td>';
390 print
'<td class="liste_titre center">';
391 print
'<div class="nowrap">';
392 print
$form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
394 print
'<div class="nowrap">';
395 print
$form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
398 print
'<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_label" value="'.dol_escape_htmltag($search_label).
'"></td>';
399 print
'<td class="liste_titre"><input type="text" class="flat maxwidthonsmartphone" name="search_desc" value="'.dol_escape_htmltag($search_desc).
'"></td>';
400 print
'<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).
'"></td>';
401 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>';
402 print
'<td class="liste_titre"></td>';
403 print
'<td class="liste_titre"></td>';
404 print
'<td class="center liste_titre">';
405 $searchpicto =
$form->showFilterButtons();
410 print
'<tr class="liste_titre">';
413 print_liste_field_titre(
"ExpenseReport", $_SERVER[
"PHP_SELF"],
"er.ref",
"", $param,
'', $sortfield, $sortorder);
414 if (!empty($conf->global->ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE)) {
415 print_liste_field_titre(
"DateValidation", $_SERVER[
"PHP_SELF"],
"er.date_valid",
"", $param,
'', $sortfield, $sortorder,
'center ');
417 print_liste_field_titre(
"DateOfLine", $_SERVER[
"PHP_SELF"],
"erd.date, erd.rowid",
"", $param,
'', $sortfield, $sortorder,
'center ');
419 print_liste_field_titre(
"Description", $_SERVER[
"PHP_SELF"],
"erd.comments",
"", $param,
'', $sortfield, $sortorder);
420 print_liste_field_titre(
"Amount", $_SERVER[
"PHP_SELF"],
"erd.total_ht",
"", $param,
'', $sortfield, $sortorder,
'right maxwidth50 ');
421 print_liste_field_titre(
"VATRate", $_SERVER[
"PHP_SELF"],
"erd.tva_tx",
"", $param,
'', $sortfield, $sortorder,
'right ');
425 if ($massactionbutton) {
426 $checkpicto =
$form->showCheckAddButtons(
'checkforselect', 1);
433 $userstatic =
new User($db);
436 while ($i < min($num_lines, $limit)) {
437 $objp = $db->fetch_object($result);
439 $objp->aarowid_suggest =
'';
440 $objp->aarowid_suggest = $objp->aarowid;
442 $expensereport_static->ref = $objp->ref;
443 $expensereport_static->id = $objp->erid;
445 $userstatic->id = $objp->userid;
446 $userstatic->ref = $objp->label;
447 $userstatic->login = $objp->login;
448 $userstatic->statut = $objp->statut;
449 $userstatic->email = $objp->email;
450 $userstatic->gender = $objp->gender;
451 $userstatic->firstname = $objp->firstname;
452 $userstatic->lastname = $objp->lastname;
453 $userstatic->employee = $objp->employee;
454 $userstatic->photo = $objp->photo;
456 print
'<tr class="oddeven">';
459 print
'<td class="nowraponall">';
460 print $userstatic->getNomUrl(-1,
'', 0, 0, 24, 1,
'login',
'', 1);
464 print
'<td>'.$objp->rowid.
'</td>';
467 print
'<td>'.$expensereport_static->getNomUrl(1).
'</td>';
470 if (!empty($conf->global->ACCOUNTANCY_USE_EXPENSE_REPORT_VALIDATION_DATE)) {
471 print
'<td class="center">'.dol_print_date($db->jdate($objp->date_valid),
'day').
'</td>';
475 print
'<td class="center">'.dol_print_date($db->jdate($objp->date),
'day').
'</td>';
479 print ($langs->trans($objp->type_fees_code) == $objp->type_fees_code ? $objp->type_fees_label : $langs->trans(($objp->type_fees_code)));
485 $trunclength = empty($conf->global->ACCOUNTING_LENGTH_DESCRIPTION) ? 32 : $conf->global->ACCOUNTING_LENGTH_DESCRIPTION;
486 print
$form->textwithtooltip(
dol_trunc($text, $trunclength), $objp->comments);
490 print
'<td class="right nowraponall amount">';
491 print
price($objp->price);
495 print
'<td class="right">';
496 print
vatrate($objp->tva_tx_line.($objp->vat_src_code ?
' ('.$objp->vat_src_code.
')' :
''));
506 print $formaccounting->select_account($objp->aarowid_suggest,
'codeventil'.$objp->rowid, 1, array(), 0, 0,
'codeventil maxwidth200 maxwidthonsmartphone',
'cachewithshowemptyone');
509 print
'<td class="center">';
510 print
'<input type="checkbox" class="flat checkforselect checkforselect'.$objp->rowid.
'" name="toselect[]" value="'.$objp->rowid.
"_".$i.
'"'.($objp->aarowid ?
"checked" :
"").
'/>';
516 if ($num_lines == 0) {
517 print
'<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
527 if ($db->type ==
'mysqli') {
528 $db->query(
"SET SQL_BIG_SELECTS=0");
532 print
'<script type="text/javascript">
533 jQuery(document).ready(function() {
534 jQuery(".codeventil").change(function() {
535 var s=$(this).attr("id").replace("codeventil", "")
536 console.log(s+" "+$(this).val());
537 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
538 else jQuery(".checkforselect"+s).prop("checked", true);
length_accountg($account)
Return General accounting account with defined length (used for product and miscellaneous)
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Class to manage accounting accounts.
Class to manage Trips and Expenses.
const STATUS_CLOSED
Classified paid.
Class to manage Dolibarr users.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
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...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
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.
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.
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.
$nbtotalofrecords
Count total nb of records.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.