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 $newlang = $object->thirdparty->default_lang;
397 if (!empty($newlang)) {
399 $outputlangs->setDefaultLang($newlang);
401 $model = $object->model_pdf;
402 $ret = $object->fetch($id);
404 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
411 if (!$error && $result > 0 && $object->fk_user_validator > 0) {
412 $langs->load(
"mails");
415 $destinataire =
new User($db);
416 $destinataire->fetch($object->fk_user_validator);
417 $emailTo = $destinataire->email;
420 $expediteur =
new User($db);
421 $expediteur->fetch($object->fk_user_author);
422 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
424 if ($emailTo && $emailFrom) {
430 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
432 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
435 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForApproval");
438 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
439 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
440 $message = $langs->transnoentities(
"ExpenseReportWaitingForApprovalMessage", $expediteur->getFullName($langs),
get_date_range($object->date_debut, $object->date_fin,
'', $langs), $link);
455 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
459 $result = $mailfile->sendfile();
461 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
464 $langs->load(
"other");
465 if ($mailfile->error) {
467 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
468 $mesg .=
'<br>'.$mailfile->error;
471 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
479 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
486 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
493 if ($action ==
"confirm_save_from_refuse" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
496 $result = $object->set_save_from_refuse($user);
501 $outputlangs = $langs;
504 $newlang =
GETPOST(
'lang_id',
'aZ09');
507 $newlang = $object->thirdparty->default_lang;
509 if (!empty($newlang)) {
511 $outputlangs->setDefaultLang($newlang);
513 $model = $object->model_pdf;
514 $ret = $object->fetch($id);
516 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
524 $destinataire =
new User($db);
525 $destinataire->fetch($object->fk_user_validator);
526 $emailTo = $destinataire->email;
529 $expediteur =
new User($db);
530 $expediteur->fetch($object->fk_user_author);
531 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
533 if ($emailFrom && $emailTo) {
539 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
541 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
544 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForReApproval");
547 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
548 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
549 $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);
568 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
572 $result = $mailfile->sendfile();
574 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
576 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
579 $langs->load(
"other");
580 if ($mailfile->error) {
582 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
583 $mesg .=
'<br>'.$mailfile->error;
586 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
594 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
603 if ($action ==
"confirm_approve" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'approve')) {
607 $result = $object->setApproved($user);
612 $outputlangs = $langs;
615 $newlang =
GETPOST(
'lang_id',
'aZ09');
618 $newlang = $object->thirdparty->default_lang;
620 if (!empty($newlang)) {
622 $outputlangs->setDefaultLang($newlang);
624 $model = $object->model_pdf;
625 $ret = $object->fetch($id);
627 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
635 $destinataire =
new User($db);
636 $destinataire->fetch($object->fk_user_author);
637 $emailTo = $destinataire->email;
641 if (empty($emailTo)) {
646 $expediteur =
new User($db);
647 $expediteur->fetch($object->fk_user_approve > 0 ? $object->fk_user_approve : $object->fk_user_validator);
650 if ($emailFrom && $emailTo) {
661 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportApproved");
664 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
665 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
666 $message = $langs->transnoentities(
"ExpenseReportApprovedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
683 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
687 $result = $mailfile->sendfile();
689 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
691 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
694 $langs->load(
"other");
695 if ($mailfile->error) {
697 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
698 $mesg .=
'<br>'.$mailfile->error;
701 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
709 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
718 if ($action ==
"confirm_refuse" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'approve')) {
722 $detailRefuse =
GETPOST(
'detail_refuse',
'alpha');
723 $result = $object->setDeny($user, $detailRefuse);
728 $outputlangs = $langs;
731 $newlang =
GETPOST(
'lang_id',
'aZ09');
734 $newlang = $object->thirdparty->default_lang;
736 if (!empty($newlang)) {
738 $outputlangs->setDefaultLang($newlang);
740 $model = $object->model_pdf;
741 $ret = $object->fetch($id);
743 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
751 $destinataire =
new User($db);
752 $destinataire->fetch($object->fk_user_author);
753 $emailTo = $destinataire->email;
756 $expediteur =
new User($db);
757 $expediteur->fetch($object->fk_user_refuse);
758 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
760 if ($emailFrom && $emailTo) {
766 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
768 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
771 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportRefused");
774 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
775 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
776 $message = $langs->transnoentities(
"ExpenseReportRefusedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailRefuse, $link);
794 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
798 $result = $mailfile->sendfile();
800 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
802 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
805 $langs->load(
"other");
806 if ($mailfile->error) {
808 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
809 $mesg .=
'<br>'.$mailfile->error;
812 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
820 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
830 if ($action ==
"confirm_cancel" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
831 if (!
GETPOST(
'detail_cancel',
'alpha')) {
832 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Comment")),
null,
'errors');
837 if ($user->id == $object->fk_user_valid || $user->id == $object->fk_user_author) {
838 $detailCancel =
GETPOST(
'detail_cancel',
'alpha');
839 $result = $object->set_cancel($user, $detailCancel);
844 $outputlangs = $langs;
847 $newlang =
GETPOST(
'lang_id',
'aZ09');
850 $newlang = $object->thirdparty->default_lang;
852 if (!empty($newlang)) {
854 $outputlangs->setDefaultLang($newlang);
856 $model = $object->model_pdf;
857 $ret = $object->fetch($id);
859 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
867 $destinataire =
new User($db);
868 $destinataire->fetch($object->fk_user_author);
869 $emailTo = $destinataire->email;
872 $expediteur =
new User($db);
873 $expediteur->fetch($object->fk_user_cancel);
874 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
876 if ($emailFrom && $emailTo) {
882 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
884 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
887 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportCanceled");
890 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
891 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
892 $message = $langs->transnoentities(
"ExpenseReportCanceledMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailCancel, $link);
910 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
914 $result = $mailfile->sendfile();
916 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
918 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
921 $langs->load(
"other");
922 if ($mailfile->error) {
924 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
925 $mesg .=
'<br>'.$mailfile->error;
928 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
936 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
949 if ($action ==
"confirm_setdraft" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->hasRight(
'expensereport',
'creer')) {
952 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
953 $result = $object->setStatut(0);
958 $outputlangs = $langs;
961 $newlang =
GETPOST(
'lang_id',
'aZ09');
964 $newlang = $object->thirdparty->default_lang;
966 if (!empty($newlang)) {
968 $outputlangs->setDefaultLang($newlang);
970 $model = $object->model_pdf;
971 $ret = $object->fetch($id);
973 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
978 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
988 if ($action ==
'set_unpaid' && $id > 0 && $user->hasRight(
'expensereport',
'to_paid')) {
992 $result = $object->setUnpaid($user);
997 $outputlangs = $langs;
1000 $newlang =
GETPOST(
'lang_id',
'aZ09');
1003 $newlang = $object->thirdparty->default_lang;
1005 if (!empty($newlang)) {
1006 $outputlangs =
new Translate(
"", $conf);
1007 $outputlangs->setDefaultLang($newlang);
1009 $model = $object->model_pdf;
1010 $ret = $object->fetch($id);
1012 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1017 if ($action ==
'set_paid' && $id > 0 && $user->hasRight(
'expensereport',
'to_paid')) {
1019 $object->fetch($id);
1021 $result = $object->setPaid($id, $user);
1026 $outputlangs = $langs;
1029 $newlang =
GETPOST(
'lang_id',
'aZ09');
1032 $newlang = $object->thirdparty->default_lang;
1034 if (!empty($newlang)) {
1035 $outputlangs =
new Translate(
"", $conf);
1036 $outputlangs->setDefaultLang($newlang);
1038 $model = $object->model_pdf;
1039 $ret = $object->fetch($id);
1041 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1049 $destinataire =
new User($db);
1050 $destinataire->fetch($object->fk_user_author);
1051 $emailTo = $destinataire->email;
1054 $expediteur =
new User($db);
1055 $expediteur->fetch($user->id);
1056 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
1058 if ($emailFrom && $emailTo) {
1059 $filename = array();
1061 $mimetype = array();
1064 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
1066 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
1069 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportPaid");
1072 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
1073 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
1074 $message = $langs->transnoentities(
"ExpenseReportPaidMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
1077 $object->setDocModel($user,
"");
1078 $resultPDF = expensereport_pdf_create($db, $object,
'',
"", $langs);
1081 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
1085 $result = $mailfile->sendfile();
1087 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
1089 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
1092 $langs->load(
"other");
1093 if ($mailfile->error) {
1095 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
1096 $mesg .=
'<br>'.$mailfile->error;
1099 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
1107 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
1116 if ($action ==
"addline" && $user->hasRight(
'expensereport',
'creer')) {
1121 if (GETPOSTISSET(
'attachfile')) {
1122 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1123 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1124 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1125 $entityprefix = ($conf->entity !=
'1') ? $conf->entity.
'/' :
'';
1126 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1128 $ecmfiles->fetch(0,
'', $relativepath);
1129 $fk_ecm_files = $ecmfiles->id;
1134 if (empty($vatrate)) {
1137 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1141 if (empty($value_unit)) {
1142 $value_unit =
price2num($value_unit_ht + ($value_unit_ht * $tmpvat / 100),
'MU');
1145 $fk_c_exp_tax_cat =
GETPOST(
'fk_c_exp_tax_cat',
'int');
1152 if (!($fk_c_type_fees > 0)) {
1154 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1158 if ((
float) $tmpvat < 0 || $tmpvat ===
'') {
1160 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"VAT")),
null,
'errors');
1165 if (empty($date) || $date ==
"--") {
1167 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
1168 } elseif ($date < $object->date_debut || $date > ($object->date_fin + (24 * 3600 - 1))) {
1170 $langs->load(
"errors");
1171 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null,
'warnings');
1175 if ($value_unit == 0) {
1177 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PriceUTTC")),
null,
'errors');
1181 if ($projectRequired && $fk_project <= 0) {
1183 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1187 if ($fileRequired && $fk_ecm_files == 0) {
1189 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"File")),
null,
'errors');
1196 $result = $object->addline($qty, $value_unit, $fk_c_type_fees, $vatrate, $date, $comments, $fk_project, $fk_c_exp_tax_cat, $type, $fk_ecm_files);
1198 $ret = $object->fetch($object->id);
1202 $outputlangs = $langs;
1203 $newlang =
GETPOST(
'lang_id',
'alpha');
1205 $user =
new User($db);
1206 $user->fetch($object->fk_user_author);
1207 $newlang = $user->lang;
1209 if (!empty($newlang)) {
1210 $outputlangs =
new Translate(
"", $conf);
1211 $outputlangs->setDefaultLang($newlang);
1214 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1218 unset($value_unit_ht);
1222 unset($fk_c_type_fees);
1233 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOST(
'id',
'int'));
1240 if ($action ==
'confirm_delete_line' &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $user->hasRight(
'expensereport',
'creer')) {
1242 $object->fetch($id);
1245 $object_ligne->fetch(
GETPOST(
"rowid",
'int'));
1246 $total_ht = $object_ligne->total_ht;
1247 $total_tva = $object_ligne->total_tva;
1249 $result = $object->deleteline(
GETPOST(
"rowid",
'int'), $user);
1254 $outputlangs = $langs;
1257 $newlang =
GETPOST(
'lang_id',
'aZ09');
1260 $newlang = $object->thirdparty->default_lang;
1262 if (!empty($newlang)) {
1263 $outputlangs =
new Translate(
"", $conf);
1264 $outputlangs->setDefaultLang($newlang);
1266 $model = $object->model_pdf;
1267 $ret = $object->fetch($id);
1269 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1273 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOST(
'id',
'int'));
1280 if ($action ==
"updateline" && $user->hasRight(
'expensereport',
'creer')) {
1282 $object->fetch($id);
1286 if (GETPOSTISSET(
'attachfile')) {
1287 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1288 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1289 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1290 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1292 $ecmfiles->fetch(0,
'', $relativepath);
1293 $fk_ecm_files = $ecmfiles->id;
1297 $rowid =
GETPOST(
'rowid',
'int');
1298 $type_fees_id =
GETPOST(
'fk_c_type_fees',
'int');
1299 $fk_c_exp_tax_cat =
GETPOST(
'fk_c_exp_tax_cat',
'int');
1300 $projet_id = $fk_project;
1301 $comments =
GETPOST(
'comments',
'restricthtml');
1303 $vatrate =
GETPOST(
'vatrate',
'alpha');
1306 if (empty($vatrate)) {
1309 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1313 if (empty($value_unit)) {
1314 $value_unit =
price2num($value_unit_ht + ($value_unit_ht * $tmpvat / 100),
'MU');
1317 if (!
GETPOST(
'fk_c_type_fees',
'int') > 0) {
1319 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1322 if ((
float) $tmpvat < 0 || $tmpvat ==
'') {
1324 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Vat")),
null,
'errors');
1328 if ($date < $object->date_debut || $date > ($object->date_fin + (24 * 3600 - 1))) {
1329 $langs->load(
"errors");
1330 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null,
'warnings');
1334 if ($projectRequired && $projet_id <= 0) {
1336 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1341 $result = $object->updateline($rowid, $type_fees_id, $projet_id, $vatrate, $comments, $qty, $value_unit, $date, $id, $fk_c_exp_tax_cat, $fk_ecm_files);
1346 $outputlangs = $langs;
1349 $newlang =
GETPOST(
'lang_id',
'aZ09');
1352 $newlang = $object->thirdparty->default_lang;
1354 if (!empty($newlang)) {
1355 $outputlangs =
new Translate(
"", $conf);
1356 $outputlangs->setDefaultLang($newlang);
1358 $model = $object->model_pdf;
1359 $ret = $object->fetch($id);
1361 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1365 unset($value_unit_ht);
1369 unset($fk_c_type_fees);
1383 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1386 $triggersendname =
'EXPENSEREPORT_SENTBYMAIL';
1387 $autocopy =
'MAIN_MAIL_AUTOCOPY_EXPENSEREPORT_TO';
1388 $trackid =
'exp'.$object->id;
1389 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1392 $upload_dir = $conf->expensereport->dir_output;
1393 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1401$title = $langs->trans(
"ExpenseReport").
" - ".$langs->trans(
"Card");
1402$help_url =
"EN:Module_Expense_Reports|FR:Module_Notes_de_frais";
1406$form =
new Form($db);
1409$projecttmp =
new Project($db);
1411$bankaccountstatic =
new Account($db);
1412$ecmfilesstatic =
new EcmFiles($db);
1416if ($action ==
'create') {
1419 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'" method="post" name="create">';
1420 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1421 print
'<input type="hidden" name="action" value="add">';
1422 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1426 print
'<table class="border centpercent">';
1431 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"DateStart").
'</td>';
1433 print $form->selectDate($date_start ? $date_start : -1,
'date_debut', 0, 0, 0,
'', 1, 1);
1439 print
'<td class="fieldrequired">'.$langs->trans(
"DateEnd").
'</td>';
1441 print $form->selectDate($date_end ? $date_end : -1,
'date_fin', 0, 0, 0,
'', 1, 1);
1447 print
'<td class="fieldrequired">'.$langs->trans(
"User").
'</td>';
1449 $defaultselectuser = $user->id;
1450 if (
GETPOST(
'fk_user_author',
'int') > 0) {
1451 $defaultselectuser =
GETPOST(
'fk_user_author',
'int');
1453 $include_users =
'hierarchyme';
1454 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expensereport',
'writeall_advance')) {
1455 $include_users = array();
1457 $s = $form->select_dolusers($defaultselectuser,
"fk_user_author", 0,
"", 0, $include_users,
'',
'0,'.$conf->entity);
1464 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1467 $include_users = $object->fetch_users_approver_expensereport();
1468 if (empty($include_users)) {
1469 print
img_warning().
' '.$langs->trans(
"NobodyHasPermissionToValidateExpenseReport");
1471 $defaultselectuser = (empty($user->fk_user_expense_validator) ? $user->fk_user : $user->fk_user_expense_validator);
1473 $defaultselectuser = $conf->global->EXPENSEREPORT_DEFAULT_VALIDATOR;
1475 if (
GETPOST(
'fk_user_validator',
'int') > 0) {
1476 $defaultselectuser =
GETPOST(
'fk_user_validator',
'int');
1478 $s = $form->select_dolusers($defaultselectuser,
"fk_user_validator", 1,
"", ((empty($defaultselectuser) || !
getDolGlobalString(
'EXPENSEREPORT_DEFAULT_VALIDATOR_UNCHANGEABLE')) ? 0 : 1), $include_users);
1479 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1487 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1489 $form->select_types_paiements(
'',
'fk_c_paiement');
1495 $note_public = GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') :
'';
1498 print
'<td class="tdtop">'.$langs->trans(
'NotePublic').
'</td>';
1501 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1502 print $doleditor->Create(1);
1506 $note_private = GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') :
'';
1508 if (empty($user->socid)) {
1510 print
'<td class="tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
1513 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1514 print $doleditor->Create(1);
1519 $parameters = array(
'colspan' =>
' colspan="3"',
'cols' => 3);
1520 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
1521 print $hookmanager->resPrint;
1522 if (empty($reshook)) {
1523 print $object->showOptionals($extrafields,
'create', $parameters);
1531 print $form->buttonsSaveCancel(
"AddTrip");
1534} elseif ($id > 0 || $ref) {
1535 $result = $object->fetch($id, $ref);
1538 if (!in_array($object->fk_user_author, $user->getAllChildIds(1))) {
1539 if (!$user->hasRight(
'expensereport',
'readall') && !$user->hasRight(
'expensereport',
'lire_tous')
1540 && (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || !$user->hasRight(
'expensereport',
'writeall_advance'))) {
1543 print
'<div class="tabBar">';
1544 print $langs->trans(
'NotUserRightToView');
1557 if ($action ==
'edit' && ($object->status < 3 || $object->status == 99)) {
1558 print
"<form name='update' action=\"".$_SERVER[
'PHP_SELF'].
"\" method=\"post\">\n";
1559 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1560 print
'<input type="hidden" name="id" value="'.$id.
'">';
1561 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1565 if ($object->status == 99) {
1566 print
'<input type="hidden" name="action" value="updateFromRefuse">';
1568 print
'<input type="hidden" name="action" value="update">';
1571 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1573 print
'<table class="border centpercent">';
1576 print
'<td>'.$langs->trans(
"User").
'</td>';
1578 $userfee =
new User($db);
1579 if ($object->fk_user_author > 0) {
1580 $userfee->fetch($object->fk_user_author);
1581 print $userfee->getNomUrl(-1);
1586 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Ref").
'</td><td>';
1587 print $form->showrefnav($object,
'ref', $linkback, 1,
'ref',
'ref',
'');
1591 print
'<td>'.$langs->trans(
"DateStart").
'</td>';
1593 print $form->selectDate($object->date_debut,
'date_debut');
1597 print
'<td>'.$langs->trans(
"DateEnd").
'</td>';
1599 print $form->selectDate($object->date_fin,
'date_fin');
1605 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1607 $form->select_types_paiements($object->fk_c_paiement,
'fk_c_paiement');
1612 if ($object->status < 3) {
1614 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1616 $include_users = $object->fetch_users_approver_expensereport();
1617 $s = $form->select_dolusers($object->fk_user_validator,
"fk_user_validator", 1,
"", 0, $include_users);
1618 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1623 print
'<td>'.$langs->trans(
"VALIDOR").
'</td>';
1625 $userfee =
new User($db);
1626 $userfee->fetch($object->fk_user_valid);
1627 print $userfee->getNomUrl(-1);
1631 if ($object->status == 6) {
1633 print
'<td>'.$langs->trans(
"AUTHORPAIEMENT").
'</td>';
1635 $userfee =
new User($db);
1636 $userfee->fetch($user->id);
1637 print $userfee->getNomUrl(-1);
1649 print $form->buttonsSaveCancel(
"Modify");
1653 $taxlessUnitPriceDisabled =
getDolGlobalString(
'EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY') ?
' disabled' :
'';
1660 if ($action ==
'clone') {
1662 $criteriaforfilter =
'hierarchyme';
1663 if ($user->hasRight(
'expensereport',
'readall')) {
1664 $criteriaforfilter =
'';
1666 $formquestion = array(
1668 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'))
1671 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneExpenseReport', $object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1674 if ($action ==
'save') {
1675 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_validate",
"",
"", 1);
1678 if ($action ==
'save_from_refuse') {
1679 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_save_from_refuse",
"",
"", 1);
1682 if ($action ==
'delete') {
1683 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"DeleteTrip"), $langs->trans(
"ConfirmDeleteTrip"),
"confirm_delete",
"",
"", 1);
1686 if ($action ==
'validate') {
1687 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"ValideTrip"), $langs->trans(
"ConfirmValideTrip"),
"confirm_approve",
"",
"", 1);
1690 if ($action ==
'paid') {
1691 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"PaidTrip"), $langs->trans(
"ConfirmPaidTrip"),
"confirm_paid",
"",
"", 1);
1694 if ($action ==
'cancel') {
1695 $array_input = array(
'text'=>$langs->trans(
"ConfirmCancelTrip"), array(
'type'=>
"text",
'label'=>
'<strong>'.$langs->trans(
"Comment").
'</strong>',
'name'=>
"detail_cancel",
'value'=>
""));
1696 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Cancel"),
"",
"confirm_cancel", $array_input,
"", 1);
1699 if ($action ==
'setdraft') {
1700 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"BrouillonnerTrip"), $langs->trans(
"ConfirmBrouillonnerTrip"),
"confirm_setdraft",
"",
"", 1);
1703 if ($action ==
'refuse') {
1704 $array_input = array(
'text'=>$langs->trans(
"ConfirmRefuseTrip"), array(
'type'=>
"text",
'label'=>$langs->trans(
"Comment"),
'name'=>
"detail_refuse",
'value'=>
""));
1705 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Deny"),
'',
"confirm_refuse", $array_input,
"yes", 1);
1708 if ($action ==
'delete_line') {
1709 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id.
"&rowid=".
GETPOST(
'rowid',
'int'), $langs->trans(
"DeleteLine"), $langs->trans(
"ConfirmDeleteLine"),
"confirm_delete_line",
'',
'yes', 1);
1716 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1718 $morehtmlref =
'<div class="refidno">';
1719 $morehtmlref .=
'</div>';
1721 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
1723 print
'<div class="fichecenter">';
1724 print
'<div class="fichehalfleft">';
1725 print
'<div class="underbanner clearboth"></div>';
1727 print
'<table class="border tableforfield centpercent">';
1731 print
'<td class="titlefield">'.$langs->trans(
"User").
'</td>';
1733 if ($object->fk_user_author > 0) {
1734 $userauthor =
new User($db);
1735 $result = $userauthor->fetch($object->fk_user_author);
1738 } elseif ($result > 0) {
1739 print $userauthor->getNomUrl(-1);
1746 print
'<td class="titlefield">'.$langs->trans(
"Period").
'</td>';
1748 print
get_date_range($object->date_debut, $object->date_fin,
'day', $langs, 0);
1753 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1754 print
'<td>'.$object->fk_c_paiement.
'</td>';
1760 print
'<td>'.$langs->trans(
"DATE_SAVE").
'</td>';
1761 print
'<td>'.dol_print_date($object->date_valid,
'dayhour',
'tzuser');
1762 if ($object->status == 2 && $object->hasDelay(
'toapprove')) {
1763 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToApprove"));
1765 if ($object->status == 5 && $object->hasDelay(
'topay')) {
1766 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToPay"));
1774 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1776 if ($object->fk_user_validator > 0) {
1777 $userfee =
new User($db);
1778 $result = $userfee->fetch($object->fk_user_validator);
1780 print $userfee->getNomUrl(-1);
1782 if (empty($userfee->email) || !
isValidEmail($userfee->email)) {
1783 $langs->load(
"errors");
1784 print
img_warning($langs->trans(
"ErrorBadEMail", $userfee->email));
1790 print
'<td>'.$langs->trans(
"CANCEL_USER").
'</span></td>';
1792 if ($object->fk_user_cancel > 0) {
1793 $userfee =
new User($db);
1794 $result = $userfee->fetch($object->fk_user_cancel);
1796 print $userfee->getNomUrl(-1);
1802 print
'<td>'.$langs->trans(
"MOTIF_CANCEL").
'</td>';
1803 print
'<td>'.$object->detail_cancel.
'</td></tr>';
1806 print
'<td>'.$langs->trans(
"DATE_CANCEL").
'</td>';
1807 print
'<td>'.dol_print_date($object->date_cancel,
'dayhour',
'tzuser').
'</td></tr>';
1811 print
'<td>'.$langs->trans(
"ApprovedBy").
'</td>';
1813 if ($object->fk_user_approve > 0) {
1814 $userapp =
new User($db);
1815 $result = $userapp->fetch($object->fk_user_approve);
1817 print $userapp->getNomUrl(-1);
1823 print
'<td>'.$langs->trans(
"DateApprove").
'</td>';
1824 print
'<td>'.dol_print_date($object->date_approve,
'dayhour',
'tzuser').
'</td></tr>';
1828 if ($object->status == 99 || !empty($object->detail_refuse)) {
1830 print
'<td>'.$langs->trans(
"REFUSEUR").
'</td>';
1832 $userfee =
new User($db);
1833 $result = $userfee->fetch($object->fk_user_refuse);
1835 print $userfee->getNomUrl(-1);
1840 print
'<td>'.$langs->trans(
"DATE_REFUS").
'</td>';
1841 print
'<td>'.dol_print_date($object->date_refuse,
'dayhour',
'tzuser');
1842 if ($object->detail_refuse) {
1843 print
' - '.$object->detail_refuse;
1849 if ($object->status == $object::STATUS_CLOSED) {
1867 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1872 print
'<div class="fichehalfright">';
1873 print
'<div class="underbanner clearboth"></div>';
1875 print
'<table class="border tableforfield centpercent">';
1879 print
'<td class="titlefieldmiddle">'.$langs->trans(
"AmountHT").
'</td>';
1880 print
'<td class="nowrap amountcard">'.price($object->total_ht, 1,
'', 1, - 1, - 1, $conf->currency).
'</td>';
1899 print
'<td>'.$langs->trans(
"AmountVAT").
'</td>';
1900 print
'<td class="nowrap amountcard">'.price($object->total_tva, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1904 if ($mysoc->localtax1_assuj ==
"1" || $object->total_localtax1 != 0) {
1905 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1906 print
'<td class="valuefield">'.price($object->total_localtax1, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1908 if ($mysoc->localtax2_assuj ==
"1" || $object->total_localtax2 != 0) {
1909 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1910 print
'<td class="valuefield">'.price($object->total_localtax2, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1914 print
'<td>'.$langs->trans(
"AmountTTC").
'</td>';
1915 print
'<td class="nowrap amountcard">'.price($object->total_ttc, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1921 if (isModEnabled(
"banque")) {
1926 print
'<table class="noborder paymenttable centpercent">';
1928 print
'<tr class="liste_titre">';
1929 print
'<td class="liste_titre">'.$langs->trans(
'Payments').
'</td>';
1930 print
'<td class="liste_titre">'.$langs->trans(
'Date').
'</td>';
1931 print
'<td class="liste_titre">'.$langs->trans(
'Type').
'</td>';
1932 if (isModEnabled(
"banque")) {
1933 print
'<td class="liste_titre right">'.$langs->trans(
'BankAccount').
'</td>';
1935 print
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
1936 print
'<td class="liste_titre" width="18"> </td>';
1940 $sql =
"SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,";
1941 $sql .=
"c.code as payment_code, c.libelle as payment_type,";
1942 $sql .=
"ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal";
1943 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as e, ".MAIN_DB_PREFIX.
"payment_expensereport as p";
1944 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as c ON p.fk_typepayment = c.id";
1945 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
1946 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
1947 $sql .=
" WHERE e.rowid = ".((int) $id);
1948 $sql .=
" AND p.fk_expensereport = e.rowid";
1949 $sql .=
' AND e.entity IN ('.getEntity(
'expensereport').
')';
1950 $sql .=
" ORDER BY dp";
1952 $resql = $db->query($sql);
1954 $num = $db->num_rows($resql);
1958 $objp = $db->fetch_object($resql);
1960 $paymentexpensereportstatic->id = $objp->rowid;
1961 $paymentexpensereportstatic->datep = $db->jdate($objp->dp);
1962 $paymentexpensereportstatic->ref = $objp->rowid;
1963 $paymentexpensereportstatic->num_payment = $objp->num_payment;
1964 $paymentexpensereportstatic->type_code = $objp->payment_code;
1965 $paymentexpensereportstatic->type_label = $objp->payment_type;
1967 print
'<tr class="oddseven">';
1969 print $paymentexpensereportstatic->getNomUrl(1);
1971 print
'<td>'.dol_print_date($db->jdate($objp->dp),
'day').
"</td>\n";
1972 $labeltype = $langs->trans(
"PaymentType".$objp->payment_code) !=
"PaymentType".$objp->payment_code ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_type;
1973 print
"<td>".$labeltype.
' '.$objp->num_payment.
"</td>\n";
1975 if (isModEnabled(
"banque")) {
1976 $bankaccountstatic->id = $objp->baid;
1977 $bankaccountstatic->ref = $objp->baref;
1978 $bankaccountstatic->label = $objp->baref;
1979 $bankaccountstatic->number = $objp->banumber;
1981 if (isModEnabled(
'accounting')) {
1982 $bankaccountstatic->account_number = $objp->account_number;
1985 $accountingjournal->fetch($objp->fk_accountancy_journal);
1986 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1,
'', 1);
1989 print
'<td class="right">';
1990 if ($bankaccountstatic->id) {
1991 print $bankaccountstatic->getNomUrl(1,
'transactions');
1995 print
'<td class="right">'.price($objp->amount).
"</td>";
1998 $totalpaid += $objp->amount;
2001 if (!is_null($totalpaid)) {
2005 $remaintopay =
price2num($object->total_ttc - $totalpaid);
2006 $resteapayeraffiche = $remaintopay;
2008 $cssforamountpaymentcomplete =
'amountpaymentcomplete';
2011 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2012 $resteapayeraffiche = 0;
2013 } elseif ($object->paid == 0) {
2014 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2016 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AlreadyPaid").
':</td><td class="right">'.
price($totalpaid).
'</td><td></td></tr>';
2017 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AmountExpected").
':</td><td class="right">'.
price($object->total_ttc).
'</td><td></td></tr>';
2019 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"RemainderToPay").
':</td>';
2020 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td></td></tr>';
2031 print
'<div class="clearboth"></div><br>';
2033 print
'<div style="clear: both;"></div>';
2035 $actiontouse =
'updateline';
2036 if (($object->status == 0 || $object->status == 99) && $action !=
'editline') {
2037 $actiontouse =
'addline';
2040 print
'<form name="expensereport" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="post" >';
2041 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2042 print
'<input type="hidden" name="action" value="'.$actiontouse.
'">';
2043 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2044 print
'<input type="hidden" name="fk_expensereport" value="'.$object->id.
'" />';
2045 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2046 print
'<input type="hidden" name="page_y" value="">';
2048 print
'<div class="div-table-responsive-no-min">';
2049 print
'<table id="tablelines" class="noborder centpercent">';
2051 if (!empty($object->lines)) {
2055 print
'<tr class="liste_titre headerexpensereportdet">';
2056 print
'<td class="center linecollinenb">'.$langs->trans(
'LineNb').
'</td>';
2058 print
'<td class="center linecoldate">'.$langs->trans(
'Date').
'</td>';
2059 if (isModEnabled(
'project')) {
2060 print
'<td class="minwidth100imp linecolproject">'.$langs->trans(
'Project').
'</td>';
2062 print
'<td class="center linecoltype">'.$langs->trans(
'Type').
'</td>';
2064 print
'<td class="center linecolcarcategory">'.$langs->trans(
'CarCategory').
'</td>';
2066 print
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
2067 print
'<td class="right linecolvat">'.$langs->trans(
'VAT').
'</td>';
2068 print
'<td class="right linecolpriceuht">'.$langs->trans(
'PriceUHT').
'</td>';
2069 print
'<td class="right linecolpriceuttc">'.$langs->trans(
'PriceUTTC').
'</td>';
2070 print
'<td class="right linecolqty">'.$langs->trans(
'Qty').
'</td>';
2071 if ($action !=
'editline') {
2072 print
'<td class="right linecolamountht">'.$langs->trans(
'AmountHT').
'</td>';
2073 print
'<td class="right linecolamountttc">'.$langs->trans(
'AmountTTC').
'</td>';
2084 if (($object->status < 2 || $object->status == 99) && $user->hasRight(
'expensereport',
'creer')) {
2085 print
'<td class="right"></td>';
2089 foreach ($object->lines as &$line) {
2092 if ($action !=
'editline' || $line->id !=
GETPOST(
'rowid',
'int')) {
2093 print
'<tr class="oddeven linetr" data-id="'.$line->id.
'">';
2096 print
'<td class="center linecollinenb">';
2101 print
'<td class="center linecoldate">'.dol_print_date($db->jdate($line->date),
'day').
'</td>';
2104 if (isModEnabled(
'project')) {
2105 print
'<td class="lineproject">';
2106 if ($line->fk_project > 0) {
2107 $projecttmp->id = $line->fk_project;
2108 $projecttmp->ref = $line->projet_ref;
2109 $projecttmp->title = $line->projet_title;
2110 print $projecttmp->getNomUrl(1);
2116 if (isModEnabled(
'accounting')) {
2117 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
2119 $resaccountingaccount = $accountingaccount->fetch(0, $line->type_fees_accountancy_code, 1);
2121 $titlealt .= $langs->trans(
"AccountancyCode").
': ';
2122 if ($resaccountingaccount > 0) {
2123 $titlealt .= $accountingaccount->account_number;
2125 $titlealt .= $langs->trans(
"NotFound");
2131 print
'<td class="center linecoltype" title="'.dol_escape_htmltag($titlealt).
'">';
2132 $labeltype = ($langs->trans(($line->type_fees_code)) == $line->type_fees_code ? $line->type_fees_libelle : $langs->trans($line->type_fees_code));
2138 print
'<td class="fk_c_exp_tax_cat linecoltaxcat">';
2139 $exp_tax_cat_label =
dol_getIdFromCode($db, $line->fk_c_exp_tax_cat,
'c_exp_tax_cat',
'rowid',
'label');
2140 print $langs->trans($exp_tax_cat_label);
2145 print
'<td class="left linecolcomment">'.dol_nl2br($line->comments).
'</td>';
2148 print
'<td class="right linecolvatrate">'.vatrate($line->vatrate.($line->vat_src_code ?
' ('.$line->vat_src_code.
')' :
''), true).
'</td>';
2151 print
'<td class="right linecolunitht">';
2152 if (!empty($line->value_unit_ht)) {
2153 print
price($line->value_unit_ht);
2155 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $line->vatrate));
2156 $pricenettoshow =
price2num($line->value_unit / (1 + $tmpvat / 100),
'MU');
2157 print
price($pricenettoshow);
2161 print
'<td class="right linecolunitttc">'.price($line->value_unit).
'</td>';
2163 print
'<td class="right linecolqty">'.dol_escape_htmltag($line->qty).
'</td>';
2165 if ($action !=
'editline') {
2166 print
'<td class="right linecoltotalht">'.price($line->total_ht).
'</td>';
2167 print
'<td class="right linecoltotalttc">'.price($line->total_ttc).
'</td>';
2171 print
'<td class="center linecolpreview">';
2172 if ($line->fk_ecm_files > 0) {
2173 $modulepart =
'expensereport';
2174 $maxheightmini = 32;
2176 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2178 $relativepath = preg_replace(
'/expensereport\//',
'', $ecmfilesstatic->filepath);
2179 $fileinfo = pathinfo($ecmfilesstatic->filepath.
'/'.$ecmfilesstatic->filename);
2182 if (!
dol_is_file($conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$minifile)) {
2186 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
2187 if (empty($urlforhref)) {
2188 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(empty($object->entity) ? $conf->entity : $object->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
2189 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
2191 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2193 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="">';
2196 $modulepart =
'expensereport';
2198 if (preg_match(
'/\.pdf$/i', $ecmfilesstatic->filename)) {
2199 $filepdf = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename;
2200 $fileimage = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2201 $relativepathimage = $relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2203 $pdfexists = file_exists($filepdf);
2206 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2208 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2217 if ($pdfexists && !$error) {
2218 $heightforphotref = 70;
2219 if (!empty($conf->dol_optimize_smallscreen)) {
2220 $heightforphotref = 60;
2223 if (file_exists($fileimage)) {
2225 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
2226 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2227 print
'<img height="'.$heightforphotref.
'" class="photo photowithmargin photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2233 if (!$thumbshown && $fileinfo[
'extension'] ==
'pdf' && !empty($filepdf) && !empty($relativepath) && !empty($fileinfo[
'filename'])) {
2235 $imgpreview = $formFile->showPreview([], $modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 0);
2237 } elseif (!$thumbshown) {
2238 print
img_mime($ecmfilesstatic->filename);
2245 print
'<td class="nowrap right linecolwarning">';
2246 print !empty($line->rule_warning_message) ?
img_warning(html_entity_decode($line->rule_warning_message)) :
' ';
2251 print
'<td class="nowrap right linecolaction">';
2253 print
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$line->rowid.
'">';
2255 print
'</a> ';
2256 print
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete_line&token='.newToken().
'&rowid='.$line->rowid.
'">';
2266 if ($action ==
'editline' && $line->id ==
GETPOST(
'rowid',
'int')) {
2269 if (isModEnabled(
'project')) {
2276 print
'<!-- line of expense report -->'.
"\n";
2277 print
'<tr class="tredited">';
2279 print
'<td class="center">';
2283 print
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
2284 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2285 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2288 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2289 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2293 print
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
2294 print
'<script type="text/javascript">'.
"\n";
2295 print
'$(document).ready(function() {
2296 $( ".auploadnewfilenow" ).click(function() {
2297 jQuery(".truploadnewfilenow").toggle();
2298 jQuery(".trattachnewfilenow").hide();
2301 $( ".aattachtodoc" ).click(function() {
2302 jQuery(".trattachnewfilenow").toggle();
2303 jQuery(".truploadnewfilenow").hide();
2306 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array'))) {
2307 print
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
2310 jQuery("form[name=\"expensereport\"]").submit(function() {
2311 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2312 jQuery("input[name=\"sendit\"]").val("");
2319 print
'</script>'.
"\n";
2322 $filenamelinked =
'';
2323 if ($line->fk_ecm_files > 0) {
2324 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2326 $filenamelinked = $ecmfilesstatic->filename;
2330 $tredited =
'tredited';
2331 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2332 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2334 print
'<tr class="oddeven tredited">';
2339 print
'<td class="center">';
2340 print $form->selectDate($line->date,
'date');
2344 if (isModEnabled(
'project')) {
2346 $formproject->select_projects(-1, $line->fk_project,
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2351 print
'<td class="center">';
2352 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees,
'fk_c_type_fees');
2356 print
'<td class="fk_c_exp_tax_cat">';
2357 $params = array(
'fk_expense' => $object->id,
'fk_expense_det' => $line->id,
'date' => $line->date);
2358 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);
2364 print
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
2368 $selectedvat =
price2num($line->vatrate).(!empty($line->vat_src_code) ?
' ('.$line->vat_src_code.
')' :
'');
2369 print
'<td class="right">';
2370 print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ?
GETPOST(
"vatrate") : $selectedvat), $mysoc,
'', 0, 0,
'', false, 1);
2374 print
'<td class="right">';
2375 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.
' />';
2379 print
'<td class="right">';
2380 print
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
2384 print
'<td class="right">';
2385 print
'<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';
2392 print
'<td class="center">';
2396 print
'<td class="center">';
2400 print
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
2401 print $form->buttonsSaveCancel(
'Save',
'Cancel', array(), 0,
'small');
2417 if (isModEnabled(
'project')) {
2420 if ($action !=
'editline') {
2424 $nbFiles = $nbLinks = 0;
2425 $arrayoffiles = array();
2427 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2428 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2429 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2432 $nbFiles = count($arrayoffiles);
2433 $nbLinks =
Link::count($db, $object->element, $object->id);
2437 print
'<tr class="liste_titre">';
2438 print
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
2439 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2440 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2443 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2444 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2448 print
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
2449 print
'<script type="text/javascript">'.
"\n";
2450 print
'$(document).ready(function() {
2451 $( ".auploadnewfilenow" ).click(function() {
2452 console.log("We click on toggle of auploadnewfilenow");
2453 jQuery(".truploadnewfilenow").toggle();
2454 jQuery(".trattachnewfilenow").hide();
2455 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2456 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2458 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2460 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2463 $( ".aattachtodoc" ).click(function() {
2464 console.log("We click on toggle of aattachtodoc");
2465 jQuery(".trattachnewfilenow").toggle();
2466 jQuery(".truploadnewfilenow").hide();
2467 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2470 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array')) && $action !=
'updateline') {
2471 print
'jQuery(".trattachnewfilenow").show();'.
"\n";
2474 jQuery("form[name=\"expensereport\"]").submit(function() {
2475 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2476 /* 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. */
2477 jQuery("input[name=\"sendit\"]").val("");
2478 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2480 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2487 print
'</script>'.
"\n";
2491 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2492 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2494 print
'<tr class="liste_titre expensereportcreate">';
2496 print
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
2497 if (isModEnabled(
'project')) {
2498 print
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
2500 print
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
2502 print
'<td>'.$langs->trans(
'CarCategory').
'</td>';
2504 print
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
2505 print
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
2506 print
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
2507 print
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
2508 print
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
2515 print
'<tr class="oddeven nohover">';
2521 print
'<td class="center inputdate">';
2522 print $form->selectDate(!empty($date) ? $date : -1,
'date', 0, 0, 0,
'', 1, 1);
2526 if (isModEnabled(
'project')) {
2527 print
'<td class="inputproject">';
2528 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0,
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2533 print
'<td class="center inputtype">';
2534 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees :
"",
'fk_c_type_fees', 1);
2538 print
'<td class="fk_c_exp_tax_cat">';
2539 $params = array(
'fk_expense' => $object->id);
2540 print $form->selectExpenseCategories(
'',
'fk_c_exp_tax_cat', 1, array(),
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2545 print
'<td class="inputcomment">';
2546 print
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments :
"", 0, 1).
'</textarea>';
2550 print
'<td class="right inputvat">';
2554 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS =
'none';
2556 print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), $mysoc,
'', 0, 0,
'', false, 1);
2560 print
'<td class="right inputpricenet">';
2561 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.
' />';
2565 print
'<td class="right inputtax">';
2566 print
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit : 0)).
'">';
2570 print
'<td class="right inputqty">';
2571 print
'<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">';
2577 if ($action !=
'editline') {
2578 print
'<td class="right"></td>';
2579 print
'<td class="right"></td>';
2582 print
'<td class="center inputbuttons">';
2583 print $form->buttonsSaveCancel(
"Add",
'',
'', 1,
'reposition');
2594 /* JQuery for product free or predefined select */
2595 jQuery(document).ready(function() {
2596 jQuery("#value_unit_ht").keyup(function(event) {
2597 console.log(event.which); // discard event tag and arrows
2598 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2599 jQuery("#value_unit").val("");
2602 jQuery("#value_unit").keyup(function(event) {
2603 console.log(event.which); // discard event tag and arrows
2604 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2605 jQuery("#value_unit_ht").val("");
2613 /* unit price coef calculation */
2614 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2615 console.log("We change a parameter");
2617 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2618 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2619 let tva = jQuery("#vatrate").find(":selected").val();
2620 let qty = jQuery(".input_qty").val();
2622 let path = "'.dol_buildpath(
"/expensereport/ajax/ajaxik.php", 1).
'";
2623 path += "?fk_c_exp_tax_cat="+tax_cat;
2624 path += "&fk_expense="+'.((int) $object->id).
';
2625 path += "&vatrate="+tva;
2626 path += "&qty="+qty;
2628 if (type_fee == 4) { // frais_kilométriques
2629 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2637 success: function(response) {
2638 if (response.response_status == "success"){';
2642 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2643 jQuery("#value_unit").trigger("change");
2647 jQuery("#value_unit_ht").val(response.data);
2648 jQuery("#value_unit_ht").trigger("change");
2649 jQuery("#value_unit").val("");
2654 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ) {
2655 console.log("We get an error result");
2656 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2662 /*console.log(event.which); // discard event tag and arrows
2663 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2664 jQuery("#value_unit_ht").val("");
2684 print
'Record not found';
2695print
'<div class="tabsAction">';
2697if ($action !=
'create' && $action !=
'edit' && $action !=
'editline') {
2699 $object->fetch($id, $ref);
2702 if (empty($user->socid)) {
2705 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>';
2717 if (in_array($object->fk_user_author, $user->getAllChildIds(1)) || $user->hasRight(
'expensereport',
'writeall_advance')) {
2719 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>';
2722 if (count($object->lines) > 0) {
2723 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>';
2734 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2736 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>';
2741 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>';
2746 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2748 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>';
2758 if (in_array($object->fk_user_author, $user->getAllChildIds(1))) {
2760 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>';
2768 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=validate&id='.$object->id.
'">'.$langs->trans(
'Approve').
'</a></div>';
2770 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2773 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2775 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2784 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2790 if ($remaintopay == 0) {
2791 print
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
2793 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>';
2800 if ($object->paid == 0) {
2801 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>";
2805 if ($user->hasRight(
'expensereport',
'creer') && ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) && $object->status ==
ExpenseReport::STATUS_APPROVED) {
2807 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>';
2811 if (($user->hasRight(
'expensereport',
'approve') || $user->hasRight(
'expensereport',
'to_paid')) && $object->status ==
ExpenseReport::STATUS_CLOSED) {
2813 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>';
2818 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>';
2822 if ($user->hasRight(
'expensereport',
'creer')) {
2823 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>';
2829 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>';
2832 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>';
2835 $parameters = array();
2836 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2843if (
GETPOST(
'modelselected',
'alpha')) {
2844 $action =
'presend';
2847if ($action !=
'presend') {
2852 print
'<div class="fichecenter"><div class="fichehalfleft">';
2853 print
'<a name="builddoc"></a>';
2855 if ($user->hasRight(
'expensereport',
'creer') && $action !=
'create' && $action !=
'edit') {
2858 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
2859 $genallowed = $user->rights->expensereport->creer;
2860 $delallowed = $user->rights->expensereport->creer;
2862 print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2863 $somethingshown = $formfile->numoffiles;
2875 print
'</div><div class="fichehalfright">';
2877 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2879 $somethingshown =
$formactions->showactions($object,
'expensereport',
null);
2881 print
'</div></div>';
2885$modelmail =
'expensereport_send';
2886$defaulttopic =
'SendExpenseReportRef';
2887$diroutput = $conf->expensereport->dir_output;
2888$trackid =
'exp'.$object->id;
2890include 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...
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_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
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.