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).
'">';
2220 print
img_mime($ecmfilesstatic->filename);
2227 print
'<td class="nowrap right linecolwarning">';
2228 print !empty($line->rule_warning_message) ?
img_warning(html_entity_decode($line->rule_warning_message)) :
' ';
2233 print
'<td class="nowrap right linecolaction">';
2235 print
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$line->rowid.
'">';
2237 print
'</a> ';
2238 print
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete_line&token='.newToken().
'&rowid='.$line->rowid.
'">';
2248 if ($action ==
'editline' && $line->id ==
GETPOST(
'rowid',
'int')) {
2251 if (isModEnabled(
'project')) {
2254 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2258 print
'<!-- line of expense report -->'.
"\n";
2259 print
'<tr class="tredited">';
2261 print
'<td class="center">';
2265 print
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
2266 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2267 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2269 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2270 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2271 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2275 print
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
2276 print
'<script type="text/javascript">'.
"\n";
2277 print
'$(document).ready(function() {
2278 $( ".auploadnewfilenow" ).click(function() {
2279 jQuery(".truploadnewfilenow").toggle();
2280 jQuery(".trattachnewfilenow").hide();
2283 $( ".aattachtodoc" ).click(function() {
2284 jQuery(".trattachnewfilenow").toggle();
2285 jQuery(".truploadnewfilenow").hide();
2288 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array'))) {
2289 print
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
2292 jQuery("form[name=\"expensereport\"]").submit(function() {
2293 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2294 jQuery("input[name=\"sendit\"]").val("");
2301 print
'</script>'.
"\n";
2304 $filenamelinked =
'';
2305 if ($line->fk_ecm_files > 0) {
2306 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2308 $filenamelinked = $ecmfilesstatic->filename;
2312 $tredited =
'tredited';
2313 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2314 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2316 print
'<tr class="oddeven tredited">';
2321 print
'<td class="center">';
2322 print $form->selectDate($line->date,
'date');
2326 if (isModEnabled(
'project')) {
2328 $formproject->select_projects(-1, $line->fk_project,
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2333 print
'<td class="center">';
2334 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees,
'fk_c_type_fees');
2337 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2338 print
'<td class="fk_c_exp_tax_cat">';
2339 $params = array(
'fk_expense' => $object->id,
'fk_expense_det' => $line->id,
'date' => $line->date);
2340 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);
2346 print
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
2350 $selectedvat =
price2num($line->vatrate).(!empty($line->vat_src_code) ?
' ('.$line->vat_src_code.
')' :
'');
2351 print
'<td class="right">';
2352 print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ?
GETPOST(
"vatrate") : $selectedvat), $mysoc,
'', 0, 0,
'', false, 1);
2356 print
'<td class="right">';
2357 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.
' />';
2361 print
'<td class="right">';
2362 print
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
2366 print
'<td class="right">';
2367 print
'<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';
2374 print
'<td class="center">';
2378 print
'<td class="center">';
2382 print
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
2383 print $form->buttonsSaveCancel(
'Save',
'Cancel', array(), 0,
'small');
2396 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2399 if (isModEnabled(
'project')) {
2402 if ($action !=
'editline') {
2406 $nbFiles = $nbLinks = 0;
2407 $arrayoffiles = array();
2408 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2409 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2410 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2411 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2414 $nbFiles = count($arrayoffiles);
2415 $nbLinks =
Link::count($db, $object->element, $object->id);
2419 print
'<tr class="liste_titre">';
2420 print
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
2421 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2422 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2424 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2425 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2426 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2430 print
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
2431 print
'<script type="text/javascript">'.
"\n";
2432 print
'$(document).ready(function() {
2433 $( ".auploadnewfilenow" ).click(function() {
2434 console.log("We click on toggle of auploadnewfilenow");
2435 jQuery(".truploadnewfilenow").toggle();
2436 jQuery(".trattachnewfilenow").hide();
2437 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2438 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2440 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2442 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2445 $( ".aattachtodoc" ).click(function() {
2446 console.log("We click on toggle of aattachtodoc");
2447 jQuery(".trattachnewfilenow").toggle();
2448 jQuery(".truploadnewfilenow").hide();
2449 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2452 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array')) && $action !=
'updateline') {
2453 print
'jQuery(".trattachnewfilenow").show();'.
"\n";
2456 jQuery("form[name=\"expensereport\"]").submit(function() {
2457 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2458 /* 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. */
2459 jQuery("input[name=\"sendit\"]").val("");
2460 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2462 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2469 print
'</script>'.
"\n";
2473 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2474 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2476 print
'<tr class="liste_titre expensereportcreate">';
2478 print
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
2479 if (isModEnabled(
'project')) {
2480 print
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
2482 print
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
2483 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2484 print
'<td>'.$langs->trans(
'CarCategory').
'</td>';
2486 print
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
2487 print
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
2488 print
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
2489 print
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
2490 print
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
2497 print
'<tr class="oddeven nohover">';
2503 print
'<td class="center inputdate">';
2504 print $form->selectDate(!empty($date) ? $date : -1,
'date', 0, 0, 0,
'', 1, 1);
2508 if (isModEnabled(
'project')) {
2509 print
'<td class="inputproject">';
2510 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0,
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2515 print
'<td class="center inputtype">';
2516 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees :
"",
'fk_c_type_fees', 1);
2519 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2520 print
'<td class="fk_c_exp_tax_cat">';
2521 $params = array(
'fk_expense' => $object->id);
2522 print $form->selectExpenseCategories(
'',
'fk_c_exp_tax_cat', 1, array(),
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2527 print
'<td class="inputcomment">';
2528 print
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments :
"", 0, 1).
'</textarea>';
2532 print
'<td class="right inputvat">';
2534 if (!empty($conf->global->EXPENSEREPORT_NO_DEFAULT_VAT)) {
2536 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS =
'none';
2538 print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), $mysoc,
'', 0, 0,
'', false, 1);
2542 print
'<td class="right inputpricenet">';
2543 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.
' />';
2547 print
'<td class="right inputtax">';
2548 print
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit : 0)).
'">';
2552 print
'<td class="right inputqty">';
2553 print
'<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">';
2559 if ($action !=
'editline') {
2560 print
'<td class="right"></td>';
2561 print
'<td class="right"></td>';
2564 print
'<td class="center inputbuttons">';
2565 print $form->buttonsSaveCancel(
"Add",
'',
'', 1,
'reposition');
2576 /* JQuery for product free or predefined select */
2577 jQuery(document).ready(function() {
2578 jQuery("#value_unit_ht").keyup(function(event) {
2579 console.log(event.which); // discard event tag and arrows
2580 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2581 jQuery("#value_unit").val("");
2584 jQuery("#value_unit").keyup(function(event) {
2585 console.log(event.which); // discard event tag and arrows
2586 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2587 jQuery("#value_unit_ht").val("");
2592 if (! empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2595 /* unit price coéf calculation */
2596 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2598 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2599 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2600 let tva = jQuery("#vatrate").find(":selected").val();
2601 let qty = jQuery(".input_qty").val();
2605 let path = "'.dol_buildpath(
"/expensereport/ajax/ajaxik.php", 1) .
'";
2606 path += "?fk_c_exp_tax_cat="+tax_cat;
2607 path +="&fk_expense="+'.$object->id.
';
2608 path += "&vatrate="+tva;
2609 path += "&qty="+qty;
2611 if (type_fee == 4) { // frais_kilométriques
2613 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2621 ,success:function(response) {
2622 if (response.response_status == "success"){';
2624 if (!empty($conf->global->EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY)) {
2626 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2627 jQuery("#value_unit").trigger("change");
2631 jQuery("#value_unit_ht").val(response.data);
2632 jQuery("#value_unit_ht").trigger("change");
2633 jQuery("#value_unit").val("");
2638 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ){
2639 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2646 /*console.log(event.which); // discard event tag and arrows
2647 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2648 jQuery("#value_unit_ht").val("");
2668 print
'Record not found';
2679print
'<div class="tabsAction">';
2681if ($action !=
'create' && $action !=
'edit' && $action !=
'editline') {
2683 $object->fetch($id, $ref);
2686 if (empty($user->socid)) {
2689 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>';
2701 if (in_array($object->fk_user_author, $user->getAllChildIds(1)) || !empty($user->rights->expensereport->writeall_advance)) {
2703 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>';
2706 if (count($object->lines) > 0) {
2707 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>';
2718 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2720 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>';
2725 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>';
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=setdraft&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'SetToDraft').
'</a></div>';
2742 if (in_array($object->fk_user_author, $user->getAllChildIds(1))) {
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>';
2752 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=validate&id='.$object->id.
'">'.$langs->trans(
'Approve').
'</a></div>';
2754 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2757 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2759 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2768 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2774 if ($remaintopay == 0) {
2775 print
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
2777 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>';
2784 if ($object->paid == 0) {
2785 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>";
2789 if ($user->rights->expensereport->creer && ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) && $object->status ==
ExpenseReport::STATUS_APPROVED) {
2791 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>';
2795 if (($user->rights->expensereport->approve || $user->rights->expensereport->to_paid) && $object->status ==
ExpenseReport::STATUS_CLOSED) {
2797 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>';
2802 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>';
2806 if ($user->rights->expensereport->creer) {
2807 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>';
2813 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>';
2816 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>';
2819 $parameters = array();
2820 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2827if (
GETPOST(
'modelselected',
'alpha')) {
2828 $action =
'presend';
2831if ($action !=
'presend') {
2836 print
'<div class="fichecenter"><div class="fichehalfleft">';
2837 print
'<a name="builddoc"></a>';
2839 if ($user->rights->expensereport->creer && $action !=
'create' && $action !=
'edit') {
2842 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
2843 $genallowed = $user->rights->expensereport->creer;
2844 $delallowed = $user->rights->expensereport->creer;
2846 print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2847 $somethingshown = $formfile->numoffiles;
2859 print
'</div><div class="fichehalfright">';
2861 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2863 $somethingshown =
$formactions->showactions($object,
'expensereport',
null);
2865 print
'</div></div>';
2869$modelmail =
'expensereport';
2870$defaulttopic =
'SendExpenseReportRef';
2871$diroutput = $conf->expensereport->dir_output;
2872$trackid =
'exp'.$object->id;
2874include 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.