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);
73if (!empty($conf->global->EXPENSEREPORT_PREFILL_DATES_WITH_CURRENT_MONTH)) {
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;
99$hidedetails = (
GETPOST(
'hidedetails',
'int') ?
GETPOST(
'hidedetails',
'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0));
100$hidedesc = (
GETPOST(
'hidedesc',
'int') ?
GETPOST(
'hidedesc',
'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DESC) ? 1 : 0));
101$hideref = (
GETPOST(
'hideref',
'int') ?
GETPOST(
'hideref',
'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_REF) ? 1 : 0));
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') && !empty($conf->global->EXPENSEREPORT_PROJECT_IS_REQUIRED);
123$fileRequired = !empty($conf->global->EXPENSEREPORT_FILE_IS_REQUIRED);
125if ($object->id > 0) {
128 if (!empty($user->rights->expensereport->readall)) {
131 if (!empty($user->rights->expensereport->lire) && in_array($object->fk_user_author, $childids)) {
140if (!empty($user->rights->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->rights->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->rights->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 ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->expensereport->creer))
269 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->expensereport->creer) && empty($user->rights->expensereport->writeall_advance))) {
274 if (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || empty($user->rights->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);
298 if (!$error && empty($conf->global->EXPENSEREPORT_ALLOW_OVERLAPPING_PERIODS)) {
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->rights->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') {
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->rights->expensereport->creer) {
384 $result = $object->setValidate($user);
388 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
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) {
425 $filename = array(); $filedir = array(); $mimetype = array();
428 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
429 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
430 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
433 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForApproval");
436 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
437 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
438 $message = $langs->transnoentities(
"ExpenseReportWaitingForApprovalMessage", $expediteur->getFullName($langs),
get_date_range($object->date_debut, $object->date_fin,
'', $langs), $link);
453 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
457 $result = $mailfile->sendfile();
459 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
462 $langs->load(
"other");
463 if ($mailfile->error) {
465 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
466 $mesg .=
'<br>'.$mailfile->error;
469 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
477 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
484 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
491 if ($action ==
"confirm_save_from_refuse" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->rights->expensereport->creer) {
494 $result = $object->set_save_from_refuse($user);
498 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
499 $outputlangs = $langs;
502 $newlang =
GETPOST(
'lang_id',
'aZ09');
505 $newlang = $object->thirdparty->default_lang;
507 if (!empty($newlang)) {
509 $outputlangs->setDefaultLang($newlang);
511 $model = $object->model_pdf;
512 $ret = $object->fetch($id);
514 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
522 $destinataire =
new User($db);
523 $destinataire->fetch($object->fk_user_validator);
524 $emailTo = $destinataire->email;
527 $expediteur =
new User($db);
528 $expediteur->fetch($object->fk_user_author);
529 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
531 if ($emailFrom && $emailTo) {
532 $filename = array(); $filedir = array(); $mimetype = array();
535 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
536 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
537 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
540 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForReApproval");
543 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
544 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
545 $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);
564 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
568 $result = $mailfile->sendfile();
570 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
572 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
575 $langs->load(
"other");
576 if ($mailfile->error) {
578 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
579 $mesg .=
'<br>'.$mailfile->error;
582 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
590 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
599 if ($action ==
"confirm_approve" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->rights->expensereport->approve) {
603 $result = $object->setApproved($user);
607 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
608 $outputlangs = $langs;
611 $newlang =
GETPOST(
'lang_id',
'aZ09');
614 $newlang = $object->thirdparty->default_lang;
616 if (!empty($newlang)) {
618 $outputlangs->setDefaultLang($newlang);
620 $model = $object->model_pdf;
621 $ret = $object->fetch($id);
623 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
631 $destinataire =
new User($db);
632 $destinataire->fetch($object->fk_user_author);
633 $emailTo = $destinataire->email;
636 $emailCC = $conf->global->NDF_CC_EMAILS;
637 if (empty($emailTo)) {
642 $expediteur =
new User($db);
643 $expediteur->fetch($object->fk_user_approve > 0 ? $object->fk_user_approve : $object->fk_user_validator);
644 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
646 if ($emailFrom && $emailTo) {
647 $filename = array(); $filedir = array(); $mimetype = array();
650 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
651 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
652 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
655 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportApproved");
658 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
659 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
660 $message = $langs->transnoentities(
"ExpenseReportApprovedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
677 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
681 $result = $mailfile->sendfile();
683 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
685 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
688 $langs->load(
"other");
689 if ($mailfile->error) {
691 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
692 $mesg .=
'<br>'.$mailfile->error;
695 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
703 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
712 if ($action ==
"confirm_refuse" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->rights->expensereport->approve) {
716 $detailRefuse =
GETPOST(
'detail_refuse',
'alpha');
717 $result = $object->setDeny($user, $detailRefuse);
721 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
722 $outputlangs = $langs;
725 $newlang =
GETPOST(
'lang_id',
'aZ09');
728 $newlang = $object->thirdparty->default_lang;
730 if (!empty($newlang)) {
732 $outputlangs->setDefaultLang($newlang);
734 $model = $object->model_pdf;
735 $ret = $object->fetch($id);
737 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
745 $destinataire =
new User($db);
746 $destinataire->fetch($object->fk_user_author);
747 $emailTo = $destinataire->email;
750 $expediteur =
new User($db);
751 $expediteur->fetch($object->fk_user_refuse);
752 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
754 if ($emailFrom && $emailTo) {
755 $filename = array(); $filedir = array(); $mimetype = array();
758 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
759 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
760 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
763 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportRefused");
766 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
767 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
768 $message = $langs->transnoentities(
"ExpenseReportRefusedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailRefuse, $link);
786 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
790 $result = $mailfile->sendfile();
792 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
794 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
797 $langs->load(
"other");
798 if ($mailfile->error) {
800 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
801 $mesg .=
'<br>'.$mailfile->error;
804 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
812 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
822 if ($action ==
"confirm_cancel" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->rights->expensereport->creer) {
823 if (!
GETPOST(
'detail_cancel',
'alpha')) {
824 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Comment")),
null,
'errors');
829 if ($user->id == $object->fk_user_valid || $user->id == $object->fk_user_author) {
830 $detailCancel =
GETPOST(
'detail_cancel',
'alpha');
831 $result = $object->set_cancel($user, $detailCancel);
835 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
836 $outputlangs = $langs;
839 $newlang =
GETPOST(
'lang_id',
'aZ09');
842 $newlang = $object->thirdparty->default_lang;
844 if (!empty($newlang)) {
846 $outputlangs->setDefaultLang($newlang);
848 $model = $object->model_pdf;
849 $ret = $object->fetch($id);
851 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
859 $destinataire =
new User($db);
860 $destinataire->fetch($object->fk_user_author);
861 $emailTo = $destinataire->email;
864 $expediteur =
new User($db);
865 $expediteur->fetch($object->fk_user_cancel);
866 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
868 if ($emailFrom && $emailTo) {
869 $filename = array(); $filedir = array(); $mimetype = array();
872 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
873 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
874 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
877 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportCanceled");
880 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
881 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
882 $message = $langs->transnoentities(
"ExpenseReportCanceledMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailCancel, $link);
900 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
904 $result = $mailfile->sendfile();
906 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
908 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
911 $langs->load(
"other");
912 if ($mailfile->error) {
914 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
915 $mesg .=
'<br>'.$mailfile->error;
918 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
926 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
939 if ($action ==
"confirm_setdraft" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->rights->expensereport->creer) {
942 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
943 $result = $object->setStatut(0);
947 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
948 $outputlangs = $langs;
951 $newlang =
GETPOST(
'lang_id',
'aZ09');
954 $newlang = $object->thirdparty->default_lang;
956 if (!empty($newlang)) {
958 $outputlangs->setDefaultLang($newlang);
960 $model = $object->model_pdf;
961 $ret = $object->fetch($id);
963 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
968 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
978 if ($action ==
'set_unpaid' && $id > 0 && $user->rights->expensereport->to_paid) {
982 $result = $object->setUnpaid($user);
986 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
987 $outputlangs = $langs;
990 $newlang =
GETPOST(
'lang_id',
'aZ09');
993 $newlang = $object->thirdparty->default_lang;
995 if (!empty($newlang)) {
997 $outputlangs->setDefaultLang($newlang);
999 $model = $object->model_pdf;
1000 $ret = $object->fetch($id);
1002 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1007 if ($action ==
'set_paid' && $id > 0 && $user->rights->expensereport->to_paid) {
1009 $object->fetch($id);
1011 $result = $object->setPaid($id, $user);
1015 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1016 $outputlangs = $langs;
1019 $newlang =
GETPOST(
'lang_id',
'aZ09');
1022 $newlang = $object->thirdparty->default_lang;
1024 if (!empty($newlang)) {
1025 $outputlangs =
new Translate(
"", $conf);
1026 $outputlangs->setDefaultLang($newlang);
1028 $model = $object->model_pdf;
1029 $ret = $object->fetch($id);
1031 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1039 $destinataire =
new User($db);
1040 $destinataire->fetch($object->fk_user_author);
1041 $emailTo = $destinataire->email;
1044 $expediteur =
new User($db);
1045 $expediteur->fetch($user->id);
1046 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
1048 if ($emailFrom && $emailTo) {
1049 $filename = array(); $filedir = array(); $mimetype = array();
1052 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
1053 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
1054 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
1057 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportPaid");
1060 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
1061 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
1062 $message = $langs->transnoentities(
"ExpenseReportPaidMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
1065 $object->setDocModel($user,
"");
1066 $resultPDF = expensereport_pdf_create($db, $object,
'',
"", $langs);
1069 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
1073 $result = $mailfile->sendfile();
1075 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
1077 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
1080 $langs->load(
"other");
1081 if ($mailfile->error) {
1083 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
1084 $mesg .=
'<br>'.$mailfile->error;
1087 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
1095 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
1104 if ($action ==
"addline" && $user->rights->expensereport->creer) {
1109 if (GETPOSTISSET(
'attachfile')) {
1110 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1111 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1112 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1113 $entityprefix = ($conf->entity !=
'1') ? $conf->entity.
'/' :
'';
1114 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1116 $ecmfiles->fetch(0,
'', $relativepath);
1117 $fk_ecm_files = $ecmfiles->id;
1122 if (empty($vatrate)) {
1125 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1129 if (empty($value_unit)) {
1130 $value_unit =
price2num($value_unit_ht + ($value_unit_ht * $tmpvat / 100),
'MU');
1133 $fk_c_exp_tax_cat =
GETPOST(
'fk_c_exp_tax_cat',
'int');
1140 if (!($fk_c_type_fees > 0)) {
1142 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1146 if ((
float) $tmpvat < 0 || $tmpvat ===
'') {
1148 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"VAT")),
null,
'errors');
1153 if (empty($date) || $date ==
"--") {
1155 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
1156 } elseif ($date < $object->date_debut || $date > ($object->date_fin + (24 * 3600 - 1))) {
1158 $langs->load(
"errors");
1159 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null,
'warnings');
1163 if ($value_unit == 0) {
1165 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PriceUTTC")),
null,
'errors');
1169 if ($projectRequired && $fk_project <= 0) {
1171 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1175 if ($fileRequired && $fk_ecm_files == 0) {
1177 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"File")),
null,
'errors');
1184 $result = $object->addline($qty, $value_unit, $fk_c_type_fees, $vatrate, $date, $comments, $fk_project, $fk_c_exp_tax_cat, $type, $fk_ecm_files);
1186 $ret = $object->fetch($object->id);
1188 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1190 $outputlangs = $langs;
1191 $newlang =
GETPOST(
'lang_id',
'alpha');
1193 $user =
new User($db);
1194 $user->fetch($object->fk_user_author);
1195 $newlang = $user->lang;
1197 if (!empty($newlang)) {
1198 $outputlangs =
new Translate(
"", $conf);
1199 $outputlangs->setDefaultLang($newlang);
1202 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1206 unset($value_unit_ht);
1210 unset($fk_c_type_fees);
1221 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOST(
'id',
'int'));
1228 if ($action ==
'confirm_delete_line' &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $user->rights->expensereport->creer) {
1230 $object->fetch($id);
1233 $object_ligne->fetch(
GETPOST(
"rowid",
'int'));
1234 $total_ht = $object_ligne->total_ht;
1235 $total_tva = $object_ligne->total_tva;
1237 $result = $object->deleteline(
GETPOST(
"rowid",
'int'), $user);
1241 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1242 $outputlangs = $langs;
1245 $newlang =
GETPOST(
'lang_id',
'aZ09');
1248 $newlang = $object->thirdparty->default_lang;
1250 if (!empty($newlang)) {
1251 $outputlangs =
new Translate(
"", $conf);
1252 $outputlangs->setDefaultLang($newlang);
1254 $model = $object->model_pdf;
1255 $ret = $object->fetch($id);
1257 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1261 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOST(
'id',
'int'));
1268 if ($action ==
"updateline" && $user->rights->expensereport->creer) {
1270 $object->fetch($id);
1274 if (GETPOSTISSET(
'attachfile')) {
1275 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1276 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1277 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1278 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1280 $ecmfiles->fetch(0,
'', $relativepath);
1281 $fk_ecm_files = $ecmfiles->id;
1285 $rowid =
GETPOST(
'rowid',
'int');
1286 $type_fees_id =
GETPOST(
'fk_c_type_fees',
'int');
1287 $fk_c_exp_tax_cat =
GETPOST(
'fk_c_exp_tax_cat',
'int');
1288 $projet_id = $fk_project;
1289 $comments =
GETPOST(
'comments',
'restricthtml');
1291 $vatrate =
GETPOST(
'vatrate',
'alpha');
1294 if (empty($vatrate)) {
1297 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1301 if (empty($value_unit)) {
1302 $value_unit =
price2num($value_unit_ht + ($value_unit_ht * $tmpvat / 100),
'MU');
1305 if (!
GETPOST(
'fk_c_type_fees',
'int') > 0) {
1307 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1310 if ((
float) $tmpvat < 0 || $tmpvat ==
'') {
1312 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Vat")),
null,
'errors');
1316 if ($date < $object->date_debut || $date > ($object->date_fin + (24 * 3600 - 1))) {
1317 $langs->load(
"errors");
1318 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null,
'warnings');
1322 if ($projectRequired && $projet_id <= 0) {
1324 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1329 $result = $object->updateline($rowid, $type_fees_id, $projet_id, $vatrate, $comments, $qty, $value_unit, $date, $id, $fk_c_exp_tax_cat, $fk_ecm_files);
1333 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1334 $outputlangs = $langs;
1337 $newlang =
GETPOST(
'lang_id',
'aZ09');
1340 $newlang = $object->thirdparty->default_lang;
1342 if (!empty($newlang)) {
1343 $outputlangs =
new Translate(
"", $conf);
1344 $outputlangs->setDefaultLang($newlang);
1346 $model = $object->model_pdf;
1347 $ret = $object->fetch($id);
1349 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1353 unset($value_unit_ht);
1357 unset($fk_c_type_fees);
1371 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1374 $triggersendname =
'EXPENSEREPORT_SENTBYMAIL';
1375 $autocopy =
'MAIN_MAIL_AUTOCOPY_EXPENSEREPORT_TO';
1376 $trackid =
'exp'.$object->id;
1377 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1380 $upload_dir = $conf->expensereport->dir_output;
1381 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1389$title = $langs->trans(
"ExpenseReport").
" - ".$langs->trans(
"Card");
1390$help_url =
"EN:Module_Expense_Reports|FR:Module_Notes_de_frais";
1394$form =
new Form($db);
1397$projecttmp =
new Project($db);
1399$bankaccountstatic =
new Account($db);
1400$ecmfilesstatic =
new EcmFiles($db);
1404if ($action ==
'create') {
1407 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'" method="post" name="create">';
1408 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1409 print
'<input type="hidden" name="action" value="add">';
1410 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1414 print
'<table class="border centpercent">';
1419 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"DateStart").
'</td>';
1421 print $form->selectDate($date_start ? $date_start : -1,
'date_debut', 0, 0, 0,
'', 1, 1);
1427 print
'<td class="fieldrequired">'.$langs->trans(
"DateEnd").
'</td>';
1429 print $form->selectDate($date_end ? $date_end : -1,
'date_fin', 0, 0, 0,
'', 1, 1);
1435 print
'<td class="fieldrequired">'.$langs->trans(
"User").
'</td>';
1437 $defaultselectuser = $user->id;
1438 if (
GETPOST(
'fk_user_author',
'int') > 0) {
1439 $defaultselectuser =
GETPOST(
'fk_user_author',
'int');
1441 $include_users =
'hierarchyme';
1442 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->expensereport->writeall_advance)) {
1443 $include_users = array();
1445 $s = $form->select_dolusers($defaultselectuser,
"fk_user_author", 0,
"", 0, $include_users,
'',
'0,'.$conf->entity);
1452 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1455 $include_users = $object->fetch_users_approver_expensereport();
1456 if (empty($include_users)) {
1457 print
img_warning().
' '.$langs->trans(
"NobodyHasPermissionToValidateExpenseReport");
1459 $defaultselectuser = (empty($user->fk_user_expense_validator) ? $user->fk_user : $user->fk_user_expense_validator);
1460 if (!empty($conf->global->EXPENSEREPORT_DEFAULT_VALIDATOR)) {
1461 $defaultselectuser = $conf->global->EXPENSEREPORT_DEFAULT_VALIDATOR;
1463 if (
GETPOST(
'fk_user_validator',
'int') > 0) {
1464 $defaultselectuser =
GETPOST(
'fk_user_validator',
'int');
1466 $s = $form->select_dolusers($defaultselectuser,
"fk_user_validator", 1,
"", ((empty($defaultselectuser) || empty($conf->global->EXPENSEREPORT_DEFAULT_VALIDATOR_UNCHANGEABLE)) ? 0 : 1), $include_users);
1467 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1473 if (!empty($conf->global->EXPENSEREPORT_ASK_PAYMENTMODE_ON_CREATION)) {
1475 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1477 $form->select_types_paiements(
'',
'fk_c_paiement');
1483 $note_public = GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') :
'';
1486 print
'<td class="tdtop">'.$langs->trans(
'NotePublic').
'</td>';
1489 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 80,
'dolibarr_notes',
'In', 0,
false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PUBLIC) ? 0 : 1, ROWS_3,
'90%');
1490 print $doleditor->Create(1);
1494 $note_private = GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') :
'';
1496 if (empty($user->socid)) {
1498 print
'<td class="tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
1501 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 80,
'dolibarr_notes',
'In', 0,
false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PRIVATE) ? 0 : 1, ROWS_3,
'90%');
1502 print $doleditor->Create(1);
1507 $parameters = array(
'colspan' =>
' colspan="3"',
'cols' => 3);
1508 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
1509 print $hookmanager->resPrint;
1510 if (empty($reshook)) {
1511 print $object->showOptionals($extrafields,
'create', $parameters);
1519 print $form->buttonsSaveCancel(
"AddTrip");
1522} elseif ($id > 0 || $ref) {
1523 $result = $object->fetch($id, $ref);
1526 if (!in_array($object->fk_user_author, $user->getAllChildIds(1))) {
1527 if (empty($user->rights->expensereport->readall) && empty($user->rights->expensereport->lire_tous)
1528 && (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || empty($user->rights->expensereport->writeall_advance))) {
1531 print
'<div class="tabBar">';
1532 print $langs->trans(
'NotUserRightToView');
1545 if ($action ==
'edit' && ($object->status < 3 || $object->status == 99)) {
1546 print
"<form name='update' action=\"".$_SERVER[
'PHP_SELF'].
"\" method=\"post\">\n";
1547 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1548 print
'<input type="hidden" name="id" value="'.$id.
'">';
1549 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1553 if ($object->status == 99) {
1554 print
'<input type="hidden" name="action" value="updateFromRefuse">';
1556 print
'<input type="hidden" name="action" value="update">';
1559 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1561 print
'<table class="border" style="width:100%;">';
1564 print
'<td>'.$langs->trans(
"User").
'</td>';
1566 $userfee =
new User($db);
1567 if ($object->fk_user_author > 0) {
1568 $userfee->fetch($object->fk_user_author);
1569 print $userfee->getNomUrl(-1);
1574 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Ref").
'</td><td>';
1575 print $form->showrefnav($object,
'ref', $linkback, 1,
'ref',
'ref',
'');
1579 print
'<td>'.$langs->trans(
"DateStart").
'</td>';
1581 print $form->selectDate($object->date_debut,
'date_debut');
1585 print
'<td>'.$langs->trans(
"DateEnd").
'</td>';
1587 print $form->selectDate($object->date_fin,
'date_fin');
1591 if (!empty($conf->global->EXPENSEREPORT_ASK_PAYMENTMODE_ON_CREATION)) {
1593 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1595 $form->select_types_paiements($object->fk_c_paiement,
'fk_c_paiement');
1600 if ($object->status < 3) {
1602 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1604 $include_users = $object->fetch_users_approver_expensereport();
1605 $s = $form->select_dolusers($object->fk_user_validator,
"fk_user_validator", 1,
"", 0, $include_users);
1606 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1611 print
'<td>'.$langs->trans(
"VALIDOR").
'</td>';
1613 $userfee =
new User($db);
1614 $userfee->fetch($object->fk_user_valid);
1615 print $userfee->getNomUrl(-1);
1619 if ($object->status == 6) {
1621 print
'<td>'.$langs->trans(
"AUTHORPAIEMENT").
'</td>';
1623 $userfee =
new User($db);
1624 $userfee->fetch($user->id);
1625 print $userfee->getNomUrl(-1);
1637 print $form->buttonsSaveCancel(
"Modify");
1641 $taxlessUnitPriceDisabled = !empty($conf->global->EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY) ?
' disabled' :
'';
1648 if ($action ==
'clone') {
1650 $criteriaforfilter =
'hierarchyme';
1651 if (!empty($user->rights->expensereport->readall)) {
1652 $criteriaforfilter =
'';
1654 $formquestion = array(
1656 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'))
1659 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneExpenseReport', $object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1662 if ($action ==
'save') {
1663 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_validate",
"",
"", 1);
1666 if ($action ==
'save_from_refuse') {
1667 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_save_from_refuse",
"",
"", 1);
1670 if ($action ==
'delete') {
1671 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"DeleteTrip"), $langs->trans(
"ConfirmDeleteTrip"),
"confirm_delete",
"",
"", 1);
1674 if ($action ==
'validate') {
1675 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"ValideTrip"), $langs->trans(
"ConfirmValideTrip"),
"confirm_approve",
"",
"", 1);
1678 if ($action ==
'paid') {
1679 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"PaidTrip"), $langs->trans(
"ConfirmPaidTrip"),
"confirm_paid",
"",
"", 1);
1682 if ($action ==
'cancel') {
1683 $array_input = array(
'text'=>$langs->trans(
"ConfirmCancelTrip"), array(
'type'=>
"text",
'label'=>
'<strong>'.$langs->trans(
"Comment").
'</strong>',
'name'=>
"detail_cancel",
'value'=>
""));
1684 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Cancel"),
"",
"confirm_cancel", $array_input,
"", 1);
1687 if ($action ==
'setdraft') {
1688 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"BrouillonnerTrip"), $langs->trans(
"ConfirmBrouillonnerTrip"),
"confirm_setdraft",
"",
"", 1);
1691 if ($action ==
'refuse') {
1692 $array_input = array(
'text'=>$langs->trans(
"ConfirmRefuseTrip"), array(
'type'=>
"text",
'label'=>$langs->trans(
"Comment"),
'name'=>
"detail_refuse",
'value'=>
""));
1693 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Deny"),
'',
"confirm_refuse", $array_input,
"yes", 1);
1696 if ($action ==
'delete_line') {
1697 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id.
"&rowid=".
GETPOST(
'rowid',
'int'), $langs->trans(
"DeleteLine"), $langs->trans(
"ConfirmDeleteLine"),
"confirm_delete_line",
'',
'yes', 1);
1704 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1706 $morehtmlref =
'<div class="refidno">';
1707 $morehtmlref .=
'</div>';
1709 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
1711 print
'<div class="fichecenter">';
1712 print
'<div class="fichehalfleft">';
1713 print
'<div class="underbanner clearboth"></div>';
1715 print
'<table class="border tableforfield centpercent">';
1719 print
'<td class="titlefield">'.$langs->trans(
"User").
'</td>';
1721 if ($object->fk_user_author > 0) {
1722 $userauthor =
new User($db);
1723 $result = $userauthor->fetch($object->fk_user_author);
1726 } elseif ($result > 0) {
1727 print $userauthor->getNomUrl(-1);
1734 print
'<td class="titlefield">'.$langs->trans(
"Period").
'</td>';
1736 print
get_date_range($object->date_debut, $object->date_fin,
'day', $langs, 0);
1739 if (!empty($conf->global->EXPENSEREPORT_ASK_PAYMENTMODE_ON_CREATION)) {
1741 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1742 print
'<td>'.$object->fk_c_paiement.
'</td>';
1748 print
'<td>'.$langs->trans(
"DATE_SAVE").
'</td>';
1749 print
'<td>'.dol_print_date($object->date_valid,
'dayhour',
'tzuser');
1750 if ($object->status == 2 && $object->hasDelay(
'toapprove')) {
1751 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToApprove"));
1753 if ($object->status == 5 && $object->hasDelay(
'topay')) {
1754 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToPay"));
1762 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1764 if ($object->fk_user_validator > 0) {
1765 $userfee =
new User($db);
1766 $result = $userfee->fetch($object->fk_user_validator);
1768 print $userfee->getNomUrl(-1);
1770 if (empty($userfee->email) || !
isValidEmail($userfee->email)) {
1771 $langs->load(
"errors");
1772 print
img_warning($langs->trans(
"ErrorBadEMail", $userfee->email));
1778 print
'<td>'.$langs->trans(
"CANCEL_USER").
'</span></td>';
1780 if ($object->fk_user_cancel > 0) {
1781 $userfee =
new User($db);
1782 $result = $userfee->fetch($object->fk_user_cancel);
1784 print $userfee->getNomUrl(-1);
1790 print
'<td>'.$langs->trans(
"MOTIF_CANCEL").
'</td>';
1791 print
'<td>'.$object->detail_cancel.
'</td></tr>';
1794 print
'<td>'.$langs->trans(
"DATE_CANCEL").
'</td>';
1795 print
'<td>'.dol_print_date($object->date_cancel,
'dayhour',
'tzuser').
'</td></tr>';
1799 print
'<td>'.$langs->trans(
"ApprovedBy").
'</td>';
1801 if ($object->fk_user_approve > 0) {
1802 $userapp =
new User($db);
1803 $result = $userapp->fetch($object->fk_user_approve);
1805 print $userapp->getNomUrl(-1);
1811 print
'<td>'.$langs->trans(
"DateApprove").
'</td>';
1812 print
'<td>'.dol_print_date($object->date_approve,
'dayhour',
'tzuser').
'</td></tr>';
1816 if ($object->status == 99 || !empty($object->detail_refuse)) {
1818 print
'<td>'.$langs->trans(
"REFUSEUR").
'</td>';
1820 $userfee =
new User($db);
1821 $result = $userfee->fetch($object->fk_user_refuse);
1823 print $userfee->getNomUrl(-1);
1828 print
'<td>'.$langs->trans(
"DATE_REFUS").
'</td>';
1829 print
'<td>'.dol_print_date($object->date_refuse,
'dayhour',
'tzuser');
1830 if ($object->detail_refuse) {
1831 print
' - '.$object->detail_refuse;
1837 if ($object->status == $object::STATUS_CLOSED) {
1855 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1860 print
'<div class="fichehalfright">';
1861 print
'<div class="underbanner clearboth"></div>';
1863 print
'<table class="border tableforfield centpercent">';
1867 print
'<td class="titlefieldmiddle">'.$langs->trans(
"AmountHT").
'</td>';
1868 print
'<td class="nowrap amountcard">'.price($object->total_ht, 1,
'', 1, - 1, - 1, $conf->currency).
'</td>';
1887 print
'<td>'.$langs->trans(
"AmountVAT").
'</td>';
1888 print
'<td class="nowrap amountcard">'.price($object->total_tva, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1892 if ($mysoc->localtax1_assuj ==
"1" || $object->total_localtax1 != 0) {
1893 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1894 print
'<td class="valuefield">'.price($object->total_localtax1, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1896 if ($mysoc->localtax2_assuj ==
"1" || $object->total_localtax2 != 0) {
1897 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1898 print
'<td class="valuefield">'.price($object->total_localtax2, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1902 print
'<td>'.$langs->trans(
"AmountTTC").
'</td>';
1903 print
'<td class="nowrap amountcard">'.price($object->total_ttc, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1909 if (isModEnabled(
"banque")) {
1914 print
'<table class="noborder paymenttable centpercent">';
1916 print
'<tr class="liste_titre">';
1917 print
'<td class="liste_titre">'.$langs->trans(
'Payments').
'</td>';
1918 print
'<td class="liste_titre">'.$langs->trans(
'Date').
'</td>';
1919 print
'<td class="liste_titre">'.$langs->trans(
'Type').
'</td>';
1920 if (isModEnabled(
"banque")) {
1921 print
'<td class="liste_titre right">'.$langs->trans(
'BankAccount').
'</td>';
1923 print
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
1924 print
'<td class="liste_titre" width="18"> </td>';
1928 $sql =
"SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,";
1929 $sql .=
"c.code as payment_code, c.libelle as payment_type,";
1930 $sql .=
"ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal";
1931 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as e, ".MAIN_DB_PREFIX.
"payment_expensereport as p";
1932 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as c ON p.fk_typepayment = c.id";
1933 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
1934 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
1935 $sql .=
" WHERE e.rowid = ".((int) $id);
1936 $sql .=
" AND p.fk_expensereport = e.rowid";
1937 $sql .=
' AND e.entity IN ('.getEntity(
'expensereport').
')';
1938 $sql .=
" ORDER BY dp";
1940 $resql = $db->query($sql);
1942 $num = $db->num_rows($resql);
1943 $i = 0; $totalpaid = 0;
1945 $objp = $db->fetch_object($resql);
1947 $paymentexpensereportstatic->id = $objp->rowid;
1948 $paymentexpensereportstatic->datep = $db->jdate($objp->dp);
1949 $paymentexpensereportstatic->ref = $objp->rowid;
1950 $paymentexpensereportstatic->num_payment = $objp->num_payment;
1951 $paymentexpensereportstatic->type_code = $objp->payment_code;
1952 $paymentexpensereportstatic->type_label = $objp->payment_type;
1954 print
'<tr class="oddseven">';
1956 print $paymentexpensereportstatic->getNomUrl(1);
1958 print
'<td>'.dol_print_date($db->jdate($objp->dp),
'day').
"</td>\n";
1959 $labeltype = $langs->trans(
"PaymentType".$objp->payment_code) != (
"PaymentType".$objp->payment_code) ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_type;
1960 print
"<td>".$labeltype.
' '.$objp->num_payment.
"</td>\n";
1962 if (isModEnabled(
"banque")) {
1963 $bankaccountstatic->id = $objp->baid;
1964 $bankaccountstatic->ref = $objp->baref;
1965 $bankaccountstatic->label = $objp->baref;
1966 $bankaccountstatic->number = $objp->banumber;
1968 if (isModEnabled(
'accounting')) {
1969 $bankaccountstatic->account_number = $objp->account_number;
1972 $accountingjournal->fetch($objp->fk_accountancy_journal);
1973 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1,
'', 1);
1976 print
'<td class="right">';
1977 if ($bankaccountstatic->id) {
1978 print $bankaccountstatic->getNomUrl(1,
'transactions');
1982 print
'<td class="right">'.price($objp->amount).
"</td>";
1985 $totalpaid += $objp->amount;
1988 if (!is_null($totalpaid)) {
1992 $remaintopay =
price2num($object->total_ttc - $totalpaid);
1993 $resteapayeraffiche = $remaintopay;
1995 $cssforamountpaymentcomplete =
'amountpaymentcomplete';
1998 $cssforamountpaymentcomplete =
'amountpaymentneutral';
1999 $resteapayeraffiche = 0;
2000 } elseif ($object->paid == 0) {
2001 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2003 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AlreadyPaid").
':</td><td class="right">'.
price($totalpaid).
'</td><td></td></tr>';
2004 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AmountExpected").
':</td><td class="right">'.
price($object->total_ttc).
'</td><td></td></tr>';
2006 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"RemainderToPay").
':</td>';
2007 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td></td></tr>';
2018 print
'<div class="clearboth"></div><br>';
2020 print
'<div style="clear: both;"></div>';
2022 $actiontouse =
'updateline';
2023 if (($object->status == 0 || $object->status == 99) && $action !=
'editline') {
2024 $actiontouse =
'addline';
2027 print
'<form name="expensereport" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="post" >';
2028 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2029 print
'<input type="hidden" name="action" value="'.$actiontouse.
'">';
2030 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2031 print
'<input type="hidden" name="fk_expensereport" value="'.$object->id.
'" />';
2032 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2033 print
'<input type="hidden" name="page_y" value="">';
2035 print
'<div class="div-table-responsive-no-min">';
2036 print
'<table id="tablelines" class="noborder centpercent">';
2038 if (!empty($object->lines)) {
2041 print
'<tr class="liste_titre headerexpensereportdet">';
2042 print
'<td class="center linecollinenb">'.$langs->trans(
'LineNb').
'</td>';
2044 print
'<td class="center linecoldate">'.$langs->trans(
'Date').
'</td>';
2045 if (isModEnabled(
'project')) {
2046 print
'<td class="minwidth100imp linecolproject">'.$langs->trans(
'Project').
'</td>';
2048 print
'<td class="center linecoltype">'.$langs->trans(
'Type').
'</td>';
2049 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2050 print
'<td class="center linecolcarcategory">'.$langs->trans(
'CarCategory').
'</td>';
2052 print
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
2053 print
'<td class="right linecolvat">'.$langs->trans(
'VAT').
'</td>';
2054 print
'<td class="right linecolpriceuht">'.$langs->trans(
'PriceUHT').
'</td>';
2055 print
'<td class="right linecolpriceuttc">'.$langs->trans(
'PriceUTTC').
'</td>';
2056 print
'<td class="right linecolqty">'.$langs->trans(
'Qty').
'</td>';
2057 if ($action !=
'editline') {
2058 print
'<td class="right linecolamountht">'.$langs->trans(
'AmountHT').
'</td>';
2059 print
'<td class="right linecolamountttc">'.$langs->trans(
'AmountTTC').
'</td>';
2070 if (($object->status < 2 || $object->status == 99) && $user->rights->expensereport->creer) {
2071 print
'<td class="right"></td>';
2075 foreach ($object->lines as &$line) {
2078 if ($action !=
'editline' || $line->id !=
GETPOST(
'rowid',
'int')) {
2079 print
'<tr class="oddeven linetr" data-id="'.$line->id.
'">';
2082 print
'<td class="center linecollinenb">';
2087 print
'<td class="center linecoldate">'.dol_print_date($db->jdate($line->date),
'day').
'</td>';
2090 if (isModEnabled(
'project')) {
2091 print
'<td class="lineproject">';
2092 if ($line->fk_project > 0) {
2093 $projecttmp->id = $line->fk_project;
2094 $projecttmp->ref = $line->projet_ref;
2095 $projecttmp->title = $line->projet_title;
2096 print $projecttmp->getNomUrl(1);
2102 if (isModEnabled(
'accounting')) {
2103 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
2105 $resaccountingaccount = $accountingaccount->fetch(0, $line->type_fees_accountancy_code, 1);
2107 $titlealt .= $langs->trans(
"AccountancyCode").
': ';
2108 if ($resaccountingaccount > 0) {
2109 $titlealt .= $accountingaccount->account_number;
2111 $titlealt .= $langs->trans(
"NotFound");
2117 print
'<td class="center linecoltype" title="'.dol_escape_htmltag($titlealt).
'">';
2118 $labeltype = ($langs->trans(($line->type_fees_code)) == $line->type_fees_code ? $line->type_fees_libelle : $langs->trans($line->type_fees_code));
2123 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2124 print
'<td class="fk_c_exp_tax_cat linecoltaxcat">';
2125 $exp_tax_cat_label =
dol_getIdFromCode($db, $line->fk_c_exp_tax_cat,
'c_exp_tax_cat',
'rowid',
'label');
2126 print $langs->trans($exp_tax_cat_label);
2131 print
'<td class="left linecolcomment">'.dol_nl2br($line->comments).
'</td>';
2134 print
'<td class="right linecolvatrate">'.vatrate($line->vatrate.($line->vat_src_code ?
' ('.$line->vat_src_code.
')' :
''), true).
'</td>';
2137 print
'<td class="right linecolunitht">';
2138 if (!empty($line->value_unit_ht)) {
2139 print
price($line->value_unit_ht);
2141 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $line->vatrate));
2142 $pricenettoshow =
price2num($line->value_unit / (1 + $tmpvat / 100),
'MU');
2143 print
price($pricenettoshow);
2147 print
'<td class="right linecolunitttc">'.price($line->value_unit).
'</td>';
2149 print
'<td class="right linecolqty">'.dol_escape_htmltag($line->qty).
'</td>';
2151 if ($action !=
'editline') {
2152 print
'<td class="right linecoltotalht">'.price($line->total_ht).
'</td>';
2153 print
'<td class="right linecoltotalttc">'.price($line->total_ttc).
'</td>';
2157 print
'<td class="center linecolpreview">';
2158 if ($line->fk_ecm_files > 0) {
2159 $modulepart =
'expensereport';
2160 $maxheightmini = 32;
2162 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2164 $relativepath = preg_replace(
'/expensereport\//',
'', $ecmfilesstatic->filepath);
2165 $fileinfo = pathinfo($ecmfilesstatic->filepath.
'/'.$ecmfilesstatic->filename);
2168 if (!
dol_is_file($conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$minifile)) {
2172 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity));
2173 if (empty($urlforhref)) {
2174 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
2175 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
2177 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2179 print
'<img class="photo" height="'.$maxheightmini.
'" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity).
'&file='.urlencode($relativepath.
'/'.$minifile).
'" title="">';
2182 $modulepart =
'expensereport';
2184 if (preg_match(
'/\.pdf$/i', $ecmfilesstatic->filename)) {
2185 $filepdf = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename;
2186 $fileimage = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2187 $relativepathimage = $relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2189 $pdfexists = file_exists($filepdf);
2192 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2193 if (empty($conf->global->MAIN_DISABLE_PDF_THUMBS)) {
2194 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2203 if ($pdfexists && !$error) {
2204 $heightforphotref = 70;
2205 if (!empty($conf->dol_optimize_smallscreen)) {
2206 $heightforphotref = 60;
2209 if (file_exists($fileimage)) {
2211 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity));
2212 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2213 print
'<img height="'.$heightforphotref.
'" class="photo photowithmargin photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2219 if (!$thumbshown && $fileinfo[
'extension'] ==
'pdf' && !empty($filepdf) && !empty($relativepath) && !empty($fileinfo[
'filename'])) {
2221 $imgpreview = $formFile->showPreview([], $modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 0);
2223 } elseif (!$thumbshown) {
2224 print
img_mime($ecmfilesstatic->filename);
2231 print
'<td class="nowrap right linecolwarning">';
2232 print !empty($line->rule_warning_message) ?
img_warning(html_entity_decode($line->rule_warning_message)) :
' ';
2237 print
'<td class="nowrap right linecolaction">';
2239 print
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$line->rowid.
'">';
2241 print
'</a> ';
2242 print
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete_line&token='.newToken().
'&rowid='.$line->rowid.
'">';
2252 if ($action ==
'editline' && $line->id ==
GETPOST(
'rowid',
'int')) {
2255 if (isModEnabled(
'project')) {
2258 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2262 print
'<!-- line of expense report -->'.
"\n";
2263 print
'<tr class="tredited">';
2265 print
'<td class="center">';
2269 print
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
2270 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2271 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2273 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2274 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2275 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2279 print
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
2280 print
'<script type="text/javascript">'.
"\n";
2281 print
'$(document).ready(function() {
2282 $( ".auploadnewfilenow" ).click(function() {
2283 jQuery(".truploadnewfilenow").toggle();
2284 jQuery(".trattachnewfilenow").hide();
2287 $( ".aattachtodoc" ).click(function() {
2288 jQuery(".trattachnewfilenow").toggle();
2289 jQuery(".truploadnewfilenow").hide();
2292 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array'))) {
2293 print
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
2296 jQuery("form[name=\"expensereport\"]").submit(function() {
2297 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2298 jQuery("input[name=\"sendit\"]").val("");
2305 print
'</script>'.
"\n";
2308 $filenamelinked =
'';
2309 if ($line->fk_ecm_files > 0) {
2310 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2312 $filenamelinked = $ecmfilesstatic->filename;
2316 $tredited =
'tredited';
2317 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2318 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2320 print
'<tr class="oddeven tredited">';
2325 print
'<td class="center">';
2326 print $form->selectDate($line->date,
'date');
2330 if (isModEnabled(
'project')) {
2332 $formproject->select_projects(-1, $line->fk_project,
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2337 print
'<td class="center">';
2338 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees,
'fk_c_type_fees');
2341 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2342 print
'<td class="fk_c_exp_tax_cat">';
2343 $params = array(
'fk_expense' => $object->id,
'fk_expense_det' => $line->id,
'date' => $line->date);
2344 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);
2350 print
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
2354 $selectedvat =
price2num($line->vatrate).(!empty($line->vat_src_code) ?
' ('.$line->vat_src_code.
')' :
'');
2355 print
'<td class="right">';
2356 print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ?
GETPOST(
"vatrate") : $selectedvat), $mysoc,
'', 0, 0,
'', false, 1);
2360 print
'<td class="right">';
2361 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.
' />';
2365 print
'<td class="right">';
2366 print
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
2370 print
'<td class="right">';
2371 print
'<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';
2378 print
'<td class="center">';
2382 print
'<td class="center">';
2386 print
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
2387 print $form->buttonsSaveCancel(
'Save',
'Cancel', array(), 0,
'small');
2400 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2403 if (isModEnabled(
'project')) {
2406 if ($action !=
'editline') {
2410 $nbFiles = $nbLinks = 0;
2411 $arrayoffiles = array();
2412 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2413 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2414 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2415 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2418 $nbFiles = count($arrayoffiles);
2419 $nbLinks =
Link::count($db, $object->element, $object->id);
2423 print
'<tr class="liste_titre">';
2424 print
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
2425 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2426 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2428 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2429 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2430 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2434 print
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
2435 print
'<script type="text/javascript">'.
"\n";
2436 print
'$(document).ready(function() {
2437 $( ".auploadnewfilenow" ).click(function() {
2438 console.log("We click on toggle of auploadnewfilenow");
2439 jQuery(".truploadnewfilenow").toggle();
2440 jQuery(".trattachnewfilenow").hide();
2441 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2442 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2444 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2446 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2449 $( ".aattachtodoc" ).click(function() {
2450 console.log("We click on toggle of aattachtodoc");
2451 jQuery(".trattachnewfilenow").toggle();
2452 jQuery(".truploadnewfilenow").hide();
2453 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2456 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array')) && $action !=
'updateline') {
2457 print
'jQuery(".trattachnewfilenow").show();'.
"\n";
2460 jQuery("form[name=\"expensereport\"]").submit(function() {
2461 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2462 /* 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. */
2463 jQuery("input[name=\"sendit\"]").val("");
2464 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2466 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2473 print
'</script>'.
"\n";
2477 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2478 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2480 print
'<tr class="liste_titre expensereportcreate">';
2482 print
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
2483 if (isModEnabled(
'project')) {
2484 print
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
2486 print
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
2487 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2488 print
'<td>'.$langs->trans(
'CarCategory').
'</td>';
2490 print
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
2491 print
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
2492 print
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
2493 print
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
2494 print
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
2501 print
'<tr class="oddeven nohover">';
2507 print
'<td class="center inputdate">';
2508 print $form->selectDate(!empty($date) ? $date : -1,
'date', 0, 0, 0,
'', 1, 1);
2512 if (isModEnabled(
'project')) {
2513 print
'<td class="inputproject">';
2514 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0,
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2519 print
'<td class="center inputtype">';
2520 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees :
"",
'fk_c_type_fees', 1);
2523 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2524 print
'<td class="fk_c_exp_tax_cat">';
2525 $params = array(
'fk_expense' => $object->id);
2526 print $form->selectExpenseCategories(
'',
'fk_c_exp_tax_cat', 1, array(),
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2531 print
'<td class="inputcomment">';
2532 print
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments :
"", 0, 1).
'</textarea>';
2536 print
'<td class="right inputvat">';
2538 if (!empty($conf->global->EXPENSEREPORT_NO_DEFAULT_VAT)) {
2540 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS =
'none';
2542 print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), $mysoc,
'', 0, 0,
'', false, 1);
2546 print
'<td class="right inputpricenet">';
2547 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.
' />';
2551 print
'<td class="right inputtax">';
2552 print
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit : 0)).
'">';
2556 print
'<td class="right inputqty">';
2557 print
'<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">';
2563 if ($action !=
'editline') {
2564 print
'<td class="right"></td>';
2565 print
'<td class="right"></td>';
2568 print
'<td class="center inputbuttons">';
2569 print $form->buttonsSaveCancel(
"Add",
'',
'', 1,
'reposition');
2580 /* JQuery for product free or predefined select */
2581 jQuery(document).ready(function() {
2582 jQuery("#value_unit_ht").keyup(function(event) {
2583 console.log(event.which); // discard event tag and arrows
2584 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2585 jQuery("#value_unit").val("");
2588 jQuery("#value_unit").keyup(function(event) {
2589 console.log(event.which); // discard event tag and arrows
2590 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2591 jQuery("#value_unit_ht").val("");
2596 if (! empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2599 /* unit price coéf calculation */
2600 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2602 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2603 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2604 let tva = jQuery("#vatrate").find(":selected").val();
2605 let qty = jQuery(".input_qty").val();
2609 let path = "'.dol_buildpath(
"/expensereport/ajax/ajaxik.php", 1) .
'";
2610 path += "?fk_c_exp_tax_cat="+tax_cat;
2611 path +="&fk_expense="+'.$object->id.
';
2612 path += "&vatrate="+tva;
2613 path += "&qty="+qty;
2615 if (type_fee == 4) { // frais_kilométriques
2617 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2625 ,success:function(response) {
2626 if (response.response_status == "success"){';
2628 if (!empty($conf->global->EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY)) {
2630 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2631 jQuery("#value_unit").trigger("change");
2635 jQuery("#value_unit_ht").val(response.data);
2636 jQuery("#value_unit_ht").trigger("change");
2637 jQuery("#value_unit").val("");
2642 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ){
2643 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2650 /*console.log(event.which); // discard event tag and arrows
2651 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2652 jQuery("#value_unit_ht").val("");
2672 print
'Record not found';
2683print
'<div class="tabsAction">';
2685if ($action !=
'create' && $action !=
'edit' && $action !=
'editline') {
2687 $object->fetch($id, $ref);
2690 if (empty($user->socid)) {
2693 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>';
2705 if (in_array($object->fk_user_author, $user->getAllChildIds(1)) || !empty($user->rights->expensereport->writeall_advance)) {
2707 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>';
2710 if (count($object->lines) > 0) {
2711 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>';
2722 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2724 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>';
2729 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>';
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=setdraft&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'SetToDraft').
'</a></div>';
2746 if (in_array($object->fk_user_author, $user->getAllChildIds(1))) {
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>';
2756 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=validate&id='.$object->id.
'">'.$langs->trans(
'Approve').
'</a></div>';
2758 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2761 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2763 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2772 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2778 if ($remaintopay == 0) {
2779 print
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
2781 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>';
2788 if ($object->paid == 0) {
2789 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>";
2793 if ($user->rights->expensereport->creer && ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) && $object->status ==
ExpenseReport::STATUS_APPROVED) {
2795 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>';
2799 if (($user->rights->expensereport->approve || $user->rights->expensereport->to_paid) && $object->status ==
ExpenseReport::STATUS_CLOSED) {
2801 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>';
2806 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>';
2810 if ($user->rights->expensereport->creer) {
2811 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>';
2817 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>';
2820 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>';
2823 $parameters = array();
2824 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2831if (
GETPOST(
'modelselected',
'alpha')) {
2832 $action =
'presend';
2835if ($action !=
'presend') {
2840 print
'<div class="fichecenter"><div class="fichehalfleft">';
2841 print
'<a name="builddoc"></a>';
2843 if ($user->rights->expensereport->creer && $action !=
'create' && $action !=
'edit') {
2846 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
2847 $genallowed = $user->rights->expensereport->creer;
2848 $delallowed = $user->rights->expensereport->creer;
2850 print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2851 $somethingshown = $formfile->numoffiles;
2863 print
'</div><div class="fichehalfright">';
2865 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2867 $somethingshown =
$formactions->showactions($object,
'expensereport',
null);
2869 print
'</div></div>';
2873$modelmail =
'expensereport_send';
2874$defaulttopic =
'SendExpenseReportRef';
2875$diroutput = $conf->expensereport->dir_output;
2876$trackid =
'exp'.$object->id;
2878include 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 accounts.
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 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.
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.