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 (!empty($mailfile->error) || !empty($mailfile->errors)) {
470 if (!empty($mailfile->error)) {
471 $mesg .=
'<br>' . $mailfile->error;
473 if (!empty($mailfile->errors) && is_array($mailfile->errors)) {
474 $mesg .=
'<br>' . implode(
'<br>', $mailfile->errors);
478 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
486 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
493 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
500 if ($action ==
"confirm_save_from_refuse" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
503 $result =
$object->set_save_from_refuse($user);
508 $outputlangs = $langs;
511 $newlang =
GETPOST(
'lang_id',
'aZ09');
514 $newlang =
$object->thirdparty->default_lang;
516 if (!empty($newlang)) {
518 $outputlangs->setDefaultLang($newlang);
523 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
531 $destinataire =
new User($db);
532 $destinataire->fetch(
$object->fk_user_validator);
533 $emailTo = $destinataire->email;
536 $expediteur =
new User($db);
537 $expediteur->fetch(
$object->fk_user_author);
540 if ($emailFrom && $emailTo) {
551 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForReApproval");
554 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
555 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
575 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
579 $result = $mailfile->sendfile();
581 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
583 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
586 $langs->load(
"other");
587 if ($mailfile->error) {
589 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
590 $mesg .=
'<br>'.$mailfile->error;
593 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
601 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
610 if ($action ==
"confirm_approve" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'approve')) {
614 $result =
$object->setApproved($user);
619 $outputlangs = $langs;
622 $newlang =
GETPOST(
'lang_id',
'aZ09');
625 $newlang =
$object->thirdparty->default_lang;
627 if (!empty($newlang)) {
629 $outputlangs->setDefaultLang($newlang);
634 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
642 $destinataire =
new User($db);
643 $destinataire->fetch(
$object->fk_user_author);
644 $emailTo = $destinataire->email;
648 if (empty($emailTo)) {
653 $expediteur =
new User($db);
654 $expediteur->fetch(
$object->fk_user_approve > 0 ?
$object->fk_user_approve :
$object->fk_user_validator);
657 if ($emailFrom && $emailTo) {
668 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportApproved");
671 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
672 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
673 $message = $langs->transnoentities(
"ExpenseReportApprovedMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
690 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, $emailCC,
'', 0, -1);
694 $result = $mailfile->sendfile();
696 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
698 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
701 $langs->load(
"other");
702 if ($mailfile->error) {
704 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
705 $mesg .=
'<br>'.$mailfile->error;
708 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
716 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
725 if ($action ==
"confirm_refuse" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'approve')) {
729 $detailRefuse =
GETPOST(
'detail_refuse',
'alpha');
730 $result =
$object->setDeny($user, $detailRefuse);
735 $outputlangs = $langs;
738 $newlang =
GETPOST(
'lang_id',
'aZ09');
741 $newlang =
$object->thirdparty->default_lang;
743 if (!empty($newlang)) {
745 $outputlangs->setDefaultLang($newlang);
750 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
758 $destinataire =
new User($db);
759 $destinataire->fetch(
$object->fk_user_author);
760 $emailTo = $destinataire->email;
763 $expediteur =
new User($db);
764 $expediteur->fetch(
$object->fk_user_refuse);
767 if ($emailFrom && $emailTo) {
778 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportRefused");
781 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
782 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
783 $message = $langs->transnoentities(
"ExpenseReportRefusedMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailRefuse, $link);
801 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
805 $result = $mailfile->sendfile();
807 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
809 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
812 $langs->load(
"other");
813 if ($mailfile->error) {
815 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
816 $mesg .=
'<br>'.$mailfile->error;
819 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
827 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
837 if ($action ==
"confirm_cancel" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
838 if (!
GETPOST(
'detail_cancel',
'alpha')) {
839 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Comment")),
null,
'errors');
844 if ($user->id ==
$object->fk_user_valid || $user->id ==
$object->fk_user_author) {
845 $detailCancel =
GETPOST(
'detail_cancel',
'alpha');
846 $result =
$object->set_cancel($user, $detailCancel);
851 $outputlangs = $langs;
854 $newlang =
GETPOST(
'lang_id',
'aZ09');
857 $newlang =
$object->thirdparty->default_lang;
859 if (!empty($newlang)) {
861 $outputlangs->setDefaultLang($newlang);
866 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
874 $destinataire =
new User($db);
875 $destinataire->fetch(
$object->fk_user_author);
876 $emailTo = $destinataire->email;
879 $expediteur =
new User($db);
880 $expediteur->fetch(
$object->fk_user_cancel);
883 if ($emailFrom && $emailTo) {
894 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportCanceled");
897 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
898 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
899 $message = $langs->transnoentities(
"ExpenseReportCanceledMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailCancel, $link);
917 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
921 $result = $mailfile->sendfile();
923 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
925 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
928 $langs->load(
"other");
929 if ($mailfile->error) {
931 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
932 $mesg .=
'<br>'.$mailfile->error;
935 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
943 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
956 if ($action ==
"confirm_setdraft" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
959 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid || in_array(
$object->fk_user_author, $childids)) {
960 $result =
$object->setStatut(0);
965 $outputlangs = $langs;
968 $newlang =
GETPOST(
'lang_id',
'aZ09');
971 $newlang =
$object->thirdparty->default_lang;
973 if (!empty($newlang)) {
975 $outputlangs->setDefaultLang($newlang);
980 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
985 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
995 if ($action ==
'set_unpaid' && $id > 0 && $user->hasRight(
'expensereport',
'to_paid')) {
999 $result =
$object->setUnpaid($user);
1004 $outputlangs = $langs;
1007 $newlang =
GETPOST(
'lang_id',
'aZ09');
1010 $newlang =
$object->thirdparty->default_lang;
1012 if (!empty($newlang)) {
1013 $outputlangs =
new Translate(
"", $conf);
1014 $outputlangs->setDefaultLang($newlang);
1019 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1024 if ($action ==
'set_paid' && $id > 0 && $user->hasRight(
'expensereport',
'to_paid')) {
1028 $result =
$object->setPaid($id, $user);
1033 $outputlangs = $langs;
1036 $newlang =
GETPOST(
'lang_id',
'aZ09');
1039 $newlang =
$object->thirdparty->default_lang;
1041 if (!empty($newlang)) {
1042 $outputlangs =
new Translate(
"", $conf);
1043 $outputlangs->setDefaultLang($newlang);
1048 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1056 $destinataire =
new User($db);
1057 $destinataire->fetch(
$object->fk_user_author);
1058 $emailTo = $destinataire->email;
1061 $expediteur =
new User($db);
1062 $expediteur->fetch($user->id);
1065 if ($emailFrom && $emailTo) {
1066 $filename = array();
1068 $mimetype = array();
1076 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportPaid");
1079 $link = $urlwithroot.
'/expensereport/card.php?id='.
$object->id;
1080 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
1081 $message = $langs->transnoentities(
"ExpenseReportPaidMessage",
$object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
1084 $object->setDocModel($user,
"");
1085 $resultPDF = expensereport_pdf_create($db,
$object,
'',
"", $langs);
1088 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
1092 $result = $mailfile->sendfile();
1094 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
1096 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
1099 $langs->load(
"other");
1100 if ($mailfile->error) {
1102 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
1103 $mesg .=
'<br>'.$mailfile->error;
1106 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
1114 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
1123 if ($action ==
"addline" && $user->hasRight(
'expensereport',
'creer')) {
1128 if (GETPOSTISSET(
'attachfile')) {
1129 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1130 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1131 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1132 $entityprefix = ($conf->entity !=
'1') ? $conf->entity.
'/' :
'';
1133 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1135 $ecmfiles->fetch(0,
'', $relativepath);
1136 $fk_ecm_files = $ecmfiles->id;
1141 if (empty($vatrate)) {
1144 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1148 if (empty($value_unit)) {
1149 $value_unit =
price2num((
float) $value_unit_ht + ((
float) $value_unit_ht * (
float) $tmpvat / 100),
'MU');
1152 $fk_c_exp_tax_cat =
GETPOSTINT(
'fk_c_exp_tax_cat');
1159 if (!($fk_c_type_fees > 0)) {
1161 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1165 if ((
float) $tmpvat < 0 || $tmpvat ===
'') {
1167 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"VAT")),
null,
'errors');
1172 if (empty($date) || $date ==
"--") {
1174 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
1175 } elseif ($date < $object->date_debut || $date > (
$object->date_fin + (24 * 3600 - 1))) {
1181 $langs->load(
"errors");
1182 $type = $error > 0 ?
'errors' :
'warnings';
1183 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null, $type);
1187 if ($value_unit == 0) {
1189 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PriceUTTC")),
null,
'errors');
1193 if ($projectRequired && $fk_project <= 0) {
1195 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1199 if ($fileRequired && $fk_ecm_files == 0) {
1201 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"File")),
null,
'errors');
1208 $result =
$object->addline($qty, $value_unit, $fk_c_type_fees, $vatrate, $date, $comments, $fk_project, $fk_c_exp_tax_cat, $type, $fk_ecm_files);
1214 $outputlangs = $langs;
1215 $newlang =
GETPOST(
'lang_id',
'alpha');
1217 $user =
new User($db);
1218 $user->fetch(
$object->fk_user_author);
1219 $newlang = $user->lang;
1221 if (!empty($newlang)) {
1222 $outputlangs =
new Translate(
"", $conf);
1223 $outputlangs->setDefaultLang($newlang);
1226 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1230 unset($value_unit_ht);
1234 unset($fk_c_type_fees);
1245 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOSTINT(
'id'));
1252 if ($action ==
'confirm_delete_line' &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $user->hasRight(
'expensereport',
'creer')) {
1258 $total_ht = $object_ligne->total_ht;
1259 $total_tva = $object_ligne->total_tva;
1266 $outputlangs = $langs;
1269 $newlang =
GETPOST(
'lang_id',
'aZ09');
1272 $newlang =
$object->thirdparty->default_lang;
1274 if (!empty($newlang)) {
1275 $outputlangs =
new Translate(
"", $conf);
1276 $outputlangs->setDefaultLang($newlang);
1281 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1285 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOSTINT(
'id'));
1292 if ($action ==
"updateline" && $user->hasRight(
'expensereport',
'creer')) {
1298 if (GETPOSTISSET(
'attachfile')) {
1299 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1300 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1301 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1302 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1304 $ecmfiles->fetch(0,
'', $relativepath);
1305 $fk_ecm_files = $ecmfiles->id;
1310 $type_fees_id =
GETPOSTINT(
'fk_c_type_fees');
1311 $fk_c_exp_tax_cat =
GETPOSTINT(
'fk_c_exp_tax_cat');
1312 $projet_id = $fk_project;
1313 $comments =
GETPOST(
'comments',
'restricthtml');
1315 $vatrate =
GETPOST(
'vatrate',
'alpha');
1318 if (empty($vatrate)) {
1321 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1325 if (empty($value_unit)) {
1326 $value_unit =
price2num((
float) $value_unit_ht + ((
float) $value_unit_ht * (
float) $tmpvat / 100),
'MU');
1331 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1334 if ((
float) $tmpvat < 0 || $tmpvat ==
'') {
1336 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Vat")),
null,
'errors');
1340 if ($date < $object->date_debut || $date > (
$object->date_fin + (24 * 3600 - 1))) {
1345 $langs->load(
"errors");
1346 $type = $error > 0 ?
'errors' :
'warnings';
1347 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null, $type);
1351 if ($projectRequired && $projet_id <= 0) {
1353 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1358 $result =
$object->updateline($rowid, $type_fees_id, $projet_id, $vatrate, $comments, $qty, $value_unit, $date, $id, $fk_c_exp_tax_cat, $fk_ecm_files);
1363 $outputlangs = $langs;
1366 $newlang =
GETPOST(
'lang_id',
'aZ09');
1369 $newlang =
$object->thirdparty->default_lang;
1371 if (!empty($newlang)) {
1372 $outputlangs =
new Translate(
"", $conf);
1373 $outputlangs->setDefaultLang($newlang);
1378 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1382 unset($value_unit_ht);
1386 unset($fk_c_type_fees);
1400 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1403 $triggersendname =
'EXPENSEREPORT_SENTBYMAIL';
1404 $autocopy =
'MAIN_MAIL_AUTOCOPY_EXPENSEREPORT_TO';
1405 $trackid =
'exp'.$object->id;
1406 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1409 $upload_dir = $conf->expensereport->dir_output;
1410 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1418$title = $langs->trans(
"ExpenseReport").
" - ".$langs->trans(
"Card");
1419$help_url =
"EN:Module_Expense_Reports|FR:Module_Notes_de_frais";
1423$form =
new Form($db);
1426$projecttmp =
new Project($db);
1428$bankaccountstatic =
new Account($db);
1429$ecmfilesstatic =
new EcmFiles($db);
1433if ($action ==
'create') {
1436 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'" method="post" name="create">';
1437 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1438 print
'<input type="hidden" name="action" value="add">';
1439 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1443 print
'<table class="border centpercent">';
1448 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"DateStart").
'</td>';
1450 print $form->selectDate($date_start ? $date_start : -1,
'date_debut', 0, 0, 0,
'', 1, 1);
1456 print
'<td class="fieldrequired">'.$langs->trans(
"DateEnd").
'</td>';
1458 print $form->selectDate($date_end ? $date_end : -1,
'date_fin', 0, 0, 0,
'', 1, 1);
1464 print
'<td class="fieldrequired">'.$langs->trans(
"User").
'</td>';
1466 $defaultselectuser = $user->id;
1468 $defaultselectuser =
GETPOSTINT(
'fk_user_author');
1470 $include_users =
'hierarchyme';
1471 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expensereport',
'writeall_advance')) {
1472 $include_users = array();
1474 $s = $form->select_dolusers($defaultselectuser,
"fk_user_author", 0,
"", 0, $include_users,
'',
'0,'.$conf->entity);
1481 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1484 $include_users =
$object->fetch_users_approver_expensereport();
1485 if (empty($include_users)) {
1486 print
img_warning().
' '.$langs->trans(
"NobodyHasPermissionToValidateExpenseReport");
1488 $defaultselectuser = (empty($user->fk_user_expense_validator) ? $user->fk_user : $user->fk_user_expense_validator);
1493 $defaultselectuser =
GETPOSTINT(
'fk_user_validator');
1495 $s = $form->select_dolusers($defaultselectuser,
"fk_user_validator", 1,
"", ((empty($defaultselectuser) || !
getDolGlobalString(
'EXPENSEREPORT_DEFAULT_VALIDATOR_UNCHANGEABLE')) ? 0 : 1), $include_users);
1496 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1504 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1506 $form->select_types_paiements(
'',
'fk_c_paiement');
1512 $note_public = GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') :
'';
1515 print
'<td class="tdtop">'.$langs->trans(
'NotePublic').
'</td>';
1518 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1519 print $doleditor->Create(1);
1523 $note_private = GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') :
'';
1525 if (empty($user->socid)) {
1527 print
'<td class="tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
1530 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1531 print $doleditor->Create(1);
1536 $parameters = array(
'colspan' =>
' colspan="3"',
'cols' => 3);
1537 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters,
$object, $action);
1538 print $hookmanager->resPrint;
1539 if (empty($reshook)) {
1540 print
$object->showOptionals($extrafields,
'create', $parameters);
1548 print $form->buttonsSaveCancel(
"AddTrip");
1551} elseif ($id > 0 || $ref) {
1552 $result =
$object->fetch($id, $ref);
1555 if (!in_array(
$object->fk_user_author, $childids)) {
1556 if (!$user->hasRight(
'expensereport',
'readall') && !$user->hasRight(
'expensereport',
'lire_tous')
1557 && (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || !$user->hasRight(
'expensereport',
'writeall_advance'))) {
1560 print
'<div class="tabBar">';
1561 print $langs->trans(
'NotUserRightToView');
1575 print
"<form name='update' action=\"".$_SERVER[
'PHP_SELF'].
"\" method=\"post\">\n";
1576 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1577 print
'<input type="hidden" name="id" value="'.$id.
'">';
1578 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1583 print
'<input type="hidden" name="action" value="updateFromRefuse">';
1585 print
'<input type="hidden" name="action" value="update">';
1588 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1590 print
'<table class="border centpercent">';
1593 print
'<td>'.$langs->trans(
"User").
'</td>';
1595 $userfee =
new User($db);
1596 if (
$object->fk_user_author > 0) {
1597 $userfee->fetch(
$object->fk_user_author);
1598 print $userfee->getNomUrl(-1);
1603 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Ref").
'</td><td>';
1604 print $form->showrefnav(
$object,
'ref', $linkback, 1,
'ref',
'ref',
'');
1608 print
'<td>'.$langs->trans(
"DateStart").
'</td>';
1610 print $form->selectDate(
$object->date_debut,
'date_debut');
1614 print
'<td>'.$langs->trans(
"DateEnd").
'</td>';
1616 print $form->selectDate(
$object->date_fin,
'date_fin');
1622 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1624 $form->select_types_paiements(
$object->fk_c_paiement,
'fk_c_paiement');
1631 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1633 $include_users =
$object->fetch_users_approver_expensereport();
1634 $s = $form->select_dolusers(
$object->fk_user_validator,
"fk_user_validator", 1,
"", 0, $include_users);
1635 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1640 print
'<td>'.$langs->trans(
"VALIDOR").
'</td>';
1642 $userfee =
new User($db);
1643 $userfee->fetch(
$object->fk_user_valid);
1644 print $userfee->getNomUrl(-1);
1650 print
'<td>'.$langs->trans(
"AUTHORPAIEMENT").
'</td>';
1652 $userfee =
new User($db);
1653 $userfee->fetch($user->id);
1654 print $userfee->getNomUrl(-1);
1666 print $form->buttonsSaveCancel(
"Modify");
1670 $taxlessUnitPriceDisabled =
getDolGlobalString(
'EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY') ?
' disabled' :
'';
1677 if ($action ==
'clone') {
1679 $criteriaforfilter =
'hierarchyme';
1680 if ($user->hasRight(
'expensereport',
'readall')) {
1681 $criteriaforfilter =
'';
1683 $formquestion = array(
1685 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'))
1688 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneExpenseReport',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1691 if ($action ==
'save') {
1692 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_validate",
"",
"", 1);
1695 if ($action ==
'save_from_refuse') {
1696 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_save_from_refuse",
"",
"", 1);
1699 if ($action ==
'delete') {
1700 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"DeleteTrip"), $langs->trans(
"ConfirmDeleteTrip"),
"confirm_delete",
"",
"", 1);
1703 if ($action ==
'validate') {
1704 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"ValideTrip"), $langs->trans(
"ConfirmValideTrip"),
"confirm_approve",
"",
"", 1);
1707 if ($action ==
'paid') {
1708 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"PaidTrip"), $langs->trans(
"ConfirmPaidTrip"),
"confirm_paid",
"",
"", 1);
1711 if ($action ==
'cancel') {
1712 $array_input = array(
'text' => $langs->trans(
"ConfirmCancelTrip"), 0 => array(
'type' =>
"text",
'label' =>
'<strong>'.$langs->trans(
"Comment").
'</strong>',
'name' =>
"detail_cancel",
'value' =>
""));
1713 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Cancel"),
"",
"confirm_cancel", $array_input,
"", 1);
1716 if ($action ==
'setdraft') {
1717 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"BrouillonnerTrip"), $langs->trans(
"ConfirmBrouillonnerTrip"),
"confirm_setdraft",
"",
"", 1);
1720 if ($action ==
'refuse') {
1721 $array_input = array(
'text' => $langs->trans(
"ConfirmRefuseTrip"), 0 => array(
'type' =>
"text",
'label' => $langs->trans(
"Comment"),
'name' =>
"detail_refuse",
'value' =>
""));
1722 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Deny"),
'',
"confirm_refuse", $array_input,
"yes", 1);
1725 if ($action ==
'delete_line') {
1726 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id.
"&rowid=".
GETPOSTINT(
'rowid'), $langs->trans(
"DeleteLine"), $langs->trans(
"ConfirmDeleteLine"),
"confirm_delete_line",
'',
'yes', 1);
1733 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1735 $morehtmlref =
'<div class="refidno">';
1736 $morehtmlref .=
'</div>';
1738 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
1740 print
'<div class="fichecenter">';
1741 print
'<div class="fichehalfleft">';
1742 print
'<div class="underbanner clearboth"></div>';
1744 print
'<table class="border tableforfield centpercent">';
1748 print
'<td class="titlefield">'.$langs->trans(
"User").
'</td>';
1750 if (
$object->fk_user_author > 0) {
1751 $userauthor =
new User($db);
1752 $result = $userauthor->fetch(
$object->fk_user_author);
1755 } elseif ($result > 0) {
1756 print $userauthor->getNomUrl(-1);
1763 print
'<td class="titlefield">'.$langs->trans(
"Period").
'</td>';
1770 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1771 print
'<td>'.$object->fk_c_paiement.
'</td>';
1777 print
'<td>'.$langs->trans(
"DATE_SAVE").
'</td>';
1778 print
'<td>'.dol_print_date(
$object->date_valid,
'dayhour',
'tzuser');
1780 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToApprove"));
1783 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToPay"));
1791 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1793 if (
$object->fk_user_validator > 0) {
1794 $userfee =
new User($db);
1795 $result = $userfee->fetch(
$object->fk_user_validator);
1797 print $userfee->getNomUrl(-1);
1799 if (empty($userfee->email) || !
isValidEmail($userfee->email)) {
1800 $langs->load(
"errors");
1801 print
img_warning($langs->trans(
"ErrorBadEMail", $userfee->email));
1807 print
'<td>'.$langs->trans(
"CANCEL_USER").
'</span></td>';
1809 if (
$object->fk_user_cancel > 0) {
1810 $userfee =
new User($db);
1811 $result = $userfee->fetch(
$object->fk_user_cancel);
1813 print $userfee->getNomUrl(-1);
1819 print
'<td>'.$langs->trans(
"MOTIF_CANCEL").
'</td>';
1820 print
'<td>'.$object->detail_cancel.
'</td></tr>';
1823 print
'<td>'.$langs->trans(
"DATE_CANCEL").
'</td>';
1824 print
'<td>'.dol_print_date(
$object->date_cancel,
'dayhour',
'tzuser').
'</td></tr>';
1828 print
'<td>'.$langs->trans(
"ApprovedBy").
'</td>';
1830 if (
$object->fk_user_approve > 0) {
1831 $userapp =
new User($db);
1832 $result = $userapp->fetch(
$object->fk_user_approve);
1834 print $userapp->getNomUrl(-1);
1840 print
'<td>'.$langs->trans(
"DateApprove").
'</td>';
1841 print
'<td>'.dol_print_date(
$object->date_approve,
'dayhour',
'tzuser').
'</td></tr>';
1847 print
'<td>'.$langs->trans(
"REFUSEUR").
'</td>';
1849 $userfee =
new User($db);
1850 $result = $userfee->fetch(
$object->fk_user_refuse);
1852 print $userfee->getNomUrl(-1);
1857 print
'<td>'.$langs->trans(
"DATE_REFUS").
'</td>';
1858 print
'<td>'.dol_print_date(
$object->date_refuse,
'dayhour',
'tzuser');
1860 print
' - '.$object->detail_refuse;
1884 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1889 print
'<div class="fichehalfright">';
1890 print
'<div class="underbanner clearboth"></div>';
1892 print
'<table class="border tableforfield centpercent">';
1896 print
'<td class="titlefieldmiddle">'.$langs->trans(
"AmountHT").
'</td>';
1897 print
'<td class="nowrap amountcard">'.price(
$object->total_ht, 1,
'', 1, - 1, - 1, $conf->currency).
'</td>';
1914 print
'<td>'.$langs->trans(
"AmountVAT").
'</td>';
1915 print
'<td class="nowrap amountcard">'.price(
$object->total_tva, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1919 if ($mysoc->localtax1_assuj ==
"1" ||
$object->total_localtax1 != 0) {
1920 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1921 print
'<td class="valuefield">'.price(
$object->total_localtax1, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1923 if ($mysoc->localtax2_assuj ==
"1" ||
$object->total_localtax2 != 0) {
1924 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1925 print
'<td class="valuefield">'.price(
$object->total_localtax2, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1929 print
'<td>'.$langs->trans(
"AmountTTC").
'</td>';
1930 print
'<td class="nowrap amountcard">'.price(
$object->total_ttc, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1936 if (isModEnabled(
"bank")) {
1941 print
'<table class="noborder paymenttable centpercent">';
1943 print
'<tr class="liste_titre">';
1944 print
'<td class="liste_titre">'.$langs->trans(
'Payments').
'</td>';
1945 print
'<td class="liste_titre">'.$langs->trans(
'Date').
'</td>';
1946 print
'<td class="liste_titre">'.$langs->trans(
'Type').
'</td>';
1947 if (isModEnabled(
"bank")) {
1948 print
'<td class="liste_titre right">'.$langs->trans(
'BankAccount').
'</td>';
1950 print
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
1951 print
'<td class="liste_titre" width="18"> </td>';
1955 $sql =
"SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,";
1956 $sql .=
"c.code as payment_code, c.libelle as payment_type,";
1957 $sql .=
"ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal";
1958 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as e, ".MAIN_DB_PREFIX.
"payment_expensereport as p";
1959 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as c ON p.fk_typepayment = c.id";
1960 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
1961 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
1962 $sql .=
" WHERE e.rowid = ".((int) $id);
1963 $sql .=
" AND p.fk_expensereport = e.rowid";
1964 $sql .=
' AND e.entity IN ('.getEntity(
'expensereport').
')';
1965 $sql .=
" ORDER BY dp";
1967 $resql = $db->query($sql);
1969 $num = $db->num_rows($resql);
1973 $objp = $db->fetch_object($resql);
1975 $paymentexpensereportstatic->id = $objp->rowid;
1976 $paymentexpensereportstatic->datep = $db->jdate($objp->dp);
1977 $paymentexpensereportstatic->ref = $objp->rowid;
1978 $paymentexpensereportstatic->num_payment = $objp->num_payment;
1979 $paymentexpensereportstatic->type_code = $objp->payment_code;
1980 $paymentexpensereportstatic->type_label = $objp->payment_type;
1982 print
'<tr class="oddseven">';
1984 print $paymentexpensereportstatic->getNomUrl(1);
1986 print
'<td>'.dol_print_date($db->jdate($objp->dp),
'day').
"</td>\n";
1987 $labeltype = $langs->trans(
"PaymentType".$objp->payment_code) !=
"PaymentType".$objp->payment_code ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_type;
1988 print
"<td>".$labeltype.
' '.$objp->num_payment.
"</td>\n";
1990 if (isModEnabled(
"bank")) {
1991 $bankaccountstatic->id = $objp->baid;
1992 $bankaccountstatic->ref = $objp->baref;
1993 $bankaccountstatic->label = $objp->baref;
1994 $bankaccountstatic->number = $objp->banumber;
1996 if (isModEnabled(
'accounting')) {
1997 $bankaccountstatic->account_number = $objp->account_number;
2000 $accountingjournal->fetch($objp->fk_accountancy_journal);
2001 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1,
'', 1);
2004 print
'<td class="right">';
2005 if ($bankaccountstatic->id) {
2006 print $bankaccountstatic->getNomUrl(1,
'transactions');
2010 print
'<td class="right">'.price($objp->amount).
"</td>";
2013 $totalpaid += $objp->amount;
2016 if (!is_null($totalpaid)) {
2021 $resteapayeraffiche = $remaintopay;
2023 $cssforamountpaymentcomplete =
'amountpaymentcomplete';
2026 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2027 $resteapayeraffiche = 0;
2028 } elseif (
$object->paid == 0) {
2029 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2031 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AlreadyPaid").
':</td><td class="right">'.
price($totalpaid).
'</td><td></td></tr>';
2032 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AmountExpected").
':</td><td class="right">'.
price(
$object->total_ttc).
'</td><td></td></tr>';
2034 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"RemainderToPay").
':</td>';
2035 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td></td></tr>';
2046 print
'<div class="clearboth"></div><br><br>';
2048 print
'<div style="clear: both;"></div>';
2050 $actiontouse =
'updateline';
2051 if ((
$object->status == 0 ||
$object->status == 99) && $action !=
'editline') {
2052 $actiontouse =
'addline';
2055 print
'<form name="expensereport" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="post" >';
2056 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2057 print
'<input type="hidden" name="action" value="'.$actiontouse.
'">';
2058 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2059 print
'<input type="hidden" name="fk_expensereport" value="'.$object->id.
'" />';
2060 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2061 print
'<input type="hidden" name="page_y" value="">';
2063 print
'<div class="div-table-responsive-no-min">';
2064 print
'<table id="tablelines" class="noborder centpercent">';
2070 print
'<tr class="liste_titre headerexpensereportdet">';
2071 print
'<td class="center linecollinenb">'.$langs->trans(
'LineNb').
'</td>';
2073 print
'<td class="center linecoldate">'.$langs->trans(
'Date').
'</td>';
2074 if (isModEnabled(
'project')) {
2075 print
'<td class="minwidth100imp linecolproject">'.$langs->trans(
'Project').
'</td>';
2077 print
'<td class="center linecoltype">'.$langs->trans(
'Type').
'</td>';
2079 print
'<td class="center linecolcarcategory">'.$langs->trans(
'CarCategory').
'</td>';
2081 print
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
2082 print
'<td class="right linecolvat">'.$langs->trans(
'VAT').
'</td>';
2083 print
'<td class="right linecolpriceuht">'.$langs->trans(
'PriceUHT').
'</td>';
2084 print
'<td class="right linecolpriceuttc">'.$langs->trans(
'PriceUTTC').
'</td>';
2085 print
'<td class="right linecolqty">'.$langs->trans(
'Qty').
'</td>';
2086 if ($action !=
'editline') {
2087 print
'<td class="right linecolamountht">'.$langs->trans(
'AmountHT').
'</td>';
2088 print
'<td class="right linecolamountttc">'.$langs->trans(
'AmountTTC').
'</td>';
2099 if ((
$object->status < 2 ||
$object->status == 99) && $user->hasRight(
'expensereport',
'creer')) {
2100 print
'<td class="right"></td>';
2104 foreach (
$object->lines as &$line) {
2107 if ($action !=
'editline' || $line->id !=
GETPOSTINT(
'rowid')) {
2108 print
'<tr class="oddeven linetr" data-id="'.$line->id.
'">';
2111 print
'<td class="center linecollinenb">';
2116 print
'<td class="center linecoldate">'.dol_print_date($db->jdate($line->date),
'day').
'</td>';
2119 if (isModEnabled(
'project')) {
2120 print
'<td class="lineproject">';
2121 if ($line->fk_project > 0) {
2122 $projecttmp->id = $line->fk_project;
2123 $projecttmp->ref = $line->projet_ref;
2124 $projecttmp->title = $line->projet_title;
2125 print $projecttmp->getNomUrl(1);
2131 if (isModEnabled(
'accounting')) {
2132 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
2134 $resaccountingaccount = $accountingaccount->fetch(0, $line->type_fees_accountancy_code, 1);
2136 $titlealt .= $langs->trans(
"AccountancyCode").
': ';
2137 if ($resaccountingaccount > 0) {
2138 $titlealt .= $accountingaccount->account_number;
2140 $titlealt .= $langs->trans(
"NotFound");
2146 print
'<td class="center linecoltype" title="'.dol_escape_htmltag($titlealt).
'">';
2147 $labeltype = ($langs->trans(($line->type_fees_code)) == $line->type_fees_code ? $line->type_fees_libelle : $langs->trans($line->type_fees_code));
2153 print
'<td class="fk_c_exp_tax_cat linecoltaxcat">';
2154 $exp_tax_cat_label =
dol_getIdFromCode($db, $line->fk_c_exp_tax_cat,
'c_exp_tax_cat',
'rowid',
'label');
2155 print $langs->trans($exp_tax_cat_label);
2160 print
'<td class="left linecolcomment">'.dol_nl2br($line->comments).
'</td>';
2163 $senderissupplier = 0;
2164 $tooltiponprice =
'';
2165 $tooltiponpriceend =
'';
2167 $tooltiponprice = $langs->transcountry(
"TotalHT", $mysoc->country_code).
'='.
price($line->total_ht);
2168 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalVAT", ($senderissupplier ?
$object->thirdparty->country_code : $mysoc->country_code)).
'='.
price($line->total_tva);
2169 if (is_object(
$object->thirdparty)) {
2170 if ($senderissupplier) {
2171 $seller =
$object->thirdparty;
2178 if ($mysoc->useLocalTax(1)) {
2179 if (($seller->country_code == $buyer->country_code) || $line->total_localtax1 || $seller->useLocalTax(1)) {
2180 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT1", $seller->country_code).
'='.
price($line->total_localtax1);
2182 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT1", $seller->country_code).
'=<span class="opacitymedium">'.$langs->trans($senderissupplier ?
"NotUsedForThisVendor" :
"NotUsedForThisCustomer").
'</span>';
2185 if ($mysoc->useLocalTax(2)) {
2186 if ((isset($seller->country_code) && isset($buyer->thirdparty->country_code) && $seller->country_code == $buyer->thirdparty->country_code) || $line->total_localtax2 || $seller->useLocalTax(2)) {
2187 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT2", $seller->country_code).
'='.
price($line->total_localtax2);
2189 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalLT2", $seller->country_code).
'=<span class="opacitymedium">'.$langs->trans($senderissupplier ?
"NotUsedForThisVendor" :
"NotUsedForThisCustomer").
'</span>';
2193 $tooltiponprice .=
'<br>'.$langs->transcountry(
"TotalTTC", $mysoc->country_code).
'='.
price($line->total_ttc);
2195 $tooltiponprice =
'<span class="classfortooltip" title="'.dol_escape_htmltag($tooltiponprice).
'">';
2196 $tooltiponpriceend =
'</span>';
2199 print
'<td class="right linecolvatrate">';
2200 print $tooltiponprice;
2201 print
vatrate($line->vatrate.($line->vat_src_code ?
' ('.$line->vat_src_code.
')' :
''), true);
2202 print $tooltiponpriceend;
2206 print
'<td class="right linecolunitht">';
2207 if (!empty($line->value_unit_ht)) {
2208 print
price($line->value_unit_ht);
2210 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $line->vatrate));
2211 $pricenettoshow =
price2num((
float) $line->value_unit / (1 + $tmpvat / 100),
'MU');
2212 print
price($pricenettoshow);
2216 print
'<td class="right linecolunitttc">'.price($line->value_unit).
'</td>';
2218 print
'<td class="right linecolqty">'.dol_escape_htmltag($line->qty).
'</td>';
2220 if ($action !=
'editline') {
2221 print
'<td class="right linecoltotalht">'.price($line->total_ht).
'</td>';
2222 print
'<td class="right linecoltotalttc">'.price($line->total_ttc).
'</td>';
2226 print
'<td class="center linecolpreview">';
2227 if ($line->fk_ecm_files > 0) {
2228 $modulepart =
'expensereport';
2229 $maxheightmini = 32;
2231 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2233 $relativepath = preg_replace(
'/expensereport\//',
'', $ecmfilesstatic->filepath);
2234 $fileinfo = pathinfo($ecmfilesstatic->filepath.
'/'.$ecmfilesstatic->filename);
2237 if (!
dol_is_file($conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$minifile)) {
2241 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity));
2242 if (empty($urlforhref)) {
2243 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
2244 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
2246 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2248 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="">';
2251 if (preg_match(
'/\.pdf$/i', $ecmfilesstatic->filename)) {
2252 $filepdf = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename;
2253 $fileimage = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2254 $relativepathimage = $relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2256 $pdfexists = file_exists($filepdf);
2259 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2261 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2270 if ($pdfexists && !$error) {
2271 $heightforphotref = 70;
2272 if (!empty($conf->dol_optimize_smallscreen)) {
2273 $heightforphotref = 60;
2275 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity));
2276 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2278 if (file_exists($fileimage)) {
2279 print
'<img height="'.$heightforphotref.
'" class="photo photowithmargin photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2282 print
img_mime($ecmfilesstatic->filename);
2292 print
'<td class="nowrap right linecolwarning">';
2293 print !empty($line->rule_warning_message) ?
img_warning(html_entity_decode($line->rule_warning_message)) :
' ';
2298 print
'<td class="nowrap right linecolaction">';
2300 print
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&rowid='.$line->rowid.
'">';
2302 print
'</a> ';
2303 print
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete_line&token='.
newToken().
'&rowid='.$line->rowid.
'">';
2313 if ($action ==
'editline' && $line->id ==
GETPOSTINT(
'rowid')) {
2316 if (isModEnabled(
'project')) {
2323 print
'<!-- line of expense report -->'.
"\n";
2324 print
'<tr class="tredited">';
2326 print
'<td class="center">';
2330 print
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
2331 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2332 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2335 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2336 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2340 print
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
2341 print
'<script type="text/javascript">'.
"\n";
2342 print
'$(document).ready(function() {
2343 $( ".auploadnewfilenow" ).click(function() {
2344 jQuery(".truploadnewfilenow").toggle();
2345 jQuery(".trattachnewfilenow").hide();
2348 $( ".aattachtodoc" ).click(function() {
2349 jQuery(".trattachnewfilenow").toggle();
2350 jQuery(".truploadnewfilenow").hide();
2353 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array'))) {
2354 print
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
2357 jQuery("form[name=\"expensereport\"]").submit(function() {
2358 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2359 jQuery("input[name=\"sendit\"]").val("");
2366 print
'</script>'.
"\n";
2369 $filenamelinked =
'';
2370 if ($line->fk_ecm_files > 0) {
2371 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2373 $filenamelinked = $ecmfilesstatic->filename;
2377 $tredited =
'tredited';
2378 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2379 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2381 print
'<tr class="oddeven tredited">';
2386 print
'<td class="center">';
2387 print $form->selectDate($line->date,
'date');
2391 if (isModEnabled(
'project')) {
2393 $formproject->select_projects(-1, $line->fk_project,
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2398 print
'<td class="center">';
2399 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees,
'fk_c_type_fees');
2403 print
'<td class="fk_c_exp_tax_cat">';
2404 $params = array(
'fk_expense' =>
$object->id,
'fk_expense_det' => $line->id,
'date' => $line->date);
2405 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);
2411 print
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
2415 $selectedvat =
price2num($line->vatrate).(!empty($line->vat_src_code) ?
' ('.$line->vat_src_code.
')' :
'');
2416 print
'<td class="right">';
2417 print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ?
GETPOST(
"vatrate") : $selectedvat), $mysoc,
'', 0, 0,
'', false, 1, 2);
2421 print
'<td class="right">';
2422 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.
' />';
2426 print
'<td class="right">';
2427 print
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
2431 print
'<td class="right">';
2432 print
'<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';
2439 print
'<td class="center">';
2443 print
'<td class="center">';
2447 print
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
2448 print $form->buttonsSaveCancel(
'Save',
'Cancel', array(), 0,
'small');
2464 if (isModEnabled(
'project')) {
2467 if ($action !=
'editline') {
2471 $nbFiles = $nbLinks = 0;
2472 $arrayoffiles = array();
2474 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2475 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2476 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2479 $nbFiles = count($arrayoffiles);
2484 print
'<tr class="liste_titre">';
2485 print
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
2486 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2487 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2490 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2491 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2495 print
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
2496 print
'<script type="text/javascript">'.
"\n";
2497 print
'$(document).ready(function() {
2498 $( ".auploadnewfilenow" ).click(function() {
2499 console.log("We click on toggle of auploadnewfilenow");
2500 jQuery(".truploadnewfilenow").toggle();
2501 jQuery(".trattachnewfilenow").hide();
2502 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2503 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2505 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2507 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2510 $( ".aattachtodoc" ).click(function() {
2511 console.log("We click on toggle of aattachtodoc");
2512 jQuery(".trattachnewfilenow").toggle();
2513 jQuery(".truploadnewfilenow").hide();
2514 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2517 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array')) && $action !=
'updateline') {
2518 print
'jQuery(".trattachnewfilenow").show();'.
"\n";
2521 jQuery("form[name=\"expensereport\"]").submit(function() {
2522 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2523 /* 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. */
2524 jQuery("input[name=\"sendit\"]").val("");
2525 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2527 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2534 print
'</script>'.
"\n";
2538 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2539 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2541 print
'<tr class="liste_titre expensereportcreate">';
2543 print
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
2544 if (isModEnabled(
'project')) {
2545 print
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
2547 print
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
2549 print
'<td>'.$langs->trans(
'CarCategory').
'</td>';
2551 print
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
2552 print
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
2553 print
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
2554 print
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
2555 print
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
2562 print
'<tr class="oddeven nohover">';
2568 print
'<td class="center inputdate">';
2569 print $form->selectDate(!empty($date) ? $date : -1,
'date', 0, 0, 0,
'', 1, 1);
2573 if (isModEnabled(
'project')) {
2574 print
'<td class="inputproject">';
2575 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0,
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2580 print
'<td class="center inputtype">';
2581 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees :
"",
'fk_c_type_fees', 1);
2585 print
'<td class="fk_c_exp_tax_cat">';
2586 $params = array(
'fk_expense' =>
$object->id);
2587 print $form->selectExpenseCategories(
'',
'fk_c_exp_tax_cat', 1, array(),
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2592 print
'<td class="inputcomment">';
2593 print
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments :
"", 0, 1).
'</textarea>';
2597 print
'<td class="right inputvat">';
2601 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS =
'none';
2603 print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), null, null, 0, 0,
'', false, 1);
2607 print
'<td class="right inputpricenet">';
2608 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.
' />';
2612 print
'<td class="right inputtax">';
2613 print
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit :
"")).
'">';
2617 print
'<td class="right inputqty">';
2618 print
'<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">';
2624 if ($action !=
'editline') {
2625 print
'<td class="right"></td>';
2626 print
'<td class="right"></td>';
2630 print
'<td class="center inputbuttons">';
2631 print $form->buttonsSaveCancel(
"Add",
'',
'', 1,
'reposition');
2642 /* JQuery for product free or predefined select */
2643 jQuery(document).ready(function() {
2644 jQuery("#value_unit_ht").keyup(function(event) {
2645 console.log(event.which); // discard event tag and arrows
2646 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2647 jQuery("#value_unit").val("");
2650 jQuery("#value_unit").keyup(function(event) {
2651 console.log(event.which); // discard event tag and arrows
2652 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2653 jQuery("#value_unit_ht").val("");
2661 /* unit price coef calculation */
2662 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2663 console.log("We change a parameter");
2665 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2666 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2667 let tva = jQuery("#vatrate").find(":selected").val();
2668 let qty = jQuery(".input_qty").val();
2670 let path = "'.DOL_URL_ROOT.
'/expensereport/ajax/ajaxik.php";
2671 path += "?fk_c_exp_tax_cat="+tax_cat;
2672 path += "&fk_expense="+'.((int)
$object->id).
';
2673 path += "&vatrate="+tva;
2674 path += "&qty="+qty;
2676 if (type_fee == 4) { // frais_kilométriques
2677 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2685 success: function(response) {
2686 if (response.response_status == "success"){';
2690 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2691 jQuery("#value_unit").trigger("change");
2695 jQuery("#value_unit_ht").val(response.data);
2696 jQuery("#value_unit_ht").trigger("change");
2697 jQuery("#value_unit").val("");
2702 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ) {
2703 console.log("We get an error result");
2704 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2710 /*console.log(event.which); // discard event tag and arrows
2711 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2712 jQuery("#value_unit_ht").val("");
2732 print
'Record not found';
2743print
'<div class="tabsAction">';
2745if ($action !=
'create' && $action !=
'edit' && $action !=
'editline') {
2750 if (empty($user->socid)) {
2753 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>';
2765 if (in_array(
$object->fk_user_author, $childids) || $user->hasRight(
'expensereport',
'writeall_advance')) {
2767 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>';
2770 if (count(
$object->lines) > 0) {
2771 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>';
2782 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid) {
2784 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>';
2789 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>';
2794 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid) {
2796 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>';
2806 if (in_array(
$object->fk_user_author, $childids)) {
2808 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>';
2816 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>';
2818 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>';
2821 if ($user->id ==
$object->fk_user_author || $user->id ==
$object->fk_user_valid) {
2823 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.
$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2832 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>';
2838 if ($remaintopay == 0) {
2839 print
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
2841 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>';
2849 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>";
2855 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=cancel&token='.
newToken().
'&id='.
$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2866 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>';
2870 if ($user->hasRight(
'expensereport',
'creer')) {
2871 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>';
2877 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>';
2880 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>';
2883 $parameters = array();
2884 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
2891if (
GETPOST(
'modelselected',
'alpha')) {
2892 $action =
'presend';
2895if ($action !=
'presend') {
2900 print
'<div class="fichecenter"><div class="fichehalfleft">';
2901 print
'<a name="builddoc"></a>';
2903 if ($user->hasRight(
'expensereport',
'creer') && $action !=
'create' && $action !=
'edit') {
2906 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
2907 $genallowed = $user->hasRight(
'expensereport',
'creer');
2908 $delallowed = $user->hasRight(
'expensereport',
'creer');
2910 print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2911 $somethingshown = $formfile->numoffiles;
2923 print
'</div><div class="fichehalfright">';
2925 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2927 $somethingshown = $formactions->showactions(
$object,
'expensereport',
null);
2929 print
'</div></div>';
2933$modelmail =
'expensereport_send';
2934$defaulttopic =
'SendExpenseReportRef';
2935$diroutput = $conf->expensereport->dir_output;
2936$trackid =
'exp'.$object->id;
2938include 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.