28require
'../../main.inc.php';
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';
39$langs->loadLangs(array(
"bills",
"companies",
"compta",
"accountancy",
"other",
"trips",
"productbatch",
"hrm"));
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';
46$optioncss =
GETPOST(
'optioncss',
'aZ');
50$mesCasesCochees =
GETPOST(
'toselect',
'array');
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);
68$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
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) {
78$offset = $limit * $page;
82 $sortfield =
"erd.date, erd.rowid";
85 if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_TODO > 0) {
93$hookmanager->initHooks(array(
'accountancyexpensereportlist'));
101if (!isModEnabled(
'accounting')) {
104if ($user->socid > 0) {
107if (!$user->hasRight(
'accounting',
'mouvements',
'lire')) {
116if (
GETPOST(
'cancel',
'alpha')) {
117 $action =
'list'; $massaction =
'';
119if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
123$parameters = array();
124$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
129if (empty($reshook)) {
131 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
133 $search_expensereport =
'';
137 $search_account =
'';
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 =
'';
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';
161if ($massaction ==
'ventil' && $user->hasRight(
'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 class="error">'.$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 class="green">'.$langs->trans(
"LineOfExpenseReport").
' '.$monId.
' - '.$langs->trans(
"VentilatedinAccount").
' : '.
length_accountg($accountventilated->account_number).
'</span></div>';
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>';
200 $msg .=
'<div>'.$langs->trans(
"EndProcessing").
'</div>';
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);
215$form =
new Form($db);
218llxHeader(
'', $langs->trans(
"ExpenseReportsVentilation"));
220if (empty($chartaccountcode)) {
221 print $langs->trans(
"ErrorChartOfAccountSystemNotSelected");
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);
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";
244if (!empty($conf->global->ACCOUNTING_DATE_START_BINDING)) {
245 $sql .=
" AND er.date_debut >= '".$db->idate($conf->global->ACCOUNTING_DATE_START_BINDING).
"'";
248if (strlen(trim($search_login))) {
251if (strlen(trim($search_expensereport))) {
254if (strlen(trim($search_label))) {
257if (strlen(trim($search_desc))) {
260if (strlen(trim($search_amount))) {
263if (strlen(trim($search_account))) {
266if (strlen(trim($search_vat))) {
269if ($search_date_start) {
270 $sql .=
" AND erd.date >= '".$db->idate($search_date_start).
"'";
272if ($search_date_end) {
273 $sql .=
" AND erd.date <= '".$db->idate($search_date_end).
"'";
275$sql .=
" AND er.entity IN (".getEntity(
'expensereport', 0).
")";
278$parameters = array();
279$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters);
280$sql .= $hookmanager->resPrint;
282$sql .= $db->order($sortfield, $sortorder);
285$nbtotalofrecords =
'';
287 $result = $db->query($sql);
288 $nbtotalofrecords = $db->num_rows($result);
289 if (($page * $limit) > $nbtotalofrecords) {
295$sql .= $db->plimit($limit + 1, $offset);
297dol_syslog(
"accountancy/expensereport/list.php", LOG_DEBUG);
300if ($db->type ==
'mysqli') {
301 $db->query(
"SET SQL_BIG_SELECTS=1");
304$result = $db->query($sql);
306 $num_lines = $db->num_rows($result);
309 $arrayofselected = is_array($toselect) ? $toselect : array();
312 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
313 $param .=
'&contextpage='.urlencode($contextpage);
315 if ($limit > 0 && $limit != $conf->liste_limit) {
316 $param .=
'&limit='.((int) $limit);
319 $param .=
'&search_login='.urlencode($search_login);
321 if ($search_lineid) {
322 $param .=
'&search_lineid='.urlencode($search_lineid);
324 if ($search_date_startday) {
325 $param .=
'&search_date_startday='.urlencode($search_date_startday);
327 if ($search_date_startmonth) {
328 $param .=
'&search_date_startmonth='.urlencode($search_date_startmonth);
330 if ($search_date_startyear) {
331 $param .=
'&search_date_startyear='.urlencode($search_date_startyear);
333 if ($search_date_endday) {
334 $param .=
'&search_date_endday='.urlencode($search_date_endday);
336 if ($search_date_endmonth) {
337 $param .=
'&search_date_endmonth='.urlencode($search_date_endmonth);
339 if ($search_date_endyear) {
340 $param .=
'&search_date_endyear='.urlencode($search_date_endyear);
342 if ($search_expensereport) {
343 $param .=
'&search_expensereport='.urlencode($search_expensereport);
346 $param .=
'&search_label='.urlencode($search_label);
349 $param .=
'&search_desc='.urlencode($search_desc);
351 if ($search_amount) {
352 $param .=
'&search_amount='.urlencode($search_amount);
355 $param .=
'&search_vat='.urlencode($search_vat);
358 $arrayofmassactions = array(
359 'ventil' =>
img_picto(
'',
'check',
'class="pictofixedwidth"').$langs->trans(
"Ventilate")
361 $massactionbutton = $form->selectMassAction(
'ventil', $arrayofmassactions, 1);
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.
'">';
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.
'">';
374 print_barre_liste($langs->trans(
"ExpenseReportLines"), $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords,
'title_accountancy', 0,
'',
'', $limit);
376 print
'<span class="opacitymedium">'.$langs->trans(
"DescVentilTodoExpenseReport").
'</span></br><br>';
384 print
'<div class="div-table-responsive">';
385 print
'<table class="tagtable liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
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>';
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'));
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'));
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();
415 print
'<tr class="liste_titre">';
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 ');
422 print_liste_field_titre(
"DateOfLine", $_SERVER[
"PHP_SELF"],
"erd.date, erd.rowid",
"", $param,
'', $sortfield, $sortorder,
'center ');
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 ');
430 if ($massactionbutton) {
431 $checkpicto = $form->showCheckAddButtons(
'checkforselect', 1);
438 $userstatic =
new User($db);
439 $form =
new Form($db);
441 while ($i < min($num_lines, $limit)) {
442 $objp = $db->fetch_object($result);
444 $objp->aarowid_suggest =
'';
445 $objp->aarowid_suggest = $objp->aarowid;
447 $expensereport_static->ref = $objp->ref;
448 $expensereport_static->id = $objp->erid;
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;
460 print
'<tr class="oddeven">';
463 print
'<td class="nowraponall">';
464 print $userstatic->getNomUrl(-1,
'', 0, 0, 24, 1,
'login',
'', 1);
468 print
'<td>'.$objp->rowid.
'</td>';
471 print
'<td>'.$expensereport_static->getNomUrl(1).
'</td>';
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>';
479 print
'<td class="center">'.dol_print_date($db->jdate($objp->date),
'day').
'</td>';
483 print ($langs->trans($objp->type_fees_code) == $objp->type_fees_code ? $objp->type_fees_label : $langs->trans(($objp->type_fees_code)));
489 $trunclength = empty($conf->global->ACCOUNTING_LENGTH_DESCRIPTION) ? 32 : $conf->global->ACCOUNTING_LENGTH_DESCRIPTION;
490 print $form->textwithtooltip(
dol_trunc($text, $trunclength), $objp->comments);
494 print
'<td class="right nowraponall amount">';
495 print
price($objp->price);
499 print
'<td class="right">';
500 print
vatrate($objp->tva_tx_line.($objp->vat_src_code ?
' ('.$objp->vat_src_code.
')' :
''));
510 print $formaccounting->select_account($objp->aarowid_suggest,
'codeventil'.$objp->rowid, 1, array(), 0, 0,
'codeventil maxwidth200 maxwidthonsmartphone',
'cachewithshowemptyone');
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" :
"").
'/>';
520 if ($num_lines == 0) {
521 print
'<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
531if ($db->type ==
'mysqli') {
532 $db->query(
"SET SQL_BIG_SELECTS=0");
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);
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.
Class to manage accounting accounts.
Class to manage Trips and Expenses.
const STATUS_CLOSED
Classified paid.
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.