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';
48$langs->loadLangs(array(
"bills",
"companies",
"compta",
"accountancy",
"other",
"trips",
"productbatch",
"hrm"));
50$action =
GETPOST(
'action',
'aZ09');
51$massaction =
GETPOST(
'massaction',
'alpha');
52$confirm =
GETPOST(
'confirm',
'alpha');
53$toselect =
GETPOST(
'toselect',
'array');
54$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'accountancyexpensereportlist';
55$optioncss =
GETPOST(
'optioncss',
'aZ');
59$mesCasesCochees =
GETPOST(
'toselect',
'array');
62$search_login =
GETPOST(
'search_login',
'alpha');
63$search_lineid =
GETPOST(
'search_lineid',
'alpha');
64$search_expensereport =
GETPOST(
'search_expensereport',
'alpha');
65$search_label =
GETPOST(
'search_label',
'alpha');
66$search_desc =
GETPOST(
'search_desc',
'alpha');
67$search_amount =
GETPOST(
'search_amount',
'alpha');
68$search_account =
GETPOST(
'search_account',
'alpha');
69$search_vat =
GETPOST(
'search_vat',
'alpha');
70$search_date_startday =
GETPOSTINT(
'search_date_startday');
71$search_date_startmonth =
GETPOSTINT(
'search_date_startmonth');
72$search_date_startyear =
GETPOSTINT(
'search_date_startyear');
73$search_date_endday =
GETPOSTINT(
'search_date_endday');
74$search_date_endmonth =
GETPOSTINT(
'search_date_endmonth');
75$search_date_endyear =
GETPOSTINT(
'search_date_endyear');
76$search_date_start =
dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear);
77$search_date_end =
dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
86$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
87$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
89if (empty($page) || $page < 0) {
92$offset = $limit * $page;
96 $sortfield =
"erd.date, erd.rowid";
107$hookmanager->initHooks(array(
'accountancyexpensereportlist'));
115if (!isModEnabled(
'accounting')) {
118if ($user->socid > 0) {
121if (!$user->hasRight(
'accounting',
'bind',
'write')) {
130if (
GETPOST(
'cancel',
'alpha')) {
134if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
138$parameters = array();
139$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
144if (empty($reshook)) {
146 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
149 $search_expensereport =
'';
153 $search_account =
'';
155 $search_date_startday =
'';
156 $search_date_startmonth =
'';
157 $search_date_startyear =
'';
158 $search_date_endday =
'';
159 $search_date_endmonth =
'';
160 $search_date_endyear =
'';
161 $search_date_start =
'';
162 $search_date_end =
'';
163 $search_country =
'';
164 $search_tvaintra =
'';
168 $objectclass =
'ExpenseReport';
169 $objectlabel =
'ExpenseReport';
170 $permissiontoread = $user->hasRight(
'accounting',
'read');
171 $permissiontodelete = $user->hasRight(
'accounting',
'delete');
172 $uploaddir =
$conf->expensereport->dir_output;
173 include DOL_DOCUMENT_ROOT .
'/core/actions_massactions.inc.php';
177if ($massaction ==
'ventil' && $user->hasRight(
'accounting',
'bind',
'write')) {
180 if (!empty($mesCasesCochees)) {
181 $msg =
'<div>'.$langs->trans(
"SelectedLines").
': '.count($mesCasesCochees).
'</div>';
182 $msg .=
'<div class="detail">';
187 foreach ($mesCasesCochees as $maLigneCochee) {
188 $maLigneCourante = explode(
"_", $maLigneCochee);
189 $monId = $maLigneCourante[0];
190 $monCompte =
GETPOST(
'codeventil'.$monId);
192 if ($monCompte <= 0) {
193 $msg .=
'<div><span class="error">'.$langs->trans(
"Lineofinvoice").
' '.$monId.
' - '.$langs->trans(
"NoAccountSelected").
'</span></div>';
196 $sql =
" UPDATE ".MAIN_DB_PREFIX.
"expensereport_det";
197 $sql .=
" SET fk_code_ventilation = ".((int) $monCompte);
198 $sql .=
" WHERE rowid = ".((int) $monId);
201 $accountventilated->fetch($monCompte,
'', 1);
203 dol_syslog(
'accountancy/expensereport/list.php:: sql='.$sql, LOG_DEBUG);
204 if ($db->query($sql)) {
205 $msg .=
'<div><span class="green">'.$langs->trans(
"LineOfExpenseReport").
' '.$monId.
' - '.$langs->trans(
"VentilatedinAccount").
' : '.
length_accountg($accountventilated->account_number).
'</span></div>';
208 $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>';
216 $msg .=
'<div>'.$langs->trans(
"EndProcessing").
'</div>';
220if (
GETPOST(
'sortfield') ==
'erd.date, erd.rowid') {
221 $value = (
GETPOST(
'sortorder') ==
'asc,asc' ? 0 : 1);
222 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
223 $res =
dolibarr_set_const($db,
"ACCOUNTING_LIST_SORT_VENTILATION_TODO", $value,
'yesno', 0,
'',
$conf->entity);
231$form =
new Form($db);
234$help_url =
'EN:Module_Double_Entry_Accounting|FR:Module_Comptabilité_en_Partie_Double#Liaisons_comptables';
236llxHeader(
'', $langs->trans(
"ExpenseReportsVentilation"), $help_url,
'', 0, 0,
'',
'',
'',
'bodyforlist mod-accountancy accountancy-expensereport page-list');
238if (empty($chartaccountcode)) {
239 print $langs->trans(
"ErrorChartOfAccountSystemNotSelected");
247$sql =
"SELECT er.ref, er.rowid as erid, er.date_debut, er.date_valid,";
248$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,";
249$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,";
250$sql .=
" u.rowid as userid, u.login, u.lastname, u.firstname, u.email, u.gender, u.employee, u.photo, u.statut,";
251$sql .=
" aa.rowid as aarowid";
252$parameters = array();
253$reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters);
254$sql .= $hookmanager->resPrint;
255$sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as er";
256$sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"expensereport_det as erd ON er.rowid = erd.fk_expensereport";
257$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_type_fees as f ON f.id = erd.fk_c_type_fees";
258$sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u ON u.rowid = er.fk_user_author";
259$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;
260$sql .=
" WHERE er.fk_statut IN (".ExpenseReport::STATUS_APPROVED.
", ".
ExpenseReport::STATUS_CLOSED.
") AND erd.fk_code_ventilation <= 0";
262if (strlen($search_lineid)) {
265if (strlen(trim($search_login))) {
268if (strlen(trim($search_expensereport))) {
271if (strlen(trim($search_label))) {
274if (strlen(trim($search_desc))) {
277if (strlen(trim($search_amount))) {
280if (strlen(trim($search_account))) {
283if (strlen(trim($search_vat))) {
286if ($search_date_start) {
287 $sql .=
" AND erd.date >= '".$db->idate($search_date_start).
"'";
289if ($search_date_end) {
290 $sql .=
" AND erd.date <= '".$db->idate($search_date_end).
"'";
292$sql .=
" AND er.entity IN (".getEntity(
'expensereport', 0).
")";
295$parameters = array();
296$reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters);
297$sql .= $hookmanager->resPrint;
299$sql .= $db->order($sortfield, $sortorder);
302$nbtotalofrecords =
'';
304 $result = $db->query($sql);
305 $nbtotalofrecords = $db->num_rows($result);
306 if (($page * $limit) > $nbtotalofrecords) {
313$sql .= $db->plimit($limit + 1, $offset);
315dol_syslog(
"accountancy/expensereport/list.php", LOG_DEBUG);
318if ($db->type ==
'mysqli') {
319 $db->query(
"SET SQL_BIG_SELECTS=1");
322$result = $db->query($sql);
324 $num_lines = $db->num_rows($result);
327 $arrayofselected = is_array($toselect) ? $toselect : array();
330 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
331 $param .=
'&contextpage='.urlencode($contextpage);
333 if ($limit > 0 && $limit !=
$conf->liste_limit) {
334 $param .=
'&limit='.((int) $limit);
336 if ($search_lineid) {
337 $param .=
'&search_lineid='.urlencode($search_lineid);
340 $param .=
'&search_login='.urlencode($search_login);
342 if ($search_date_startday) {
343 $param .=
'&search_date_startday='.urlencode((
string) ($search_date_startday));
345 if ($search_date_startmonth) {
346 $param .=
'&search_date_startmonth='.urlencode((
string) ($search_date_startmonth));
348 if ($search_date_startyear) {
349 $param .=
'&search_date_startyear='.urlencode((
string) ($search_date_startyear));
351 if ($search_date_endday) {
352 $param .=
'&search_date_endday='.urlencode((
string) ($search_date_endday));
354 if ($search_date_endmonth) {
355 $param .=
'&search_date_endmonth='.urlencode((
string) ($search_date_endmonth));
357 if ($search_date_endyear) {
358 $param .=
'&search_date_endyear='.urlencode((
string) ($search_date_endyear));
360 if ($search_expensereport) {
361 $param .=
'&search_expensereport='.urlencode($search_expensereport);
364 $param .=
'&search_label='.urlencode($search_label);
367 $param .=
'&search_desc='.urlencode($search_desc);
369 if ($search_amount) {
370 $param .=
'&search_amount='.urlencode($search_amount);
373 $param .=
'&search_vat='.urlencode($search_vat);
376 $arrayofmassactions = array(
377 'ventil' =>
img_picto(
'',
'check',
'class="pictofixedwidth"').$langs->trans(
"Ventilate")
379 $massactionbutton =
'';
380 if ($massaction !==
'set_default_account') {
381 $massactionbutton = $form->selectMassAction(
'ventil', $arrayofmassactions, 1);
384 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="post">'.
"\n";
385 print
'<input type="hidden" name="action" value="ventil">';
386 if ($optioncss !=
'') {
387 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
389 print
'<input type="hidden" name="token" value="'.newToken().
'">';
390 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
391 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
392 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
393 print
'<input type="hidden" name="page" value="'.$page.
'">';
396 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);
404 print
'<div class="div-table-responsive">';
405 print
'<table class="tagtable liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
408 print
'<tr class="liste_titre_filter">';
409 print
'<td class="liste_titre"><input type="text" class="flat maxwidth40" name="search_lineid" value="'.dol_escape_htmltag($search_lineid).
'"></td>';
410 print
'<td class="liste_titre"><input type="text" name="search_login" class="maxwidth50" value="'.dol_escape_htmltag($search_login).
'"></td>';
411 print
'<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_expensereport" value="'.dol_escape_htmltag($search_expensereport).
'"></td>';
413 print
'<td class="liste_titre"></td>';
415 print
'<td class="liste_titre center">';
416 print
'<div class="nowrapfordate">';
417 print $form->selectDate($search_date_start ? $search_date_start : -1,
'search_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
419 print
'<div class="nowrapfordate">';
420 print $form->selectDate($search_date_end ? $search_date_end : -1,
'search_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
423 print
'<td class="liste_titre"><input type="text" class="flat maxwidth50" name="search_label" value="'.dol_escape_htmltag($search_label).
'"></td>';
424 print
'<td class="liste_titre"><input type="text" class="flat maxwidthonsmartphone" name="search_desc" value="'.dol_escape_htmltag($search_desc).
'"></td>';
425 print
'<td class="liste_titre right"><input type="text" class="flat maxwidth50 right" name="search_amount" value="'.dol_escape_htmltag($search_amount).
'"></td>';
426 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>';
427 print
'<td class="liste_titre"></td>';
428 print
'<td class="liste_titre"></td>';
429 print
'<td class="center liste_titre">';
430 $searchpicto = $form->showFilterButtons();
435 print
'<tr class="liste_titre">';
438 print_liste_field_titre(
"ExpenseReport", $_SERVER[
"PHP_SELF"],
"er.ref",
"", $param,
'', $sortfield, $sortorder);
440 print_liste_field_titre(
"DateValidation", $_SERVER[
"PHP_SELF"],
"er.date_valid",
"", $param,
'', $sortfield, $sortorder,
'center ');
442 print_liste_field_titre(
"DateOfLine", $_SERVER[
"PHP_SELF"],
"erd.date, erd.rowid",
"", $param,
'', $sortfield, $sortorder,
'center ');
444 print_liste_field_titre(
"Description", $_SERVER[
"PHP_SELF"],
"erd.comments",
"", $param,
'', $sortfield, $sortorder);
445 print_liste_field_titre(
"Amount", $_SERVER[
"PHP_SELF"],
"erd.total_ht",
"", $param,
'', $sortfield, $sortorder,
'right maxwidth50 ');
446 print_liste_field_titre(
"VATRate", $_SERVER[
"PHP_SELF"],
"erd.tva_tx",
"", $param,
'', $sortfield, $sortorder,
'right ');
450 if ($massactionbutton) {
451 $checkpicto = $form->showCheckAddButtons(
'checkforselect', 1);
458 $userstatic =
new User($db);
459 $form =
new Form($db);
461 while ($i < min($num_lines, $limit)) {
462 $objp = $db->fetch_object($result);
464 $objp->aarowid_suggest =
'';
465 $objp->aarowid_suggest = $objp->aarowid;
467 $expensereport_static->ref = $objp->ref;
468 $expensereport_static->id = $objp->erid;
470 $userstatic->id = $objp->userid;
471 $userstatic->login = $objp->login;
472 $userstatic->status = $objp->statut;
473 $userstatic->email = $objp->email;
474 $userstatic->gender = $objp->gender;
475 $userstatic->firstname = $objp->firstname;
476 $userstatic->lastname = $objp->lastname;
477 $userstatic->employee = $objp->employee;
478 $userstatic->photo = $objp->photo;
480 print
'<tr class="oddeven">';
483 print
'<td>'.$objp->rowid.
'</td>';
486 print
'<td class="nowraponall">';
487 print $userstatic->getNomUrl(-1,
'', 0, 0, 24, 1,
'login',
'', 1);
491 print
'<td class="tdoverflowmax150">'.$expensereport_static->getNomUrl(1).
'</td>';
495 print
'<td class="center">'.dol_print_date($db->jdate($objp->date_valid),
'day').
'</td>';
499 print
'<td class="center">'.dol_print_date($db->jdate($objp->date),
'day').
'</td>';
503 print($langs->trans($objp->type_fees_code) == $objp->type_fees_code ? $objp->type_fees_label : $langs->trans(($objp->type_fees_code)));
510 print $form->textwithtooltip(
dol_trunc($text, $trunclength), $objp->comments);
514 print
'<td class="right nowraponall amount">';
515 print
price($objp->price);
519 print
'<td class="right">';
520 print
vatrate($objp->tva_tx_line.($objp->vat_src_code ?
' ('.$objp->vat_src_code.
')' :
''));
530 print $formaccounting->select_account($objp->aarowid_suggest,
'codeventil'.$objp->rowid, 1, array(), 0, 0,
'codeventil maxwidth200 maxwidthonsmartphone',
'cachewithshowemptyone');
533 print
'<td class="center">';
534 print
'<input type="checkbox" class="flat checkforselect checkforselect'.$objp->rowid.
'" name="toselect[]" value="'.$objp->rowid.
"_".$i.
'"'.($objp->aarowid ?
"checked" :
"").
'/>';
540 if ($num_lines == 0) {
541 print
'<tr><td colspan="13"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
551if ($db->type ==
'mysqli') {
552 $db->query(
"SET SQL_BIG_SELECTS=0");
556print
'<script type="text/javascript">
557jQuery(document).ready(function() {
558 jQuery(".codeventil").change(function() {
559 var s=$(this).attr("id").replace("codeventil", "")
560 console.log(s+" "+$(this).val());
561 if ($(this).val() == -1) jQuery(".checkforselect"+s).prop("checked", false);
562 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($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
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 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.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.