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 $newlang =
$object->thirdparty->default_lang;
399 if (!empty($newlang)) {
401 $outputlangs->setDefaultLang($newlang);
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);
426 if ($emailTo && $emailFrom) {
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 ($mailfile->error) {
469 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
470 $mesg .=
'<br>'.$mailfile->error;
473 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
481 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
488 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
495 if ($action ==
"confirm_save_from_refuse" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
498 $result =
$object->set_save_from_refuse($user);
503 $outputlangs = $langs;
506 $newlang =
GETPOST(
'lang_id',
'aZ09');
509 $newlang =
$object->thirdparty->default_lang;
511 if (!empty($newlang)) {
513 $outputlangs->setDefaultLang($newlang);
518 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
526 $destinataire =
new User($db);
527 $destinataire->fetch(
$object->fk_user_validator);
528 $emailTo = $destinataire->email;
531 $expediteur =
new User($db);
532 $expediteur->fetch(
$object->fk_user_author);
535 if ($emailFrom && $emailTo) {
546 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForReApproval");
549 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
550 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
570 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
574 $result = $mailfile->sendfile();
576 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
578 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
581 $langs->load(
"other");
582 if ($mailfile->error) {
584 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
585 $mesg .=
'<br>'.$mailfile->error;
588 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
596 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
605 if ($action ==
"confirm_approve" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'approve')) {
609 $result =
$object->setApproved($user);
614 $outputlangs = $langs;
617 $newlang =
GETPOST(
'lang_id',
'aZ09');
620 $newlang =
$object->thirdparty->default_lang;
622 if (!empty($newlang)) {
624 $outputlangs->setDefaultLang($newlang);
629 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
637 $destinataire =
new User($db);
638 $destinataire->fetch(
$object->fk_user_author);
639 $emailTo = $destinataire->email;
643 if (empty($emailTo)) {
648 $expediteur =
new User($db);
649 $expediteur->fetch(
$object->fk_user_approve > 0 ?
$object->fk_user_approve :
$object->fk_user_validator);
652 if ($emailFrom && $emailTo) {
663 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportApproved");
666 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
667 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
668 $message = $langs->transnoentities(
"ExpenseReportApprovedMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
685 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, $emailCC,
'', 0, -1);
689 $result = $mailfile->sendfile();
691 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
693 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
696 $langs->load(
"other");
697 if ($mailfile->error) {
699 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
700 $mesg .=
'<br>'.$mailfile->error;
703 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
711 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
720 if ($action ==
"confirm_refuse" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'approve')) {
724 $detailRefuse =
GETPOST(
'detail_refuse',
'alpha');
725 $result =
$object->setDeny($user, $detailRefuse);
730 $outputlangs = $langs;
733 $newlang =
GETPOST(
'lang_id',
'aZ09');
736 $newlang =
$object->thirdparty->default_lang;
738 if (!empty($newlang)) {
740 $outputlangs->setDefaultLang($newlang);
745 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
753 $destinataire =
new User($db);
754 $destinataire->fetch(
$object->fk_user_author);
755 $emailTo = $destinataire->email;
758 $expediteur =
new User($db);
759 $expediteur->fetch(
$object->fk_user_refuse);
762 if ($emailFrom && $emailTo) {
773 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportRefused");
776 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
777 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
778 $message = $langs->transnoentities(
"ExpenseReportRefusedMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailRefuse, $link);
796 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
800 $result = $mailfile->sendfile();
802 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
804 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
807 $langs->load(
"other");
808 if ($mailfile->error) {
810 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
811 $mesg .=
'<br>'.$mailfile->error;
814 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
822 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
832 if ($action ==
"confirm_cancel" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
833 if (!
GETPOST(
'detail_cancel',
'alpha')) {
834 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Comment")),
null,
'errors');
839 if ($user->id ==
$object->fk_user_valid || $user->id ==
$object->fk_user_author) {
840 $detailCancel =
GETPOST(
'detail_cancel',
'alpha');
841 $result =
$object->set_cancel($user, $detailCancel);
846 $outputlangs = $langs;
849 $newlang =
GETPOST(
'lang_id',
'aZ09');
852 $newlang =
$object->thirdparty->default_lang;
854 if (!empty($newlang)) {
856 $outputlangs->setDefaultLang($newlang);
861 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
869 $destinataire =
new User($db);
870 $destinataire->fetch(
$object->fk_user_author);
871 $emailTo = $destinataire->email;
874 $expediteur =
new User($db);
875 $expediteur->fetch(
$object->fk_user_cancel);
878 if ($emailFrom && $emailTo) {
889 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportCanceled");
892 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
893 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
894 $message = $langs->transnoentities(
"ExpenseReportCanceledMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailCancel, $link);
912 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
916 $result = $mailfile->sendfile();
918 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
920 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
923 $langs->load(
"other");
924 if ($mailfile->error) {
926 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
927 $mesg .=
'<br>'.$mailfile->error;
930 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
938 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
951 if ($action ==
"confirm_setdraft" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
954 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid || in_array(
$object->fk_user_author, $childids)) {
955 $result =
$object->setStatut(0);
960 $outputlangs = $langs;
963 $newlang =
GETPOST(
'lang_id',
'aZ09');
966 $newlang =
$object->thirdparty->default_lang;
968 if (!empty($newlang)) {
970 $outputlangs->setDefaultLang($newlang);
975 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
980 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
990 if ($action ==
'set_unpaid' && $id > 0 && $user->hasRight(
'expensereport',
'to_paid')) {
994 $result =
$object->setUnpaid($user);
999 $outputlangs = $langs;
1002 $newlang =
GETPOST(
'lang_id',
'aZ09');
1005 $newlang =
$object->thirdparty->default_lang;
1007 if (!empty($newlang)) {
1008 $outputlangs =
new Translate(
"", $conf);
1009 $outputlangs->setDefaultLang($newlang);
1014 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1019 if ($action ==
'set_paid' && $id > 0 && $user->hasRight(
'expensereport',
'to_paid')) {
1023 $result =
$object->setPaid($id, $user);
1028 $outputlangs = $langs;
1031 $newlang =
GETPOST(
'lang_id',
'aZ09');
1034 $newlang =
$object->thirdparty->default_lang;
1036 if (!empty($newlang)) {
1037 $outputlangs =
new Translate(
"", $conf);
1038 $outputlangs->setDefaultLang($newlang);
1043 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1051 $destinataire =
new User($db);
1052 $destinataire->fetch(
$object->fk_user_author);
1053 $emailTo = $destinataire->email;
1056 $expediteur =
new User($db);
1057 $expediteur->fetch($user->id);
1060 if ($emailFrom && $emailTo) {
1061 $filename = array();
1063 $mimetype = array();
1071 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportPaid");
1074 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
1075 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
1076 $message = $langs->transnoentities(
"ExpenseReportPaidMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
1079 $object->setDocModel($user,
"");
1080 $resultPDF = expensereport_pdf_create($db,
$object,
'',
"", $langs);
1083 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
1087 $result = $mailfile->sendfile();
1089 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
1091 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
1094 $langs->load(
"other");
1095 if ($mailfile->error) {
1097 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
1098 $mesg .=
'<br>'.$mailfile->error;
1101 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
1109 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
1118 if ($action ==
"addline" && $user->hasRight(
'expensereport',
'creer')) {
1123 if (GETPOSTISSET(
'attachfile')) {
1124 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1125 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1126 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1127 $entityprefix = ($conf->entity !=
'1') ? $conf->entity.
'/' :
'';
1128 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1130 $ecmfiles->fetch(0,
'', $relativepath);
1131 $fk_ecm_files = $ecmfiles->id;
1136 if (empty($vatrate)) {
1139 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1143 if (empty($value_unit)) {
1144 $value_unit =
price2num((
float) $value_unit_ht + ((
float) $value_unit_ht * (
float) $tmpvat / 100),
'MU');
1147 $fk_c_exp_tax_cat =
GETPOSTINT(
'fk_c_exp_tax_cat');
1154 if (!($fk_c_type_fees > 0)) {
1156 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1160 if ((
float) $tmpvat < 0 || $tmpvat ===
'') {
1162 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"VAT")),
null,
'errors');
1167 if (empty($date) || $date ==
"--") {
1169 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
1170 } elseif ($date < $object->date_debut || $date > (
$object->date_fin + (24 * 3600 - 1))) {
1176 $langs->load(
"errors");
1177 $type = $error > 0 ?
'errors' :
'warnings';
1178 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null, $type);
1182 if ($value_unit == 0) {
1184 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PriceUTTC")),
null,
'errors');
1188 if ($projectRequired && $fk_project <= 0) {
1190 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1194 if ($fileRequired && $fk_ecm_files == 0) {
1196 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"File")),
null,
'errors');
1203 $result =
$object->addline($qty, $value_unit, $fk_c_type_fees, $vatrate, $date, $comments, $fk_project, $fk_c_exp_tax_cat, $type, $fk_ecm_files);
1209 $outputlangs = $langs;
1210 $newlang =
GETPOST(
'lang_id',
'alpha');
1212 $user =
new User($db);
1213 $user->fetch(
$object->fk_user_author);
1214 $newlang = $user->lang;
1216 if (!empty($newlang)) {
1217 $outputlangs =
new Translate(
"", $conf);
1218 $outputlangs->setDefaultLang($newlang);
1221 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1225 unset($value_unit_ht);
1229 unset($fk_c_type_fees);
1240 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOSTINT(
'id'));
1247 if ($action ==
'confirm_delete_line' &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $user->hasRight(
'expensereport',
'creer')) {
1253 $total_ht = $object_ligne->total_ht;
1254 $total_tva = $object_ligne->total_tva;
1261 $outputlangs = $langs;
1264 $newlang =
GETPOST(
'lang_id',
'aZ09');
1267 $newlang =
$object->thirdparty->default_lang;
1269 if (!empty($newlang)) {
1270 $outputlangs =
new Translate(
"", $conf);
1271 $outputlangs->setDefaultLang($newlang);
1276 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1280 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOSTINT(
'id'));
1287 if ($action ==
"updateline" && $user->hasRight(
'expensereport',
'creer')) {
1293 if (GETPOSTISSET(
'attachfile')) {
1294 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1295 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1296 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1297 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1299 $ecmfiles->fetch(0,
'', $relativepath);
1300 $fk_ecm_files = $ecmfiles->id;
1305 $type_fees_id =
GETPOSTINT(
'fk_c_type_fees');
1306 $fk_c_exp_tax_cat =
GETPOSTINT(
'fk_c_exp_tax_cat');
1307 $projet_id = $fk_project;
1308 $comments =
GETPOST(
'comments',
'restricthtml');
1310 $vatrate =
GETPOST(
'vatrate',
'alpha');
1313 if (empty($vatrate)) {
1316 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1320 if (empty($value_unit)) {
1321 $value_unit =
price2num((
float) $value_unit_ht + ((
float) $value_unit_ht * (
float) $tmpvat / 100),
'MU');
1326 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1329 if ((
float) $tmpvat < 0 || $tmpvat ==
'') {
1331 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Vat")),
null,
'errors');
1335 if ($date < $object->date_debut || $date > (
$object->date_fin + (24 * 3600 - 1))) {
1340 $langs->load(
"errors");
1341 $type = $error > 0 ?
'errors' :
'warnings';
1342 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null, $type);
1346 if ($projectRequired && $projet_id <= 0) {
1348 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1353 $result =
$object->updateline($rowid, $type_fees_id, $projet_id, $vatrate, $comments, $qty, $value_unit, $date, $id, $fk_c_exp_tax_cat, $fk_ecm_files);
1358 $outputlangs = $langs;
1361 $newlang =
GETPOST(
'lang_id',
'aZ09');
1364 $newlang =
$object->thirdparty->default_lang;
1366 if (!empty($newlang)) {
1367 $outputlangs =
new Translate(
"", $conf);
1368 $outputlangs->setDefaultLang($newlang);
1373 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1377 unset($value_unit_ht);
1381 unset($fk_c_type_fees);
1395 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1398 $triggersendname =
'EXPENSEREPORT_SENTBYMAIL';
1399 $autocopy =
'MAIN_MAIL_AUTOCOPY_EXPENSEREPORT_TO';
1400 $trackid =
'exp'.$object->id;
1401 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1404 $upload_dir = $conf->expensereport->dir_output;
1405 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1413$title = $langs->trans(
"ExpenseReport").
" - ".$langs->trans(
"Card");
1414$help_url =
"EN:Module_Expense_Reports|FR:Module_Notes_de_frais";
1418$form =
new Form($db);
1421$projecttmp =
new Project($db);
1423$bankaccountstatic =
new Account($db);
1424$ecmfilesstatic =
new EcmFiles($db);
1428if ($action ==
'create') {
1431 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'" method="post" name="create">';
1432 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1433 print
'<input type="hidden" name="action" value="add">';
1434 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1438 print
'<table class="border centpercent">';
1443 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"DateStart").
'</td>';
1445 print $form->selectDate($date_start ? $date_start : -1,
'date_debut', 0, 0, 0,
'', 1, 1);
1451 print
'<td class="fieldrequired">'.$langs->trans(
"DateEnd").
'</td>';
1453 print $form->selectDate($date_end ? $date_end : -1,
'date_fin', 0, 0, 0,
'', 1, 1);
1459 print
'<td class="fieldrequired">'.$langs->trans(
"User").
'</td>';
1461 $defaultselectuser = $user->id;
1463 $defaultselectuser =
GETPOSTINT(
'fk_user_author');
1465 $include_users =
'hierarchyme';
1466 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expensereport',
'writeall_advance')) {
1467 $include_users = array();
1469 $s = $form->select_dolusers($defaultselectuser,
"fk_user_author", 0,
"", 0, $include_users,
'',
'0,'.$conf->entity);
1476 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1479 $include_users =
$object->fetch_users_approver_expensereport();
1480 if (empty($include_users)) {
1481 print
img_warning().
' '.$langs->trans(
"NobodyHasPermissionToValidateExpenseReport");
1483 $defaultselectuser = (empty($user->fk_user_expense_validator) ? $user->fk_user : $user->fk_user_expense_validator);
1488 $defaultselectuser =
GETPOSTINT(
'fk_user_validator');
1490 $s = $form->select_dolusers($defaultselectuser,
"fk_user_validator", 1,
"", ((empty($defaultselectuser) || !
getDolGlobalString(
'EXPENSEREPORT_DEFAULT_VALIDATOR_UNCHANGEABLE')) ? 0 : 1), $include_users);
1491 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1499 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1501 $form->select_types_paiements(
'',
'fk_c_paiement');
1507 $note_public = GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') :
'';
1510 print
'<td class="tdtop">'.$langs->trans(
'NotePublic').
'</td>';
1513 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1514 print $doleditor->Create(1);
1518 $note_private = GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') :
'';
1520 if (empty($user->socid)) {
1522 print
'<td class="tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
1525 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1526 print $doleditor->Create(1);
1531 $parameters = array(
'colspan' =>
' colspan="3"',
'cols' => 3);
1532 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters,
$object, $action);
1533 print $hookmanager->resPrint;
1534 if (empty($reshook)) {
1535 print
$object->showOptionals($extrafields,
'create', $parameters);
1543 print $form->buttonsSaveCancel(
"AddTrip");
1546} elseif ($id > 0 || $ref) {
1547 $result =
$object->fetch($id, $ref);
1550 if (!in_array(
$object->fk_user_author, $childids)) {
1551 if (!$user->hasRight(
'expensereport',
'readall') && !$user->hasRight(
'expensereport',
'lire_tous')
1552 && (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || !$user->hasRight(
'expensereport',
'writeall_advance'))) {
1555 print
'<div class="tabBar">';
1556 print $langs->trans(
'NotUserRightToView');
1569 if ($action ==
'edit' && (
$object->status < 3 ||
$object->status == 99)) {
1570 print
"<form name='update' action=\"".$_SERVER[
'PHP_SELF'].
"\" method=\"post\">\n";
1571 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1572 print
'<input type="hidden" name="id" value="'.$id.
'">';
1573 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1578 print
'<input type="hidden" name="action" value="updateFromRefuse">';
1580 print
'<input type="hidden" name="action" value="update">';
1583 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1585 print
'<table class="border centpercent">';
1588 print
'<td>'.$langs->trans(
"User").
'</td>';
1590 $userfee =
new User($db);
1591 if (
$object->fk_user_author > 0) {
1592 $userfee->fetch(
$object->fk_user_author);
1593 print $userfee->getNomUrl(-1);
1598 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Ref").
'</td><td>';
1599 print $form->showrefnav(
$object,
'ref', $linkback, 1,
'ref',
'ref',
'');
1603 print
'<td>'.$langs->trans(
"DateStart").
'</td>';
1605 print $form->selectDate(
$object->date_debut,
'date_debut');
1609 print
'<td>'.$langs->trans(
"DateEnd").
'</td>';
1611 print $form->selectDate(
$object->date_fin,
'date_fin');
1617 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1619 $form->select_types_paiements(
$object->fk_c_paiement,
'fk_c_paiement');
1626 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1628 $include_users =
$object->fetch_users_approver_expensereport();
1629 $s = $form->select_dolusers(
$object->fk_user_validator,
"fk_user_validator", 1,
"", 0, $include_users);
1630 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1635 print
'<td>'.$langs->trans(
"VALIDOR").
'</td>';
1637 $userfee =
new User($db);
1638 $userfee->fetch(
$object->fk_user_valid);
1639 print $userfee->getNomUrl(-1);
1645 print
'<td>'.$langs->trans(
"AUTHORPAIEMENT").
'</td>';
1647 $userfee =
new User($db);
1648 $userfee->fetch($user->id);
1649 print $userfee->getNomUrl(-1);
1661 print $form->buttonsSaveCancel(
"Modify");
1665 $taxlessUnitPriceDisabled =
getDolGlobalString(
'EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY') ?
' disabled' :
'';
1672 if ($action ==
'clone') {
1674 $criteriaforfilter =
'hierarchyme';
1675 if ($user->hasRight(
'expensereport',
'readall')) {
1676 $criteriaforfilter =
'';
1678 $formquestion = array(
1680 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'))
1683 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneExpenseReport',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1686 if ($action ==
'save') {
1687 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_validate",
"",
"", 1);
1690 if ($action ==
'save_from_refuse') {
1691 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_save_from_refuse",
"",
"", 1);
1694 if ($action ==
'delete') {
1695 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"DeleteTrip"), $langs->trans(
"ConfirmDeleteTrip"),
"confirm_delete",
"",
"", 1);
1698 if ($action ==
'validate') {
1699 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"ValideTrip"), $langs->trans(
"ConfirmValideTrip"),
"confirm_approve",
"",
"", 1);
1702 if ($action ==
'paid') {
1703 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"PaidTrip"), $langs->trans(
"ConfirmPaidTrip"),
"confirm_paid",
"",
"", 1);
1706 if ($action ==
'cancel') {
1707 $array_input = array(
'text' => $langs->trans(
"ConfirmCancelTrip"), 0 => array(
'type' =>
"text",
'label' =>
'<strong>'.$langs->trans(
"Comment").
'</strong>',
'name' =>
"detail_cancel",
'value' =>
""));
1708 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Cancel"),
"",
"confirm_cancel", $array_input,
"", 1);
1711 if ($action ==
'setdraft') {
1712 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"BrouillonnerTrip"), $langs->trans(
"ConfirmBrouillonnerTrip"),
"confirm_setdraft",
"",
"", 1);
1715 if ($action ==
'refuse') {
1716 $array_input = array(
'text' => $langs->trans(
"ConfirmRefuseTrip"), 0 => array(
'type' =>
"text",
'label' => $langs->trans(
"Comment"),
'name' =>
"detail_refuse",
'value' =>
""));
1717 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Deny"),
'',
"confirm_refuse", $array_input,
"yes", 1);
1720 if ($action ==
'delete_line') {
1721 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id.
"&rowid=".
GETPOSTINT(
'rowid'), $langs->trans(
"DeleteLine"), $langs->trans(
"ConfirmDeleteLine"),
"confirm_delete_line",
'',
'yes', 1);
1728 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1730 $morehtmlref =
'<div class="refidno">';
1731 $morehtmlref .=
'</div>';
1733 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
1735 print
'<div class="fichecenter">';
1736 print
'<div class="fichehalfleft">';
1737 print
'<div class="underbanner clearboth"></div>';
1739 print
'<table class="border tableforfield centpercent">';
1743 print
'<td class="titlefield">'.$langs->trans(
"User").
'</td>';
1745 if (
$object->fk_user_author > 0) {
1746 $userauthor =
new User($db);
1747 $result = $userauthor->fetch(
$object->fk_user_author);
1750 } elseif ($result > 0) {
1751 print $userauthor->getNomUrl(-1);
1758 print
'<td class="titlefield">'.$langs->trans(
"Period").
'</td>';
1765 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1766 print
'<td>'.$object->fk_c_paiement.
'</td>';
1772 print
'<td>'.$langs->trans(
"DATE_SAVE").
'</td>';
1773 print
'<td>'.dol_print_date(
$object->date_valid,
'dayhour',
'tzuser');
1775 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToApprove"));
1778 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToPay"));
1786 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1788 if (
$object->fk_user_validator > 0) {
1789 $userfee =
new User($db);
1790 $result = $userfee->fetch(
$object->fk_user_validator);
1792 print $userfee->getNomUrl(-1);
1794 if (empty($userfee->email) || !
isValidEmail($userfee->email)) {
1795 $langs->load(
"errors");
1796 print
img_warning($langs->trans(
"ErrorBadEMail", $userfee->email));
1802 print
'<td>'.$langs->trans(
"CANCEL_USER").
'</span></td>';
1804 if (
$object->fk_user_cancel > 0) {
1805 $userfee =
new User($db);
1806 $result = $userfee->fetch(
$object->fk_user_cancel);
1808 print $userfee->getNomUrl(-1);
1814 print
'<td>'.$langs->trans(
"MOTIF_CANCEL").
'</td>';
1815 print
'<td>'.$object->detail_cancel.
'</td></tr>';
1818 print
'<td>'.$langs->trans(
"DATE_CANCEL").
'</td>';
1819 print
'<td>'.dol_print_date(
$object->date_cancel,
'dayhour',
'tzuser').
'</td></tr>';
1823 print
'<td>'.$langs->trans(
"ApprovedBy").
'</td>';
1825 if (
$object->fk_user_approve > 0) {
1826 $userapp =
new User($db);
1827 $result = $userapp->fetch(
$object->fk_user_approve);
1829 print $userapp->getNomUrl(-1);
1835 print
'<td>'.$langs->trans(
"DateApprove").
'</td>';
1836 print
'<td>'.dol_print_date(
$object->date_approve,
'dayhour',
'tzuser').
'</td></tr>';
1842 print
'<td>'.$langs->trans(
"REFUSEUR").
'</td>';
1844 $userfee =
new User($db);
1845 $result = $userfee->fetch(
$object->fk_user_refuse);
1847 print $userfee->getNomUrl(-1);
1852 print
'<td>'.$langs->trans(
"DATE_REFUS").
'</td>';
1853 print
'<td>'.dol_print_date(
$object->date_refuse,
'dayhour',
'tzuser');
1855 print
' - '.$object->detail_refuse;
1861 if (
$object->status == $object::STATUS_CLOSED) {
1879 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1884 print
'<div class="fichehalfright">';
1885 print
'<div class="underbanner clearboth"></div>';
1887 print
'<table class="border tableforfield centpercent">';
1891 print
'<td class="titlefieldmiddle">'.$langs->trans(
"AmountHT").
'</td>';
1892 print
'<td class="nowrap amountcard">'.price(
$object->total_ht, 1,
'', 1, - 1, - 1, $conf->currency).
'</td>';
1909 print
'<td>'.$langs->trans(
"AmountVAT").
'</td>';
1910 print
'<td class="nowrap amountcard">'.price(
$object->total_tva, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1914 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
1915 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1916 print
'<td class="valuefield">'.price(
$object->total_localtax1, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1918 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
1919 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1920 print
'<td class="valuefield">'.price(
$object->total_localtax2, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1924 print
'<td>'.$langs->trans(
"AmountTTC").
'</td>';
1925 print
'<td class="nowrap amountcard">'.price(
$object->total_ttc, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1931 if (isModEnabled(
"bank")) {
1936 print
'<table class="noborder paymenttable centpercent">';
1938 print
'<tr class="liste_titre">';
1939 print
'<td class="liste_titre">'.$langs->trans(
'Payments').
'</td>';
1940 print
'<td class="liste_titre">'.$langs->trans(
'Date').
'</td>';
1941 print
'<td class="liste_titre">'.$langs->trans(
'Type').
'</td>';
1942 if (isModEnabled(
"bank")) {
1943 print
'<td class="liste_titre right">'.$langs->trans(
'BankAccount').
'</td>';
1945 print
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
1946 print
'<td class="liste_titre" width="18"> </td>';
1950 $sql =
"SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,";
1951 $sql .=
"c.code as payment_code, c.libelle as payment_type,";
1952 $sql .=
"ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal";
1953 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as e, ".MAIN_DB_PREFIX.
"payment_expensereport as p";
1954 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as c ON p.fk_typepayment = c.id";
1955 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
1956 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
1957 $sql .=
" WHERE e.rowid = ".((int) $id);
1958 $sql .=
" AND p.fk_expensereport = e.rowid";
1959 $sql .=
' AND e.entity IN ('.getEntity(
'expensereport').
')';
1960 $sql .=
" ORDER BY dp";
1962 $resql = $db->query($sql);
1964 $num = $db->num_rows($resql);
1968 $objp = $db->fetch_object($resql);
1970 $paymentexpensereportstatic->id = $objp->rowid;
1971 $paymentexpensereportstatic->datep = $db->jdate($objp->dp);
1972 $paymentexpensereportstatic->ref = $objp->rowid;
1973 $paymentexpensereportstatic->num_payment = $objp->num_payment;
1974 $paymentexpensereportstatic->type_code = $objp->payment_code;
1975 $paymentexpensereportstatic->type_label = $objp->payment_type;
1977 print
'<tr class="oddseven">';
1979 print $paymentexpensereportstatic->getNomUrl(1);
1981 print
'<td>'.dol_print_date($db->jdate($objp->dp),
'day').
"</td>\n";
1982 $labeltype = $langs->trans(
"PaymentType".$objp->payment_code) !=
"PaymentType".$objp->payment_code ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_type;
1983 print
"<td>".$labeltype.
' '.$objp->num_payment.
"</td>\n";
1985 if (isModEnabled(
"bank")) {
1986 $bankaccountstatic->id = $objp->baid;
1987 $bankaccountstatic->ref = $objp->baref;
1988 $bankaccountstatic->label = $objp->baref;
1989 $bankaccountstatic->number = $objp->banumber;
1991 if (isModEnabled(
'accounting')) {
1992 $bankaccountstatic->account_number = $objp->account_number;
1995 $accountingjournal->fetch($objp->fk_accountancy_journal);
1996 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1,
'', 1);
1999 print
'<td class="right">';
2000 if ($bankaccountstatic->id) {
2001 print $bankaccountstatic->getNomUrl(1,
'transactions');
2005 print
'<td class="right">'.price($objp->amount).
"</td>";
2008 $totalpaid += $objp->amount;
2011 if (!is_null($totalpaid)) {
2016 $resteapayeraffiche = $remaintopay;
2018 $cssforamountpaymentcomplete =
'amountpaymentcomplete';
2021 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2022 $resteapayeraffiche = 0;
2023 } elseif (
$object->paid == 0) {
2024 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2026 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AlreadyPaid").
':</td><td class="right">'.
price($totalpaid).
'</td><td></td></tr>';
2027 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AmountExpected").
':</td><td class="right">'.
price(
$object->total_ttc).
'</td><td></td></tr>';
2029 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"RemainderToPay").
':</td>';
2030 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td></td></tr>';
2041 print
'<div class="clearboth"></div><br><br>';
2043 print
'<div style="clear: both;"></div>';
2045 $actiontouse =
'updateline';
2046 if ((
$object->status == 0 ||
$object->status == 99) && $action !=
'editline') {
2047 $actiontouse =
'addline';
2050 print
'<form name="expensereport" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="post" >';
2051 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2052 print
'<input type="hidden" name="action" value="'.$actiontouse.
'">';
2053 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2054 print
'<input type="hidden" name="fk_expensereport" value="'.$object->id.
'" />';
2055 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2056 print
'<input type="hidden" name="page_y" value="">';
2058 print
'<div class="div-table-responsive-no-min">';
2059 print
'<table id="tablelines" class="noborder centpercent">';
2065 print
'<tr class="liste_titre headerexpensereportdet">';
2066 print
'<td class="center linecollinenb">'.$langs->trans(
'LineNb').
'</td>';
2068 print
'<td class="center linecoldate">'.$langs->trans(
'Date').
'</td>';
2069 if (isModEnabled(
'project')) {
2070 print
'<td class="minwidth100imp linecolproject">'.$langs->trans(
'Project').
'</td>';
2072 print
'<td class="center linecoltype">'.$langs->trans(
'Type').
'</td>';
2074 print
'<td class="center linecolcarcategory">'.$langs->trans(
'CarCategory').
'</td>';
2076 print
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
2077 print
'<td class="right linecolvat">'.$langs->trans(
'VAT').
'</td>';
2078 print
'<td class="right linecolpriceuht">'.$langs->trans(
'PriceUHT').
'</td>';
2079 print
'<td class="right linecolpriceuttc">'.$langs->trans(
'PriceUTTC').
'</td>';
2080 print
'<td class="right linecolqty">'.$langs->trans(
'Qty').
'</td>';
2081 if ($action !=
'editline') {
2082 print
'<td class="right linecolamountht">'.$langs->trans(
'AmountHT').
'</td>';
2083 print
'<td class="right linecolamountttc">'.$langs->trans(
'AmountTTC').
'</td>';
2094 if ((
$object->status < 2 ||
$object->status == 99) && $user->hasRight(
'expensereport',
'creer')) {
2095 print
'<td class="right"></td>';
2099 foreach (
$object->lines as &$line) {
2102 if ($action !=
'editline' || $line->id !=
GETPOSTINT(
'rowid')) {
2103 print
'<tr class="oddeven linetr" data-id="'.$line->id.
'">';
2106 print
'<td class="center linecollinenb">';
2111 print
'<td class="center linecoldate">'.dol_print_date($db->jdate($line->date),
'day').
'</td>';
2114 if (isModEnabled(
'project')) {
2115 print
'<td class="lineproject">';
2116 if ($line->fk_project > 0) {
2117 $projecttmp->id = $line->fk_project;
2118 $projecttmp->ref = $line->projet_ref;
2119 $projecttmp->title = $line->projet_title;
2120 print $projecttmp->getNomUrl(1);
2126 if (isModEnabled(
'accounting')) {
2127 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
2129 $resaccountingaccount = $accountingaccount->fetch(0, $line->type_fees_accountancy_code, 1);
2131 $titlealt .= $langs->trans(
"AccountancyCode").
': ';
2132 if ($resaccountingaccount > 0) {
2133 $titlealt .= $accountingaccount->account_number;
2135 $titlealt .= $langs->trans(
"NotFound");
2141 print
'<td class="center linecoltype" title="'.dol_escape_htmltag($titlealt).
'">';
2142 $labeltype = ($langs->trans(($line->type_fees_code)) == $line->type_fees_code ? $line->type_fees_libelle : $langs->trans($line->type_fees_code));
2148 print
'<td class="fk_c_exp_tax_cat linecoltaxcat">';
2149 $exp_tax_cat_label =
dol_getIdFromCode($db, $line->fk_c_exp_tax_cat,
'c_exp_tax_cat',
'rowid',
'label');
2150 print $langs->trans($exp_tax_cat_label);
2155 print
'<td class="left linecolcomment">'.dol_nl2br($line->comments).
'</td>';
2158 $senderissupplier = 0;
2159 $tooltiponprice =
'';
2160 $tooltiponpriceend =
'';
2162 $tooltiponprice = $langs->transcountry(
"TotalHT", $mysoc->country_code).
'='.
price($line->total_ht);
2163 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalVAT", ($senderissupplier ?
$object->thirdparty->country_code : $mysoc->country_code)).
'='.
price($line->total_tva);
2164 if (is_object(
$object->thirdparty)) {
2165 if ($senderissupplier) {
2166 $seller =
$object->thirdparty;
2173 if ($mysoc->useLocalTax(1)) {
2174 if (($seller->country_code == $buyer->country_code) || $line->total_localtax1 || $seller->useLocalTax(1)) {
2175 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT1", $seller->country_code).
'='.
price($line->total_localtax1);
2177 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT1", $seller->country_code).
'=<span class="opacitymedium">'.$langs->trans($senderissupplier ?
"NotUsedForThisVendor" :
"NotUsedForThisCustomer").
'</span>';
2180 if ($mysoc->useLocalTax(2)) {
2181 if ((isset($seller->country_code) && isset($buyer->thirdparty->country_code) && $seller->country_code == $buyer->thirdparty->country_code) || $line->total_localtax2 || $seller->useLocalTax(2)) {
2182 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT2", $seller->country_code).
'='.
price($line->total_localtax2);
2184 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT2", $seller->country_code).
'=<span class="opacitymedium">'.$langs->trans($senderissupplier ?
"NotUsedForThisVendor" :
"NotUsedForThisCustomer").
'</span>';
2188 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalTTC", $mysoc->country_code).
'='.
price($line->total_ttc);
2190 $tooltiponprice =
'<span class="classfortooltip" title="'.dol_escape_htmltag($tooltiponprice).
'">';
2191 $tooltiponpriceend =
'</span>';
2194 print
'<td class="right linecolvatrate">';
2195 print $tooltiponprice;
2196 print
vatrate($line->vatrate.($line->vat_src_code ?
' ('.$line->vat_src_code.
')' :
''), true);
2197 print $tooltiponpriceend;
2201 print
'<td class="right linecolunitht">';
2202 if (!empty($line->value_unit_ht)) {
2203 print
price($line->value_unit_ht);
2205 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $line->vatrate));
2206 $pricenettoshow =
price2num((
float) $line->value_unit / (1 + $tmpvat / 100),
'MU');
2207 print
price($pricenettoshow);
2211 print
'<td class="right linecolunitttc">'.price($line->value_unit).
'</td>';
2213 print
'<td class="right linecolqty">'.dol_escape_htmltag($line->qty).
'</td>';
2215 if ($action !=
'editline') {
2216 print
'<td class="right linecoltotalht">'.price($line->total_ht).
'</td>';
2217 print
'<td class="right linecoltotalttc">'.price($line->total_ttc).
'</td>';
2221 print
'<td class="center linecolpreview">';
2222 if ($line->fk_ecm_files > 0) {
2223 $modulepart =
'expensereport';
2224 $maxheightmini = 32;
2226 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2228 $relativepath = preg_replace(
'/expensereport\//',
'', $ecmfilesstatic->filepath);
2229 $fileinfo = pathinfo($ecmfilesstatic->filepath.
'/'.$ecmfilesstatic->filename);
2232 if (!
dol_is_file($conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$minifile)) {
2236 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity));
2237 if (empty($urlforhref)) {
2238 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
2239 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
2241 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2243 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="">';
2246 if (preg_match(
'/\.pdf$/i', $ecmfilesstatic->filename)) {
2247 $filepdf = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename;
2248 $fileimage = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2249 $relativepathimage = $relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2251 $pdfexists = file_exists($filepdf);
2254 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2256 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2265 if ($pdfexists && !$error) {
2266 $heightforphotref = 70;
2267 if (!empty($conf->dol_optimize_smallscreen)) {
2268 $heightforphotref = 60;
2270 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity));
2271 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2273 if (file_exists($fileimage)) {
2274 print
'<img height="'.$heightforphotref.
'" class="photo photowithmargin photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2277 print
img_mime($ecmfilesstatic->filename);
2287 print
'<td class="nowrap right linecolwarning">';
2288 print !empty($line->rule_warning_message) ?
img_warning(html_entity_decode($line->rule_warning_message)) :
' ';
2293 print
'<td class="nowrap right linecolaction">';
2295 print
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&rowid='.$line->rowid.
'">';
2297 print
'</a> ';
2298 print
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete_line&token='.
newToken().
'&rowid='.$line->rowid.
'">';
2308 if ($action ==
'editline' && $line->id ==
GETPOSTINT(
'rowid')) {
2311 if (isModEnabled(
'project')) {
2318 print
'<!-- line of expense report -->'.
"\n";
2319 print
'<tr class="tredited">';
2321 print
'<td class="center">';
2325 print
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
2326 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2327 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2330 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2331 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2335 print
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
2336 print
'<script type="text/javascript">'.
"\n";
2337 print
'$(document).ready(function() {
2338 $( ".auploadnewfilenow" ).click(function() {
2339 jQuery(".truploadnewfilenow").toggle();
2340 jQuery(".trattachnewfilenow").hide();
2343 $( ".aattachtodoc" ).click(function() {
2344 jQuery(".trattachnewfilenow").toggle();
2345 jQuery(".truploadnewfilenow").hide();
2348 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array'))) {
2349 print
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
2352 jQuery("form[name=\"expensereport\"]").submit(function() {
2353 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2354 jQuery("input[name=\"sendit\"]").val("");
2361 print
'</script>'.
"\n";
2364 $filenamelinked =
'';
2365 if ($line->fk_ecm_files > 0) {
2366 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2368 $filenamelinked = $ecmfilesstatic->filename;
2372 $tredited =
'tredited';
2373 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2374 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2376 print
'<tr class="oddeven tredited">';
2381 print
'<td class="center">';
2382 print $form->selectDate($line->date,
'date');
2386 if (isModEnabled(
'project')) {
2388 $formproject->select_projects(-1, $line->fk_project,
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2393 print
'<td class="center">';
2394 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees,
'fk_c_type_fees');
2398 print
'<td class="fk_c_exp_tax_cat">';
2399 $params = array(
'fk_expense' =>
$object->id,
'fk_expense_det' => $line->id,
'date' => $line->date);
2400 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);
2406 print
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
2410 $selectedvat =
price2num($line->vatrate).(!empty($line->vat_src_code) ?
' ('.$line->vat_src_code.
')' :
'');
2411 print
'<td class="right">';
2412 print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ?
GETPOST(
"vatrate") : $selectedvat), $mysoc,
'', 0, 0,
'', false, 1, 2);
2416 print
'<td class="right">';
2417 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.
' />';
2421 print
'<td class="right">';
2422 print
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
2426 print
'<td class="right">';
2427 print
'<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';
2434 print
'<td class="center">';
2438 print
'<td class="center">';
2442 print
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
2443 print $form->buttonsSaveCancel(
'Save',
'Cancel', array(), 0,
'small');
2459 if (isModEnabled(
'project')) {
2462 if ($action !=
'editline') {
2466 $nbFiles = $nbLinks = 0;
2467 $arrayoffiles = array();
2469 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2470 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2471 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2474 $nbFiles = count($arrayoffiles);
2479 print
'<tr class="liste_titre">';
2480 print
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
2481 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2482 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2485 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2486 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2490 print
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
2491 print
'<script type="text/javascript">'.
"\n";
2492 print
'$(document).ready(function() {
2493 $( ".auploadnewfilenow" ).click(function() {
2494 console.log("We click on toggle of auploadnewfilenow");
2495 jQuery(".truploadnewfilenow").toggle();
2496 jQuery(".trattachnewfilenow").hide();
2497 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2498 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2500 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2502 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2505 $( ".aattachtodoc" ).click(function() {
2506 console.log("We click on toggle of aattachtodoc");
2507 jQuery(".trattachnewfilenow").toggle();
2508 jQuery(".truploadnewfilenow").hide();
2509 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2512 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array')) && $action !=
'updateline') {
2513 print
'jQuery(".trattachnewfilenow").show();'.
"\n";
2516 jQuery("form[name=\"expensereport\"]").submit(function() {
2517 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2518 /* 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. */
2519 jQuery("input[name=\"sendit\"]").val("");
2520 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2522 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2529 print
'</script>'.
"\n";
2533 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2534 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2536 print
'<tr class="liste_titre expensereportcreate">';
2538 print
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
2539 if (isModEnabled(
'project')) {
2540 print
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
2542 print
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
2544 print
'<td>'.$langs->trans(
'CarCategory').
'</td>';
2546 print
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
2547 print
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
2548 print
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
2549 print
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
2550 print
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
2557 print
'<tr class="oddeven nohover">';
2563 print
'<td class="center inputdate">';
2564 print $form->selectDate(!empty($date) ? $date : -1,
'date', 0, 0, 0,
'', 1, 1);
2568 if (isModEnabled(
'project')) {
2569 print
'<td class="inputproject">';
2570 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0,
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2575 print
'<td class="center inputtype">';
2576 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees :
"",
'fk_c_type_fees', 1);
2580 print
'<td class="fk_c_exp_tax_cat">';
2581 $params = array(
'fk_expense' =>
$object->id);
2582 print $form->selectExpenseCategories(
'',
'fk_c_exp_tax_cat', 1, array(),
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2587 print
'<td class="inputcomment">';
2588 print
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments :
"", 0, 1).
'</textarea>';
2592 print
'<td class="right inputvat">';
2596 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS =
'none';
2598 print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), $mysoc,
'', 0, 0,
'', false, 1);
2602 print
'<td class="right inputpricenet">';
2603 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.
' />';
2607 print
'<td class="right inputtax">';
2608 print
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit : 0)).
'">';
2612 print
'<td class="right inputqty">';
2613 print
'<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">';
2619 if ($action !=
'editline') {
2620 print
'<td class="right"></td>';
2621 print
'<td class="right"></td>';
2625 print
'<td class="center inputbuttons">';
2626 print $form->buttonsSaveCancel(
"Add",
'',
'', 1,
'reposition');
2637 /* JQuery for product free or predefined select */
2638 jQuery(document).ready(function() {
2639 jQuery("#value_unit_ht").keyup(function(event) {
2640 console.log(event.which); // discard event tag and arrows
2641 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2642 jQuery("#value_unit").val("");
2645 jQuery("#value_unit").keyup(function(event) {
2646 console.log(event.which); // discard event tag and arrows
2647 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2648 jQuery("#value_unit_ht").val("");
2656 /* unit price coef calculation */
2657 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2658 console.log("We change a parameter");
2660 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2661 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2662 let tva = jQuery("#vatrate").find(":selected").val();
2663 let qty = jQuery(".input_qty").val();
2665 let path = "'.DOL_URL_ROOT.
'/expensereport/ajax/ajaxik.php";
2666 path += "?fk_c_exp_tax_cat="+tax_cat;
2667 path += "&fk_expense="+'.((int)
$object->id).
';
2668 path += "&vatrate="+tva;
2669 path += "&qty="+qty;
2671 if (type_fee == 4) { // frais_kilométriques
2672 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2680 success: function(response) {
2681 if (response.response_status == "success"){';
2685 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2686 jQuery("#value_unit").trigger("change");
2690 jQuery("#value_unit_ht").val(response.data);
2691 jQuery("#value_unit_ht").trigger("change");
2692 jQuery("#value_unit").val("");
2697 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ) {
2698 console.log("We get an error result");
2699 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2705 /*console.log(event.which); // discard event tag and arrows
2706 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2707 jQuery("#value_unit_ht").val("");
2727 print
'Record not found';
2738print
'<div class="tabsAction">';
2740if ($action !=
'create' && $action !=
'edit' && $action !=
'editline') {
2745 if (empty($user->socid)) {
2748 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>';
2760 if (in_array(
$object->fk_user_author, $childids) || $user->hasRight(
'expensereport',
'writeall_advance')) {
2762 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>';
2765 if (count(
$object->lines) > 0) {
2766 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>';
2777 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid) {
2779 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>';
2784 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>';
2789 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid) {
2791 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>';
2801 if (in_array(
$object->fk_user_author, $childids)) {
2803 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>';
2811 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>';
2813 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>';
2816 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid) {
2818 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.
$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2827 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>';
2833 if ($remaintopay == 0) {
2834 print
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
2836 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>';
2844 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>";
2850 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>';
2856 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>';
2861 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>';
2865 if ($user->hasRight(
'expensereport',
'creer')) {
2866 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>';
2872 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>';
2875 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>';
2878 $parameters = array();
2879 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
2886if (
GETPOST(
'modelselected',
'alpha')) {
2887 $action =
'presend';
2890if ($action !=
'presend') {
2895 print
'<div class="fichecenter"><div class="fichehalfleft">';
2896 print
'<a name="builddoc"></a>';
2898 if ($user->hasRight(
'expensereport',
'creer') && $action !=
'create' && $action !=
'edit') {
2901 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
2902 $genallowed = $user->hasRight(
'expensereport',
'creer');
2903 $delallowed = $user->hasRight(
'expensereport',
'creer');
2905 print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2906 $somethingshown = $formfile->numoffiles;
2918 print
'</div><div class="fichehalfright">';
2920 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2922 $somethingshown = $formactions->showactions(
$object,
'expensereport',
null);
2924 print
'</div></div>';
2928$modelmail =
'expensereport';
2929$defaulttopic =
'SendExpenseReportRef';
2930$diroutput = $conf->expensereport->dir_output;
2931$trackid =
'exp'.$object->id;
2933include 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...
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_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
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.