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