30require 
'../main.inc.php';
 
   31require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formexpensereport.class.php';
 
   32require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
 
   33require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
 
   34require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
 
   35require_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
 
   36require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
 
   37require_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
 
   38require_once DOL_DOCUMENT_ROOT.
'/compta/bank/class/account.class.php';
 
   39require_once DOL_DOCUMENT_ROOT.
'/core/lib/expensereport.lib.php';
 
   40require_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
 
   41require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
 
   42require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
 
   43require_once DOL_DOCUMENT_ROOT.
'/core/modules/expensereport/modules_expensereport.php';
 
   44require_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport.class.php';
 
   45require_once DOL_DOCUMENT_ROOT.
'/expensereport/class/paymentexpensereport.class.php';
 
   46require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
 
   47require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
 
   48if (isModEnabled(
'accounting')) {
 
   49  require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingjournal.class.php';
 
   53$langs->loadLangs(array(
"trips", 
"bills", 
"mails"));
 
   55$action = 
GETPOST(
'action', 
'aZ09');
 
   56$cancel = 
GETPOST(
'cancel', 
'alpha');
 
   57$confirm = 
GETPOST(
'confirm', 
'alpha');
 
   58$backtopage = 
GETPOST(
'backtopage', 
'alpha');
 
   64$fk_project = 
GETPOST(
'fk_project', 
'int');
 
   65$vatrate = 
GETPOST(
'vatrate', 
'alpha');
 
   67$comments = 
GETPOST(
'comments', 
'restricthtml');
 
   68$fk_c_type_fees = 
GETPOST(
'fk_c_type_fees', 
'int');
 
   71$childids = $user->getAllChildIds(1);
 
   74  if (empty($date_start)) {
 
   78  if (empty($date_end)) {
 
   85$rootfordata = DOL_DATA_ROOT;
 
   86$rootforuser = DOL_DATA_ROOT;
 
   88if (isModEnabled(
'multicompany') && !empty($conf->entity) && $conf->entity > 1) {
 
   89  $rootfordata .= 
'/'.$conf->entity;
 
   91$conf->expensereport->dir_output = $rootfordata.
'/expensereport';
 
   94$urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT, 
'/').
'$/i', 
'', trim($dolibarr_main_url_root));
 
   95$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; 
 
  108$extrafields->fetch_name_optionals_label($object->table_element);
 
  111include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php'; 
 
  114$hookmanager->initHooks(array(
'expensereportcard', 
'globalcard'));
 
  116$permissionnote = $user->rights->expensereport->creer; 
 
  117$permissiondellink = $user->rights->expensereport->creer; 
 
  118$permissiontoadd = $user->rights->expensereport->creer; 
 
  122$projectRequired = isModEnabled(
'project') && 
getDolGlobalString(
'EXPENSEREPORT_PROJECT_IS_REQUIRED');
 
  125if ($object->id > 0) {
 
  128  if ($user->hasRight(
'expensereport', 
'readall')) {
 
  131  if ($user->hasRight(
'expensereport', 
'lire') && in_array($object->fk_user_author, $childids)) {
 
  140if ($user->hasRight(
'expensereport', 
'supprimer')) {
 
  143if ($object->statut == 
ExpenseReport::STATUS_DRAFT && $user->hasRight(
'expensereport', 
'write') && in_array($object->fk_user_author, $childids)) {
 
  149  $socid = $user->socid;
 
  151$result = 
restrictedArea($user, 
'expensereport', $object->id, 
'expensereport');
 
  153$permissiontoadd = $user->rights->expensereport->creer; 
 
  163$parameters = array(
'socid' => $socid);
 
  164$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action); 
 
  169if (empty($reshook)) {
 
  170  $backurlforlist = DOL_URL_ROOT.
'/expensereport/list.php';
 
  172  if (empty($backtopage) || ($cancel && empty($id))) {
 
  173    if (empty($backtopage) || ($cancel && strpos($backtopage, 
'__ID__'))) {
 
  174      if (empty($id) && (($action != 
'add' && $action != 
'create') || $cancel)) {
 
  175        $backtopage = $backurlforlist;
 
  177        $backtopage = DOL_URL_ROOT.
'/expensereport/card.php?id='.((!empty($id) && $id > 0) ? $id : 
'__ID__');
 
  183    if (!empty($backtopageforcancel)) {
 
  184      header(
"Location: ".$backtopageforcancel);
 
  186    } elseif (!empty($backtopage)) {
 
  187      header(
"Location: ".$backtopage);
 
  201    $fk_c_type_fees = -1;
 
  204  include DOL_DOCUMENT_ROOT.
'/core/actions_linkedfiles.inc.php';
 
  206  if (!empty(
GETPOST(
'sendit', 
'alpha'))) {   
 
  207    if ($action == 
'updateline') {
 
  208      $action = 
'editline'; 
 
  214  include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php'; 
 
  216  include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php'; 
 
  218  include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php'; 
 
  221  if ($action == 
'confirm_clone' && $confirm == 
'yes' && $user->hasRight(
'expensereport', 
'creer')) {
 
  222    if (1 == 0 && !
GETPOST(
'clone_content', 
'alpha') && !
GETPOST(
'clone_receivers', 
'alpha')) {
 
  225      if ($object->id > 0) {
 
  227        $orig = clone $object;
 
  229        $result = $object->createFromClone($user, 
GETPOST(
'fk_user_author', 
'int'));
 
  231          header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
 
  242  if ($action == 
'confirm_delete' && 
GETPOST(
"confirm", 
'alpha') == 
"yes" && $id > 0 && $candelete) {
 
  244    $result = $object->fetch($id);
 
  245    $result = $object->delete($user);
 
  247      header(
"Location: index.php");
 
  254  if ($action == 
'add' && $user->hasRight(
'expensereport', 
'creer')) {
 
  259    $object->date_debut = $date_start;
 
  260    $object->date_fin = $date_end;
 
  262    $object->fk_user_author = 
GETPOST(
'fk_user_author', 
'int');
 
  263    if (!($object->fk_user_author > 0)) {
 
  264      $object->fk_user_author = $user->id;
 
  268    if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'expensereport', 
'creer'))
 
  269      || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'expensereport', 
'creer') && !$user->hasRight(
'expensereport', 
'writeall_advance'))) {
 
  274      if (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || !$user->hasRight(
'expensereport', 
'writeall_advance')) {
 
  275        if (!in_array($object->fk_user_author, $childids)) {
 
  282    $fuser = 
new User($db);
 
  283    $fuser->fetch($object->fk_user_author);
 
  286    $object->fk_c_paiement = 
GETPOST(
'fk_c_paiement', 
'int');
 
  287    $object->fk_user_validator = 
GETPOST(
'fk_user_validator', 
'int');
 
  288    $object->note_public = 
GETPOST(
'note_public', 
'restricthtml');
 
  289    $object->note_private = 
GETPOST(
'note_private', 
'restricthtml');
 
  292      $ret = $extrafields->setOptionalsFromPost(
null, $object);
 
  299      $overlappingExpenseReportID = $object->periode_existe($fuser, $object->date_debut, $object->date_fin);
 
  301      if ($overlappingExpenseReportID > 0) {
 
  303        setEventMessages($langs->trans(
"ErrorDoubleDeclaration").
' <a href="'.$_SERVER[
'PHP_SELF'].
'?id='.$overlappingExpenseReportID.
'">'. $langs->trans(
'ShowTrip').
'</a>', 
null, 
'errors');
 
  311      $id = $object->create($user);
 
  318        Header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
 
  328  if (($action == 
'update' || $action == 
'updateFromRefuse') && $user->hasRight(
'expensereport', 
'creer')) {
 
  332    $object->date_debut = $date_start;
 
  333    $object->date_fin = $date_end;
 
  335    if ($object->status < 3) {
 
  336      $object->fk_user_validator = 
GETPOST(
'fk_user_validator', 
'int');
 
  339    $object->fk_c_paiement = 
GETPOST(
'fk_c_paiement', 
'int');
 
  340    $object->note_public = 
GETPOST(
'note_public', 
'restricthtml');
 
  341    $object->note_private = 
GETPOST(
'note_private', 
'restricthtml');
 
  342    $object->fk_user_modif = $user->id;
 
  344    $result = $object->update($user);
 
  346      header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOST(
'id', 
'int'));
 
  353  if ($action == 
'update_extras') {
 
  354    $object->oldcopy = 
dol_clone($object, 2);
 
  357    $ret = $extrafields->setOptionalsFromPost(
null, $object, 
GETPOST(
'attribute', 
'restricthtml'));
 
  364      $result = $object->insertExtraFields(
'EXPENSEREPORT_MODIFY');
 
  372      $action = 
'edit_extras';
 
  376  if ($action == 
"confirm_validate" && 
GETPOST(
"confirm", 
'alpha') == 
"yes" && $id > 0 && $user->hasRight(
'expensereport', 
'creer')) {
 
  384    $result = $object->setValidate($user);
 
  389        $outputlangs = $langs;
 
  392          $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
  395          $user = 
new User($db);
 
  396          $user->fetch($object->fk_user_author);
 
  397          $newlang = $user->lang;
 
  399        if (!empty($newlang)) {
 
  401          $outputlangs->setDefaultLang($newlang);
 
  403        $model = $object->model_pdf;
 
  404        $ret = $object->fetch($id); 
 
  406        $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
  413    if (!$error && $result > 0 && $object->fk_user_validator > 0) {
 
  414      $langs->load(
"mails");
 
  417      $destinataire = 
new User($db);
 
  418      $destinataire->fetch($object->fk_user_validator);
 
  419      $emailTo = $destinataire->email;
 
  422      $expediteur = 
new User($db);
 
  423      $expediteur->fetch($object->fk_user_author);
 
  424      $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
 
  426      if ($emailTo && $emailFrom) {
 
  432        $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
 
  434          $societeName = $conf->global->MAIN_APPLICATION_TITLE;
 
  437        $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForApproval");
 
  440        $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
 
  441        $link = 
'<a href="'.$link.
'">'.$link.
'</a>';
 
  442        $message = $langs->transnoentities(
"ExpenseReportWaitingForApprovalMessage", $expediteur->getFullName($langs), 
get_date_range($object->date_debut, $object->date_fin, 
'', $langs), $link);
 
  457        $mailfile = 
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, 
'', 
'', 0, -1);
 
  461          $result = $mailfile->sendfile();
 
  463            $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
 
  466            $langs->load(
"other");
 
  467            if (!empty($mailfile->error) || !empty($mailfile->errors)) {
 
  470              if (!empty($mailfile->error)) {
 
  471                $mesg .= 
'<br>' . $mailfile->error;
 
  473              if (!empty($mailfile->errors) && is_array($mailfile->errors)) {
 
  474                $mesg .= 
'<br>' . implode(
'<br>', $mailfile->errors);
 
  478              setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', 
null, 
'warnings');
 
  486        setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"), 
null, 
'warnings');
 
  493      header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
 
  500  if ($action == 
"confirm_save_from_refuse" && 
GETPOST(
"confirm", 
'alpha') == 
"yes" && $id > 0 && $user->hasRight(
'expensereport', 
'creer')) {
 
  503    $result = $object->set_save_from_refuse($user);
 
  508        $outputlangs = $langs;
 
  511          $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
  514          $user = 
new User($db);
 
  515          $user->fetch($object->fk_user_author);
 
  516          $newlang = $user->lang;
 
  518        if (!empty($newlang)) {
 
  520          $outputlangs->setDefaultLang($newlang);
 
  522        $model = $object->model_pdf;
 
  523        $ret = $object->fetch($id); 
 
  525        $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
  533      $destinataire = 
new User($db);
 
  534      $destinataire->fetch($object->fk_user_validator);
 
  535      $emailTo = $destinataire->email;
 
  538      $expediteur = 
new User($db);
 
  539      $expediteur->fetch($object->fk_user_author);
 
  540      $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
 
  542      if ($emailFrom && $emailTo) {
 
  548        $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
 
  550          $societeName = $conf->global->MAIN_APPLICATION_TITLE;
 
  553        $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForReApproval");
 
  556        $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
 
  557        $link = 
'<a href="'.$link.
'">'.$link.
'</a>';
 
  558        $message = $langs->transnoentities(
"ExpenseReportWaitingForReApprovalMessage", 
dol_print_date($object->date_refuse, 
'day'), $object->detail_refuse, $expediteur->getFullName($langs), 
get_date_range($object->date_debut, $object->date_fin, 
'', $langs), $link);
 
  577        $mailfile = 
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, 
'', 
'', 0, -1);
 
  581          $result = $mailfile->sendfile();
 
  583            $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
 
  585            header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
 
  588            $langs->load(
"other");
 
  589            if ($mailfile->error) {
 
  591              $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
 
  592              $mesg .= 
'<br>'.$mailfile->error;
 
  595              setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', 
null, 
'warnings');
 
  603        setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"), 
null, 
'warnings');
 
  612  if ($action == 
"confirm_approve" && 
GETPOST(
"confirm", 
'alpha') == 
"yes" && $id > 0 && $user->hasRight(
'expensereport', 
'approve')) {
 
  616    $result = $object->setApproved($user);
 
  621        $outputlangs = $langs;
 
  624          $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
  627          $user = 
new User($db);
 
  628          $user->fetch($object->fk_user_author);
 
  629          $newlang = $user->lang;
 
  631        if (!empty($newlang)) {
 
  633          $outputlangs->setDefaultLang($newlang);
 
  635        $model = $object->model_pdf;
 
  636        $ret = $object->fetch($id); 
 
  638        $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
  646      $destinataire = 
new User($db);
 
  647      $destinataire->fetch($object->fk_user_author);
 
  648      $emailTo = $destinataire->email;
 
  652      if (empty($emailTo)) {
 
  657      $expediteur = 
new User($db);
 
  658      $expediteur->fetch($object->fk_user_approve > 0 ? $object->fk_user_approve : $object->fk_user_validator);
 
  661      if ($emailFrom && $emailTo) {
 
  672        $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportApproved");
 
  675        $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
 
  676        $link = 
'<a href="'.$link.
'">'.$link.
'</a>';
 
  677        $message = $langs->transnoentities(
"ExpenseReportApprovedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
 
  694        $mailfile = 
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, 
'', 
'', 0, -1);
 
  698          $result = $mailfile->sendfile();
 
  700            $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
 
  702            header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
 
  705            $langs->load(
"other");
 
  706            if ($mailfile->error) {
 
  708              $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
 
  709              $mesg .= 
'<br>'.$mailfile->error;
 
  712              setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', 
null, 
'warnings');
 
  720        setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"), 
null, 
'warnings');
 
  729  if ($action == 
"confirm_refuse" && 
GETPOST(
'confirm', 
'alpha') == 
"yes" && $id > 0 && $user->hasRight(
'expensereport', 
'approve')) {
 
  733    $detailRefuse = 
GETPOST(
'detail_refuse', 
'alpha');
 
  734    $result = $object->setDeny($user, $detailRefuse);
 
  739        $outputlangs = $langs;
 
  742          $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
  745          $user = 
new User($db);
 
  746          $user->fetch($object->fk_user_author);
 
  747          $newlang = $user->lang;
 
  749        if (!empty($newlang)) {
 
  751          $outputlangs->setDefaultLang($newlang);
 
  753        $model = $object->model_pdf;
 
  754        $ret = $object->fetch($id); 
 
  756        $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
  764      $destinataire = 
new User($db);
 
  765      $destinataire->fetch($object->fk_user_author);
 
  766      $emailTo = $destinataire->email;
 
  769      $expediteur = 
new User($db);
 
  770      $expediteur->fetch($object->fk_user_refuse);
 
  771      $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
 
  773      if ($emailFrom && $emailTo) {
 
  779        $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
 
  781          $societeName = $conf->global->MAIN_APPLICATION_TITLE;
 
  784        $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportRefused");
 
  787        $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
 
  788        $link = 
'<a href="'.$link.
'">'.$link.
'</a>';
 
  789        $message = $langs->transnoentities(
"ExpenseReportRefusedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailRefuse, $link);
 
  807        $mailfile = 
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, 
'', 
'', 0, -1);
 
  811          $result = $mailfile->sendfile();
 
  813            $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
 
  815            header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
 
  818            $langs->load(
"other");
 
  819            if ($mailfile->error) {
 
  821              $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
 
  822              $mesg .= 
'<br>'.$mailfile->error;
 
  825              setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', 
null, 
'warnings');
 
  833        setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"), 
null, 
'warnings');
 
  843  if ($action == 
"confirm_cancel" && 
GETPOST(
'confirm', 
'alpha') == 
"yes" && $id > 0 && $user->hasRight(
'expensereport', 
'creer')) {
 
  844    if (!
GETPOST(
'detail_cancel', 
'alpha')) {
 
  845      setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Comment")), 
null, 
'errors');
 
  850      if ($user->id == $object->fk_user_valid || $user->id == $object->fk_user_author) {
 
  851        $detailCancel = 
GETPOST(
'detail_cancel', 
'alpha');
 
  852        $result = $object->set_cancel($user, $detailCancel);
 
  857            $outputlangs = $langs;
 
  860              $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
  863              $user = 
new User($db);
 
  864              $user->fetch($object->fk_user_author);
 
  865              $newlang = $user->lang;
 
  867            if (!empty($newlang)) {
 
  869              $outputlangs->setDefaultLang($newlang);
 
  871            $model = $object->model_pdf;
 
  872            $ret = $object->fetch($id); 
 
  874            $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
  882          $destinataire = 
new User($db);
 
  883          $destinataire->fetch($object->fk_user_author);
 
  884          $emailTo = $destinataire->email;
 
  887          $expediteur = 
new User($db);
 
  888          $expediteur->fetch($object->fk_user_cancel);
 
  889          $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
 
  891          if ($emailFrom && $emailTo) {
 
  897            $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
 
  899              $societeName = $conf->global->MAIN_APPLICATION_TITLE;
 
  902            $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportCanceled");
 
  905            $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
 
  906            $link = 
'<a href="'.$link.
'">'.$link.
'</a>';
 
  907            $message = $langs->transnoentities(
"ExpenseReportCanceledMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailCancel, $link);
 
  925            $mailfile = 
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, 
'', 
'', 0, -1);
 
  929              $result = $mailfile->sendfile();
 
  931                $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
 
  933                header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
 
  936                $langs->load(
"other");
 
  937                if ($mailfile->error) {
 
  939                  $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
 
  940                  $mesg .= 
'<br>'.$mailfile->error;
 
  943                  setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', 
null, 
'warnings');
 
  951            setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"), 
null, 
'warnings');
 
  964  if ($action == 
"confirm_setdraft" && 
GETPOST(
'confirm', 
'alpha') == 
"yes" && $id > 0 && $user->hasRight(
'expensereport', 
'creer')) {
 
  967    if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
 
  968      $result = $object->setStatut(0);
 
  973          $outputlangs = $langs;
 
  976            $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
  979            $user = 
new User($db);
 
  980            $user->fetch($object->fk_user_author);
 
  981            $newlang = $user->lang;
 
  983          if (!empty($newlang)) {
 
  985            $outputlangs->setDefaultLang($newlang);
 
  987          $model = $object->model_pdf;
 
  988          $ret = $object->fetch($id); 
 
  990          $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
  995        header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
 
 1005  if ($action == 
'set_unpaid' && $id > 0 && $user->hasRight(
'expensereport', 
'to_paid')) {
 
 1007    $object->fetch($id);
 
 1009    $result = $object->setUnpaid($user);
 
 1014        $outputlangs = $langs;
 
 1017          $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
 1020          $user = 
new User($db);
 
 1021          $user->fetch($object->fk_user_author);
 
 1022          $newlang = $user->lang;
 
 1024        if (!empty($newlang)) {
 
 1025          $outputlangs = 
new Translate(
"", $conf);
 
 1026          $outputlangs->setDefaultLang($newlang);
 
 1028        $model = $object->model_pdf;
 
 1029        $ret = $object->fetch($id); 
 
 1031        $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
 1036  if ($action == 
'set_paid' && $id > 0 && $user->hasRight(
'expensereport', 
'to_paid')) {
 
 1038    $object->fetch($id);
 
 1040    $result = $object->setPaid($id, $user);
 
 1045        $outputlangs = $langs;
 
 1048          $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
 1051          $user = 
new User($db);
 
 1052          $user->fetch($object->fk_user_author);
 
 1053          $newlang = $user->lang;
 
 1055        if (!empty($newlang)) {
 
 1056          $outputlangs = 
new Translate(
"", $conf);
 
 1057          $outputlangs->setDefaultLang($newlang);
 
 1059        $model = $object->model_pdf;
 
 1060        $ret = $object->fetch($id); 
 
 1062        $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
 1070      $destinataire = 
new User($db);
 
 1071      $destinataire->fetch($object->fk_user_author);
 
 1072      $emailTo = $destinataire->email;
 
 1075      $expediteur = 
new User($db);
 
 1076      $expediteur->fetch($user->id);
 
 1077      $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
 
 1079      if ($emailFrom && $emailTo) {
 
 1080        $filename = array();
 
 1082        $mimetype = array();
 
 1085        $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
 
 1087          $societeName = $conf->global->MAIN_APPLICATION_TITLE;
 
 1090        $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportPaid");
 
 1093        $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
 
 1094        $link = 
'<a href="'.$link.
'">'.$link.
'</a>';
 
 1095        $message = $langs->transnoentities(
"ExpenseReportPaidMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
 
 1098        $object->setDocModel($user, 
"");
 
 1099        $resultPDF = expensereport_pdf_create($db, $object, 
'', 
"", $langs);
 
 1102        $mailfile = 
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, 
'', 
'', 0, -1);
 
 1106          $result = $mailfile->sendfile();
 
 1108            $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
 
 1110            header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
 
 1113            $langs->load(
"other");
 
 1114            if ($mailfile->error) {
 
 1116              $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
 
 1117              $mesg .= 
'<br>'.$mailfile->error;
 
 1120              setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', 
null, 
'warnings');
 
 1128        setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"), 
null, 
'warnings');
 
 1137  if ($action == 
"addline" && $user->hasRight(
'expensereport', 
'creer')) {
 
 1142    if (GETPOSTISSET(
'attachfile')) {
 
 1143      $arrayoffiles = 
GETPOST(
'attachfile', 
'array');
 
 1144      if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
 
 1145        include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
 
 1146        $entityprefix = ($conf->entity != 
'1') ? $conf->entity.
'/' : 
'';
 
 1147        $relativepath = 
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
 
 1149        $ecmfiles->fetch(0, 
'', $relativepath);
 
 1150        $fk_ecm_files = $ecmfiles->id;
 
 1155    if (empty($vatrate)) {
 
 1158    $tmpvat = 
price2num(preg_replace(
'/\s*\(.*\)/', 
'', $vatrate));
 
 1162    if (empty($value_unit)) {
 
 1163      $value_unit = 
price2num($value_unit_ht + ($value_unit_ht * $tmpvat / 100), 
'MU');
 
 1166    $fk_c_exp_tax_cat = 
GETPOST(
'fk_c_exp_tax_cat', 
'int');
 
 1173    if (!($fk_c_type_fees > 0)) {
 
 1175      setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")), 
null, 
'errors');
 
 1179    if ((
float) $tmpvat < 0 || $tmpvat === 
'') {
 
 1181      setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"VAT")), 
null, 
'errors');
 
 1186    if (empty($date) || $date == 
"--") {
 
 1188      setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")), 
null, 
'errors');
 
 1189    } elseif ($date < $object->date_debut || $date > ($object->date_fin + (24 * 3600 - 1))) {
 
 1191      $langs->load(
"errors");
 
 1192      setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"), 
null, 
'warnings');
 
 1196    if ($value_unit == 0) {
 
 1198      setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PriceUTTC")), 
null, 
'errors');
 
 1202    if ($projectRequired && $fk_project <= 0) {
 
 1204      setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")), 
null, 
'errors');
 
 1208    if ($fileRequired && $fk_ecm_files == 0) {
 
 1210      setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"File")), 
null, 
'errors');
 
 1217      $result = $object->addline($qty, $value_unit, $fk_c_type_fees, $vatrate, $date, $comments, $fk_project, $fk_c_exp_tax_cat, $type, $fk_ecm_files);
 
 1219        $ret = $object->fetch($object->id); 
 
 1223          $outputlangs = $langs;
 
 1224          $newlang = 
GETPOST(
'lang_id', 
'alpha');
 
 1226            $user = 
new User($db);
 
 1227            $user->fetch($object->fk_user_author);
 
 1228            $newlang = $user->lang;
 
 1230          if (!empty($newlang)) {
 
 1231            $outputlangs = 
new Translate(
"", $conf);
 
 1232            $outputlangs->setDefaultLang($newlang);
 
 1235          $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
 1239        unset($value_unit_ht);
 
 1243        unset($fk_c_type_fees);
 
 1254      header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOST(
'id', 
'int'));
 
 1261  if ($action == 
'confirm_delete_line' && 
GETPOST(
"confirm", 
'alpha') == 
"yes" && $user->hasRight(
'expensereport', 
'creer')) {
 
 1263    $object->fetch($id);
 
 1266    $object_ligne->fetch(
GETPOST(
"rowid", 
'int'));
 
 1267    $total_ht = $object_ligne->total_ht;
 
 1268    $total_tva = $object_ligne->total_tva;
 
 1270    $result = $object->deleteline(
GETPOST(
"rowid", 
'int'), $user);
 
 1275          $outputlangs = $langs;
 
 1278            $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
 1281            $user = 
new User($db);
 
 1282            $user->fetch($object->fk_user_author);
 
 1283            $newlang = $user->lang;
 
 1285          if (!empty($newlang)) {
 
 1286            $outputlangs = 
new Translate(
"", $conf);
 
 1287            $outputlangs->setDefaultLang($newlang);
 
 1289          $model = $object->model_pdf;
 
 1290          $ret = $object->fetch($id); 
 
 1292          $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
 1296      header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOST(
'id', 
'int'));
 
 1303  if ($action == 
"updateline" && $user->hasRight(
'expensereport', 
'creer')) {
 
 1305    $object->fetch($id);
 
 1309    if (GETPOSTISSET(
'attachfile')) {
 
 1310      $arrayoffiles = 
GETPOST(
'attachfile', 
'array');
 
 1311      if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
 
 1312        include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
 
 1313        $relativepath = 
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
 
 1315        $ecmfiles->fetch(0, 
'', $relativepath);
 
 1316        $fk_ecm_files = $ecmfiles->id;
 
 1320    $rowid = 
GETPOST(
'rowid', 
'int');
 
 1321    $type_fees_id = 
GETPOST(
'fk_c_type_fees', 
'int');
 
 1322    $fk_c_exp_tax_cat = 
GETPOST(
'fk_c_exp_tax_cat', 
'int');
 
 1323    $projet_id = $fk_project;
 
 1324    $comments = 
GETPOST(
'comments', 
'restricthtml');
 
 1326    $vatrate = 
GETPOST(
'vatrate', 
'alpha');
 
 1329    if (empty($vatrate)) {
 
 1332    $tmpvat = 
price2num(preg_replace(
'/\s*\(.*\)/', 
'', $vatrate));
 
 1336    if (empty($value_unit)) {
 
 1337      $value_unit = 
price2num($value_unit_ht + ($value_unit_ht * $tmpvat / 100), 
'MU');
 
 1340    if (!
GETPOST(
'fk_c_type_fees', 
'int') > 0) {
 
 1342      setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")), 
null, 
'errors');
 
 1345    if ((
float) $tmpvat < 0 || $tmpvat == 
'') {
 
 1347      setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Vat")), 
null, 
'errors');
 
 1351    if ($date < $object->date_debut || $date > ($object->date_fin + (24 * 3600 - 1))) {
 
 1352      $langs->load(
"errors");
 
 1353      setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"), 
null, 
'warnings');
 
 1357    if ($projectRequired && $projet_id <= 0) {
 
 1359      setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")), 
null, 
'errors');
 
 1364      $result = $object->updateline($rowid, $type_fees_id, $projet_id, $vatrate, $comments, $qty, $value_unit, $date, $id, $fk_c_exp_tax_cat, $fk_ecm_files);
 
 1369            $outputlangs = $langs;
 
 1372              $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
 1375              $user = 
new User($db);
 
 1376              $user->fetch($object->fk_user_author);
 
 1377              $newlang = $user->lang;
 
 1379            if (!empty($newlang)) {
 
 1380              $outputlangs = 
new Translate(
"", $conf);
 
 1381              $outputlangs->setDefaultLang($newlang);
 
 1383            $model = $object->model_pdf;
 
 1384            $ret = $object->fetch($id); 
 
 1386            $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
 
 1390          unset($value_unit_ht);
 
 1394          unset($fk_c_type_fees);
 
 1408  include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
 
 1411  $triggersendname = 
'EXPENSEREPORT_SENTBYMAIL';
 
 1412  $autocopy = 
'MAIN_MAIL_AUTOCOPY_EXPENSEREPORT_TO';
 
 1413  $trackid = 
'exp'.$object->id;
 
 1414  include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
 
 1417  $upload_dir = $conf->expensereport->dir_output;
 
 1418  include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
 
 1426$title = $langs->trans(
"ExpenseReport").
" - ".$langs->trans(
"Card");
 
 1427$help_url = 
"EN:Module_Expense_Reports|FR:Module_Notes_de_frais";
 
 1431$form = 
new Form($db);
 
 1434$projecttmp = 
new Project($db);
 
 1436$bankaccountstatic = 
new Account($db);
 
 1437$ecmfilesstatic = 
new EcmFiles($db);
 
 1441if ($action == 
'create') {
 
 1444  print 
'<form action="'.$_SERVER[
'PHP_SELF'].
'" method="post" name="create">';
 
 1445  print 
'<input type="hidden" name="token" value="'.newToken().
'">';
 
 1446  print 
'<input type="hidden" name="action" value="add">';
 
 1447  print 
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
 
 1451  print 
'<table class="border centpercent">';
 
 1456  print 
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"DateStart").
'</td>';
 
 1458  print $form->selectDate($date_start ? $date_start : -1, 
'date_debut', 0, 0, 0, 
'', 1, 1);
 
 1464  print 
'<td class="fieldrequired">'.$langs->trans(
"DateEnd").
'</td>';
 
 1466  print $form->selectDate($date_end ? $date_end : -1, 
'date_fin', 0, 0, 0, 
'', 1, 1);
 
 1472  print 
'<td class="fieldrequired">'.$langs->trans(
"User").
'</td>';
 
 1474  $defaultselectuser = $user->id;
 
 1475  if (
GETPOST(
'fk_user_author', 
'int') > 0) {
 
 1476    $defaultselectuser = 
GETPOST(
'fk_user_author', 
'int');
 
 1478  $include_users = 
'hierarchyme';
 
 1479  if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expensereport', 
'writeall_advance')) {
 
 1480    $include_users = array();
 
 1482  $s = $form->select_dolusers($defaultselectuser, 
"fk_user_author", 0, 
"", 0, $include_users, 
'', 
'0,'.$conf->entity);
 
 1489  print 
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
 
 1492  $include_users = $object->fetch_users_approver_expensereport();
 
 1493  if (empty($include_users)) {
 
 1494    print 
img_warning().
' '.$langs->trans(
"NobodyHasPermissionToValidateExpenseReport");
 
 1496    $defaultselectuser = (empty($user->fk_user_expense_validator) ? $user->fk_user : $user->fk_user_expense_validator); 
 
 1498      $defaultselectuser = $conf->global->EXPENSEREPORT_DEFAULT_VALIDATOR; 
 
 1500    if (
GETPOST(
'fk_user_validator', 
'int') > 0) {
 
 1501      $defaultselectuser = 
GETPOST(
'fk_user_validator', 
'int');
 
 1503    $s = $form->select_dolusers($defaultselectuser, 
"fk_user_validator", 1, 
"", ((empty($defaultselectuser) || !
getDolGlobalString(
'EXPENSEREPORT_DEFAULT_VALIDATOR_UNCHANGEABLE')) ? 0 : 1), $include_users);
 
 1504    print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
 
 1512    print 
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
 
 1514    $form->select_types_paiements(
'', 
'fk_c_paiement');
 
 1520  $note_public = GETPOSTISSET(
'note_public') ? 
GETPOST(
'note_public', 
'restricthtml') : 
'';
 
 1523  print 
'<td class="tdtop">'.$langs->trans(
'NotePublic').
'</td>';
 
 1526  $doleditor = 
new DolEditor(
'note_public', $note_public, 
'', 80, 
'dolibarr_notes', 
'In', 0, 
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3, 
'90%');
 
 1527  print $doleditor->Create(1);
 
 1531  $note_private = GETPOSTISSET(
'note_private') ? 
GETPOST(
'note_private', 
'restricthtml') : 
'';
 
 1533  if (empty($user->socid)) {
 
 1535    print 
'<td class="tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
 
 1538    $doleditor = 
new DolEditor(
'note_private', $note_private, 
'', 80, 
'dolibarr_notes', 
'In', 0, 
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3, 
'90%');
 
 1539    print $doleditor->Create(1);
 
 1544  $parameters = array(
'colspan' => 
' colspan="3"', 
'cols' => 3);
 
 1545  $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action); 
 
 1546  print $hookmanager->resPrint;
 
 1547  if (empty($reshook)) {
 
 1548    print $object->showOptionals($extrafields, 
'create', $parameters);
 
 1556  print $form->buttonsSaveCancel(
"AddTrip");
 
 1559} elseif ($id > 0 || $ref) {
 
 1560  $result = $object->fetch($id, $ref);
 
 1563    if (!in_array($object->fk_user_author, $user->getAllChildIds(1))) {
 
 1564      if (!$user->hasRight(
'expensereport', 
'readall') && !$user->hasRight(
'expensereport', 
'lire_tous')
 
 1565        && (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || !$user->hasRight(
'expensereport', 
'writeall_advance'))) {
 
 1568        print 
'<div class="tabBar">';
 
 1569        print $langs->trans(
'NotUserRightToView');
 
 1582    if ($action == 
'edit' && ($object->status < 3 || $object->status == 99)) {
 
 1583      print 
"<form name='update' action=\"".$_SERVER[
'PHP_SELF'].
"\" method=\"post\">\n";
 
 1584      print 
'<input type="hidden" name="token" value="'.newToken().
'">';
 
 1585      print 
'<input type="hidden" name="id" value="'.$id.
'">';
 
 1586      print 
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
 
 1590      if ($object->status == 99) {
 
 1591        print 
'<input type="hidden" name="action" value="updateFromRefuse">';
 
 1593        print 
'<input type="hidden" name="action" value="update">';
 
 1596      $linkback = 
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ? 
'&socid='.$socid : 
'').
'">'.$langs->trans(
"BackToList").
'</a>';
 
 1598      print 
'<table class="border centpercent">';
 
 1601      print 
'<td>'.$langs->trans(
"User").
'</td>';
 
 1603      $userfee = 
new User($db);
 
 1604      if ($object->fk_user_author > 0) {
 
 1605        $userfee->fetch($object->fk_user_author);
 
 1606        print $userfee->getNomUrl(-1);
 
 1611      print 
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Ref").
'</td><td>';
 
 1612      print $form->showrefnav($object, 
'ref', $linkback, 1, 
'ref', 
'ref', 
'');
 
 1616      print 
'<td>'.$langs->trans(
"DateStart").
'</td>';
 
 1618      print $form->selectDate($object->date_debut, 
'date_debut');
 
 1622      print 
'<td>'.$langs->trans(
"DateEnd").
'</td>';
 
 1624      print $form->selectDate($object->date_fin, 
'date_fin');
 
 1630        print 
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
 
 1632        $form->select_types_paiements($object->fk_c_paiement, 
'fk_c_paiement');
 
 1637      if ($object->status < 3) {
 
 1639        print 
'<td>'.$langs->trans(
"VALIDATOR").
'</td>'; 
 
 1641        $include_users = $object->fetch_users_approver_expensereport();
 
 1642        $s = $form->select_dolusers($object->fk_user_validator, 
"fk_user_validator", 1, 
"", 0, $include_users);
 
 1643        print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
 
 1648        print 
'<td>'.$langs->trans(
"VALIDOR").
'</td>';
 
 1650        $userfee = 
new User($db);
 
 1651        $userfee->fetch($object->fk_user_valid);
 
 1652        print $userfee->getNomUrl(-1);
 
 1656      if ($object->status == 6) {
 
 1658        print 
'<td>'.$langs->trans(
"AUTHORPAIEMENT").
'</td>';
 
 1660        $userfee = 
new User($db);
 
 1661        $userfee->fetch($user->id);
 
 1662        print $userfee->getNomUrl(-1);
 
 1674      print $form->buttonsSaveCancel(
"Modify");
 
 1678      $taxlessUnitPriceDisabled = 
getDolGlobalString(
'EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY') ? 
' disabled' : 
'';
 
 1685      if ($action == 
'clone') {
 
 1687        $criteriaforfilter = 
'hierarchyme';
 
 1688        if ($user->hasRight(
'expensereport', 
'readall')) {
 
 1689          $criteriaforfilter = 
'';
 
 1691        $formquestion = array(
 
 1693          array(
'type' => 
'other', 
'name' => 
'fk_user_author', 
'label' => $langs->trans(
"SelectTargetUser"), 
'value' => $form->select_dolusers((
GETPOST(
'fk_user_author', 
'int') > 0 ? 
GETPOST(
'fk_user_author', 
'int') : $user->id), 
'fk_user_author', 0, null, 0, $criteriaforfilter, 
'', 
'0', 0, 0, 
'', 0, 
'', 
'maxwidth150'))
 
 1696        $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneExpenseReport', $object->ref), 
'confirm_clone', $formquestion, 
'yes', 1);
 
 1699      if ($action == 
'save') {
 
 1700        $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"), 
"confirm_validate", 
"", 
"", 1);
 
 1703      if ($action == 
'save_from_refuse') {
 
 1704        $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"), 
"confirm_save_from_refuse", 
"", 
"", 1);
 
 1707      if ($action == 
'delete') {
 
 1708        $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"DeleteTrip"), $langs->trans(
"ConfirmDeleteTrip"), 
"confirm_delete", 
"", 
"", 1);
 
 1711      if ($action == 
'validate') {
 
 1712        $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"ValideTrip"), $langs->trans(
"ConfirmValideTrip"), 
"confirm_approve", 
"", 
"", 1);
 
 1715      if ($action == 
'paid') {
 
 1716        $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"PaidTrip"), $langs->trans(
"ConfirmPaidTrip"), 
"confirm_paid", 
"", 
"", 1);
 
 1719      if ($action == 
'cancel') {
 
 1720        $array_input = array(
'text'=>$langs->trans(
"ConfirmCancelTrip"), array(
'type'=>
"text", 
'label'=>
'<strong>'.$langs->trans(
"Comment").
'</strong>', 
'name'=>
"detail_cancel", 
'value'=>
""));
 
 1721        $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Cancel"), 
"", 
"confirm_cancel", $array_input, 
"", 1);
 
 1724      if ($action == 
'setdraft') {
 
 1725        $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"BrouillonnerTrip"), $langs->trans(
"ConfirmBrouillonnerTrip"), 
"confirm_setdraft", 
"", 
"", 1);
 
 1728      if ($action == 
'refuse') {    
 
 1729        $array_input = array(
'text'=>$langs->trans(
"ConfirmRefuseTrip"), array(
'type'=>
"text", 
'label'=>$langs->trans(
"Comment"), 
'name'=>
"detail_refuse", 
'value'=>
""));
 
 1730        $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Deny"), 
'', 
"confirm_refuse", $array_input, 
"yes", 1);
 
 1733      if ($action == 
'delete_line') {
 
 1734        $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id.
"&rowid=".
GETPOST(
'rowid', 
'int'), $langs->trans(
"DeleteLine"), $langs->trans(
"ConfirmDeleteLine"), 
"confirm_delete_line", 
'', 
'yes', 1);
 
 1741      $linkback = 
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ? 
'&socid='.$socid : 
'').
'">'.$langs->trans(
"BackToList").
'</a>';
 
 1743      $morehtmlref = 
'<div class="refidno">';
 
 1744      $morehtmlref .= 
'</div>';
 
 1746      dol_banner_tab($object, 
'ref', $linkback, 1, 
'ref', 
'ref', $morehtmlref);
 
 1748      print 
'<div class="fichecenter">';
 
 1749      print 
'<div class="fichehalfleft">';
 
 1750      print 
'<div class="underbanner clearboth"></div>';
 
 1752      print 
'<table class="border tableforfield centpercent">';
 
 1756      print 
'<td class="titlefield">'.$langs->trans(
"User").
'</td>';
 
 1758      if ($object->fk_user_author > 0) {
 
 1759        $userauthor = 
new User($db);
 
 1760        $result = $userauthor->fetch($object->fk_user_author);
 
 1763        } elseif ($result > 0) {
 
 1764          print $userauthor->getNomUrl(-1);
 
 1771      print 
'<td class="titlefield">'.$langs->trans(
"Period").
'</td>';
 
 1773      print 
get_date_range($object->date_debut, $object->date_fin, 
'day', $langs, 0);
 
 1778        print 
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
 
 1779        print 
'<td>'.$object->fk_c_paiement.
'</td>';
 
 1785      print 
'<td>'.$langs->trans(
"DATE_SAVE").
'</td>';
 
 1786      print 
'<td>'.dol_print_date($object->date_valid, 
'dayhour', 
'tzuser');
 
 1787      if ($object->status == 2 && $object->hasDelay(
'toapprove')) {
 
 1788        print 
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToApprove"));
 
 1790      if ($object->status == 5 && $object->hasDelay(
'topay')) {
 
 1791        print 
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToPay"));
 
 1799        print 
'<td>'.$langs->trans(
"VALIDATOR").
'</td>'; 
 
 1801        if ($object->fk_user_validator > 0) {
 
 1802          $userfee = 
new User($db);
 
 1803          $result = $userfee->fetch($object->fk_user_validator);
 
 1805            print $userfee->getNomUrl(-1);
 
 1807          if (empty($userfee->email) || !
isValidEmail($userfee->email)) {
 
 1808            $langs->load(
"errors");
 
 1809            print 
img_warning($langs->trans(
"ErrorBadEMail", $userfee->email));
 
 1815        print 
'<td>'.$langs->trans(
"CANCEL_USER").
'</span></td>';
 
 1817        if ($object->fk_user_cancel > 0) {
 
 1818          $userfee = 
new User($db);
 
 1819          $result = $userfee->fetch($object->fk_user_cancel);
 
 1821            print $userfee->getNomUrl(-1);
 
 1827        print 
'<td>'.$langs->trans(
"MOTIF_CANCEL").
'</td>';
 
 1828        print 
'<td>'.$object->detail_cancel.
'</td></tr>';
 
 1831        print 
'<td>'.$langs->trans(
"DATE_CANCEL").
'</td>';
 
 1832        print 
'<td>'.dol_print_date($object->date_cancel, 
'dayhour', 
'tzuser').
'</td></tr>';
 
 1836        print 
'<td>'.$langs->trans(
"ApprovedBy").
'</td>';
 
 1838        if ($object->fk_user_approve > 0) {
 
 1839          $userapp = 
new User($db);
 
 1840          $result = $userapp->fetch($object->fk_user_approve);
 
 1842            print $userapp->getNomUrl(-1);
 
 1848        print 
'<td>'.$langs->trans(
"DateApprove").
'</td>';
 
 1849        print 
'<td>'.dol_print_date($object->date_approve, 
'dayhour', 
'tzuser').
'</td></tr>';
 
 1853      if ($object->status == 99 || !empty($object->detail_refuse)) {
 
 1855        print 
'<td>'.$langs->trans(
"REFUSEUR").
'</td>';
 
 1857        $userfee = 
new User($db);
 
 1858        $result = $userfee->fetch($object->fk_user_refuse);
 
 1860          print $userfee->getNomUrl(-1);
 
 1865        print 
'<td>'.$langs->trans(
"DATE_REFUS").
'</td>';
 
 1866        print 
'<td>'.dol_print_date($object->date_refuse, 
'dayhour', 
'tzuser');
 
 1867        if ($object->detail_refuse) {
 
 1868          print 
' - '.$object->detail_refuse;
 
 1874      if ($object->status == $object::STATUS_CLOSED) {
 
 1892      include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
 
 1897      print 
'<div class="fichehalfright">';
 
 1898      print 
'<div class="underbanner clearboth"></div>';
 
 1900      print 
'<table class="border tableforfield centpercent">';
 
 1904      print 
'<td class="titlefieldmiddle">'.$langs->trans(
"AmountHT").
'</td>';
 
 1905      print 
'<td class="nowrap amountcard">'.price($object->total_ht, 1, 
'', 1, - 1, - 1, $conf->currency).
'</td>';
 
 1924      print 
'<td>'.$langs->trans(
"AmountVAT").
'</td>';
 
 1925      print 
'<td class="nowrap amountcard">'.price($object->total_tva, 1, 
'', 1, -1, -1, $conf->currency).
'</td>';
 
 1929      if ($mysoc->localtax1_assuj == 
"1" || $object->total_localtax1 != 0) {    
 
 1930        print 
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
 
 1931        print 
'<td class="valuefield">'.price($object->total_localtax1, 1, 
'', 1, -1, -1, $conf->currency).
'</td></tr>';
 
 1933      if ($mysoc->localtax2_assuj == 
"1" || $object->total_localtax2 != 0) {    
 
 1934        print 
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
 
 1935        print 
'<td class="valuefield">'.price($object->total_localtax2, 1, 
'', 1, -1, -1, $conf->currency).
'</td></tr>';
 
 1939      print 
'<td>'.$langs->trans(
"AmountTTC").
'</td>';
 
 1940      print 
'<td class="nowrap amountcard">'.price($object->total_ttc, 1, 
'', 1, -1, -1, $conf->currency).
'</td>';
 
 1946      if (isModEnabled(
"banque")) {
 
 1951      print 
'<table class="noborder paymenttable centpercent">';
 
 1953      print 
'<tr class="liste_titre">';
 
 1954      print 
'<td class="liste_titre">'.$langs->trans(
'Payments').
'</td>';
 
 1955      print 
'<td class="liste_titre">'.$langs->trans(
'Date').
'</td>';
 
 1956      print 
'<td class="liste_titre">'.$langs->trans(
'Type').
'</td>';
 
 1957      if (isModEnabled(
"banque")) {
 
 1958        print 
'<td class="liste_titre right">'.$langs->trans(
'BankAccount').
'</td>';
 
 1960      print 
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
 
 1961      print 
'<td class="liste_titre" width="18"> </td>';
 
 1965      $sql = 
"SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,";
 
 1966      $sql .= 
"c.code as payment_code, c.libelle as payment_type,";
 
 1967      $sql .= 
"ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal";
 
 1968      $sql .= 
" FROM ".MAIN_DB_PREFIX.
"expensereport as e, ".MAIN_DB_PREFIX.
"payment_expensereport as p";
 
 1969      $sql .= 
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as c ON p.fk_typepayment = c.id";
 
 1970      $sql .= 
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
 
 1971      $sql .= 
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
 
 1972      $sql .= 
" WHERE e.rowid = ".((int) $id);
 
 1973      $sql .= 
" AND p.fk_expensereport = e.rowid";
 
 1974      $sql .= 
' AND e.entity IN ('.getEntity(
'expensereport').
')';
 
 1975      $sql .= 
" ORDER BY dp";
 
 1977      $resql = $db->query($sql);
 
 1979        $num = $db->num_rows($resql);
 
 1983          $objp = $db->fetch_object($resql);
 
 1985          $paymentexpensereportstatic->id = $objp->rowid;
 
 1986          $paymentexpensereportstatic->datep = $db->jdate($objp->dp);
 
 1987          $paymentexpensereportstatic->ref = $objp->rowid;
 
 1988          $paymentexpensereportstatic->num_payment = $objp->num_payment;
 
 1989          $paymentexpensereportstatic->type_code = $objp->payment_code;
 
 1990          $paymentexpensereportstatic->type_label = $objp->payment_type;
 
 1992          print 
'<tr class="oddseven">';
 
 1994          print $paymentexpensereportstatic->getNomUrl(1);
 
 1996          print 
'<td>'.dol_print_date($db->jdate($objp->dp), 
'day').
"</td>\n";
 
 1997          $labeltype = $langs->trans(
"PaymentType".$objp->payment_code) != 
"PaymentType".$objp->payment_code ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_type;
 
 1998          print 
"<td>".$labeltype.
' '.$objp->num_payment.
"</td>\n";
 
 2000          if (isModEnabled(
"banque")) {
 
 2001            $bankaccountstatic->id = $objp->baid;
 
 2002            $bankaccountstatic->ref = $objp->baref;
 
 2003            $bankaccountstatic->label = $objp->baref;
 
 2004            $bankaccountstatic->number = $objp->banumber;
 
 2006            if (isModEnabled(
'accounting')) {
 
 2007              $bankaccountstatic->account_number = $objp->account_number;
 
 2010              $accountingjournal->fetch($objp->fk_accountancy_journal);
 
 2011              $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, 
'', 1);
 
 2014            print 
'<td class="right">';
 
 2015            if ($bankaccountstatic->id) {
 
 2016              print $bankaccountstatic->getNomUrl(1, 
'transactions');
 
 2020          print 
'<td class="right">'.price($objp->amount).
"</td>";
 
 2023          $totalpaid += $objp->amount;
 
 2026        if (!is_null($totalpaid)) {
 
 2030        $remaintopay = 
price2num($object->total_ttc - $totalpaid);
 
 2031        $resteapayeraffiche = $remaintopay;
 
 2033        $cssforamountpaymentcomplete = 
'amountpaymentcomplete';
 
 2036          $cssforamountpaymentcomplete = 
'amountpaymentneutral';
 
 2037          $resteapayeraffiche = 0;
 
 2038        } elseif ($object->paid == 0) {
 
 2039          $cssforamountpaymentcomplete = 
'amountpaymentneutral';
 
 2041        print 
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AlreadyPaid").
':</td><td class="right">'.
price($totalpaid).
'</td><td></td></tr>';
 
 2042        print 
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AmountExpected").
':</td><td class="right">'.
price($object->total_ttc).
'</td><td></td></tr>';
 
 2044        print 
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"RemainderToPay").
':</td>';
 
 2045        print 
'<td class="right'.($resteapayeraffiche ? 
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td></td></tr>';
 
 2056      print 
'<div class="clearboth"></div><br>';
 
 2058      print 
'<div style="clear: both;"></div>';
 
 2060      $actiontouse = 
'updateline';
 
 2061      if (($object->status == 0 || $object->status == 99) && $action != 
'editline') {
 
 2062        $actiontouse = 
'addline';
 
 2065      print 
'<form name="expensereport" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="post" >';
 
 2066      print 
'<input type="hidden" name="token" value="'.newToken().
'">';
 
 2067      print 
'<input type="hidden" name="action" value="'.$actiontouse.
'">';
 
 2068      print 
'<input type="hidden" name="id" value="'.$object->id.
'">';
 
 2069      print 
'<input type="hidden" name="fk_expensereport" value="'.$object->id.
'" />';
 
 2070      print 
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
 
 2071      print 
'<input type="hidden" name="page_y" value="">';
 
 2073      print 
'<div class="div-table-responsive-no-min">';
 
 2074      print 
'<table id="tablelines" class="noborder centpercent">';
 
 2076      if (!empty($object->lines)) {
 
 2080        print 
'<tr class="liste_titre headerexpensereportdet">';
 
 2081        print 
'<td class="center linecollinenb">'.$langs->trans(
'LineNb').
'</td>';
 
 2083        print 
'<td class="center linecoldate">'.$langs->trans(
'Date').
'</td>';
 
 2084        if (isModEnabled(
'project')) {
 
 2085          print 
'<td class="minwidth100imp linecolproject">'.$langs->trans(
'Project').
'</td>';
 
 2087        print 
'<td class="center linecoltype">'.$langs->trans(
'Type').
'</td>';
 
 2089          print 
'<td class="center linecolcarcategory">'.$langs->trans(
'CarCategory').
'</td>';
 
 2091        print 
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
 
 2092        print 
'<td class="right linecolvat">'.$langs->trans(
'VAT').
'</td>';
 
 2093        print 
'<td class="right linecolpriceuht">'.$langs->trans(
'PriceUHT').
'</td>';
 
 2094        print 
'<td class="right linecolpriceuttc">'.$langs->trans(
'PriceUTTC').
'</td>';
 
 2095        print 
'<td class="right linecolqty">'.$langs->trans(
'Qty').
'</td>';
 
 2096        if ($action != 
'editline') {
 
 2097          print 
'<td class="right linecolamountht">'.$langs->trans(
'AmountHT').
'</td>';
 
 2098          print 
'<td class="right linecolamountttc">'.$langs->trans(
'AmountTTC').
'</td>';
 
 2109        if (($object->status < 2 || $object->status == 99) && $user->hasRight(
'expensereport', 
'creer')) {
 
 2110          print 
'<td class="right"></td>';
 
 2114        foreach ($object->lines as &$line) {
 
 2117          if ($action != 
'editline' || $line->id != 
GETPOST(
'rowid', 
'int')) {
 
 2118            print 
'<tr class="oddeven linetr" data-id="'.$line->id.
'">';
 
 2121            print 
'<td class="center linecollinenb">';
 
 2126            print 
'<td class="center linecoldate">'.dol_print_date($db->jdate($line->date), 
'day').
'</td>';
 
 2129            if (isModEnabled(
'project')) {
 
 2130              print 
'<td class="lineproject">';
 
 2131              if ($line->fk_project > 0) {
 
 2132                $projecttmp->id = $line->fk_project;
 
 2133                $projecttmp->ref = $line->projet_ref;
 
 2134                $projecttmp->title = $line->projet_title;
 
 2135                print $projecttmp->getNomUrl(1);
 
 2141            if (isModEnabled(
'accounting')) {
 
 2142              require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
 
 2144              $resaccountingaccount = $accountingaccount->fetch(0, $line->type_fees_accountancy_code, 1);
 
 2146              $titlealt .= $langs->trans(
"AccountancyCode").
': ';
 
 2147              if ($resaccountingaccount > 0) {
 
 2148                $titlealt .= $accountingaccount->account_number;
 
 2150                $titlealt .= $langs->trans(
"NotFound");
 
 2156            print 
'<td class="center linecoltype" title="'.dol_escape_htmltag($titlealt).
'">';
 
 2157            $labeltype = ($langs->trans(($line->type_fees_code)) == $line->type_fees_code ? $line->type_fees_libelle : $langs->trans($line->type_fees_code));
 
 2163              print 
'<td class="fk_c_exp_tax_cat linecoltaxcat">';
 
 2164              $exp_tax_cat_label = 
dol_getIdFromCode($db, $line->fk_c_exp_tax_cat, 
'c_exp_tax_cat', 
'rowid', 
'label');
 
 2165              print $langs->trans($exp_tax_cat_label);
 
 2170            print 
'<td class="left linecolcomment">'.dol_nl2br($line->comments).
'</td>';
 
 2173            print 
'<td class="right linecolvatrate">'.vatrate($line->vatrate.($line->vat_src_code ? 
' ('.$line->vat_src_code.
')' : 
''), true).
'</td>';
 
 2176            print 
'<td class="right linecolunitht">';
 
 2177            if (!empty($line->value_unit_ht)) {
 
 2178              print 
price($line->value_unit_ht);
 
 2180              $tmpvat = 
price2num(preg_replace(
'/\s*\(.*\)/', 
'', $line->vatrate));
 
 2181              $pricenettoshow = 
price2num($line->value_unit / (1 + $tmpvat / 100), 
'MU');
 
 2182              print 
price($pricenettoshow);
 
 2186            print 
'<td class="right linecolunitttc">'.price($line->value_unit).
'</td>';
 
 2188            print 
'<td class="right linecolqty">'.dol_escape_htmltag($line->qty).
'</td>';
 
 2190            if ($action != 
'editline') {
 
 2191              print 
'<td class="right linecoltotalht">'.price($line->total_ht).
'</td>';
 
 2192              print 
'<td class="right linecoltotalttc">'.price($line->total_ttc).
'</td>';
 
 2196            print 
'<td class="center linecolpreview">';
 
 2197            if ($line->fk_ecm_files > 0) {
 
 2198              $modulepart = 
'expensereport';
 
 2199              $maxheightmini = 32;
 
 2201              $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
 
 2203                $relativepath = preg_replace(
'/expensereport\//', 
'', $ecmfilesstatic->filepath);
 
 2204                $fileinfo = pathinfo($ecmfilesstatic->filepath.
'/'.$ecmfilesstatic->filename);
 
 2207                  if (!
dol_is_file($conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$minifile)) {
 
 2211                  $urlforhref = 
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1, 
'&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
 
 2212                  if (empty($urlforhref)) {
 
 2213                    $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(empty($object->entity) ? $conf->entity : $object->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
 
 2214                    print 
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
 
 2216                    print 
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
 
 2218                  print 
'<img class="photo" height="'.$maxheightmini.
'" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(empty($object->entity) ? $conf->entity : $object->entity).
'&file='.urlencode($relativepath.
'/'.$minifile).
'" title="">';
 
 2221                  $modulepart = 
'expensereport';
 
 2223                  if (preg_match(
'/\.pdf$/i', $ecmfilesstatic->filename)) {
 
 2224                    $filepdf = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename;
 
 2225                    $fileimage = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
 
 2226                    $relativepathimage = $relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
 
 2228                    $pdfexists = file_exists($filepdf);
 
 2231                      if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
 
 2233                          include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
 
 2242                    if ($pdfexists && !$error) {
 
 2243                      $heightforphotref = 70;
 
 2244                      if (!empty($conf->dol_optimize_smallscreen)) {
 
 2245                        $heightforphotref = 60;
 
 2248                      if (file_exists($fileimage)) {
 
 2250                        $urlforhref = 
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1, 
'&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
 
 2251                        print 
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
 
 2252                        print 
'<img height="'.$heightforphotref.
'" class="photo photowithmargin photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
 
 2258                  if (!$thumbshown && $fileinfo[
'extension'] == 
'pdf' && !empty($filepdf) && !empty($relativepath) && !empty($fileinfo[
'filename'])) {
 
 2260                    $imgpreview = $formFile->showPreview([], $modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 0);
 
 2262                  } elseif (!$thumbshown) {
 
 2263                    print 
img_mime($ecmfilesstatic->filename);
 
 2270            print 
'<td class="nowrap right linecolwarning">';
 
 2271            print !empty($line->rule_warning_message) ? 
img_warning(html_entity_decode($line->rule_warning_message)) : 
' ';
 
 2276              print 
'<td class="nowrap right linecolaction">';
 
 2278              print 
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$line->rowid.
'">';
 
 2280              print 
'</a>   ';
 
 2281              print 
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete_line&token='.newToken().
'&rowid='.$line->rowid.
'">';
 
 2291          if ($action == 
'editline' && $line->id == 
GETPOST(
'rowid', 
'int')) {
 
 2294            if (isModEnabled(
'project')) {
 
 2301            print 
'<!-- line of expense report -->'.
"\n";
 
 2302            print 
'<tr class="tredited">';
 
 2304            print 
'<td class="center">';
 
 2308            print 
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
 
 2309            print 
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
 
 2310            print 
img_picto($langs->trans(
"UploadANewFileNow"), 
'chevron-down', 
'', 
false, 0, 0, 
'', 
'marginleftonly');
 
 2313              print 
'   -   <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
 
 2314              print 
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"), 
'chevron-down', 
'', 
false, 0, 0, 
'', 
'marginleftonly');
 
 2318            print 
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
 
 2319            print 
'<script type="text/javascript">'.
"\n";
 
 2320            print 
'$(document).ready(function() { 
 2321                        $( ".auploadnewfilenow" ).click(function() { 
 2322                            jQuery(".truploadnewfilenow").toggle(); 
 2323                                    jQuery(".trattachnewfilenow").hide(); 
 2326                        $( ".aattachtodoc" ).click(function() { 
 2327                            jQuery(".trattachnewfilenow").toggle(); 
 2328                                    jQuery(".truploadnewfilenow").hide(); 
 2331            if (is_array(
GETPOST(
'attachfile', 
'array')) && count(
GETPOST(
'attachfile', 
'array'))) {
 
 2332              print 
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
 
 2335                            jQuery("form[name=\"expensereport\"]").submit(function() { 
 2336                                if (jQuery(".truploadnewfilenow").is(":hidden")) { 
 2337                                    jQuery("input[name=\"sendit\"]").val(""); 
 2344            print 
'</script>'.
"\n";
 
 2347            $filenamelinked = 
'';
 
 2348            if ($line->fk_ecm_files > 0) {
 
 2349              $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
 
 2351                $filenamelinked = $ecmfilesstatic->filename;
 
 2355            $tredited = 
'tredited'; 
 
 2356            include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
 
 2357            include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
 
 2359            print 
'<tr class="oddeven tredited">';
 
 2364            print 
'<td class="center">';
 
 2365            print $form->selectDate($line->date, 
'date');
 
 2369            if (isModEnabled(
'project')) {
 
 2371              $formproject->select_projects(-1, $line->fk_project, 
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0, 
'', 0, 0, 
'maxwidth300');
 
 2376            print 
'<td class="center">';
 
 2377            print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees, 
'fk_c_type_fees');
 
 2381              print 
'<td class="fk_c_exp_tax_cat">';
 
 2382              $params = array(
'fk_expense' => $object->id, 
'fk_expense_det' => $line->id, 
'date' => $line->date);
 
 2383              print $form->selectExpenseCategories($line->fk_c_exp_tax_cat, 
'fk_c_exp_tax_cat', 1, array(), 
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params);
 
 2389            print 
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
 
 2393            $selectedvat = 
price2num($line->vatrate).(!empty($line->vat_src_code) ? 
' ('.$line->vat_src_code.
')' : 
'');
 
 2394            print 
'<td class="right">';
 
 2395            print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ? 
GETPOST(
"vatrate") : $selectedvat), $mysoc, 
'', 0, 0, 
'', false, 1);
 
 2399            print 
'<td class="right">';
 
 2400            print 
'<input type="text" min="0" class="right maxwidth50" id="value_unit_ht" name="value_unit_ht" value="'.dol_escape_htmltag(
price2num((!empty($line->value_unit_ht) ? $line->value_unit_ht : 
""))).
'"'.$taxlessUnitPriceDisabled.
' />';
 
 2404            print 
'<td class="right">';
 
 2405            print 
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
 
 2409            print 
'<td class="right">';
 
 2410            print 
'<input type="text" min="0" class="input_qty right maxwidth50"  name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';  
 
 2417            print 
'<td class="center">';
 
 2421            print 
'<td class="center">';
 
 2425            print 
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
 
 2426            print $form->buttonsSaveCancel(
'Save', 
'Cancel', array(), 0, 
'small');
 
 2442        if (isModEnabled(
'project')) {
 
 2445        if ($action != 
'editline') {
 
 2449        $nbFiles = $nbLinks = 0;
 
 2450        $arrayoffiles = array();
 
 2452          require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
 
 2453          require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
 
 2454          require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
 
 2457          $nbFiles = count($arrayoffiles);
 
 2458          $nbLinks = 
Link::count($db, $object->element, $object->id);
 
 2462        print 
'<tr class="liste_titre">';
 
 2463        print 
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
 
 2464        print 
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
 
 2465        print 
img_picto($langs->trans(
"UploadANewFileNow"), 
'chevron-down', 
'', 
false, 0, 0, 
'', 
'marginleftonly');
 
 2468          print 
'   -   <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
 
 2469          print 
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"), 
'chevron-down', 
'', 
false, 0, 0, 
'', 
'marginleftonly');
 
 2473        print 
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
 
 2474        print 
'<script type="text/javascript">'.
"\n";
 
 2475        print 
'$(document).ready(function() { 
 2476                $( ".auploadnewfilenow" ).click(function() { 
 2477              console.log("We click on toggle of auploadnewfilenow"); 
 2478                    jQuery(".truploadnewfilenow").toggle(); 
 2479                            jQuery(".trattachnewfilenow").hide(); 
 2480              if (jQuery(".truploadnewfilenow").is(":hidden")) { 
 2481                              jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled"); 
 2483                                jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit"); 
 2485              // TODO Switch css fa-chevron-dow and add fa-chevron-up 
 2488                $( ".aattachtodoc" ).click(function() { 
 2489              console.log("We click on toggle of aattachtodoc"); 
 2490                    jQuery(".trattachnewfilenow").toggle(); 
 2491                            jQuery(".truploadnewfilenow").hide(); 
 2492              // TODO Switch css fa-chevron-dow and add fa-chevron-up 
 2495        if (is_array(
GETPOST(
'attachfile', 
'array')) && count(
GETPOST(
'attachfile', 
'array')) && $action != 
'updateline') {
 
 2496          print 
'jQuery(".trattachnewfilenow").show();'.
"\n";
 
 2499            jQuery("form[name=\"expensereport\"]").submit(function() { 
 2500              if (jQuery(".truploadnewfilenow").is(":hidden")) { 
 2501                /* When section to send file is not expanded, we disable the button sendit that submit form to add a new file, so button to submit line will work. */ 
 2502                jQuery("input[name=\"sendit\"]").val(""); 
 2503                jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled"); 
 2505                jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit"); 
 2512        print 
'</script>'.
"\n";
 
 2516        include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
 
 2517        include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
 
 2519        print 
'<tr class="liste_titre expensereportcreate">';
 
 2521        print 
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
 
 2522        if (isModEnabled(
'project')) {
 
 2523          print 
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
 
 2525        print 
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
 
 2527          print 
'<td>'.$langs->trans(
'CarCategory').
'</td>';
 
 2529        print 
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
 
 2530        print 
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
 
 2531        print 
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
 
 2532        print 
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
 
 2533        print 
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
 
 2540        print 
'<tr class="oddeven nohover">';
 
 2546        print 
'<td class="center inputdate">';
 
 2547        print $form->selectDate(!empty($date) ? $date : -1, 
'date', 0, 0, 0, 
'', 1, 1);
 
 2551        if (isModEnabled(
'project')) {
 
 2552          print 
'<td class="inputproject">';
 
 2553          $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0, 
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0, 
'', 0, 0, 
'maxwidth300');
 
 2558        print 
'<td class="center inputtype">';
 
 2559        print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees : 
"", 
'fk_c_type_fees', 1);
 
 2563          print 
'<td class="fk_c_exp_tax_cat">';
 
 2564          $params = array(
'fk_expense' => $object->id);
 
 2565          print $form->selectExpenseCategories(
'', 
'fk_c_exp_tax_cat', 1, array(), 
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
 
 2570        print 
'<td class="inputcomment">';
 
 2571        print 
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments : 
"", 0, 1).
'</textarea>';
 
 2575        print 
'<td class="right inputvat">';
 
 2579          $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS = 
'none';
 
 2581        print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), $mysoc, 
'', 0, 0, 
'', false, 1);
 
 2585        print 
'<td class="right inputpricenet">';
 
 2586        print 
'<input type="text" class="right maxwidth50" id="value_unit_ht" name="value_unit_ht" value="'.dol_escape_htmltag((!empty($value_unit_ht) ? $value_unit_ht : 0)).
'"'.$taxlessUnitPriceDisabled.
' />';
 
 2590        print 
'<td class="right inputtax">';
 
 2591        print 
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit : 0)).
'">';
 
 2595        print 
'<td class="right inputqty">';
 
 2596        print 
'<input type="text" min="0" class=" input_qty right maxwidth50"  name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">'; 
 
 2602        if ($action != 
'editline') {
 
 2603          print 
'<td class="right"></td>';
 
 2604          print 
'<td class="right"></td>';
 
 2607        print 
'<td class="center inputbuttons">';
 
 2608        print $form->buttonsSaveCancel(
"Add", 
'', 
'', 1, 
'reposition');
 
 2619      /* JQuery for product free or predefined select */ 
 2620      jQuery(document).ready(function() { 
 2621        jQuery("#value_unit_ht").keyup(function(event) { 
 2622          console.log(event.which);   // discard event tag and arrows 
 2623          if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") { 
 2624            jQuery("#value_unit").val(""); 
 2627        jQuery("#value_unit").keyup(function(event) { 
 2628          console.log(event.which);   // discard event tag and arrows 
 2629          if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") { 
 2630            jQuery("#value_unit_ht").val(""); 
 2638                /* unit price coef calculation */ 
 2639                jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) { 
 2640          console.log("We change a parameter"); 
 2642                    let type_fee = jQuery("#fk_c_type_fees").find(":selected").val(); 
 2643                    let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val(); 
 2644                    let tva = jQuery("#vatrate").find(":selected").val(); 
 2645                    let qty = jQuery(".input_qty").val(); 
 2647          let path = "'.dol_buildpath(
"/expensereport/ajax/ajaxik.php", 1).
'"; 
 2648          path += "?fk_c_exp_tax_cat="+tax_cat; 
 2649          path += "&fk_expense="+'.((int) $object->id).
'; 
 2650                    path += "&vatrate="+tva; 
 2651                    path += "&qty="+qty; 
 2653                    if (type_fee == 4) { // frais_kilométriques 
 2654                        if (tax_cat == "" || parseInt(tax_cat) <= 0){ 
 2662              success: function(response) { 
 2663                if (response.response_status == "success"){';
 
 2667                  jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100); 
 2668                  jQuery("#value_unit").trigger("change"); 
 2672                  jQuery("#value_unit_ht").val(response.data); 
 2673                  jQuery("#value_unit_ht").trigger("change"); 
 2674                  jQuery("#value_unit").val(""); 
 2679                                } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ) { 
 2680                  console.log("We get an error result"); 
 2681                                    $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } ); 
 2687          /*console.log(event.which);   // discard event tag and arrows 
 2688          if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") { 
 2689            jQuery("#value_unit_ht").val(""); 
 2709  print 
'Record not found';
 
 2720print 
'<div class="tabsAction">';
 
 2722if ($action != 
'create' && $action != 
'edit' && $action != 
'editline') {
 
 2724  $object->fetch($id, $ref);
 
 2727  if (empty($user->socid)) {
 
 2730      print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=presend&mode=init#formmailbeforetitle">'.$langs->trans(
'SendMail').
'</a></div>';
 
 2742    if (in_array($object->fk_user_author, $user->getAllChildIds(1)) || $user->hasRight(
'expensereport', 
'writeall_advance')) {
 
 2744      print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=edit&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'Modify').
'</a></div>';
 
 2747      if (count($object->lines) > 0) {
 
 2748        print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=save&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'ValidateAndSubmit').
'</a></div>';
 
 2759    if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
 
 2761      print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=edit&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'Modify').
'</a></div>';
 
 2766      print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=save_from_refuse&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'ValidateAndSubmit').
'</a></div>';
 
 2771    if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
 
 2773      print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=setdraft&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'SetToDraft').
'</a></div>';
 
 2783    if (in_array($object->fk_user_author, $user->getAllChildIds(1))) {
 
 2785      print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=setdraft&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'SetToDraft').
'</a></div>';
 
 2793    print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=validate&id='.$object->id.
'">'.$langs->trans(
'Approve').
'</a></div>';
 
 2795    print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
 
 2798    if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
 
 2800      print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
 
 2809    print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
 
 2815    if ($remaintopay == 0) {
 
 2816      print 
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
 
 2818      print 
'<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.
'/expensereport/payment/payment.php?id='.$object->id.
'&action=create">'.$langs->trans(
'DoPayment').
'</a></div>';
 
 2825    if ($object->paid == 0) {
 
 2826      print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=set_paid&token='.newToken().
'">'.$langs->trans(
"ClassifyPaid").
"</a></div>";
 
 2830  if ($user->hasRight(
'expensereport', 
'creer') && ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) && $object->status == 
ExpenseReport::STATUS_APPROVED) {
 
 2832    print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
 
 2836  if (($user->hasRight(
'expensereport', 
'approve') || $user->hasRight(
'expensereport', 
'to_paid')) && $object->status == 
ExpenseReport::STATUS_CLOSED) {
 
 2838    print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
 
 2843    print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=set_unpaid&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'ClassifyUnPaid').
'</a></div>';
 
 2847  if ($user->hasRight(
'expensereport', 
'creer')) {
 
 2848    print 
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=clone&token='.newToken().
'">'.$langs->trans(
"ToClone").
'</a></div>';
 
 2854    print 
'<div class="inline-block divButAction"><a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?action=delete&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'Delete').
'</a></div>';
 
 2857    print 
'<div class="inline-block divButAction"><a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?action=delete&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'Delete').
'</a></div>';
 
 2860  $parameters = array();
 
 2861  $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action); 
 
 2868if (
GETPOST(
'modelselected', 
'alpha')) {
 
 2869  $action = 
'presend';
 
 2872if ($action != 
'presend') {
 
 2877  print 
'<div class="fichecenter"><div class="fichehalfleft">';
 
 2878  print 
'<a name="builddoc"></a>'; 
 
 2880  if ($user->hasRight(
'expensereport', 
'creer') && $action != 
'create' && $action != 
'edit') {
 
 2883    $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
 
 2884    $genallowed = $user->rights->expensereport->creer;
 
 2885    $delallowed = $user->rights->expensereport->creer;
 
 2887    print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
 
 2888    $somethingshown = $formfile->numoffiles;
 
 2900  print 
'</div><div class="fichehalfright">';
 
 2902  include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
 
 2904  $somethingshown = 
$formactions->showactions($object, 
'expensereport', 
null);
 
 2906  print 
'</div></div>';
 
 2910$modelmail = 
'expensereport_send';
 
 2911$defaulttopic = 
'SendExpenseReportRef';
 
 2912$diroutput = $conf->expensereport->dir_output;
 
 2913$trackid = 
'exp'.$object->id;
 
 2915include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
 
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif( $action=='specimen') elseif($action=='setmodel') elseif( $action=='del') elseif($action=='setdoc') $formactions
View.
 
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
 
Class to manage bank accounts.
 
Class to manage accounting accounts.
 
Class to manage accounting journals.
 
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
 
Class to manage a WYSIWYG editor.
 
Class to manage ECM files.
 
Class to manage Trips and Expenses.
 
const STATUS_DRAFT
Draft status.
 
const STATUS_APPROVED
Classified approved.
 
const STATUS_CANCELED
Classified canceled.
 
const STATUS_CLOSED
Classified paid.
 
const STATUS_REFUSED
Classified refused.
 
const STATUS_VALIDATED
Validated (need to be paid)
 
Class of expense report details lines.
 
static count($dbs, $objecttype, $objectid)
Return nb of links.
 
Class to manage payments of expense report.
 
Class to manage projects.
 
Class to manage translations.
 
Class to manage Dolibarr users.
 
expensereport_prepare_head($object)
Prepare array with list of tabs.
 
dol_convert_file($fileinput, $ext='png', $fileoutput='', $page='')
Convert an image file or a PDF into another image format.
 
dol_is_file($pathoffile)
Return if path is a file.
 
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
 
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
 
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...
 
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
 
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
 
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
 
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
 
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
 
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
 
get_date_range($date_start, $date_end, $format='', $outputlangs='', $withparenthesis=1)
Format output for start and end date.
 
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
 
dol_get_fiche_end($notab=0)
Return tab footer of a card.
 
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.
 
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
 
dol_now($mode='auto')
Return date for now.
 
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
 
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_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
 
getImageFileNameForSize($file, $extName, $extImgTarget='')
Return the filename of file to get the thumbs.
 
getAdvancedPreviewUrl($modulepart, $relativepath, $alldata=0, $param='')
Return URL we can use for advanced preview links.
 
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.
 
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
 
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
 
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
 
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
 
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
 
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
 
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
 
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.