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>';
1944 $canSeeBankAccount = isModEnabled(
'bank') && $user->hasRight(
'banque',
'lire');
1947 if ($canSeeBankAccount) {
1952 print
'<table class="noborder paymenttable centpercent">';
1954 print
'<tr class="liste_titre">';
1955 print
'<td class="liste_titre">'.$langs->trans(
'Payments').
'</td>';
1956 print
'<td class="liste_titre">'.$langs->trans(
'Date').
'</td>';
1957 print
'<td class="liste_titre">'.$langs->trans(
'Type').
'</td>';
1958 if ($canSeeBankAccount) {
1959 print
'<td class="liste_titre right">'.$langs->trans(
'BankAccount').
'</td>';
1961 print
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
1962 print
'<td class="liste_titre" width="18"> </td>';
1966 $sql =
"SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,";
1967 $sql .=
"c.code as payment_code, c.libelle as payment_type,";
1968 $sql .=
"ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal";
1969 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as e, ".MAIN_DB_PREFIX.
"payment_expensereport as p";
1970 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as c ON p.fk_typepayment = c.id";
1971 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
1972 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
1973 $sql .=
" WHERE e.rowid = ".((int) $id);
1974 $sql .=
" AND p.fk_expensereport = e.rowid";
1975 $sql .=
' AND e.entity IN ('.getEntity(
'expensereport').
')';
1976 $sql .=
" ORDER BY dp";
1978 $resql = $db->query($sql);
1980 $num = $db->num_rows($resql);
1984 $objp = $db->fetch_object($resql);
1986 $paymentexpensereportstatic->id = $objp->rowid;
1987 $paymentexpensereportstatic->datep = $db->jdate($objp->dp);
1988 $paymentexpensereportstatic->ref = $objp->rowid;
1989 $paymentexpensereportstatic->num_payment = $objp->num_payment;
1990 $paymentexpensereportstatic->type_code = $objp->payment_code;
1991 $paymentexpensereportstatic->type_label = $objp->payment_type;
1993 print
'<tr class="oddseven">';
1995 print $paymentexpensereportstatic->getNomUrl(1);
1997 print
'<td>'.dol_print_date($db->jdate($objp->dp),
'day').
"</td>\n";
1998 $labeltype = $langs->trans(
"PaymentType".$objp->payment_code) !=
"PaymentType".$objp->payment_code ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_type;
1999 print
"<td>".$labeltype.
' '.$objp->num_payment.
"</td>\n";
2001 if ($canSeeBankAccount) {
2002 $bankaccountstatic->id = $objp->baid;
2003 $bankaccountstatic->ref = $objp->baref;
2004 $bankaccountstatic->label = $objp->baref;
2005 $bankaccountstatic->number = $objp->banumber;
2007 if (isModEnabled(
'accounting')) {
2008 $bankaccountstatic->account_number = $objp->account_number;
2011 $accountingjournal->fetch($objp->fk_accountancy_journal);
2012 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1,
'', 1);
2015 print
'<td class="right">';
2016 if ($bankaccountstatic->id) {
2017 print $bankaccountstatic->getNomUrl(1,
'transactions');
2021 print
'<td class="right">'.price($objp->amount).
"</td>";
2024 $totalpaid += $objp->amount;
2027 if (!is_null($totalpaid)) {
2031 $remaintopay =
price2num($object->total_ttc - $totalpaid);
2032 $resteapayeraffiche = $remaintopay;
2034 $cssforamountpaymentcomplete =
'amountpaymentcomplete';
2037 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2038 $resteapayeraffiche = 0;
2039 } elseif ($object->paid == 0) {
2040 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2042 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AlreadyPaid").
':</td><td class="right">'.
price($totalpaid).
'</td><td></td></tr>';
2043 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AmountExpected").
':</td><td class="right">'.
price($object->total_ttc).
'</td><td></td></tr>';
2045 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"RemainderToPay").
':</td>';
2046 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td></td></tr>';
2057 print
'<div class="clearboth"></div><br>';
2059 print
'<div style="clear: both;"></div>';
2061 $actiontouse =
'updateline';
2062 if (($object->status == 0 || $object->status == 99) && $action !=
'editline') {
2063 $actiontouse =
'addline';
2066 print
'<form name="expensereport" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="post" >';
2067 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2068 print
'<input type="hidden" name="action" value="'.$actiontouse.
'">';
2069 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2070 print
'<input type="hidden" name="fk_expensereport" value="'.$object->id.
'" />';
2071 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2072 print
'<input type="hidden" name="page_y" value="">';
2074 print
'<div class="div-table-responsive-no-min">';
2075 print
'<table id="tablelines" class="noborder centpercent">';
2077 if (!empty($object->lines)) {
2081 print
'<tr class="liste_titre headerexpensereportdet">';
2082 print
'<td class="center linecollinenb">'.$langs->trans(
'LineNb').
'</td>';
2084 print
'<td class="center linecoldate">'.$langs->trans(
'Date').
'</td>';
2085 if (isModEnabled(
'project')) {
2086 print
'<td class="minwidth100imp linecolproject">'.$langs->trans(
'Project').
'</td>';
2088 print
'<td class="center linecoltype">'.$langs->trans(
'Type').
'</td>';
2090 print
'<td class="center linecolcarcategory">'.$langs->trans(
'CarCategory').
'</td>';
2092 print
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
2093 print
'<td class="right linecolvat">'.$langs->trans(
'VAT').
'</td>';
2094 print
'<td class="right linecolpriceuht">'.$langs->trans(
'PriceUHT').
'</td>';
2095 print
'<td class="right linecolpriceuttc">'.$langs->trans(
'PriceUTTC').
'</td>';
2096 print
'<td class="right linecolqty">'.$langs->trans(
'Qty').
'</td>';
2097 if ($action !=
'editline') {
2098 print
'<td class="right linecolamountht">'.$langs->trans(
'AmountHT').
'</td>';
2099 print
'<td class="right linecolamountttc">'.$langs->trans(
'AmountTTC').
'</td>';
2110 if (($object->status < 2 || $object->status == 99) && $user->hasRight(
'expensereport',
'creer')) {
2111 print
'<td class="right"></td>';
2115 foreach ($object->lines as &$line) {
2118 if ($action !=
'editline' || $line->id !=
GETPOST(
'rowid',
'int')) {
2119 print
'<tr class="oddeven linetr" data-id="'.$line->id.
'">';
2122 print
'<td class="center linecollinenb">';
2127 print
'<td class="center linecoldate">'.dol_print_date($db->jdate($line->date),
'day').
'</td>';
2130 if (isModEnabled(
'project')) {
2131 print
'<td class="lineproject">';
2132 if ($line->fk_project > 0) {
2133 $projecttmp->id = $line->fk_project;
2134 $projecttmp->ref = $line->projet_ref;
2135 $projecttmp->title = $line->projet_title;
2136 print $projecttmp->getNomUrl(1);
2142 if (isModEnabled(
'accounting')) {
2143 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
2145 $resaccountingaccount = $accountingaccount->fetch(0, $line->type_fees_accountancy_code, 1);
2147 $titlealt .= $langs->trans(
"AccountancyCode").
': ';
2148 if ($resaccountingaccount > 0) {
2149 $titlealt .= $accountingaccount->account_number;
2151 $titlealt .= $langs->trans(
"NotFound");
2157 print
'<td class="center linecoltype" title="'.dol_escape_htmltag($titlealt).
'">';
2158 $labeltype = ($langs->trans(($line->type_fees_code)) == $line->type_fees_code ? $line->type_fees_libelle : $langs->trans($line->type_fees_code));
2164 print
'<td class="fk_c_exp_tax_cat linecoltaxcat">';
2165 $exp_tax_cat_label =
dol_getIdFromCode($db, $line->fk_c_exp_tax_cat,
'c_exp_tax_cat',
'rowid',
'label');
2166 print $langs->trans($exp_tax_cat_label);
2171 print
'<td class="left linecolcomment">'.dol_nl2br($line->comments).
'</td>';
2174 print
'<td class="right linecolvatrate">'.vatrate($line->vatrate.($line->vat_src_code ?
' ('.$line->vat_src_code.
')' :
''), true).
'</td>';
2177 print
'<td class="right linecolunitht">';
2178 if (!empty($line->value_unit_ht)) {
2179 print
price($line->value_unit_ht);
2181 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $line->vatrate));
2182 $pricenettoshow =
price2num($line->value_unit / (1 + $tmpvat / 100),
'MU');
2183 print
price($pricenettoshow);
2187 print
'<td class="right linecolunitttc">'.price($line->value_unit).
'</td>';
2189 print
'<td class="right linecolqty">'.dol_escape_htmltag($line->qty).
'</td>';
2191 if ($action !=
'editline') {
2192 print
'<td class="right linecoltotalht">'.price($line->total_ht).
'</td>';
2193 print
'<td class="right linecoltotalttc">'.price($line->total_ttc).
'</td>';
2197 print
'<td class="center linecolpreview">';
2198 if ($line->fk_ecm_files > 0) {
2199 $modulepart =
'expensereport';
2200 $maxheightmini = 32;
2202 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2204 $relativepath = preg_replace(
'/expensereport\//',
'', $ecmfilesstatic->filepath);
2205 $fileinfo = pathinfo($ecmfilesstatic->filepath.
'/'.$ecmfilesstatic->filename);
2208 if (!
dol_is_file($conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$minifile)) {
2212 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
2213 if (empty($urlforhref)) {
2214 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(empty($object->entity) ? $conf->entity : $object->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
2215 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
2217 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2219 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="">';
2222 $modulepart =
'expensereport';
2224 if (preg_match(
'/\.pdf$/i', $ecmfilesstatic->filename)) {
2225 $filepdf = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename;
2226 $fileimage = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2227 $relativepathimage = $relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2229 $pdfexists = file_exists($filepdf);
2232 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2234 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2243 if ($pdfexists && !$error) {
2244 $heightforphotref = 70;
2245 if (!empty($conf->dol_optimize_smallscreen)) {
2246 $heightforphotref = 60;
2249 if (file_exists($fileimage)) {
2251 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
2252 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2253 print
'<img height="'.$heightforphotref.
'" class="photo photowithmargin photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2259 if (!$thumbshown && $fileinfo[
'extension'] ==
'pdf' && !empty($filepdf) && !empty($relativepath) && !empty($fileinfo[
'filename'])) {
2261 $imgpreview = $formFile->showPreview([], $modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 0);
2263 } elseif (!$thumbshown) {
2264 print
img_mime($ecmfilesstatic->filename);
2271 print
'<td class="nowrap right linecolwarning">';
2272 print !empty($line->rule_warning_message) ?
img_warning(html_entity_decode($line->rule_warning_message)) :
' ';
2277 print
'<td class="nowrap right linecolaction">';
2279 print
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$line->rowid.
'">';
2281 print
'</a> ';
2282 print
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete_line&token='.newToken().
'&rowid='.$line->rowid.
'">';
2292 if ($action ==
'editline' && $line->id ==
GETPOST(
'rowid',
'int')) {
2295 if (isModEnabled(
'project')) {
2302 print
'<!-- line of expense report -->'.
"\n";
2303 print
'<tr class="tredited">';
2305 print
'<td class="center">';
2309 print
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
2310 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2311 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2314 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2315 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2319 print
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
2320 print
'<script type="text/javascript">'.
"\n";
2321 print
'$(document).ready(function() {
2322 $( ".auploadnewfilenow" ).click(function() {
2323 jQuery(".truploadnewfilenow").toggle();
2324 jQuery(".trattachnewfilenow").hide();
2327 $( ".aattachtodoc" ).click(function() {
2328 jQuery(".trattachnewfilenow").toggle();
2329 jQuery(".truploadnewfilenow").hide();
2332 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array'))) {
2333 print
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
2336 jQuery("form[name=\"expensereport\"]").submit(function() {
2337 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2338 jQuery("input[name=\"sendit\"]").val("");
2345 print
'</script>'.
"\n";
2348 $filenamelinked =
'';
2349 if ($line->fk_ecm_files > 0) {
2350 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2352 $filenamelinked = $ecmfilesstatic->filename;
2356 $tredited =
'tredited';
2357 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2358 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2360 print
'<tr class="oddeven tredited">';
2365 print
'<td class="center">';
2366 print $form->selectDate($line->date,
'date');
2370 if (isModEnabled(
'project')) {
2372 $formproject->select_projects(-1, $line->fk_project,
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2377 print
'<td class="center">';
2378 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees,
'fk_c_type_fees');
2382 print
'<td class="fk_c_exp_tax_cat">';
2383 $params = array(
'fk_expense' => $object->id,
'fk_expense_det' => $line->id,
'date' => $line->date);
2384 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);
2390 print
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
2394 $selectedvat =
price2num($line->vatrate).(!empty($line->vat_src_code) ?
' ('.$line->vat_src_code.
')' :
'');
2395 print
'<td class="right">';
2396 print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ?
GETPOST(
"vatrate") : $selectedvat), $mysoc,
'', 0, 0,
'', false, 1);
2400 print
'<td class="right">';
2401 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.
' />';
2405 print
'<td class="right">';
2406 print
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
2410 print
'<td class="right">';
2411 print
'<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';
2418 print
'<td class="center">';
2422 print
'<td class="center">';
2426 print
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
2427 print $form->buttonsSaveCancel(
'Save',
'Cancel', array(), 0,
'small');
2443 if (isModEnabled(
'project')) {
2446 if ($action !=
'editline') {
2450 $nbFiles = $nbLinks = 0;
2451 $arrayoffiles = array();
2453 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2454 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2455 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2458 $nbFiles = count($arrayoffiles);
2459 $nbLinks =
Link::count($db, $object->element, $object->id);
2463 print
'<tr class="liste_titre">';
2464 print
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
2465 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2466 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2469 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2470 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2474 print
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
2475 print
'<script type="text/javascript">'.
"\n";
2476 print
'$(document).ready(function() {
2477 $( ".auploadnewfilenow" ).click(function() {
2478 console.log("We click on toggle of auploadnewfilenow");
2479 jQuery(".truploadnewfilenow").toggle();
2480 jQuery(".trattachnewfilenow").hide();
2481 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2482 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2484 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2486 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2489 $( ".aattachtodoc" ).click(function() {
2490 console.log("We click on toggle of aattachtodoc");
2491 jQuery(".trattachnewfilenow").toggle();
2492 jQuery(".truploadnewfilenow").hide();
2493 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2496 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array')) && $action !=
'updateline') {
2497 print
'jQuery(".trattachnewfilenow").show();'.
"\n";
2500 jQuery("form[name=\"expensereport\"]").submit(function() {
2501 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2502 /* 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. */
2503 jQuery("input[name=\"sendit\"]").val("");
2504 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2506 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2513 print
'</script>'.
"\n";
2517 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2518 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2520 print
'<tr class="liste_titre expensereportcreate">';
2522 print
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
2523 if (isModEnabled(
'project')) {
2524 print
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
2526 print
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
2528 print
'<td>'.$langs->trans(
'CarCategory').
'</td>';
2530 print
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
2531 print
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
2532 print
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
2533 print
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
2534 print
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
2541 print
'<tr class="oddeven nohover">';
2547 print
'<td class="center inputdate">';
2548 print $form->selectDate(!empty($date) ? $date : -1,
'date', 0, 0, 0,
'', 1, 1);
2552 if (isModEnabled(
'project')) {
2553 print
'<td class="inputproject">';
2554 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0,
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2559 print
'<td class="center inputtype">';
2560 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees :
"",
'fk_c_type_fees', 1);
2564 print
'<td class="fk_c_exp_tax_cat">';
2565 $params = array(
'fk_expense' => $object->id);
2566 print $form->selectExpenseCategories(
'',
'fk_c_exp_tax_cat', 1, array(),
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2571 print
'<td class="inputcomment">';
2572 print
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments :
"", 0, 1).
'</textarea>';
2576 print
'<td class="right inputvat">';
2580 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS =
'none';
2582 print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), $mysoc,
'', 0, 0,
'', false, 1);
2586 print
'<td class="right inputpricenet">';
2587 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.
' />';
2591 print
'<td class="right inputtax">';
2592 print
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit : 0)).
'">';
2596 print
'<td class="right inputqty">';
2597 print
'<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">';
2603 if ($action !=
'editline') {
2604 print
'<td class="right"></td>';
2605 print
'<td class="right"></td>';
2608 print
'<td class="center inputbuttons">';
2609 print $form->buttonsSaveCancel(
"Add",
'',
'', 1,
'reposition');
2620 /* JQuery for product free or predefined select */
2621 jQuery(document).ready(function() {
2622 jQuery("#value_unit_ht").keyup(function(event) {
2623 console.log(event.which); // discard event tag and arrows
2624 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2625 jQuery("#value_unit").val("");
2628 jQuery("#value_unit").keyup(function(event) {
2629 console.log(event.which); // discard event tag and arrows
2630 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2631 jQuery("#value_unit_ht").val("");
2639 /* unit price coef calculation */
2640 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2641 console.log("We change a parameter");
2643 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2644 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2645 let tva = jQuery("#vatrate").find(":selected").val();
2646 let qty = jQuery(".input_qty").val();
2648 let path = "'.dol_buildpath(
"/expensereport/ajax/ajaxik.php", 1).
'";
2649 path += "?fk_c_exp_tax_cat="+tax_cat;
2650 path += "&fk_expense="+'.((int) $object->id).
';
2651 path += "&vatrate="+tva;
2652 path += "&qty="+qty;
2654 if (type_fee == 4) { // frais_kilométriques
2655 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2663 success: function(response) {
2664 if (response.response_status == "success"){';
2668 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2669 jQuery("#value_unit").trigger("change");
2673 jQuery("#value_unit_ht").val(response.data);
2674 jQuery("#value_unit_ht").trigger("change");
2675 jQuery("#value_unit").val("");
2680 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ) {
2681 console.log("We get an error result");
2682 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2688 /*console.log(event.which); // discard event tag and arrows
2689 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2690 jQuery("#value_unit_ht").val("");
2710 print
'Record not found';
2721print
'<div class="tabsAction">';
2723if ($action !=
'create' && $action !=
'edit' && $action !=
'editline') {
2725 $object->fetch($id, $ref);
2728 if (empty($user->socid)) {
2731 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>';
2743 if (in_array($object->fk_user_author, $user->getAllChildIds(1)) || $user->hasRight(
'expensereport',
'writeall_advance')) {
2745 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>';
2748 if (count($object->lines) > 0) {
2749 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>';
2760 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2762 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=edit&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'Modify').
'</a></div>';
2767 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>';
2772 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2774 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>';
2784 if (in_array($object->fk_user_author, $user->getAllChildIds(1))) {
2786 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>';
2794 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=validate&id='.$object->id.
'">'.$langs->trans(
'Approve').
'</a></div>';
2796 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2799 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2801 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2810 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2816 if ($remaintopay == 0) {
2817 print
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
2819 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>';
2826 if ($object->paid == 0) {
2827 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>";
2831 if ($user->hasRight(
'expensereport',
'creer') && ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) && $object->status ==
ExpenseReport::STATUS_APPROVED) {
2833 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>';
2837 if (($user->hasRight(
'expensereport',
'approve') || $user->hasRight(
'expensereport',
'to_paid')) && $object->status ==
ExpenseReport::STATUS_CLOSED) {
2839 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>';
2844 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>';
2848 if ($user->hasRight(
'expensereport',
'creer')) {
2849 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>';
2855 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>';
2858 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>';
2861 $parameters = array();
2862 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2869if (
GETPOST(
'modelselected',
'alpha')) {
2870 $action =
'presend';
2873if ($action !=
'presend') {
2878 print
'<div class="fichecenter"><div class="fichehalfleft">';
2879 print
'<a name="builddoc"></a>';
2881 if ($user->hasRight(
'expensereport',
'creer') && $action !=
'create' && $action !=
'edit') {
2884 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
2885 $genallowed = $user->rights->expensereport->creer;
2886 $delallowed = $user->rights->expensereport->creer;
2888 print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2889 $somethingshown = $formfile->numoffiles;
2901 print
'</div><div class="fichehalfright">';
2903 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2905 $somethingshown =
$formactions->showactions($object,
'expensereport',
null);
2907 print
'</div></div>';
2911$modelmail =
'expensereport_send';
2912$defaulttopic =
'SendExpenseReportRef';
2913$diroutput = $conf->expensereport->dir_output;
2914$trackid =
'exp'.$object->id;
2916include 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.