31require
'../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formexpensereport.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
34require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/compta/bank/class/account.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/core/lib/expensereport.lib.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
42require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
43require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
44require_once DOL_DOCUMENT_ROOT.
'/core/modules/expensereport/modules_expensereport.php';
45require_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/expensereport/class/paymentexpensereport.class.php';
47require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
49if (isModEnabled(
'accounting')) {
50 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingjournal.class.php';
54$langs->loadLangs(array(
"trips",
"bills",
"mails"));
56$action =
GETPOST(
'action',
'aZ09');
57$cancel =
GETPOST(
'cancel',
'alpha');
58$confirm =
GETPOST(
'confirm',
'alpha');
59$backtopage =
GETPOST(
'backtopage',
'alpha');
66$vatrate =
GETPOST(
'vatrate',
'alpha');
68$comments =
GETPOST(
'comments',
'restricthtml');
73$childids = $user->getAllChildIds(1);
76 if (empty($date_start)) {
80 if (empty($date_end)) {
87$rootfordata = DOL_DATA_ROOT;
88$rootforuser = DOL_DATA_ROOT;
90if (isModEnabled(
'multicompany') && !empty($conf->entity) && $conf->entity > 1) {
91 $rootfordata .=
'/'.$conf->entity;
93$conf->expensereport->dir_output = $rootfordata.
'/expensereport';
96$urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
97$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
110$extrafields->fetch_name_optionals_label(
$object->table_element);
113include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
116$hookmanager->initHooks(array(
'expensereportcard',
'globalcard'));
118$permissionnote = $user->hasRight(
'expensereport',
'creer');
119$permissiondellink = $user->hasRight(
'expensereport',
'creer');
120$permissiontoadd = $user->hasRight(
'expensereport',
'creer');
124$projectRequired = isModEnabled(
'project') &&
getDolGlobalString(
'EXPENSEREPORT_PROJECT_IS_REQUIRED');
130 if ($user->hasRight(
'expensereport',
'readall')) {
133 if ($user->hasRight(
'expensereport',
'lire') && in_array(
$object->fk_user_author, $childids)) {
142if ($user->hasRight(
'expensereport',
'supprimer')) {
151 $socid = $user->socid;
155$permissiontoadd = $user->hasRight(
'expensereport',
'creer');
165$parameters = array(
'socid' => $socid);
166$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
171if (empty($reshook)) {
172 $backurlforlist = DOL_URL_ROOT.
'/expensereport/list.php';
174 if (empty($backtopage) || ($cancel && empty($id))) {
175 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
176 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
177 $backtopage = $backurlforlist;
179 $backtopage = DOL_URL_ROOT.
'/expensereport/card.php?id='.((!empty($id) && $id > 0) ? $id :
'__ID__');
185 if (!empty($backtopageforcancel)) {
186 header(
"Location: ".$backtopageforcancel);
188 } elseif (!empty($backtopage)) {
189 header(
"Location: ".$backtopage);
203 $fk_c_type_fees = -1;
206 include DOL_DOCUMENT_ROOT.
'/core/actions_linkedfiles.inc.php';
208 if (!empty(
GETPOST(
'sendit',
'alpha'))) {
209 if ($action ==
'updateline') {
210 $action =
'editline';
216 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
218 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
220 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
223 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $user->hasRight(
'expensereport',
'creer')) {
224 if (1 == 0 && !
GETPOST(
'clone_content',
'alpha') && !
GETPOST(
'clone_receivers',
'alpha')) {
233 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
244 if ($action ==
'confirm_delete' &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $candelete) {
247 $result =
$object->delete($user);
249 header(
"Location: index.php");
256 if ($action ==
'add' && $user->hasRight(
'expensereport',
'creer')) {
261 $object->date_debut = $date_start;
265 if (!(
$object->fk_user_author > 0)) {
266 $object->fk_user_author = $user->id;
270 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'expensereport',
'creer'))
271 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'expensereport',
'creer') && !$user->hasRight(
'expensereport',
'writeall_advance'))) {
276 if (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || !$user->hasRight(
'expensereport',
'writeall_advance')) {
277 if (!in_array(
$object->fk_user_author, $childids)) {
284 $fuser =
new User($db);
285 $fuser->fetch(
$object->fk_user_author);
294 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
301 $overlappingExpenseReportID =
$object->periode_existe($fuser,
$object->date_debut,
$object->date_fin);
303 if ($overlappingExpenseReportID > 0) {
305 setEventMessages($langs->trans(
"ErrorDoubleDeclaration").
' <a href="'.$_SERVER[
'PHP_SELF'].
'?id='.$overlappingExpenseReportID.
'">'. $langs->trans(
'ShowTrip').
'</a>',
null,
'errors');
320 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
330 if (($action ==
'update' || $action ==
'updateFromRefuse') && $user->hasRight(
'expensereport',
'creer')) {
334 $object->date_debut = $date_start;
344 $object->fk_user_modif = $user->id;
346 $result =
$object->update($user);
348 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOSTINT(
'id'));
355 if ($action ==
'update_extras' && $user->hasRight(
'expensereport',
'creer')) {
359 $ret = $extrafields->setOptionalsFromPost(
null,
$object,
GETPOST(
'attribute',
'restricthtml'));
366 $result =
$object->insertExtraFields(
'EXPENSEREPORT_MODIFY');
374 $action =
'edit_extras';
378 if ($action ==
"confirm_validate" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
386 $result =
$object->setValidate($user);
391 $outputlangs = $langs;
394 $newlang =
GETPOST(
'lang_id',
'aZ09');
397 $user =
new User($db);
398 $user->fetch(
$object->fk_user_author);
399 $newlang = $user->lang;
401 if (!empty($newlang)) {
403 $outputlangs->setDefaultLang($newlang);
408 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
415 if (!$error && $result > 0 &&
$object->fk_user_validator > 0) {
416 $langs->load(
"mails");
419 $destinataire =
new User($db);
420 $destinataire->fetch(
$object->fk_user_validator);
421 $emailTo = $destinataire->email;
424 $expediteur =
new User($db);
425 $expediteur->fetch(
$object->fk_user_author);
428 if ($emailTo && $emailFrom) {
439 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForApproval");
442 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
443 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
444 $message = $langs->transnoentities(
"ExpenseReportWaitingForApprovalMessage", $expediteur->getFullName($langs),
get_date_range(
$object->date_debut,
$object->date_fin,
'', $langs), $link);
459 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
463 $result = $mailfile->sendfile();
465 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
468 $langs->load(
"other");
469 if (!empty($mailfile->error) || !empty($mailfile->errors)) {
472 if (!empty($mailfile->error)) {
473 $mesg .=
'<br>' . $mailfile->error;
475 if (!empty($mailfile->errors) && is_array($mailfile->errors)) {
476 $mesg .=
'<br>' . implode(
'<br>', $mailfile->errors);
480 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
488 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
495 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
502 if ($action ==
"confirm_save_from_refuse" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
505 $result =
$object->set_save_from_refuse($user);
510 $outputlangs = $langs;
513 $newlang =
GETPOST(
'lang_id',
'aZ09');
516 $user =
new User($db);
517 $user->fetch(
$object->fk_user_author);
518 $newlang = $user->lang;
520 if (!empty($newlang)) {
522 $outputlangs->setDefaultLang($newlang);
527 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
535 $destinataire =
new User($db);
536 $destinataire->fetch(
$object->fk_user_validator);
537 $emailTo = $destinataire->email;
540 $expediteur =
new User($db);
541 $expediteur->fetch(
$object->fk_user_author);
544 if ($emailFrom && $emailTo) {
555 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForReApproval");
558 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
559 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
579 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
583 $result = $mailfile->sendfile();
585 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
587 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
590 $langs->load(
"other");
591 if ($mailfile->error) {
593 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
594 $mesg .=
'<br>'.$mailfile->error;
597 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
605 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
614 if ($action ==
"confirm_approve" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'approve')) {
618 $result =
$object->setApproved($user);
623 $outputlangs = $langs;
626 $newlang =
GETPOST(
'lang_id',
'aZ09');
629 $user =
new User($db);
630 $user->fetch(
$object->fk_user_author);
631 $newlang = $user->lang;
633 if (!empty($newlang)) {
635 $outputlangs->setDefaultLang($newlang);
640 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
648 $destinataire =
new User($db);
649 $destinataire->fetch(
$object->fk_user_author);
650 $emailTo = $destinataire->email;
654 if (empty($emailTo)) {
659 $expediteur =
new User($db);
660 $expediteur->fetch(
$object->fk_user_approve > 0 ?
$object->fk_user_approve :
$object->fk_user_validator);
663 if ($emailFrom && $emailTo) {
674 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportApproved");
677 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
678 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
679 $message = $langs->transnoentities(
"ExpenseReportApprovedMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
696 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, $emailCC,
'', 0, -1);
700 $result = $mailfile->sendfile();
702 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
704 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
707 $langs->load(
"other");
708 if ($mailfile->error) {
710 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
711 $mesg .=
'<br>'.$mailfile->error;
714 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
722 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
731 if ($action ==
"confirm_refuse" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'approve')) {
735 $detailRefuse =
GETPOST(
'detail_refuse',
'alpha');
736 $result =
$object->setDeny($user, $detailRefuse);
741 $outputlangs = $langs;
744 $newlang =
GETPOST(
'lang_id',
'aZ09');
747 $user =
new User($db);
748 $user->fetch(
$object->fk_user_author);
749 $newlang = $user->lang;
751 if (!empty($newlang)) {
753 $outputlangs->setDefaultLang($newlang);
758 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
766 $destinataire =
new User($db);
767 $destinataire->fetch(
$object->fk_user_author);
768 $emailTo = $destinataire->email;
771 $expediteur =
new User($db);
772 $expediteur->fetch(
$object->fk_user_refuse);
775 if ($emailFrom && $emailTo) {
786 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportRefused");
789 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
790 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
791 $message = $langs->transnoentities(
"ExpenseReportRefusedMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailRefuse, $link);
809 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
813 $result = $mailfile->sendfile();
815 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
817 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
820 $langs->load(
"other");
821 if ($mailfile->error) {
823 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
824 $mesg .=
'<br>'.$mailfile->error;
827 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
835 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
845 if ($action ==
"confirm_cancel" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
846 if (!
GETPOST(
'detail_cancel',
'alpha')) {
847 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Comment")),
null,
'errors');
852 if ($user->id ==
$object->fk_user_valid || $user->id ==
$object->fk_user_author) {
853 $detailCancel =
GETPOST(
'detail_cancel',
'alpha');
854 $result =
$object->set_cancel($user, $detailCancel);
859 $outputlangs = $langs;
862 $newlang =
GETPOST(
'lang_id',
'aZ09');
865 $user =
new User($db);
866 $user->fetch(
$object->fk_user_author);
867 $newlang = $user->lang;
869 if (!empty($newlang)) {
871 $outputlangs->setDefaultLang($newlang);
876 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
884 $destinataire =
new User($db);
885 $destinataire->fetch(
$object->fk_user_author);
886 $emailTo = $destinataire->email;
889 $expediteur =
new User($db);
890 $expediteur->fetch(
$object->fk_user_cancel);
893 if ($emailFrom && $emailTo) {
904 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportCanceled");
907 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
908 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
909 $message = $langs->transnoentities(
"ExpenseReportCanceledMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailCancel, $link);
927 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
931 $result = $mailfile->sendfile();
933 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
935 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
938 $langs->load(
"other");
939 if ($mailfile->error) {
941 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
942 $mesg .=
'<br>'.$mailfile->error;
945 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
953 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
966 if ($action ==
"confirm_setdraft" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
969 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid || in_array(
$object->fk_user_author, $childids)) {
970 $result =
$object->setStatut(0);
975 $outputlangs = $langs;
978 $newlang =
GETPOST(
'lang_id',
'aZ09');
981 $user =
new User($db);
982 $user->fetch(
$object->fk_user_author);
983 $newlang = $user->lang;
985 if (!empty($newlang)) {
987 $outputlangs->setDefaultLang($newlang);
992 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
997 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
1007 if ($action ==
'set_unpaid' && $id > 0 && $user->hasRight(
'expensereport',
'to_paid')) {
1011 $result =
$object->setUnpaid($user);
1016 $outputlangs = $langs;
1019 $newlang =
GETPOST(
'lang_id',
'aZ09');
1022 $user =
new User($db);
1023 $user->fetch(
$object->fk_user_author);
1024 $newlang = $user->lang;
1026 if (!empty($newlang)) {
1027 $outputlangs =
new Translate(
"", $conf);
1028 $outputlangs->setDefaultLang($newlang);
1033 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1038 if ($action ==
'set_paid' && $id > 0 && $user->hasRight(
'expensereport',
'to_paid')) {
1042 $result =
$object->setPaid($id, $user);
1047 $outputlangs = $langs;
1050 $newlang =
GETPOST(
'lang_id',
'aZ09');
1053 $user =
new User($db);
1054 $user->fetch(
$object->fk_user_author);
1055 $newlang = $user->lang;
1057 if (!empty($newlang)) {
1058 $outputlangs =
new Translate(
"", $conf);
1059 $outputlangs->setDefaultLang($newlang);
1064 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1072 $destinataire =
new User($db);
1073 $destinataire->fetch(
$object->fk_user_author);
1074 $emailTo = $destinataire->email;
1077 $expediteur =
new User($db);
1078 $expediteur->fetch($user->id);
1081 if ($emailFrom && $emailTo) {
1082 $filename = array();
1084 $mimetype = array();
1092 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportPaid");
1095 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
1096 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
1097 $message = $langs->transnoentities(
"ExpenseReportPaidMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
1100 $object->setDocModel($user,
"");
1101 $resultPDF = expensereport_pdf_create($db,
$object,
'',
"", $langs);
1104 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
1108 $result = $mailfile->sendfile();
1110 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
1112 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
1115 $langs->load(
"other");
1116 if ($mailfile->error) {
1118 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
1119 $mesg .=
'<br>'.$mailfile->error;
1122 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
1130 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
1139 if ($action ==
"addline" && $user->hasRight(
'expensereport',
'creer')) {
1144 if (GETPOSTISSET(
'attachfile')) {
1145 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1146 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1147 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1148 $entityprefix = ($conf->entity !=
'1') ? $conf->entity.
'/' :
'';
1149 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1151 $ecmfiles->fetch(0,
'', $relativepath);
1152 $fk_ecm_files = $ecmfiles->id;
1157 if (empty($vatrate)) {
1160 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1164 if (empty($value_unit)) {
1165 $value_unit =
price2num((
float) $value_unit_ht + ((
float) $value_unit_ht * (
float) $tmpvat / 100),
'MU');
1168 $fk_c_exp_tax_cat =
GETPOSTINT(
'fk_c_exp_tax_cat');
1175 if (!($fk_c_type_fees > 0)) {
1177 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1181 if ((
float) $tmpvat < 0 || $tmpvat ===
'') {
1183 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"VAT")),
null,
'errors');
1188 if (empty($date) || $date ==
"--") {
1190 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
1191 } elseif ($date < $object->date_debut || $date > (
$object->date_fin + (24 * 3600 - 1))) {
1197 $langs->load(
"errors");
1198 $type = $error > 0 ?
'errors' :
'warnings';
1199 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null, $type);
1203 if ($value_unit == 0) {
1205 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PriceUTTC")),
null,
'errors');
1209 if ($projectRequired && $fk_project <= 0) {
1211 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1215 if ($fileRequired && $fk_ecm_files == 0) {
1217 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"File")),
null,
'errors');
1224 $result =
$object->addline($qty, $value_unit, $fk_c_type_fees, $vatrate, $date, $comments, $fk_project, $fk_c_exp_tax_cat, $type, $fk_ecm_files);
1230 $outputlangs = $langs;
1231 $newlang =
GETPOST(
'lang_id',
'alpha');
1233 $user =
new User($db);
1234 $user->fetch(
$object->fk_user_author);
1235 $newlang = $user->lang;
1237 if (!empty($newlang)) {
1238 $outputlangs =
new Translate(
"", $conf);
1239 $outputlangs->setDefaultLang($newlang);
1242 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1246 unset($value_unit_ht);
1250 unset($fk_c_type_fees);
1261 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOSTINT(
'id'));
1268 if ($action ==
'confirm_delete_line' &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $user->hasRight(
'expensereport',
'creer')) {
1274 $total_ht = $object_ligne->total_ht;
1275 $total_tva = $object_ligne->total_tva;
1282 $outputlangs = $langs;
1285 $newlang =
GETPOST(
'lang_id',
'aZ09');
1288 $user =
new User($db);
1289 $user->fetch(
$object->fk_user_author);
1290 $newlang = $user->lang;
1292 if (!empty($newlang)) {
1293 $outputlangs =
new Translate(
"", $conf);
1294 $outputlangs->setDefaultLang($newlang);
1299 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1303 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOSTINT(
'id'));
1310 if ($action ==
"updateline" && $user->hasRight(
'expensereport',
'creer')) {
1316 if (GETPOSTISSET(
'attachfile')) {
1317 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1318 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1319 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1320 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1322 $ecmfiles->fetch(0,
'', $relativepath);
1323 $fk_ecm_files = $ecmfiles->id;
1328 $type_fees_id =
GETPOSTINT(
'fk_c_type_fees');
1329 $fk_c_exp_tax_cat =
GETPOSTINT(
'fk_c_exp_tax_cat');
1330 $projet_id = $fk_project;
1331 $comments =
GETPOST(
'comments',
'restricthtml');
1333 $vatrate =
GETPOST(
'vatrate',
'alpha');
1336 if (empty($vatrate)) {
1339 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1343 if (empty($value_unit)) {
1344 $value_unit =
price2num((
float) $value_unit_ht + ((
float) $value_unit_ht * (
float) $tmpvat / 100),
'MU');
1349 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1352 if ((
float) $tmpvat < 0 || $tmpvat ==
'') {
1354 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Vat")),
null,
'errors');
1358 if ($date < $object->date_debut || $date > (
$object->date_fin + (24 * 3600 - 1))) {
1363 $langs->load(
"errors");
1364 $type = $error > 0 ?
'errors' :
'warnings';
1365 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null, $type);
1369 if ($projectRequired && $projet_id <= 0) {
1371 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1376 $result =
$object->updateline($rowid, $type_fees_id, $projet_id, $vatrate, $comments, $qty, $value_unit, $date, $id, $fk_c_exp_tax_cat, $fk_ecm_files);
1381 $outputlangs = $langs;
1384 $newlang =
GETPOST(
'lang_id',
'aZ09');
1387 $user =
new User($db);
1388 $user->fetch(
$object->fk_user_author);
1389 $newlang = $user->lang;
1391 if (!empty($newlang)) {
1392 $outputlangs =
new Translate(
"", $conf);
1393 $outputlangs->setDefaultLang($newlang);
1398 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1402 unset($value_unit_ht);
1406 unset($fk_c_type_fees);
1420 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1423 $triggersendname =
'EXPENSEREPORT_SENTBYMAIL';
1424 $autocopy =
'MAIN_MAIL_AUTOCOPY_EXPENSEREPORT_TO';
1425 $trackid =
'exp'.$object->id;
1426 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1429 $upload_dir = $conf->expensereport->dir_output;
1430 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1438$title = $langs->trans(
"ExpenseReport").
" - ".$langs->trans(
"Card");
1439$help_url =
"EN:Module_Expense_Reports|FR:Module_Notes_de_frais";
1443$form =
new Form($db);
1446$projecttmp =
new Project($db);
1448$bankaccountstatic =
new Account($db);
1449$ecmfilesstatic =
new EcmFiles($db);
1453if ($action ==
'create') {
1456 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'" method="post" name="create">';
1457 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1458 print
'<input type="hidden" name="action" value="add">';
1459 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1463 print
'<table class="border centpercent">';
1468 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"DateStart").
'</td>';
1470 print $form->selectDate($date_start ? $date_start : -1,
'date_debut', 0, 0, 0,
'', 1, 1);
1476 print
'<td class="fieldrequired">'.$langs->trans(
"DateEnd").
'</td>';
1478 print $form->selectDate($date_end ? $date_end : -1,
'date_fin', 0, 0, 0,
'', 1, 1);
1484 print
'<td class="fieldrequired">'.$langs->trans(
"User").
'</td>';
1486 $defaultselectuser = $user->id;
1488 $defaultselectuser =
GETPOSTINT(
'fk_user_author');
1490 $include_users =
'hierarchyme';
1491 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expensereport',
'writeall_advance')) {
1492 $include_users = array();
1494 $s = $form->select_dolusers($defaultselectuser,
"fk_user_author", 0,
"", 0, $include_users,
'',
'0,'.$conf->entity);
1501 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1504 $include_users =
$object->fetch_users_approver_expensereport();
1505 if (empty($include_users)) {
1506 print
img_warning().
' '.$langs->trans(
"NobodyHasPermissionToValidateExpenseReport");
1508 $defaultselectuser = (empty($user->fk_user_expense_validator) ? $user->fk_user : $user->fk_user_expense_validator);
1513 $defaultselectuser =
GETPOSTINT(
'fk_user_validator');
1515 $s = $form->select_dolusers($defaultselectuser,
"fk_user_validator", 1,
"", ((empty($defaultselectuser) || !
getDolGlobalString(
'EXPENSEREPORT_DEFAULT_VALIDATOR_UNCHANGEABLE')) ? 0 : 1), $include_users);
1516 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1524 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1526 $form->select_types_paiements(
'',
'fk_c_paiement');
1532 $note_public = GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') :
'';
1535 print
'<td class="tdtop">'.$langs->trans(
'NotePublic').
'</td>';
1538 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1539 print $doleditor->Create(1);
1543 $note_private = GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') :
'';
1545 if (empty($user->socid)) {
1547 print
'<td class="tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
1550 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1551 print $doleditor->Create(1);
1556 $parameters = array(
'colspan' =>
' colspan="3"',
'cols' => 3);
1557 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters,
$object, $action);
1558 print $hookmanager->resPrint;
1559 if (empty($reshook)) {
1560 print
$object->showOptionals($extrafields,
'create', $parameters);
1568 print $form->buttonsSaveCancel(
"AddTrip");
1571} elseif ($id > 0 || $ref) {
1572 $result =
$object->fetch($id, $ref);
1575 if (!in_array(
$object->fk_user_author, $childids)) {
1576 if (!$user->hasRight(
'expensereport',
'readall') && !$user->hasRight(
'expensereport',
'lire_tous')
1577 && (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || !$user->hasRight(
'expensereport',
'writeall_advance'))) {
1580 print
'<div class="tabBar">';
1581 print $langs->trans(
'NotUserRightToView');
1595 print
"<form name='update' action=\"".$_SERVER[
'PHP_SELF'].
"\" method=\"post\">\n";
1596 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1597 print
'<input type="hidden" name="id" value="'.$id.
'">';
1598 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1603 print
'<input type="hidden" name="action" value="updateFromRefuse">';
1605 print
'<input type="hidden" name="action" value="update">';
1608 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1610 print
'<table class="border centpercent">';
1613 print
'<td>'.$langs->trans(
"User").
'</td>';
1615 $userfee =
new User($db);
1616 if (
$object->fk_user_author > 0) {
1617 $userfee->fetch(
$object->fk_user_author);
1618 print $userfee->getNomUrl(-1);
1623 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Ref").
'</td><td>';
1624 print $form->showrefnav(
$object,
'ref', $linkback, 1,
'ref',
'ref',
'');
1628 print
'<td>'.$langs->trans(
"DateStart").
'</td>';
1630 print $form->selectDate(
$object->date_debut,
'date_debut');
1634 print
'<td>'.$langs->trans(
"DateEnd").
'</td>';
1636 print $form->selectDate(
$object->date_fin,
'date_fin');
1642 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1644 $form->select_types_paiements(
$object->fk_c_paiement,
'fk_c_paiement');
1651 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1653 $include_users =
$object->fetch_users_approver_expensereport();
1654 $s = $form->select_dolusers(
$object->fk_user_validator,
"fk_user_validator", 1,
"", 0, $include_users);
1655 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1660 print
'<td>'.$langs->trans(
"VALIDOR").
'</td>';
1662 $userfee =
new User($db);
1663 $userfee->fetch(
$object->fk_user_valid);
1664 print $userfee->getNomUrl(-1);
1670 print
'<td>'.$langs->trans(
"AUTHORPAIEMENT").
'</td>';
1672 $userfee =
new User($db);
1673 $userfee->fetch($user->id);
1674 print $userfee->getNomUrl(-1);
1686 print $form->buttonsSaveCancel(
"Modify");
1690 $taxlessUnitPriceDisabled =
getDolGlobalString(
'EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY') ?
' disabled' :
'';
1697 if ($action ==
'clone') {
1699 $criteriaforfilter =
'hierarchyme';
1700 if ($user->hasRight(
'expensereport',
'readall')) {
1701 $criteriaforfilter =
'';
1703 $formquestion = array(
1705 0 => array(
'type' =>
'other',
'name' =>
'fk_user_author',
'label' => $langs->trans(
"SelectTargetUser"),
'value' => $form->select_dolusers((
GETPOSTINT(
'fk_user_author') > 0 ?
GETPOSTINT(
'fk_user_author') : $user->id),
'fk_user_author', 0, null, 0, $criteriaforfilter,
'',
'0', 0, 0,
'', 0,
'',
'maxwidth150'))
1708 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneExpenseReport',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1711 if ($action ==
'save') {
1712 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_validate",
"",
"", 1);
1715 if ($action ==
'save_from_refuse') {
1716 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_save_from_refuse",
"",
"", 1);
1719 if ($action ==
'delete') {
1720 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"DeleteTrip"), $langs->trans(
"ConfirmDeleteTrip"),
"confirm_delete",
"",
"", 1);
1723 if ($action ==
'validate') {
1724 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"ValideTrip"), $langs->trans(
"ConfirmValideTrip"),
"confirm_approve",
"",
"", 1);
1727 if ($action ==
'paid') {
1728 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"PaidTrip"), $langs->trans(
"ConfirmPaidTrip"),
"confirm_paid",
"",
"", 1);
1731 if ($action ==
'cancel') {
1732 $array_input = array(
'text' => $langs->trans(
"ConfirmCancelTrip"), 0 => array(
'type' =>
"text",
'label' =>
'<strong>'.$langs->trans(
"Comment").
'</strong>',
'name' =>
"detail_cancel",
'value' =>
""));
1733 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Cancel"),
"",
"confirm_cancel", $array_input,
"", 1);
1736 if ($action ==
'setdraft') {
1737 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"BrouillonnerTrip"), $langs->trans(
"ConfirmBrouillonnerTrip"),
"confirm_setdraft",
"",
"", 1);
1740 if ($action ==
'refuse') {
1741 $array_input = array(
'text' => $langs->trans(
"ConfirmRefuseTrip"), 0 => array(
'type' =>
"text",
'label' => $langs->trans(
"Comment"),
'name' =>
"detail_refuse",
'value' =>
""));
1742 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Deny"),
'',
"confirm_refuse", $array_input,
"yes", 1);
1745 if ($action ==
'delete_line') {
1746 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id.
"&rowid=".
GETPOSTINT(
'rowid'), $langs->trans(
"DeleteLine"), $langs->trans(
"ConfirmDeleteLine"),
"confirm_delete_line",
'',
'yes', 1);
1753 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1755 $morehtmlref =
'<div class="refidno">';
1756 $morehtmlref .=
'</div>';
1758 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
1760 print
'<div class="fichecenter">';
1761 print
'<div class="fichehalfleft">';
1762 print
'<div class="underbanner clearboth"></div>';
1764 print
'<table class="border tableforfield centpercent">';
1768 print
'<td class="titlefield">'.$langs->trans(
"User").
'</td>';
1770 if (
$object->fk_user_author > 0) {
1771 $userauthor =
new User($db);
1772 $result = $userauthor->fetch(
$object->fk_user_author);
1775 } elseif ($result > 0) {
1776 print $userauthor->getNomUrl(-1);
1783 print
'<td class="titlefield">'.$langs->trans(
"Period").
'</td>';
1790 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1791 print
'<td>'.$object->fk_c_paiement.
'</td>';
1797 print
'<td>'.$langs->trans(
"DATE_SAVE").
'</td>';
1798 print
'<td>'.dol_print_date(
$object->date_valid,
'dayhour',
'tzuser');
1800 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToApprove"));
1803 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToPay"));
1811 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1813 if (
$object->fk_user_validator > 0) {
1814 $userfee =
new User($db);
1815 $result = $userfee->fetch(
$object->fk_user_validator);
1817 print $userfee->getNomUrl(-1);
1819 if (empty($userfee->email) || !
isValidEmail($userfee->email)) {
1820 $langs->load(
"errors");
1821 print
img_warning($langs->trans(
"ErrorBadEMail", $userfee->email));
1827 print
'<td>'.$langs->trans(
"CANCEL_USER").
'</span></td>';
1829 if (
$object->fk_user_cancel > 0) {
1830 $userfee =
new User($db);
1831 $result = $userfee->fetch(
$object->fk_user_cancel);
1833 print $userfee->getNomUrl(-1);
1839 print
'<td>'.$langs->trans(
"MOTIF_CANCEL").
'</td>';
1840 print
'<td>'.$object->detail_cancel.
'</td></tr>';
1843 print
'<td>'.$langs->trans(
"DATE_CANCEL").
'</td>';
1844 print
'<td>'.dol_print_date(
$object->date_cancel,
'dayhour',
'tzuser').
'</td></tr>';
1848 print
'<td>'.$langs->trans(
"ApprovedBy").
'</td>';
1850 if (
$object->fk_user_approve > 0) {
1851 $userapp =
new User($db);
1852 $result = $userapp->fetch(
$object->fk_user_approve);
1854 print $userapp->getNomUrl(-1);
1860 print
'<td>'.$langs->trans(
"DateApprove").
'</td>';
1861 print
'<td>'.dol_print_date(
$object->date_approve,
'dayhour',
'tzuser').
'</td></tr>';
1867 print
'<td>'.$langs->trans(
"REFUSEUR").
'</td>';
1869 $userfee =
new User($db);
1870 $result = $userfee->fetch(
$object->fk_user_refuse);
1872 print $userfee->getNomUrl(-1);
1877 print
'<td>'.$langs->trans(
"DATE_REFUS").
'</td>';
1878 print
'<td>'.dol_print_date(
$object->date_refuse,
'dayhour',
'tzuser');
1880 print
' - '.$object->detail_refuse;
1904 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1909 print
'<div class="fichehalfright">';
1910 print
'<div class="underbanner clearboth"></div>';
1912 print
'<table class="border tableforfield centpercent">';
1916 print
'<td class="titlefieldmiddle">'.$langs->trans(
"AmountHT").
'</td>';
1917 print
'<td class="nowrap amountcard">'.price(
$object->total_ht, 1,
'', 1, - 1, - 1, $conf->currency).
'</td>';
1934 print
'<td>'.$langs->trans(
"AmountVAT").
'</td>';
1935 print
'<td class="nowrap amountcard">'.price(
$object->total_tva, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1939 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
1940 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1941 print
'<td class="valuefield">'.price(
$object->total_localtax1, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1943 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
1944 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1945 print
'<td class="valuefield">'.price(
$object->total_localtax2, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1949 print
'<td>'.$langs->trans(
"AmountTTC").
'</td>';
1950 print
'<td class="nowrap amountcard">'.price(
$object->total_ttc, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1956 if (isModEnabled(
"bank")) {
1961 print
'<table class="noborder paymenttable centpercent">';
1963 print
'<tr class="liste_titre">';
1964 print
'<td class="liste_titre">'.$langs->trans(
'Payments').
'</td>';
1965 print
'<td class="liste_titre">'.$langs->trans(
'Date').
'</td>';
1966 print
'<td class="liste_titre">'.$langs->trans(
'Type').
'</td>';
1967 if (isModEnabled(
"bank")) {
1968 print
'<td class="liste_titre right">'.$langs->trans(
'BankAccount').
'</td>';
1970 print
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
1971 print
'<td class="liste_titre" width="18"> </td>';
1975 $sql =
"SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,";
1976 $sql .=
"c.code as payment_code, c.libelle as payment_type,";
1977 $sql .=
"ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal";
1978 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as e, ".MAIN_DB_PREFIX.
"payment_expensereport as p";
1979 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as c ON p.fk_typepayment = c.id";
1980 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
1981 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
1982 $sql .=
" WHERE e.rowid = ".((int) $id);
1983 $sql .=
" AND p.fk_expensereport = e.rowid";
1984 $sql .=
' AND e.entity IN ('.getEntity(
'expensereport').
')';
1985 $sql .=
" ORDER BY dp";
1987 $resql = $db->query($sql);
1989 $num = $db->num_rows($resql);
1993 $objp = $db->fetch_object($resql);
1995 $paymentexpensereportstatic->id = $objp->rowid;
1996 $paymentexpensereportstatic->datep = $db->jdate($objp->dp);
1997 $paymentexpensereportstatic->ref = $objp->rowid;
1998 $paymentexpensereportstatic->num_payment = $objp->num_payment;
1999 $paymentexpensereportstatic->type_code = $objp->payment_code;
2000 $paymentexpensereportstatic->type_label = $objp->payment_type;
2002 print
'<tr class="oddseven">';
2004 print $paymentexpensereportstatic->getNomUrl(1);
2006 print
'<td>'.dol_print_date($db->jdate($objp->dp),
'day').
"</td>\n";
2007 $labeltype = $langs->trans(
"PaymentType".$objp->payment_code) !=
"PaymentType".$objp->payment_code ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_type;
2008 print
"<td>".$labeltype.
' '.$objp->num_payment.
"</td>\n";
2010 if (isModEnabled(
"bank")) {
2011 $bankaccountstatic->id = $objp->baid;
2012 $bankaccountstatic->ref = $objp->baref;
2013 $bankaccountstatic->label = $objp->baref;
2014 $bankaccountstatic->number = $objp->banumber;
2016 if (isModEnabled(
'accounting')) {
2017 $bankaccountstatic->account_number = $objp->account_number;
2020 $accountingjournal->fetch($objp->fk_accountancy_journal);
2021 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1,
'', 1);
2024 print
'<td class="right">';
2025 if ($bankaccountstatic->id) {
2026 print $bankaccountstatic->getNomUrl(1,
'transactions');
2030 print
'<td class="right">'.price($objp->amount).
"</td>";
2033 $totalpaid += $objp->amount;
2036 if (!is_null($totalpaid)) {
2041 $resteapayeraffiche = $remaintopay;
2043 $cssforamountpaymentcomplete =
'amountpaymentcomplete';
2046 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2047 $resteapayeraffiche = 0;
2048 } elseif (
$object->paid == 0) {
2049 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2051 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AlreadyPaid").
':</td><td class="right">'.
price($totalpaid).
'</td><td></td></tr>';
2052 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AmountExpected").
':</td><td class="right">'.
price(
$object->total_ttc).
'</td><td></td></tr>';
2054 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"RemainderToPay").
':</td>';
2055 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td></td></tr>';
2066 print
'<div class="clearboth"></div><br><br>';
2068 print
'<div style="clear: both;"></div>';
2070 $actiontouse =
'updateline';
2071 if ((
$object->status == 0 ||
$object->status == 99) && $action !=
'editline') {
2072 $actiontouse =
'addline';
2075 print
'<form name="expensereport" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="post" >';
2076 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2077 print
'<input type="hidden" name="action" value="'.$actiontouse.
'">';
2078 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2079 print
'<input type="hidden" name="fk_expensereport" value="'.$object->id.
'" />';
2080 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2081 print
'<input type="hidden" name="page_y" value="">';
2083 print
'<div class="div-table-responsive-no-min">';
2084 print
'<table id="tablelines" class="noborder centpercent">';
2090 print
'<tr class="liste_titre headerexpensereportdet">';
2091 print
'<td class="center linecollinenb">'.$langs->trans(
'LineNb').
'</td>';
2093 print
'<td class="center linecoldate">'.$langs->trans(
'Date').
'</td>';
2094 if (isModEnabled(
'project')) {
2095 print
'<td class="minwidth100imp linecolproject">'.$langs->trans(
'Project').
'</td>';
2097 print
'<td class="center linecoltype">'.$langs->trans(
'Type').
'</td>';
2099 print
'<td class="center linecolcarcategory">'.$langs->trans(
'CarCategory').
'</td>';
2101 print
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
2102 print
'<td class="right linecolvat">'.$langs->trans(
'VAT').
'</td>';
2103 print
'<td class="right linecolpriceuht">'.$langs->trans(
'PriceUHT').
'</td>';
2104 print
'<td class="right linecolpriceuttc">'.$langs->trans(
'PriceUTTC').
'</td>';
2105 print
'<td class="right linecolqty">'.$langs->trans(
'Qty').
'</td>';
2106 if ($action !=
'editline') {
2107 print
'<td class="right linecolamountht">'.$langs->trans(
'AmountHT').
'</td>';
2108 print
'<td class="right linecolamountttc">'.$langs->trans(
'AmountTTC').
'</td>';
2119 if ((
$object->status < 2 ||
$object->status == 99) && $user->hasRight(
'expensereport',
'creer')) {
2120 print
'<td class="right"></td>';
2124 foreach (
$object->lines as &$line) {
2127 if ($action !=
'editline' || $line->id !=
GETPOSTINT(
'rowid')) {
2128 print
'<tr class="oddeven linetr" data-id="'.$line->id.
'">';
2131 print
'<td class="center linecollinenb">';
2136 print
'<td class="center linecoldate">'.dol_print_date($db->jdate($line->date),
'day').
'</td>';
2139 if (isModEnabled(
'project')) {
2140 print
'<td class="lineproject">';
2141 if ($line->fk_project > 0) {
2142 $projecttmp->id = $line->fk_project;
2143 $projecttmp->ref = $line->projet_ref;
2144 $projecttmp->title = $line->projet_title;
2145 print $projecttmp->getNomUrl(1);
2151 if (isModEnabled(
'accounting')) {
2152 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
2154 $resaccountingaccount = $accountingaccount->fetch(0, $line->type_fees_accountancy_code, 1);
2156 $titlealt .= $langs->trans(
"AccountancyCode").
': ';
2157 if ($resaccountingaccount > 0) {
2158 $titlealt .= $accountingaccount->account_number;
2160 $titlealt .= $langs->trans(
"NotFound");
2166 print
'<td class="center linecoltype" title="'.dol_escape_htmltag($titlealt).
'">';
2167 $labeltype = ($langs->trans(($line->type_fees_code)) == $line->type_fees_code ? $line->type_fees_libelle : $langs->trans($line->type_fees_code));
2173 print
'<td class="fk_c_exp_tax_cat linecoltaxcat">';
2174 $exp_tax_cat_label =
dol_getIdFromCode($db, $line->fk_c_exp_tax_cat,
'c_exp_tax_cat',
'rowid',
'label');
2175 print $langs->trans($exp_tax_cat_label);
2180 print
'<td class="left linecolcomment">'.dol_nl2br($line->comments).
'</td>';
2183 $senderissupplier = 0;
2184 $tooltiponprice =
'';
2185 $tooltiponpriceend =
'';
2187 $tooltiponprice = $langs->transcountry(
"TotalHT", $mysoc->country_code).
'='.
price($line->total_ht);
2188 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalVAT", ($senderissupplier ?
$object->thirdparty->country_code : $mysoc->country_code)).
'='.
price($line->total_tva);
2189 if (is_object(
$object->thirdparty)) {
2190 if ($senderissupplier) {
2191 $seller =
$object->thirdparty;
2198 if ($mysoc->useLocalTax(1)) {
2199 if (($seller->country_code == $buyer->country_code) || $line->total_localtax1 || $seller->useLocalTax(1)) {
2200 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT1", $seller->country_code).
'='.
price($line->total_localtax1);
2202 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT1", $seller->country_code).
'=<span class="opacitymedium">'.$langs->trans($senderissupplier ?
"NotUsedForThisVendor" :
"NotUsedForThisCustomer").
'</span>';
2205 if ($mysoc->useLocalTax(2)) {
2206 if ((isset($seller->country_code) && isset($buyer->thirdparty->country_code) && $seller->country_code == $buyer->thirdparty->country_code) || $line->total_localtax2 || $seller->useLocalTax(2)) {
2207 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT2", $seller->country_code).
'='.
price($line->total_localtax2);
2209 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT2", $seller->country_code).
'=<span class="opacitymedium">'.$langs->trans($senderissupplier ?
"NotUsedForThisVendor" :
"NotUsedForThisCustomer").
'</span>';
2213 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalTTC", $mysoc->country_code).
'='.
price($line->total_ttc);
2215 $tooltiponprice =
'<span class="classfortooltip" title="'.dol_escape_htmltag($tooltiponprice).
'">';
2216 $tooltiponpriceend =
'</span>';
2219 print
'<td class="right linecolvatrate">';
2220 print $tooltiponprice;
2221 print
vatrate($line->vatrate.($line->vat_src_code ?
' ('.$line->vat_src_code.
')' :
''), true);
2222 print $tooltiponpriceend;
2226 print
'<td class="right linecolunitht">';
2227 if (!empty($line->value_unit_ht)) {
2228 print
price($line->value_unit_ht);
2230 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $line->vatrate));
2231 $pricenettoshow =
price2num((
float) $line->value_unit / (1 + $tmpvat / 100),
'MU');
2232 print
price($pricenettoshow);
2236 print
'<td class="right linecolunitttc">'.price($line->value_unit).
'</td>';
2238 print
'<td class="right linecolqty">'.dol_escape_htmltag($line->qty).
'</td>';
2240 if ($action !=
'editline') {
2241 print
'<td class="right linecoltotalht">'.price($line->total_ht).
'</td>';
2242 print
'<td class="right linecoltotalttc">'.price($line->total_ttc).
'</td>';
2246 print
'<td class="center linecolpreview">';
2247 if ($line->fk_ecm_files > 0) {
2248 $modulepart =
'expensereport';
2249 $maxheightmini = 32;
2251 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2253 $relativepath = preg_replace(
'/expensereport\//',
'', $ecmfilesstatic->filepath);
2254 $fileinfo = pathinfo($ecmfilesstatic->filepath.
'/'.$ecmfilesstatic->filename);
2257 if (!
dol_is_file($conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$minifile)) {
2261 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity));
2262 if (empty($urlforhref)) {
2263 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
2264 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
2266 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2268 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="">';
2271 if (preg_match(
'/\.pdf$/i', $ecmfilesstatic->filename)) {
2272 $filepdf = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename;
2273 $fileimage = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2274 $relativepathimage = $relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2276 $pdfexists = file_exists($filepdf);
2279 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2281 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2290 if ($pdfexists && !$error) {
2291 $heightforphotref = 70;
2292 if (!empty($conf->dol_optimize_smallscreen)) {
2293 $heightforphotref = 60;
2295 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity));
2296 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2298 if (file_exists($fileimage)) {
2299 print
'<img height="'.$heightforphotref.
'" class="photo photowithmargin photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2302 print
img_mime($ecmfilesstatic->filename);
2312 print
'<td class="nowrap right linecolwarning">';
2313 print !empty($line->rule_warning_message) ?
img_warning(html_entity_decode($line->rule_warning_message)) :
' ';
2318 print
'<td class="nowrap right linecolaction">';
2320 print
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&rowid='.$line->rowid.
'">';
2322 print
'</a> ';
2323 print
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete_line&token='.
newToken().
'&rowid='.$line->rowid.
'">';
2333 if ($action ==
'editline' && $line->id ==
GETPOSTINT(
'rowid')) {
2336 if (isModEnabled(
'project')) {
2343 print
'<!-- line of expense report -->'.
"\n";
2344 print
'<tr class="tredited">';
2346 print
'<td class="center">';
2350 print
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
2351 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2352 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2355 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2356 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2360 print
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
2361 print
'<script type="text/javascript">'.
"\n";
2362 print
'$(document).ready(function() {
2363 $( ".auploadnewfilenow" ).click(function() {
2364 jQuery(".truploadnewfilenow").toggle();
2365 jQuery(".trattachnewfilenow").hide();
2368 $( ".aattachtodoc" ).click(function() {
2369 jQuery(".trattachnewfilenow").toggle();
2370 jQuery(".truploadnewfilenow").hide();
2373 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array'))) {
2374 print
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
2377 jQuery("form[name=\"expensereport\"]").submit(function() {
2378 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2379 jQuery("input[name=\"sendit\"]").val("");
2386 print
'</script>'.
"\n";
2389 $filenamelinked =
'';
2390 if ($line->fk_ecm_files > 0) {
2391 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2393 $filenamelinked = $ecmfilesstatic->filename;
2397 $tredited =
'tredited';
2398 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2399 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2401 print
'<tr class="oddeven tredited">';
2406 print
'<td class="center">';
2407 print $form->selectDate($line->date,
'date');
2411 if (isModEnabled(
'project')) {
2413 $formproject->select_projects(-1, $line->fk_project,
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2418 print
'<td class="center">';
2419 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees,
'fk_c_type_fees');
2423 print
'<td class="fk_c_exp_tax_cat">';
2424 $params = array(
'fk_expense' =>
$object->id,
'fk_expense_det' => $line->id,
'date' => $line->date);
2425 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);
2431 print
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
2435 $selectedvat =
price2num($line->vatrate).(!empty($line->vat_src_code) ?
' ('.$line->vat_src_code.
')' :
'');
2436 print
'<td class="right">';
2437 print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ?
GETPOST(
"vatrate") : $selectedvat), $mysoc,
'', 0, 0,
'', false, 1, 2);
2441 print
'<td class="right">';
2442 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.
' />';
2446 print
'<td class="right">';
2447 print
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
2451 print
'<td class="right">';
2452 print
'<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';
2459 print
'<td class="center">';
2463 print
'<td class="center">';
2467 print
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
2468 print $form->buttonsSaveCancel(
'Save',
'Cancel', array(), 0,
'small');
2484 if (isModEnabled(
'project')) {
2487 if ($action !=
'editline') {
2491 $nbFiles = $nbLinks = 0;
2492 $arrayoffiles = array();
2494 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2495 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2496 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2499 $nbFiles = count($arrayoffiles);
2504 print
'<tr class="liste_titre">';
2505 print
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
2506 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2507 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2510 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2511 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2515 print
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
2516 print
'<script type="text/javascript">'.
"\n";
2517 print
'$(document).ready(function() {
2518 $( ".auploadnewfilenow" ).click(function() {
2519 console.log("We click on toggle of auploadnewfilenow");
2520 jQuery(".truploadnewfilenow").toggle();
2521 jQuery(".trattachnewfilenow").hide();
2522 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2523 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2525 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2527 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2530 $( ".aattachtodoc" ).click(function() {
2531 console.log("We click on toggle of aattachtodoc");
2532 jQuery(".trattachnewfilenow").toggle();
2533 jQuery(".truploadnewfilenow").hide();
2534 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2537 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array')) && $action !=
'updateline') {
2538 print
'jQuery(".trattachnewfilenow").show();'.
"\n";
2541 jQuery("form[name=\"expensereport\"]").submit(function() {
2542 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2543 /* 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. */
2544 jQuery("input[name=\"sendit\"]").val("");
2545 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2547 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2554 print
'</script>'.
"\n";
2558 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2559 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2561 print
'<tr class="liste_titre expensereportcreate">';
2563 print
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
2564 if (isModEnabled(
'project')) {
2565 print
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
2567 print
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
2569 print
'<td>'.$langs->trans(
'CarCategory').
'</td>';
2571 print
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
2572 print
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
2573 print
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
2574 print
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
2575 print
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
2582 print
'<tr class="oddeven nohover">';
2588 print
'<td class="center inputdate">';
2589 print $form->selectDate(!empty($date) ? $date : -1,
'date', 0, 0, 0,
'', 1, 1);
2593 if (isModEnabled(
'project')) {
2594 print
'<td class="inputproject">';
2595 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0,
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2600 print
'<td class="center inputtype">';
2601 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees :
"",
'fk_c_type_fees', 1);
2605 print
'<td class="fk_c_exp_tax_cat">';
2606 $params = array(
'fk_expense' =>
$object->id);
2607 print $form->selectExpenseCategories(
'',
'fk_c_exp_tax_cat', 1, array(),
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2612 print
'<td class="inputcomment">';
2613 print
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments :
"", 0, 1).
'</textarea>';
2617 print
'<td class="right inputvat">';
2621 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS =
'none';
2623 print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), null, null, 0, 0,
'', false, 1);
2627 print
'<td class="right inputpricenet">';
2628 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 :
"")).
'"'.$taxlessUnitPriceDisabled.
' />';
2632 print
'<td class="right inputtax">';
2633 print
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit :
"")).
'">';
2637 print
'<td class="right inputqty">';
2638 print
'<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">';
2644 if ($action !=
'editline') {
2645 print
'<td class="right"></td>';
2646 print
'<td class="right"></td>';
2650 print
'<td class="center inputbuttons">';
2651 print $form->buttonsSaveCancel(
"Add",
'',
'', 1,
'reposition');
2662 /* JQuery for product free or predefined select */
2663 jQuery(document).ready(function() {
2664 jQuery("#value_unit_ht").keyup(function(event) {
2665 console.log(event.which); // discard event tag and arrows
2666 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2667 jQuery("#value_unit").val("");
2670 jQuery("#value_unit").keyup(function(event) {
2671 console.log(event.which); // discard event tag and arrows
2672 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2673 jQuery("#value_unit_ht").val("");
2681 /* unit price coef calculation */
2682 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2683 console.log("We change a parameter");
2685 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2686 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2687 let tva = jQuery("#vatrate").find(":selected").val();
2688 let qty = jQuery(".input_qty").val();
2690 let path = "'.DOL_URL_ROOT.
'/expensereport/ajax/ajaxik.php";
2691 path += "?fk_c_exp_tax_cat="+tax_cat;
2692 path += "&fk_expense="+'.((int)
$object->id).
';
2693 path += "&vatrate="+tva;
2694 path += "&qty="+qty;
2696 if (type_fee == 4) { // frais_kilométriques
2697 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2705 success: function(response) {
2706 if (response.response_status == "success"){';
2710 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2711 jQuery("#value_unit").trigger("change");
2715 jQuery("#value_unit_ht").val(response.data);
2716 jQuery("#value_unit_ht").trigger("change");
2717 jQuery("#value_unit").val("");
2722 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ) {
2723 console.log("We get an error result");
2724 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2730 /*console.log(event.which); // discard event tag and arrows
2731 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2732 jQuery("#value_unit_ht").val("");
2752 print
'Record not found';
2763print
'<div class="tabsAction">';
2765if ($action !=
'create' && $action !=
'edit' && $action !=
'editline') {
2770 if (empty($user->socid)) {
2773 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>';
2785 if (in_array(
$object->fk_user_author, $childids) || $user->hasRight(
'expensereport',
'writeall_advance')) {
2787 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>';
2790 if (count(
$object->lines) > 0) {
2791 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>';
2802 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid) {
2804 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>';
2809 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>';
2814 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid) {
2816 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>';
2826 if (in_array(
$object->fk_user_author, $childids)) {
2828 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>';
2836 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=validate&token='.
newToken().
'&id='.
$object->id.
'">'.$langs->trans(
'Approve').
'</a></div>';
2838 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&token='.
newToken().
'&id='.
$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2841 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid) {
2843 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.
$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2852 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&token='.
newToken().
'&id='.
$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2858 if ($remaintopay == 0) {
2859 print
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
2861 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>';
2869 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>";
2875 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>';
2881 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>';
2886 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>';
2890 if ($user->hasRight(
'expensereport',
'creer')) {
2891 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>';
2897 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>';
2900 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>';
2903 $parameters = array();
2904 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
2911if (
GETPOST(
'modelselected',
'alpha')) {
2912 $action =
'presend';
2915if ($action !=
'presend') {
2920 print
'<div class="fichecenter"><div class="fichehalfleft">';
2921 print
'<a name="builddoc"></a>';
2923 if ($user->hasRight(
'expensereport',
'creer') && $action !=
'create' && $action !=
'edit') {
2926 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
2927 $genallowed = $user->hasRight(
'expensereport',
'creer');
2928 $delallowed = $user->hasRight(
'expensereport',
'creer');
2930 print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2931 $somethingshown = $formfile->numoffiles;
2943 print
'</div><div class="fichehalfright">';
2945 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2947 $somethingshown = $formactions->showactions(
$object,
'expensereport',
null);
2949 print
'</div></div>';
2953$modelmail =
'expensereport_send';
2954$defaulttopic =
'SendExpenseReportRef';
2955$diroutput = $conf->expensereport->dir_output;
2956$trackid =
'exp'.$object->id;
2958include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
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($utf8_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_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
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($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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 '.
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_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.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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.
get_date_range($date_start, $date_end, $format='', $outputlangs=null, $withparenthesis=1)
Format output for start and end date.
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.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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 edit/modify 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.