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);
77$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
78$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
79$page = GETPOSTISSET(
'pageplusone') ? (
GETPOST(
'pageplusone') - 1) :
GETPOST(
"page",
'int');
80if (empty($page) || $page < 0) {
83$offset = $limit * $page;
87 $sortfield =
"erd.date, erd.rowid";
98$hookmanager->initHooks(array(
'accountancyexpensereportlist'));
106if (!isModEnabled(
'accounting')) {
109if ($user->socid > 0) {
112if (!$user->hasRight(
'accounting',
'mouvements',
'lire')) {
121if (
GETPOST(
'cancel',
'alpha')) {
125if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
129$parameters = array();
130$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
135if (empty($reshook)) {
137 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
139 $search_expensereport =
'';
143 $search_account =
'';
145 $search_date_startday =
'';
146 $search_date_startmonth =
'';
147 $search_date_startyear =
'';
148 $search_date_endday =
'';
149 $search_date_endmonth =
'';
150 $search_date_endyear =
'';
151 $search_date_start =
'';
152 $search_date_end =
'';
153 $search_country =
'';
154 $search_tvaintra =
'';
158 $objectclass =
'ExpenseReport';
159 $objectlabel =
'ExpenseReport';
160 $permissiontoread = $user->hasRight(
'accounting',
'read');
161 $permissiontodelete = $user->hasRight(
'accounting',
'delete');
162 $uploaddir = $conf->expensereport->dir_output;
163 include DOL_DOCUMENT_ROOT .
'/core/actions_massactions.inc.php';
167if ($massaction ==
'ventil' && $user->hasRight(
'accounting',
'bind',
'write')) {
170 if (!empty($mesCasesCochees)) {
171 $msg =
'<div>'.$langs->trans(
"SelectedLines").
': '.count($mesCasesCochees).
'</div>';
172 $msg .=
'<div class="detail">';
177 foreach ($mesCasesCochees as $maLigneCochee) {
178 $maLigneCourante = explode(
"_", $maLigneCochee);
179 $monId = $maLigneCourante[0];
180 $monCompte =
GETPOST(
'codeventil'.$monId);
182 if ($monCompte <= 0) {
183 $msg .=
'<div><span class="error">'.$langs->trans(
"Lineofinvoice").
' '.$monId.
' - '.$langs->trans(
"NoAccountSelected").
'</span></div>';
186 $sql =
" UPDATE ".MAIN_DB_PREFIX.
"expensereport_det";
187 $sql .=
" SET fk_code_ventilation = ".((int) $monCompte);
188 $sql .=
" WHERE rowid = ".((int) $monId);
191 $accountventilated->fetch($monCompte,
'', 1);
193 dol_syslog(
'accountancy/expensereport/list.php:: sql='.$sql, LOG_DEBUG);
194 if ($db->query($sql)) {
195 $msg .=
'<div><span class="green">'.$langs->trans(
"LineOfExpenseReport").
' '.$monId.
' - '.$langs->trans(
"VentilatedinAccount").
' : '.
length_accountg($accountventilated->account_number).
'</span></div>';
198 $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>';
206 $msg .=
'<div>'.$langs->trans(
"EndProcessing").
'</div>';
210if (
GETPOST(
'sortfield') ==
'erd.date, erd.rowid') {
211 $value = (
GETPOST(
'sortorder') ==
'asc,asc' ? 0 : 1);
212 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
213 $res =
dolibarr_set_const($db,
"ACCOUNTING_LIST_SORT_VENTILATION_TODO", $value,
'yesno', 0,
'', $conf->entity);
221$form =
new Form($db);
224$help_url =
'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilité_en_Partie_Double#Liaisons_comptables';
226llxHeader(
'', $langs->trans(
"ExpenseReportsVentilation"), $help_url);
228if (empty($chartaccountcode)) {
229 print $langs->trans(
"ErrorChartOfAccountSystemNotSelected");
237$sql =
"SELECT er.ref, er.rowid as erid, er.date_debut, er.date_valid,";
238$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,";
239$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,";
240$sql .=
" u.rowid as userid, u.login, u.lastname, u.firstname, u.email, u.gender, u.employee, u.photo, u.statut,";
241$sql .=
" aa.rowid as aarowid";
242$parameters = array();
243$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters);
244$sql .= $hookmanager->resPrint;
245$sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as er";
246$sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"expensereport_det as erd ON er.rowid = erd.fk_expensereport";
247$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_type_fees as f ON f.id = erd.fk_c_type_fees";
248$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u ON u.rowid = er.fk_user_author";
249$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;
250$sql .=
" WHERE er.fk_statut IN (".ExpenseReport::STATUS_APPROVED.
", ".
ExpenseReport::STATUS_CLOSED.
") AND erd.fk_code_ventilation <= 0";
252if (strlen(trim($search_login))) {
255if (strlen(trim($search_expensereport))) {
258if (strlen(trim($search_label))) {
261if (strlen(trim($search_desc))) {
264if (strlen(trim($search_amount))) {
267if (strlen(trim($search_account))) {
270if (strlen(trim($search_vat))) {
273if ($search_date_start) {
274 $sql .=
" AND erd.date >= '".$db->idate($search_date_start).
"'";
276if ($search_date_end) {
277 $sql .=
" AND erd.date <= '".$db->idate($search_date_end).
"'";
279$sql .=
" AND er.entity IN (".getEntity(
'expensereport', 0).
")";
282$parameters = array();
283$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters);
284$sql .= $hookmanager->resPrint;
286$sql .= $db->order($sortfield, $sortorder);
289$nbtotalofrecords =
'';
291 $result = $db->query($sql);
292 $nbtotalofrecords = $db->num_rows($result);
293 if (($page * $limit) > $nbtotalofrecords) {
300$sql .= $db->plimit($limit + 1, $offset);
302dol_syslog(
"accountancy/expensereport/list.php", LOG_DEBUG);
305if ($db->type ==
'mysqli') {
306 $db->query(
"SET SQL_BIG_SELECTS=1");
309$result = $db->query($sql);
311 $num_lines = $db->num_rows($result);
314 $arrayofselected = is_array($toselect) ? $toselect : array();
317 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
318 $param .=
'&contextpage='.urlencode($contextpage);
320 if ($limit > 0 && $limit != $conf->liste_limit) {
321 $param .=
'&limit='.((int) $limit);
324 $param .=
'&search_login='.urlencode($search_login);
326 if ($search_lineid) {
327 $param .=
'&search_lineid='.urlencode($search_lineid);
329 if ($search_date_startday) {
330 $param .=
'&search_date_startday='.urlencode($search_date_startday);
332 if ($search_date_startmonth) {
333 $param .=
'&search_date_startmonth='.urlencode($search_date_startmonth);
335 if ($search_date_startyear) {
336 $param .=
'&search_date_startyear='.urlencode($search_date_startyear);
338 if ($search_date_endday) {
339 $param .=
'&search_date_endday='.urlencode($search_date_endday);
341 if ($search_date_endmonth) {
342 $param .=
'&search_date_endmonth='.urlencode($search_date_endmonth);
344 if ($search_date_endyear) {
345 $param .=
'&search_date_endyear='.urlencode($search_date_endyear);
347 if ($search_expensereport) {
348 $param .=
'&search_expensereport='.urlencode($search_expensereport);
351 $param .=
'&search_label='.urlencode($search_label);
354 $param .=
'&search_desc='.urlencode($search_desc);
356 if ($search_amount) {
357 $param .=
'&search_amount='.urlencode($search_amount);
360 $param .=
'&search_vat='.urlencode($search_vat);
363 $arrayofmassactions = array(
364 'ventil' =>
img_picto(
'',
'check',
'class="pictofixedwidth"').$langs->trans(
"Ventilate")
366 $massactionbutton = $form->selectMassAction(
'ventil', $arrayofmassactions, 1);
368 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="post">'.
"\n";
369 print
'<input type="hidden" name="action" value="ventil">';
370 if ($optioncss !=
'') {
371 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
373 print
'<input type="hidden" name="token" value="'.newToken().
'">';
374 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
375 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
376 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
377 print
'<input type="hidden" name="page" value="'.$page.
'">';
379 print_barre_liste($langs->trans(
"ExpenseReportLines"), $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords,
'title_accountancy', 0,
'',
'', $limit);
381 print
'<span class="opacitymedium">'.$langs->trans(
"DescVentilTodoExpenseReport").
'</span></br><br>';
389 print
'<div class="div-table-responsive">';
390 print
'<table class="tagtable liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
393 print
'<tr class="liste_titre_filter">';
394 print
'<td class="liste_titre"><input type="text" name="search_login" class="maxwidth50" value="'.$search_login.
'"></td>';
395 print
'<td class="liste_titre"></td>';
396 print
'<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_expensereport" value="'.dol_escape_htmltag($search_expensereport).
'"></td>';
398 print
'<td class="liste_titre"></td>';
400 print
'<td class="liste_titre center">';
401 print
'<div class="nowrapfordate">';
402 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
404 print
'<div class="nowrapfordate">';
405 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
408 print
'<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_label" value="'.dol_escape_htmltag($search_label).
'"></td>';
409 print
'<td class="liste_titre"><input type="text" class="flat maxwidthonsmartphone" name="search_desc" value="'.dol_escape_htmltag($search_desc).
'"></td>';
410 print
'<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).
'"></td>';
411 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>';
412 print
'<td class="liste_titre"></td>';
413 print
'<td class="liste_titre"></td>';
414 print
'<td class="center liste_titre">';
415 $searchpicto = $form->showFilterButtons();
420 print
'<tr class="liste_titre">';
423 print_liste_field_titre(
"ExpenseReport", $_SERVER[
"PHP_SELF"],
"er.ref",
"", $param,
'', $sortfield, $sortorder);
425 print_liste_field_titre(
"DateValidation", $_SERVER[
"PHP_SELF"],
"er.date_valid",
"", $param,
'', $sortfield, $sortorder,
'center ');
427 print_liste_field_titre(
"DateOfLine", $_SERVER[
"PHP_SELF"],
"erd.date, erd.rowid",
"", $param,
'', $sortfield, $sortorder,
'center ');
429 print_liste_field_titre(
"Description", $_SERVER[
"PHP_SELF"],
"erd.comments",
"", $param,
'', $sortfield, $sortorder);
430 print_liste_field_titre(
"Amount", $_SERVER[
"PHP_SELF"],
"erd.total_ht",
"", $param,
'', $sortfield, $sortorder,
'right maxwidth50 ');
431 print_liste_field_titre(
"VATRate", $_SERVER[
"PHP_SELF"],
"erd.tva_tx",
"", $param,
'', $sortfield, $sortorder,
'right ');
435 if ($massactionbutton) {
436 $checkpicto = $form->showCheckAddButtons(
'checkforselect', 1);
443 $userstatic =
new User($db);
444 $form =
new Form($db);
446 while ($i < min($num_lines, $limit)) {
447 $objp = $db->fetch_object($result);
449 $objp->aarowid_suggest =
'';
450 $objp->aarowid_suggest = $objp->aarowid;
452 $expensereport_static->ref = $objp->ref;
453 $expensereport_static->id = $objp->erid;
455 $userstatic->id = $objp->userid;
456 $userstatic->login = $objp->login;
457 $userstatic->statut = $objp->statut;
458 $userstatic->email = $objp->email;
459 $userstatic->gender = $objp->gender;
460 $userstatic->firstname = $objp->firstname;
461 $userstatic->lastname = $objp->lastname;
462 $userstatic->employee = $objp->employee;
463 $userstatic->photo = $objp->photo;
465 print
'<tr class="oddeven">';
468 print
'<td class="nowraponall">';
469 print $userstatic->getNomUrl(-1,
'', 0, 0, 24, 1,
'login',
'', 1);
473 print
'<td>'.$objp->rowid.
'</td>';
476 print
'<td>'.$expensereport_static->getNomUrl(1).
'</td>';
480 print
'<td class="center">'.dol_print_date($db->jdate($objp->date_valid),
'day').
'</td>';
484 print
'<td class="center">'.dol_print_date($db->jdate($objp->date),
'day').
'</td>';
488 print($langs->trans($objp->type_fees_code) == $objp->type_fees_code ? $objp->type_fees_label : $langs->trans(($objp->type_fees_code)));
495 print $form->textwithtooltip(
dol_trunc($text, $trunclength), $objp->comments);
499 print
'<td class="right nowraponall amount">';
500 print
price($objp->price);
504 print
'<td class="right">';
505 print
vatrate($objp->tva_tx_line.($objp->vat_src_code ?
' ('.$objp->vat_src_code.
')' :
''));
515 print $formaccounting->select_account($objp->aarowid_suggest,
'codeventil'.$objp->rowid, 1, array(), 0, 0,
'codeventil maxwidth200 maxwidthonsmartphone',
'cachewithshowemptyone');
518 print
'<td class="center">';
519 print
'<input type="checkbox" class="flat checkforselect checkforselect'.$objp->rowid.
'" name="toselect[]" value="'.$objp->rowid.
"_".$i.
'"'.($objp->aarowid ?
"checked" :
"").
'/>';
525 if ($num_lines == 0) {
526 print
'<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
536if ($db->type ==
'mysqli') {
537 $db->query(
"SET SQL_BIG_SELECTS=0");
541print
'<script type="text/javascript">
542jQuery(document).ready(function() {
543 jQuery(".codeventil").change(function() {
544 var s=$(this).attr("id").replace("codeventil", "")
545 console.log(s+" "+$(this).val());
546 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
547 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 a 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.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.