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).
'">';
2234 print
img_mime($ecmfilesstatic->filename);
2241 print
'<td class="nowrap right linecolwarning">';
2242 print !empty($line->rule_warning_message) ?
img_warning(html_entity_decode($line->rule_warning_message)) :
' ';
2247 print
'<td class="nowrap right linecolaction">';
2249 print
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$line->rowid.
'">';
2251 print
'</a> ';
2252 print
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete_line&token='.newToken().
'&rowid='.$line->rowid.
'">';
2262 if ($action ==
'editline' && $line->id ==
GETPOST(
'rowid',
'int')) {
2265 if (isModEnabled(
'project')) {
2272 print
'<!-- line of expense report -->'.
"\n";
2273 print
'<tr class="tredited">';
2275 print
'<td class="center">';
2279 print
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
2280 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2281 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2284 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2285 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2289 print
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
2290 print
'<script type="text/javascript">'.
"\n";
2291 print
'$(document).ready(function() {
2292 $( ".auploadnewfilenow" ).click(function() {
2293 jQuery(".truploadnewfilenow").toggle();
2294 jQuery(".trattachnewfilenow").hide();
2297 $( ".aattachtodoc" ).click(function() {
2298 jQuery(".trattachnewfilenow").toggle();
2299 jQuery(".truploadnewfilenow").hide();
2302 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array'))) {
2303 print
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
2306 jQuery("form[name=\"expensereport\"]").submit(function() {
2307 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2308 jQuery("input[name=\"sendit\"]").val("");
2315 print
'</script>'.
"\n";
2318 $filenamelinked =
'';
2319 if ($line->fk_ecm_files > 0) {
2320 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2322 $filenamelinked = $ecmfilesstatic->filename;
2326 $tredited =
'tredited';
2327 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2328 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2330 print
'<tr class="oddeven tredited">';
2335 print
'<td class="center">';
2336 print $form->selectDate($line->date,
'date');
2340 if (isModEnabled(
'project')) {
2342 $formproject->select_projects(-1, $line->fk_project,
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2347 print
'<td class="center">';
2348 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees,
'fk_c_type_fees');
2352 print
'<td class="fk_c_exp_tax_cat">';
2353 $params = array(
'fk_expense' => $object->id,
'fk_expense_det' => $line->id,
'date' => $line->date);
2354 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);
2360 print
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
2364 $selectedvat =
price2num($line->vatrate).(!empty($line->vat_src_code) ?
' ('.$line->vat_src_code.
')' :
'');
2365 print
'<td class="right">';
2366 print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ?
GETPOST(
"vatrate") : $selectedvat), $mysoc,
'', 0, 0,
'', false, 1);
2370 print
'<td class="right">';
2371 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.
' />';
2375 print
'<td class="right">';
2376 print
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
2380 print
'<td class="right">';
2381 print
'<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';
2388 print
'<td class="center">';
2392 print
'<td class="center">';
2396 print
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
2397 print $form->buttonsSaveCancel(
'Save',
'Cancel', array(), 0,
'small');
2413 if (isModEnabled(
'project')) {
2416 if ($action !=
'editline') {
2420 $nbFiles = $nbLinks = 0;
2421 $arrayoffiles = array();
2423 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2424 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2425 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2428 $nbFiles = count($arrayoffiles);
2429 $nbLinks =
Link::count($db, $object->element, $object->id);
2433 print
'<tr class="liste_titre">';
2434 print
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
2435 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2436 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2439 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2440 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2444 print
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
2445 print
'<script type="text/javascript">'.
"\n";
2446 print
'$(document).ready(function() {
2447 $( ".auploadnewfilenow" ).click(function() {
2448 console.log("We click on toggle of auploadnewfilenow");
2449 jQuery(".truploadnewfilenow").toggle();
2450 jQuery(".trattachnewfilenow").hide();
2451 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2452 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2454 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2456 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2459 $( ".aattachtodoc" ).click(function() {
2460 console.log("We click on toggle of aattachtodoc");
2461 jQuery(".trattachnewfilenow").toggle();
2462 jQuery(".truploadnewfilenow").hide();
2463 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2466 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array')) && $action !=
'updateline') {
2467 print
'jQuery(".trattachnewfilenow").show();'.
"\n";
2470 jQuery("form[name=\"expensereport\"]").submit(function() {
2471 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2472 /* 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. */
2473 jQuery("input[name=\"sendit\"]").val("");
2474 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2476 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2483 print
'</script>'.
"\n";
2487 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2488 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2490 print
'<tr class="liste_titre expensereportcreate">';
2492 print
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
2493 if (isModEnabled(
'project')) {
2494 print
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
2496 print
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
2498 print
'<td>'.$langs->trans(
'CarCategory').
'</td>';
2500 print
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
2501 print
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
2502 print
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
2503 print
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
2504 print
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
2511 print
'<tr class="oddeven nohover">';
2517 print
'<td class="center inputdate">';
2518 print $form->selectDate(!empty($date) ? $date : -1,
'date', 0, 0, 0,
'', 1, 1);
2522 if (isModEnabled(
'project')) {
2523 print
'<td class="inputproject">';
2524 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0,
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2529 print
'<td class="center inputtype">';
2530 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees :
"",
'fk_c_type_fees', 1);
2534 print
'<td class="fk_c_exp_tax_cat">';
2535 $params = array(
'fk_expense' => $object->id);
2536 print $form->selectExpenseCategories(
'',
'fk_c_exp_tax_cat', 1, array(),
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2541 print
'<td class="inputcomment">';
2542 print
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments :
"", 0, 1).
'</textarea>';
2546 print
'<td class="right inputvat">';
2550 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS =
'none';
2552 print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), $mysoc,
'', 0, 0,
'', false, 1);
2556 print
'<td class="right inputpricenet">';
2557 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.
' />';
2561 print
'<td class="right inputtax">';
2562 print
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit : 0)).
'">';
2566 print
'<td class="right inputqty">';
2567 print
'<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">';
2573 if ($action !=
'editline') {
2574 print
'<td class="right"></td>';
2575 print
'<td class="right"></td>';
2578 print
'<td class="center inputbuttons">';
2579 print $form->buttonsSaveCancel(
"Add",
'',
'', 1,
'reposition');
2590 /* JQuery for product free or predefined select */
2591 jQuery(document).ready(function() {
2592 jQuery("#value_unit_ht").keyup(function(event) {
2593 console.log(event.which); // discard event tag and arrows
2594 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2595 jQuery("#value_unit").val("");
2598 jQuery("#value_unit").keyup(function(event) {
2599 console.log(event.which); // discard event tag and arrows
2600 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2601 jQuery("#value_unit_ht").val("");
2609 /* unit price coef calculation */
2610 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2611 console.log("We change a parameter");
2613 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2614 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2615 let tva = jQuery("#vatrate").find(":selected").val();
2616 let qty = jQuery(".input_qty").val();
2618 let path = "'.dol_buildpath(
"/expensereport/ajax/ajaxik.php", 1).
'";
2619 path += "?fk_c_exp_tax_cat="+tax_cat;
2620 path += "&fk_expense="+'.((int) $object->id).
';
2621 path += "&vatrate="+tva;
2622 path += "&qty="+qty;
2624 if (type_fee == 4) { // frais_kilométriques
2625 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2633 success: function(response) {
2634 if (response.response_status == "success"){';
2638 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2639 jQuery("#value_unit").trigger("change");
2643 jQuery("#value_unit_ht").val(response.data);
2644 jQuery("#value_unit_ht").trigger("change");
2645 jQuery("#value_unit").val("");
2650 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ) {
2651 console.log("We get an error result");
2652 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2658 /*console.log(event.which); // discard event tag and arrows
2659 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2660 jQuery("#value_unit_ht").val("");
2680 print
'Record not found';
2691print
'<div class="tabsAction">';
2693if ($action !=
'create' && $action !=
'edit' && $action !=
'editline') {
2695 $object->fetch($id, $ref);
2698 if (empty($user->socid)) {
2701 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>';
2713 if (in_array($object->fk_user_author, $user->getAllChildIds(1)) || $user->hasRight(
'expensereport',
'writeall_advance')) {
2715 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>';
2718 if (count($object->lines) > 0) {
2719 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>';
2730 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2732 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>';
2737 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>';
2742 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2744 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>';
2754 if (in_array($object->fk_user_author, $user->getAllChildIds(1))) {
2756 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>';
2764 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=validate&id='.$object->id.
'">'.$langs->trans(
'Approve').
'</a></div>';
2766 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2769 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2771 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2780 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2786 if ($remaintopay == 0) {
2787 print
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
2789 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>';
2796 if ($object->paid == 0) {
2797 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>";
2801 if ($user->hasRight(
'expensereport',
'creer') && ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) && $object->status ==
ExpenseReport::STATUS_APPROVED) {
2803 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>';
2807 if (($user->hasRight(
'expensereport',
'approve') || $user->hasRight(
'expensereport',
'to_paid')) && $object->status ==
ExpenseReport::STATUS_CLOSED) {
2809 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>';
2814 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>';
2818 if ($user->hasRight(
'expensereport',
'creer')) {
2819 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>';
2825 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>';
2828 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>';
2831 $parameters = array();
2832 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2839if (
GETPOST(
'modelselected',
'alpha')) {
2840 $action =
'presend';
2843if ($action !=
'presend') {
2848 print
'<div class="fichecenter"><div class="fichehalfleft">';
2849 print
'<a name="builddoc"></a>';
2851 if ($user->hasRight(
'expensereport',
'creer') && $action !=
'create' && $action !=
'edit') {
2854 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
2855 $genallowed = $user->rights->expensereport->creer;
2856 $delallowed = $user->rights->expensereport->creer;
2858 print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2859 $somethingshown = $formfile->numoffiles;
2871 print
'</div><div class="fichehalfright">';
2873 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2875 $somethingshown =
$formactions->showactions($object,
'expensereport',
null);
2877 print
'</div></div>';
2881$modelmail =
'expensereport_send';
2882$defaulttopic =
'SendExpenseReportRef';
2883$diroutput = $conf->expensereport->dir_output;
2884$trackid =
'exp'.$object->id;
2886include 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.