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 $user =
new User($db);
396 $user->fetch($object->fk_user_author);
397 $newlang = $user->lang;
399 if (!empty($newlang)) {
401 $outputlangs->setDefaultLang($newlang);
403 $model = $object->model_pdf;
404 $ret = $object->fetch($id);
406 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
413 if (!$error && $result > 0 && $object->fk_user_validator > 0) {
414 $langs->load(
"mails");
417 $destinataire =
new User($db);
418 $destinataire->fetch($object->fk_user_validator);
419 $emailTo = $destinataire->email;
422 $expediteur =
new User($db);
423 $expediteur->fetch($object->fk_user_author);
424 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
426 if ($emailTo && $emailFrom) {
427 $filename = array(); $filedir = array(); $mimetype = array();
430 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
431 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
432 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
435 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForApproval");
438 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
439 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
440 $message = $langs->transnoentities(
"ExpenseReportWaitingForApprovalMessage", $expediteur->getFullName($langs),
get_date_range($object->date_debut, $object->date_fin,
'', $langs), $link);
455 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
459 $result = $mailfile->sendfile();
461 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
464 $langs->load(
"other");
465 if (!empty($mailfile->error) || !empty($mailfile->errors)) {
468 if (!empty($mailfile->error)) {
469 $mesg .=
'<br>' . $mailfile->error;
471 if (!empty($mailfile->errors) && is_array($mailfile->errors)) {
472 $mesg .=
'<br>' . implode(
'<br>', $mailfile->errors);
476 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
484 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
491 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
498 if ($action ==
"confirm_save_from_refuse" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->rights->expensereport->creer) {
501 $result = $object->set_save_from_refuse($user);
505 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
506 $outputlangs = $langs;
509 $newlang =
GETPOST(
'lang_id',
'aZ09');
512 $user =
new User($db);
513 $user->fetch($object->fk_user_author);
514 $newlang = $user->lang;
516 if (!empty($newlang)) {
518 $outputlangs->setDefaultLang($newlang);
520 $model = $object->model_pdf;
521 $ret = $object->fetch($id);
523 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
531 $destinataire =
new User($db);
532 $destinataire->fetch($object->fk_user_validator);
533 $emailTo = $destinataire->email;
536 $expediteur =
new User($db);
537 $expediteur->fetch($object->fk_user_author);
538 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
540 if ($emailFrom && $emailTo) {
541 $filename = array(); $filedir = array(); $mimetype = array();
544 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
545 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
546 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
549 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportWaitingForReApproval");
552 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
553 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
554 $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);
573 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
577 $result = $mailfile->sendfile();
579 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
581 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
584 $langs->load(
"other");
585 if ($mailfile->error) {
587 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
588 $mesg .=
'<br>'.$mailfile->error;
591 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
599 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
608 if ($action ==
"confirm_approve" &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $id > 0 && $user->rights->expensereport->approve) {
612 $result = $object->setApproved($user);
616 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
617 $outputlangs = $langs;
620 $newlang =
GETPOST(
'lang_id',
'aZ09');
623 $user =
new User($db);
624 $user->fetch($object->fk_user_author);
625 $newlang = $user->lang;
627 if (!empty($newlang)) {
629 $outputlangs->setDefaultLang($newlang);
631 $model = $object->model_pdf;
632 $ret = $object->fetch($id);
634 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
642 $destinataire =
new User($db);
643 $destinataire->fetch($object->fk_user_author);
644 $emailTo = $destinataire->email;
647 $emailCC = $conf->global->NDF_CC_EMAILS;
648 if (empty($emailTo)) {
653 $expediteur =
new User($db);
654 $expediteur->fetch($object->fk_user_approve > 0 ? $object->fk_user_approve : $object->fk_user_validator);
655 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
657 if ($emailFrom && $emailTo) {
658 $filename = array(); $filedir = array(); $mimetype = array();
661 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
662 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
663 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
666 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportApproved");
669 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
670 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
671 $message = $langs->transnoentities(
"ExpenseReportApprovedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
688 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
692 $result = $mailfile->sendfile();
694 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
696 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
699 $langs->load(
"other");
700 if ($mailfile->error) {
702 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
703 $mesg .=
'<br>'.$mailfile->error;
706 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
714 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
723 if ($action ==
"confirm_refuse" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->rights->expensereport->approve) {
727 $detailRefuse =
GETPOST(
'detail_refuse',
'alpha');
728 $result = $object->setDeny($user, $detailRefuse);
732 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
733 $outputlangs = $langs;
736 $newlang =
GETPOST(
'lang_id',
'aZ09');
739 $user =
new User($db);
740 $user->fetch($object->fk_user_author);
741 $newlang = $user->lang;
743 if (!empty($newlang)) {
745 $outputlangs->setDefaultLang($newlang);
747 $model = $object->model_pdf;
748 $ret = $object->fetch($id);
750 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
758 $destinataire =
new User($db);
759 $destinataire->fetch($object->fk_user_author);
760 $emailTo = $destinataire->email;
763 $expediteur =
new User($db);
764 $expediteur->fetch($object->fk_user_refuse);
765 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
767 if ($emailFrom && $emailTo) {
768 $filename = array(); $filedir = array(); $mimetype = array();
771 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
772 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
773 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
776 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportRefused");
779 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
780 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
781 $message = $langs->transnoentities(
"ExpenseReportRefusedMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailRefuse, $link);
799 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
803 $result = $mailfile->sendfile();
805 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
807 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
810 $langs->load(
"other");
811 if ($mailfile->error) {
813 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
814 $mesg .=
'<br>'.$mailfile->error;
817 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
825 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
835 if ($action ==
"confirm_cancel" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->rights->expensereport->creer) {
836 if (!
GETPOST(
'detail_cancel',
'alpha')) {
837 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Comment")),
null,
'errors');
842 if ($user->id == $object->fk_user_valid || $user->id == $object->fk_user_author) {
843 $detailCancel =
GETPOST(
'detail_cancel',
'alpha');
844 $result = $object->set_cancel($user, $detailCancel);
848 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
849 $outputlangs = $langs;
852 $newlang =
GETPOST(
'lang_id',
'aZ09');
855 $user =
new User($db);
856 $user->fetch($object->fk_user_author);
857 $newlang = $user->lang;
859 if (!empty($newlang)) {
861 $outputlangs->setDefaultLang($newlang);
863 $model = $object->model_pdf;
864 $ret = $object->fetch($id);
866 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
874 $destinataire =
new User($db);
875 $destinataire->fetch($object->fk_user_author);
876 $emailTo = $destinataire->email;
879 $expediteur =
new User($db);
880 $expediteur->fetch($object->fk_user_cancel);
881 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
883 if ($emailFrom && $emailTo) {
884 $filename = array(); $filedir = array(); $mimetype = array();
887 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
888 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
889 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
892 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportCanceled");
895 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
896 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
897 $message = $langs->transnoentities(
"ExpenseReportCanceledMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $detailCancel, $link);
915 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
919 $result = $mailfile->sendfile();
921 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
923 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
926 $langs->load(
"other");
927 if ($mailfile->error) {
929 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
930 $mesg .=
'<br>'.$mailfile->error;
933 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
941 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
954 if ($action ==
"confirm_setdraft" &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $id > 0 && $user->rights->expensereport->creer) {
957 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
958 $result = $object->setStatut(0);
962 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
963 $outputlangs = $langs;
966 $newlang =
GETPOST(
'lang_id',
'aZ09');
969 $user =
new User($db);
970 $user->fetch($object->fk_user_author);
971 $newlang = $user->lang;
973 if (!empty($newlang)) {
975 $outputlangs->setDefaultLang($newlang);
977 $model = $object->model_pdf;
978 $ret = $object->fetch($id);
980 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
985 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
995 if ($action ==
'set_unpaid' && $id > 0 && $user->rights->expensereport->to_paid) {
999 $result = $object->setUnpaid($user);
1003 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1004 $outputlangs = $langs;
1007 $newlang =
GETPOST(
'lang_id',
'aZ09');
1010 $user =
new User($db);
1011 $user->fetch($object->fk_user_author);
1012 $newlang = $user->lang;
1014 if (!empty($newlang)) {
1015 $outputlangs =
new Translate(
"", $conf);
1016 $outputlangs->setDefaultLang($newlang);
1018 $model = $object->model_pdf;
1019 $ret = $object->fetch($id);
1021 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1026 if ($action ==
'set_paid' && $id > 0 && $user->rights->expensereport->to_paid) {
1028 $object->fetch($id);
1030 $result = $object->setPaid($id, $user);
1034 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1035 $outputlangs = $langs;
1038 $newlang =
GETPOST(
'lang_id',
'aZ09');
1041 $user =
new User($db);
1042 $user->fetch($object->fk_user_author);
1043 $newlang = $user->lang;
1045 if (!empty($newlang)) {
1046 $outputlangs =
new Translate(
"", $conf);
1047 $outputlangs->setDefaultLang($newlang);
1049 $model = $object->model_pdf;
1050 $ret = $object->fetch($id);
1052 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1060 $destinataire =
new User($db);
1061 $destinataire->fetch($object->fk_user_author);
1062 $emailTo = $destinataire->email;
1065 $expediteur =
new User($db);
1066 $expediteur->fetch($user->id);
1067 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
1069 if ($emailFrom && $emailTo) {
1070 $filename = array(); $filedir = array(); $mimetype = array();
1073 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
1074 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
1075 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
1078 $subject = $societeName.
" - ".$langs->transnoentities(
"ExpenseReportPaid");
1081 $link = $urlwithroot.
'/expensereport/card.php?id='.$object->id;
1082 $link =
'<a href="'.$link.
'">'.$link.
'</a>';
1083 $message = $langs->transnoentities(
"ExpenseReportPaidMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
1086 $object->setDocModel($user,
"");
1087 $resultPDF = expensereport_pdf_create($db, $object,
'',
"", $langs);
1090 $mailfile =
new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename,
'',
'', 0, -1);
1094 $result = $mailfile->sendfile();
1096 $mesg = $langs->trans(
'MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
1098 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".$id);
1101 $langs->load(
"other");
1102 if ($mailfile->error) {
1104 $mesg .= $langs->trans(
'ErrorFailedToSendMail', $emailFrom, $emailTo);
1105 $mesg .=
'<br>'.$mailfile->error;
1108 setEventMessages(
'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS',
null,
'warnings');
1116 setEventMessages($langs->trans(
"NoEmailSentBadSenderOrRecipientEmail"),
null,
'warnings');
1125 if ($action ==
"addline" && $user->rights->expensereport->creer) {
1130 if (GETPOSTISSET(
'attachfile')) {
1131 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1132 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1133 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1134 $entityprefix = ($conf->entity !=
'1') ? $conf->entity.
'/' :
'';
1135 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1137 $ecmfiles->fetch(0,
'', $relativepath);
1138 $fk_ecm_files = $ecmfiles->id;
1143 if (empty($vatrate)) {
1146 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1150 if (empty($value_unit)) {
1151 $value_unit =
price2num($value_unit_ht + ($value_unit_ht * $tmpvat / 100),
'MU');
1154 $fk_c_exp_tax_cat =
GETPOST(
'fk_c_exp_tax_cat',
'int');
1161 if (!($fk_c_type_fees > 0)) {
1163 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1167 if ((
float) $tmpvat < 0 || $tmpvat ===
'') {
1169 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"VAT")),
null,
'errors');
1174 if (empty($date) || $date ==
"--") {
1176 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
1177 } elseif ($date < $object->date_debut || $date > ($object->date_fin + (24 * 3600 - 1))) {
1179 $langs->load(
"errors");
1180 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null,
'warnings');
1184 if ($value_unit == 0) {
1186 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PriceUTTC")),
null,
'errors');
1190 if ($projectRequired && $fk_project <= 0) {
1192 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1196 if ($fileRequired && $fk_ecm_files == 0) {
1198 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"File")),
null,
'errors');
1205 $result = $object->addline($qty, $value_unit, $fk_c_type_fees, $vatrate, $date, $comments, $fk_project, $fk_c_exp_tax_cat, $type, $fk_ecm_files);
1207 $ret = $object->fetch($object->id);
1209 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1211 $outputlangs = $langs;
1212 $newlang =
GETPOST(
'lang_id',
'alpha');
1214 $user =
new User($db);
1215 $user->fetch($object->fk_user_author);
1216 $newlang = $user->lang;
1218 if (!empty($newlang)) {
1219 $outputlangs =
new Translate(
"", $conf);
1220 $outputlangs->setDefaultLang($newlang);
1223 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1227 unset($value_unit_ht);
1231 unset($fk_c_type_fees);
1242 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOST(
'id',
'int'));
1249 if ($action ==
'confirm_delete_line' &&
GETPOST(
"confirm",
'alpha') ==
"yes" && $user->rights->expensereport->creer) {
1251 $object->fetch($id);
1254 $object_ligne->fetch(
GETPOST(
"rowid",
'int'));
1255 $total_ht = $object_ligne->total_ht;
1256 $total_tva = $object_ligne->total_tva;
1258 $result = $object->deleteline(
GETPOST(
"rowid",
'int'), $user);
1262 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1263 $outputlangs = $langs;
1266 $newlang =
GETPOST(
'lang_id',
'aZ09');
1269 $user =
new User($db);
1270 $user->fetch($object->fk_user_author);
1271 $newlang = $user->lang;
1273 if (!empty($newlang)) {
1274 $outputlangs =
new Translate(
"", $conf);
1275 $outputlangs->setDefaultLang($newlang);
1277 $model = $object->model_pdf;
1278 $ret = $object->fetch($id);
1280 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1284 header(
"Location: ".$_SERVER[
"PHP_SELF"].
"?id=".
GETPOST(
'id',
'int'));
1291 if ($action ==
"updateline" && $user->rights->expensereport->creer) {
1293 $object->fetch($id);
1297 if (GETPOSTISSET(
'attachfile')) {
1298 $arrayoffiles =
GETPOST(
'attachfile',
'array');
1299 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1300 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1301 $relativepath =
'expensereport/'.$object->ref.
'/'.$arrayoffiles[0];
1303 $ecmfiles->fetch(0,
'', $relativepath);
1304 $fk_ecm_files = $ecmfiles->id;
1308 $rowid =
GETPOST(
'rowid',
'int');
1309 $type_fees_id =
GETPOST(
'fk_c_type_fees',
'int');
1310 $fk_c_exp_tax_cat =
GETPOST(
'fk_c_exp_tax_cat',
'int');
1311 $projet_id = $fk_project;
1312 $comments =
GETPOST(
'comments',
'restricthtml');
1314 $vatrate =
GETPOST(
'vatrate',
'alpha');
1317 if (empty($vatrate)) {
1320 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $vatrate));
1324 if (empty($value_unit)) {
1325 $value_unit =
price2num($value_unit_ht + ($value_unit_ht * $tmpvat / 100),
'MU');
1328 if (!
GETPOST(
'fk_c_type_fees',
'int') > 0) {
1330 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Type")),
null,
'errors');
1333 if ((
float) $tmpvat < 0 || $tmpvat ==
'') {
1335 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Vat")),
null,
'errors');
1339 if ($date < $object->date_debut || $date > ($object->date_fin + (24 * 3600 - 1))) {
1340 $langs->load(
"errors");
1341 setEventMessages($langs->trans(
"WarningDateOfLineMustBeInExpenseReportRange"),
null,
'warnings');
1345 if ($projectRequired && $projet_id <= 0) {
1347 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Project")),
null,
'errors');
1352 $result = $object->updateline($rowid, $type_fees_id, $projet_id, $vatrate, $comments, $qty, $value_unit, $date, $id, $fk_c_exp_tax_cat, $fk_ecm_files);
1356 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1357 $outputlangs = $langs;
1360 $newlang =
GETPOST(
'lang_id',
'aZ09');
1363 $user =
new User($db);
1364 $user->fetch($object->fk_user_author);
1365 $newlang = $user->lang;
1367 if (!empty($newlang)) {
1368 $outputlangs =
new Translate(
"", $conf);
1369 $outputlangs->setDefaultLang($newlang);
1371 $model = $object->model_pdf;
1372 $ret = $object->fetch($id);
1374 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1378 unset($value_unit_ht);
1382 unset($fk_c_type_fees);
1396 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1399 $triggersendname =
'EXPENSEREPORT_SENTBYMAIL';
1400 $autocopy =
'MAIN_MAIL_AUTOCOPY_EXPENSEREPORT_TO';
1401 $trackid =
'exp'.$object->id;
1402 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1405 $upload_dir = $conf->expensereport->dir_output;
1406 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1414$title = $langs->trans(
"ExpenseReport").
" - ".$langs->trans(
"Card");
1415$help_url =
"EN:Module_Expense_Reports|FR:Module_Notes_de_frais";
1419$form =
new Form($db);
1422$projecttmp =
new Project($db);
1424$bankaccountstatic =
new Account($db);
1425$ecmfilesstatic =
new EcmFiles($db);
1429if ($action ==
'create') {
1432 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'" method="post" name="create">';
1433 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1434 print
'<input type="hidden" name="action" value="add">';
1435 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1439 print
'<table class="border centpercent">';
1444 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"DateStart").
'</td>';
1446 print $form->selectDate($date_start ? $date_start : -1,
'date_debut', 0, 0, 0,
'', 1, 1);
1452 print
'<td class="fieldrequired">'.$langs->trans(
"DateEnd").
'</td>';
1454 print $form->selectDate($date_end ? $date_end : -1,
'date_fin', 0, 0, 0,
'', 1, 1);
1460 print
'<td class="fieldrequired">'.$langs->trans(
"User").
'</td>';
1462 $defaultselectuser = $user->id;
1463 if (
GETPOST(
'fk_user_author',
'int') > 0) {
1464 $defaultselectuser =
GETPOST(
'fk_user_author',
'int');
1466 $include_users =
'hierarchyme';
1467 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->expensereport->writeall_advance)) {
1468 $include_users = array();
1470 $s = $form->select_dolusers($defaultselectuser,
"fk_user_author", 0,
"", 0, $include_users,
'',
'0,'.$conf->entity);
1477 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1480 $include_users = $object->fetch_users_approver_expensereport();
1481 if (empty($include_users)) {
1482 print
img_warning().
' '.$langs->trans(
"NobodyHasPermissionToValidateExpenseReport");
1484 $defaultselectuser = (empty($user->fk_user_expense_validator) ? $user->fk_user : $user->fk_user_expense_validator);
1485 if (!empty($conf->global->EXPENSEREPORT_DEFAULT_VALIDATOR)) {
1486 $defaultselectuser = $conf->global->EXPENSEREPORT_DEFAULT_VALIDATOR;
1488 if (
GETPOST(
'fk_user_validator',
'int') > 0) {
1489 $defaultselectuser =
GETPOST(
'fk_user_validator',
'int');
1491 $s = $form->select_dolusers($defaultselectuser,
"fk_user_validator", 1,
"", ((empty($defaultselectuser) || empty($conf->global->EXPENSEREPORT_DEFAULT_VALIDATOR_UNCHANGEABLE)) ? 0 : 1), $include_users);
1492 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1498 if (!empty($conf->global->EXPENSEREPORT_ASK_PAYMENTMODE_ON_CREATION)) {
1500 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1502 $form->select_types_paiements(
'',
'fk_c_paiement');
1508 $note_public = GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') :
'';
1511 print
'<td class="tdtop">'.$langs->trans(
'NotePublic').
'</td>';
1514 $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%');
1515 print $doleditor->Create(1);
1519 $note_private = GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') :
'';
1521 if (empty($user->socid)) {
1523 print
'<td class="tdtop">'.$langs->trans(
'NotePrivate').
'</td>';
1526 $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%');
1527 print $doleditor->Create(1);
1532 $parameters = array(
'colspan' =>
' colspan="3"',
'cols' => 3);
1533 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
1534 print $hookmanager->resPrint;
1535 if (empty($reshook)) {
1536 print $object->showOptionals($extrafields,
'create', $parameters);
1544 print $form->buttonsSaveCancel(
"AddTrip");
1547} elseif ($id > 0 || $ref) {
1548 $result = $object->fetch($id, $ref);
1551 if (!in_array($object->fk_user_author, $user->getAllChildIds(1))) {
1552 if (empty($user->rights->expensereport->readall) && empty($user->rights->expensereport->lire_tous)
1553 && (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || empty($user->rights->expensereport->writeall_advance))) {
1556 print
'<div class="tabBar">';
1557 print $langs->trans(
'NotUserRightToView');
1570 if ($action ==
'edit' && ($object->status < 3 || $object->status == 99)) {
1571 print
"<form name='update' action=\"".$_SERVER[
'PHP_SELF'].
"\" method=\"post\">\n";
1572 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1573 print
'<input type="hidden" name="id" value="'.$id.
'">';
1574 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1578 if ($object->status == 99) {
1579 print
'<input type="hidden" name="action" value="updateFromRefuse">';
1581 print
'<input type="hidden" name="action" value="update">';
1584 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1586 print
'<table class="border" style="width:100%;">';
1589 print
'<td>'.$langs->trans(
"User").
'</td>';
1591 $userfee =
new User($db);
1592 if ($object->fk_user_author > 0) {
1593 $userfee->fetch($object->fk_user_author);
1594 print $userfee->getNomUrl(-1);
1599 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Ref").
'</td><td>';
1600 print $form->showrefnav($object,
'ref', $linkback, 1,
'ref',
'ref',
'');
1604 print
'<td>'.$langs->trans(
"DateStart").
'</td>';
1606 print $form->selectDate($object->date_debut,
'date_debut');
1610 print
'<td>'.$langs->trans(
"DateEnd").
'</td>';
1612 print $form->selectDate($object->date_fin,
'date_fin');
1616 if (!empty($conf->global->EXPENSEREPORT_ASK_PAYMENTMODE_ON_CREATION)) {
1618 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1620 $form->select_types_paiements($object->fk_c_paiement,
'fk_c_paiement');
1625 if ($object->status < 3) {
1627 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1629 $include_users = $object->fetch_users_approver_expensereport();
1630 $s = $form->select_dolusers($object->fk_user_validator,
"fk_user_validator", 1,
"", 0, $include_users);
1631 print $form->textwithpicto($s, $langs->trans(
"AnyOtherInThisListCanValidate"));
1636 print
'<td>'.$langs->trans(
"VALIDOR").
'</td>';
1638 $userfee =
new User($db);
1639 $userfee->fetch($object->fk_user_valid);
1640 print $userfee->getNomUrl(-1);
1644 if ($object->status == 6) {
1646 print
'<td>'.$langs->trans(
"AUTHORPAIEMENT").
'</td>';
1648 $userfee =
new User($db);
1649 $userfee->fetch($user->id);
1650 print $userfee->getNomUrl(-1);
1662 print $form->buttonsSaveCancel(
"Modify");
1666 $taxlessUnitPriceDisabled = !empty($conf->global->EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY) ?
' disabled' :
'';
1673 if ($action ==
'clone') {
1675 $criteriaforfilter =
'hierarchyme';
1676 if (!empty($user->rights->expensereport->readall)) {
1677 $criteriaforfilter =
'';
1679 $formquestion = array(
1681 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'))
1684 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneExpenseReport', $object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1687 if ($action ==
'save') {
1688 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_validate",
"",
"", 1);
1691 if ($action ==
'save_from_refuse') {
1692 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"SaveTrip"), $langs->trans(
"ConfirmSaveTrip"),
"confirm_save_from_refuse",
"",
"", 1);
1695 if ($action ==
'delete') {
1696 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"DeleteTrip"), $langs->trans(
"ConfirmDeleteTrip"),
"confirm_delete",
"",
"", 1);
1699 if ($action ==
'validate') {
1700 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"ValideTrip"), $langs->trans(
"ConfirmValideTrip"),
"confirm_approve",
"",
"", 1);
1703 if ($action ==
'paid') {
1704 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"PaidTrip"), $langs->trans(
"ConfirmPaidTrip"),
"confirm_paid",
"",
"", 1);
1707 if ($action ==
'cancel') {
1708 $array_input = array(
'text'=>$langs->trans(
"ConfirmCancelTrip"), array(
'type'=>
"text",
'label'=>
'<strong>'.$langs->trans(
"Comment").
'</strong>',
'name'=>
"detail_cancel",
'value'=>
""));
1709 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Cancel"),
"",
"confirm_cancel", $array_input,
"", 1);
1712 if ($action ==
'setdraft') {
1713 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"BrouillonnerTrip"), $langs->trans(
"ConfirmBrouillonnerTrip"),
"confirm_setdraft",
"",
"", 1);
1716 if ($action ==
'refuse') {
1717 $array_input = array(
'text'=>$langs->trans(
"ConfirmRefuseTrip"), array(
'type'=>
"text",
'label'=>$langs->trans(
"Comment"),
'name'=>
"detail_refuse",
'value'=>
""));
1718 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id, $langs->trans(
"Deny"),
'',
"confirm_refuse", $array_input,
"yes", 1);
1721 if ($action ==
'delete_line') {
1722 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$id.
"&rowid=".
GETPOST(
'rowid',
'int'), $langs->trans(
"DeleteLine"), $langs->trans(
"ConfirmDeleteLine"),
"confirm_delete_line",
'',
'yes', 1);
1729 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1731 $morehtmlref =
'<div class="refidno">';
1732 $morehtmlref .=
'</div>';
1734 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
1736 print
'<div class="fichecenter">';
1737 print
'<div class="fichehalfleft">';
1738 print
'<div class="underbanner clearboth"></div>';
1740 print
'<table class="border tableforfield centpercent">';
1744 print
'<td class="titlefield">'.$langs->trans(
"User").
'</td>';
1746 if ($object->fk_user_author > 0) {
1747 $userauthor =
new User($db);
1748 $result = $userauthor->fetch($object->fk_user_author);
1751 } elseif ($result > 0) {
1752 print $userauthor->getNomUrl(-1);
1759 print
'<td class="titlefield">'.$langs->trans(
"Period").
'</td>';
1761 print
get_date_range($object->date_debut, $object->date_fin,
'day', $langs, 0);
1764 if (!empty($conf->global->EXPENSEREPORT_ASK_PAYMENTMODE_ON_CREATION)) {
1766 print
'<td>'.$langs->trans(
"ModePaiement").
'</td>';
1767 print
'<td>'.$object->fk_c_paiement.
'</td>';
1773 print
'<td>'.$langs->trans(
"DATE_SAVE").
'</td>';
1774 print
'<td>'.dol_print_date($object->date_valid,
'dayhour',
'tzuser');
1775 if ($object->status == 2 && $object->hasDelay(
'toapprove')) {
1776 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToApprove"));
1778 if ($object->status == 5 && $object->hasDelay(
'topay')) {
1779 print
' '.img_warning($langs->trans(
"Late").
' - '.$langs->trans(
"ToPay"));
1787 print
'<td>'.$langs->trans(
"VALIDATOR").
'</td>';
1789 if ($object->fk_user_validator > 0) {
1790 $userfee =
new User($db);
1791 $result = $userfee->fetch($object->fk_user_validator);
1793 print $userfee->getNomUrl(-1);
1795 if (empty($userfee->email) || !
isValidEmail($userfee->email)) {
1796 $langs->load(
"errors");
1797 print
img_warning($langs->trans(
"ErrorBadEMail", $userfee->email));
1803 print
'<td>'.$langs->trans(
"CANCEL_USER").
'</span></td>';
1805 if ($object->fk_user_cancel > 0) {
1806 $userfee =
new User($db);
1807 $result = $userfee->fetch($object->fk_user_cancel);
1809 print $userfee->getNomUrl(-1);
1815 print
'<td>'.$langs->trans(
"MOTIF_CANCEL").
'</td>';
1816 print
'<td>'.$object->detail_cancel.
'</td></tr>';
1819 print
'<td>'.$langs->trans(
"DATE_CANCEL").
'</td>';
1820 print
'<td>'.dol_print_date($object->date_cancel,
'dayhour',
'tzuser').
'</td></tr>';
1824 print
'<td>'.$langs->trans(
"ApprovedBy").
'</td>';
1826 if ($object->fk_user_approve > 0) {
1827 $userapp =
new User($db);
1828 $result = $userapp->fetch($object->fk_user_approve);
1830 print $userapp->getNomUrl(-1);
1836 print
'<td>'.$langs->trans(
"DateApprove").
'</td>';
1837 print
'<td>'.dol_print_date($object->date_approve,
'dayhour',
'tzuser').
'</td></tr>';
1841 if ($object->status == 99 || !empty($object->detail_refuse)) {
1843 print
'<td>'.$langs->trans(
"REFUSEUR").
'</td>';
1845 $userfee =
new User($db);
1846 $result = $userfee->fetch($object->fk_user_refuse);
1848 print $userfee->getNomUrl(-1);
1853 print
'<td>'.$langs->trans(
"DATE_REFUS").
'</td>';
1854 print
'<td>'.dol_print_date($object->date_refuse,
'dayhour',
'tzuser');
1855 if ($object->detail_refuse) {
1856 print
' - '.$object->detail_refuse;
1862 if ($object->status == $object::STATUS_CLOSED) {
1880 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1885 print
'<div class="fichehalfright">';
1886 print
'<div class="underbanner clearboth"></div>';
1888 print
'<table class="border tableforfield centpercent">';
1892 print
'<td class="titlefieldmiddle">'.$langs->trans(
"AmountHT").
'</td>';
1893 print
'<td class="nowrap amountcard">'.price($object->total_ht, 1,
'', 1, - 1, - 1, $conf->currency).
'</td>';
1912 print
'<td>'.$langs->trans(
"AmountVAT").
'</td>';
1913 print
'<td class="nowrap amountcard">'.price($object->total_tva, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1917 if ($mysoc->localtax1_assuj ==
"1" || $object->total_localtax1 != 0) {
1918 print
'<tr><td>'.$langs->transcountry(
"AmountLT1", $mysoc->country_code).
'</td>';
1919 print
'<td class="valuefield">'.price($object->total_localtax1, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1921 if ($mysoc->localtax2_assuj ==
"1" || $object->total_localtax2 != 0) {
1922 print
'<tr><td>'.$langs->transcountry(
"AmountLT2", $mysoc->country_code).
'</td>';
1923 print
'<td class="valuefield">'.price($object->total_localtax2, 1,
'', 1, -1, -1, $conf->currency).
'</td></tr>';
1927 print
'<td>'.$langs->trans(
"AmountTTC").
'</td>';
1928 print
'<td class="nowrap amountcard">'.price($object->total_ttc, 1,
'', 1, -1, -1, $conf->currency).
'</td>';
1932 $canSeeBankAccount = isModEnabled(
'bank') && $user->hasRight(
'banque',
'lire');
1935 if ($canSeeBankAccount) {
1940 print
'<table class="noborder paymenttable centpercent">';
1942 print
'<tr class="liste_titre">';
1943 print
'<td class="liste_titre">'.$langs->trans(
'Payments').
'</td>';
1944 print
'<td class="liste_titre">'.$langs->trans(
'Date').
'</td>';
1945 print
'<td class="liste_titre">'.$langs->trans(
'Type').
'</td>';
1946 if ($canSeeBankAccount) {
1947 print
'<td class="liste_titre right">'.$langs->trans(
'BankAccount').
'</td>';
1949 print
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
1950 print
'<td class="liste_titre" width="18"> </td>';
1954 $sql =
"SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,";
1955 $sql .=
"c.code as payment_code, c.libelle as payment_type,";
1956 $sql .=
"ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal";
1957 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as e, ".MAIN_DB_PREFIX.
"payment_expensereport as p";
1958 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as c ON p.fk_typepayment = c.id";
1959 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
1960 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
1961 $sql .=
" WHERE e.rowid = ".((int) $id);
1962 $sql .=
" AND p.fk_expensereport = e.rowid";
1963 $sql .=
' AND e.entity IN ('.getEntity(
'expensereport').
')';
1964 $sql .=
" ORDER BY dp";
1966 $resql = $db->query($sql);
1968 $num = $db->num_rows($resql);
1969 $i = 0; $totalpaid = 0;
1971 $objp = $db->fetch_object($resql);
1973 $paymentexpensereportstatic->id = $objp->rowid;
1974 $paymentexpensereportstatic->datep = $db->jdate($objp->dp);
1975 $paymentexpensereportstatic->ref = $objp->rowid;
1976 $paymentexpensereportstatic->num_payment = $objp->num_payment;
1977 $paymentexpensereportstatic->type_code = $objp->payment_code;
1978 $paymentexpensereportstatic->type_label = $objp->payment_type;
1980 print
'<tr class="oddseven">';
1982 print $paymentexpensereportstatic->getNomUrl(1);
1984 print
'<td>'.dol_print_date($db->jdate($objp->dp),
'day').
"</td>\n";
1985 $labeltype = $langs->trans(
"PaymentType".$objp->payment_code) != (
"PaymentType".$objp->payment_code) ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_type;
1986 print
"<td>".$labeltype.
' '.$objp->num_payment.
"</td>\n";
1988 if ($canSeeBankAccount) {
1989 $bankaccountstatic->id = $objp->baid;
1990 $bankaccountstatic->ref = $objp->baref;
1991 $bankaccountstatic->label = $objp->baref;
1992 $bankaccountstatic->number = $objp->banumber;
1994 if (isModEnabled(
'accounting')) {
1995 $bankaccountstatic->account_number = $objp->account_number;
1998 $accountingjournal->fetch($objp->fk_accountancy_journal);
1999 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1,
'', 1);
2002 print
'<td class="right">';
2003 if ($bankaccountstatic->id) {
2004 print $bankaccountstatic->getNomUrl(1,
'transactions');
2008 print
'<td class="right">'.price($objp->amount).
"</td>";
2011 $totalpaid += $objp->amount;
2014 if (!is_null($totalpaid)) {
2018 $remaintopay =
price2num($object->total_ttc - $totalpaid);
2019 $resteapayeraffiche = $remaintopay;
2021 $cssforamountpaymentcomplete =
'amountpaymentcomplete';
2024 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2025 $resteapayeraffiche = 0;
2026 } elseif ($object->paid == 0) {
2027 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2029 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AlreadyPaid").
':</td><td class="right">'.
price($totalpaid).
'</td><td></td></tr>';
2030 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AmountExpected").
':</td><td class="right">'.
price($object->total_ttc).
'</td><td></td></tr>';
2032 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"RemainderToPay").
':</td>';
2033 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td></td></tr>';
2044 print
'<div class="clearboth"></div><br>';
2046 print
'<div style="clear: both;"></div>';
2048 $actiontouse =
'updateline';
2049 if (($object->status == 0 || $object->status == 99) && $action !=
'editline') {
2050 $actiontouse =
'addline';
2053 print
'<form name="expensereport" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="post" >';
2054 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2055 print
'<input type="hidden" name="action" value="'.$actiontouse.
'">';
2056 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2057 print
'<input type="hidden" name="fk_expensereport" value="'.$object->id.
'" />';
2058 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2059 print
'<input type="hidden" name="page_y" value="">';
2061 print
'<div class="div-table-responsive-no-min">';
2062 print
'<table id="tablelines" class="noborder centpercent">';
2064 if (!empty($object->lines)) {
2067 print
'<tr class="liste_titre headerexpensereportdet">';
2068 print
'<td class="center linecollinenb">'.$langs->trans(
'LineNb').
'</td>';
2070 print
'<td class="center linecoldate">'.$langs->trans(
'Date').
'</td>';
2071 if (isModEnabled(
'project')) {
2072 print
'<td class="minwidth100imp linecolproject">'.$langs->trans(
'Project').
'</td>';
2074 print
'<td class="center linecoltype">'.$langs->trans(
'Type').
'</td>';
2075 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2076 print
'<td class="center linecolcarcategory">'.$langs->trans(
'CarCategory').
'</td>';
2078 print
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
2079 print
'<td class="right linecolvat">'.$langs->trans(
'VAT').
'</td>';
2080 print
'<td class="right linecolpriceuht">'.$langs->trans(
'PriceUHT').
'</td>';
2081 print
'<td class="right linecolpriceuttc">'.$langs->trans(
'PriceUTTC').
'</td>';
2082 print
'<td class="right linecolqty">'.$langs->trans(
'Qty').
'</td>';
2083 if ($action !=
'editline') {
2084 print
'<td class="right linecolamountht">'.$langs->trans(
'AmountHT').
'</td>';
2085 print
'<td class="right linecolamountttc">'.$langs->trans(
'AmountTTC').
'</td>';
2096 if (($object->status < 2 || $object->status == 99) && $user->rights->expensereport->creer) {
2097 print
'<td class="right"></td>';
2101 foreach ($object->lines as &$line) {
2104 if ($action !=
'editline' || $line->id !=
GETPOST(
'rowid',
'int')) {
2105 print
'<tr class="oddeven linetr" data-id="'.$line->id.
'">';
2108 print
'<td class="center linecollinenb">';
2113 print
'<td class="center linecoldate">'.dol_print_date($db->jdate($line->date),
'day').
'</td>';
2116 if (isModEnabled(
'project')) {
2117 print
'<td class="lineproject">';
2118 if ($line->fk_project > 0) {
2119 $projecttmp->id = $line->fk_project;
2120 $projecttmp->ref = $line->projet_ref;
2121 $projecttmp->title = $line->projet_title;
2122 print $projecttmp->getNomUrl(1);
2128 if (isModEnabled(
'accounting')) {
2129 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
2131 $resaccountingaccount = $accountingaccount->fetch(0, $line->type_fees_accountancy_code, 1);
2133 $titlealt .= $langs->trans(
"AccountancyCode").
': ';
2134 if ($resaccountingaccount > 0) {
2135 $titlealt .= $accountingaccount->account_number;
2137 $titlealt .= $langs->trans(
"NotFound");
2143 print
'<td class="center linecoltype" title="'.dol_escape_htmltag($titlealt).
'">';
2144 $labeltype = ($langs->trans(($line->type_fees_code)) == $line->type_fees_code ? $line->type_fees_libelle : $langs->trans($line->type_fees_code));
2149 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2150 print
'<td class="fk_c_exp_tax_cat linecoltaxcat">';
2151 $exp_tax_cat_label =
dol_getIdFromCode($db, $line->fk_c_exp_tax_cat,
'c_exp_tax_cat',
'rowid',
'label');
2152 print $langs->trans($exp_tax_cat_label);
2157 print
'<td class="left linecolcomment">'.dol_nl2br($line->comments).
'</td>';
2160 print
'<td class="right linecolvatrate">'.vatrate($line->vatrate.($line->vat_src_code ?
' ('.$line->vat_src_code.
')' :
''), true).
'</td>';
2163 print
'<td class="right linecolunitht">';
2164 if (!empty($line->value_unit_ht)) {
2165 print
price($line->value_unit_ht);
2167 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $line->vatrate));
2168 $pricenettoshow =
price2num($line->value_unit / (1 + $tmpvat / 100),
'MU');
2169 print
price($pricenettoshow);
2173 print
'<td class="right linecolunitttc">'.price($line->value_unit).
'</td>';
2175 print
'<td class="right linecolqty">'.dol_escape_htmltag($line->qty).
'</td>';
2177 if ($action !=
'editline') {
2178 print
'<td class="right linecoltotalht">'.price($line->total_ht).
'</td>';
2179 print
'<td class="right linecoltotalttc">'.price($line->total_ttc).
'</td>';
2183 print
'<td class="center linecolpreview">';
2184 if ($line->fk_ecm_files > 0) {
2185 $modulepart =
'expensereport';
2186 $maxheightmini = 32;
2188 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2190 $relativepath = preg_replace(
'/expensereport\//',
'', $ecmfilesstatic->filepath);
2191 $fileinfo = pathinfo($ecmfilesstatic->filepath.
'/'.$ecmfilesstatic->filename);
2194 if (!
dol_is_file($conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$minifile)) {
2198 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity));
2199 if (empty($urlforhref)) {
2200 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
2201 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
2203 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2205 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="">';
2208 $modulepart =
'expensereport';
2210 if (preg_match(
'/\.pdf$/i', $ecmfilesstatic->filename)) {
2211 $filepdf = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename;
2212 $fileimage = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2213 $relativepathimage = $relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2215 $pdfexists = file_exists($filepdf);
2218 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2219 if (empty($conf->global->MAIN_DISABLE_PDF_THUMBS)) {
2220 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2229 if ($pdfexists && !$error) {
2230 $heightforphotref = 70;
2231 if (!empty($conf->dol_optimize_smallscreen)) {
2232 $heightforphotref = 60;
2235 if (file_exists($fileimage)) {
2237 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity));
2238 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2239 print
'<img height="'.$heightforphotref.
'" class="photo photowithmargin photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2245 if (!$thumbshown && $fileinfo[
'extension'] ==
'pdf' && !empty($filepdf) && !empty($relativepath) && !empty($fileinfo[
'filename'])) {
2247 $imgpreview = $formFile->showPreview([], $modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 0);
2249 } elseif (!$thumbshown) {
2250 print
img_mime($ecmfilesstatic->filename);
2257 print
'<td class="nowrap right linecolwarning">';
2258 print !empty($line->rule_warning_message) ?
img_warning(html_entity_decode($line->rule_warning_message)) :
' ';
2263 print
'<td class="nowrap right linecolaction">';
2265 print
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$line->rowid.
'">';
2267 print
'</a> ';
2268 print
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete_line&token='.newToken().
'&rowid='.$line->rowid.
'">';
2278 if ($action ==
'editline' && $line->id ==
GETPOST(
'rowid',
'int')) {
2281 if (isModEnabled(
'project')) {
2284 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2288 print
'<!-- line of expense report -->'.
"\n";
2289 print
'<tr class="tredited">';
2291 print
'<td class="center">';
2295 print
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
2296 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2297 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2299 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2300 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2301 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2305 print
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
2306 print
'<script type="text/javascript">'.
"\n";
2307 print
'$(document).ready(function() {
2308 $( ".auploadnewfilenow" ).click(function() {
2309 jQuery(".truploadnewfilenow").toggle();
2310 jQuery(".trattachnewfilenow").hide();
2313 $( ".aattachtodoc" ).click(function() {
2314 jQuery(".trattachnewfilenow").toggle();
2315 jQuery(".truploadnewfilenow").hide();
2318 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array'))) {
2319 print
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
2322 jQuery("form[name=\"expensereport\"]").submit(function() {
2323 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2324 jQuery("input[name=\"sendit\"]").val("");
2331 print
'</script>'.
"\n";
2334 $filenamelinked =
'';
2335 if ($line->fk_ecm_files > 0) {
2336 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2338 $filenamelinked = $ecmfilesstatic->filename;
2342 $tredited =
'tredited';
2343 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2344 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2346 print
'<tr class="oddeven tredited">';
2351 print
'<td class="center">';
2352 print $form->selectDate($line->date,
'date');
2356 if (isModEnabled(
'project')) {
2358 $formproject->select_projects(-1, $line->fk_project,
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2363 print
'<td class="center">';
2364 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees,
'fk_c_type_fees');
2367 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2368 print
'<td class="fk_c_exp_tax_cat">';
2369 $params = array(
'fk_expense' => $object->id,
'fk_expense_det' => $line->id,
'date' => $line->date);
2370 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);
2376 print
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
2380 $selectedvat =
price2num($line->vatrate).(!empty($line->vat_src_code) ?
' ('.$line->vat_src_code.
')' :
'');
2381 print
'<td class="right">';
2382 print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ?
GETPOST(
"vatrate") : $selectedvat), $mysoc,
'', 0, 0,
'', false, 1);
2386 print
'<td class="right">';
2387 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.
' />';
2391 print
'<td class="right">';
2392 print
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
2396 print
'<td class="right">';
2397 print
'<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';
2404 print
'<td class="center">';
2408 print
'<td class="center">';
2412 print
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
2413 print $form->buttonsSaveCancel(
'Save',
'Cancel', array(), 0,
'small');
2426 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2429 if (isModEnabled(
'project')) {
2432 if ($action !=
'editline') {
2436 $nbFiles = $nbLinks = 0;
2437 $arrayoffiles = array();
2438 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2439 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2440 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2441 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2444 $nbFiles = count($arrayoffiles);
2445 $nbLinks =
Link::count($db, $object->element, $object->id);
2449 print
'<tr class="liste_titre">';
2450 print
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
2451 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2452 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2454 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2455 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2456 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2460 print
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
2461 print
'<script type="text/javascript">'.
"\n";
2462 print
'$(document).ready(function() {
2463 $( ".auploadnewfilenow" ).click(function() {
2464 console.log("We click on toggle of auploadnewfilenow");
2465 jQuery(".truploadnewfilenow").toggle();
2466 jQuery(".trattachnewfilenow").hide();
2467 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2468 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2470 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2472 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2475 $( ".aattachtodoc" ).click(function() {
2476 console.log("We click on toggle of aattachtodoc");
2477 jQuery(".trattachnewfilenow").toggle();
2478 jQuery(".truploadnewfilenow").hide();
2479 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2482 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array')) && $action !=
'updateline') {
2483 print
'jQuery(".trattachnewfilenow").show();'.
"\n";
2486 jQuery("form[name=\"expensereport\"]").submit(function() {
2487 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2488 /* 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. */
2489 jQuery("input[name=\"sendit\"]").val("");
2490 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2492 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2499 print
'</script>'.
"\n";
2503 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2504 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2506 print
'<tr class="liste_titre expensereportcreate">';
2508 print
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
2509 if (isModEnabled(
'project')) {
2510 print
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
2512 print
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
2513 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2514 print
'<td>'.$langs->trans(
'CarCategory').
'</td>';
2516 print
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
2517 print
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
2518 print
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
2519 print
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
2520 print
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
2527 print
'<tr class="oddeven nohover">';
2533 print
'<td class="center inputdate">';
2534 print $form->selectDate(!empty($date) ? $date : -1,
'date', 0, 0, 0,
'', 1, 1);
2538 if (isModEnabled(
'project')) {
2539 print
'<td class="inputproject">';
2540 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0,
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2545 print
'<td class="center inputtype">';
2546 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees :
"",
'fk_c_type_fees', 1);
2549 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2550 print
'<td class="fk_c_exp_tax_cat">';
2551 $params = array(
'fk_expense' => $object->id);
2552 print $form->selectExpenseCategories(
'',
'fk_c_exp_tax_cat', 1, array(),
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2557 print
'<td class="inputcomment">';
2558 print
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments :
"", 0, 1).
'</textarea>';
2562 print
'<td class="right inputvat">';
2564 if (!empty($conf->global->EXPENSEREPORT_NO_DEFAULT_VAT)) {
2566 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS =
'none';
2568 print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), $mysoc,
'', 0, 0,
'', false, 1);
2572 print
'<td class="right inputpricenet">';
2573 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.
' />';
2577 print
'<td class="right inputtax">';
2578 print
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit : 0)).
'">';
2582 print
'<td class="right inputqty">';
2583 print
'<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">';
2589 if ($action !=
'editline') {
2590 print
'<td class="right"></td>';
2591 print
'<td class="right"></td>';
2594 print
'<td class="center inputbuttons">';
2595 print $form->buttonsSaveCancel(
"Add",
'',
'', 1,
'reposition');
2606 /* JQuery for product free or predefined select */
2607 jQuery(document).ready(function() {
2608 jQuery("#value_unit_ht").keyup(function(event) {
2609 console.log(event.which); // discard event tag and arrows
2610 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2611 jQuery("#value_unit").val("");
2614 jQuery("#value_unit").keyup(function(event) {
2615 console.log(event.which); // discard event tag and arrows
2616 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2617 jQuery("#value_unit_ht").val("");
2622 if (! empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2625 /* unit price coéf calculation */
2626 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2628 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2629 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2630 let tva = jQuery("#vatrate").find(":selected").val();
2631 let qty = jQuery(".input_qty").val();
2635 let path = "'.dol_buildpath(
"/expensereport/ajax/ajaxik.php", 1) .
'";
2636 path += "?fk_c_exp_tax_cat="+tax_cat;
2637 path +="&fk_expense="+'.$object->id.
';
2638 path += "&vatrate="+tva;
2639 path += "&qty="+qty;
2641 if (type_fee == 4) { // frais_kilométriques
2643 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2651 ,success:function(response) {
2652 if (response.response_status == "success"){';
2654 if (!empty($conf->global->EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY)) {
2656 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2657 jQuery("#value_unit").trigger("change");
2661 jQuery("#value_unit_ht").val(response.data);
2662 jQuery("#value_unit_ht").trigger("change");
2663 jQuery("#value_unit").val("");
2668 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ){
2669 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2676 /*console.log(event.which); // discard event tag and arrows
2677 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2678 jQuery("#value_unit_ht").val("");
2698 print
'Record not found';
2709print
'<div class="tabsAction">';
2711if ($action !=
'create' && $action !=
'edit' && $action !=
'editline') {
2713 $object->fetch($id, $ref);
2716 if (empty($user->socid)) {
2719 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>';
2731 if (in_array($object->fk_user_author, $user->getAllChildIds(1)) || !empty($user->rights->expensereport->writeall_advance)) {
2733 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>';
2736 if (count($object->lines) > 0) {
2737 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>';
2748 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2750 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>';
2755 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>';
2760 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2762 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=setdraft&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'SetToDraft').
'</a></div>';
2772 if (in_array($object->fk_user_author, $user->getAllChildIds(1))) {
2774 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=setdraft&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'SetToDraft').
'</a></div>';
2782 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=validate&id='.$object->id.
'">'.$langs->trans(
'Approve').
'</a></div>';
2784 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2787 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2789 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2798 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2804 if ($remaintopay == 0) {
2805 print
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
2807 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>';
2814 if ($object->paid == 0) {
2815 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>";
2819 if ($user->rights->expensereport->creer && ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) && $object->status ==
ExpenseReport::STATUS_APPROVED) {
2821 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>';
2825 if (($user->rights->expensereport->approve || $user->rights->expensereport->to_paid) && $object->status ==
ExpenseReport::STATUS_CLOSED) {
2827 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>';
2832 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>';
2836 if ($user->rights->expensereport->creer) {
2837 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>';
2843 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>';
2846 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>';
2849 $parameters = array();
2850 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2857if (
GETPOST(
'modelselected',
'alpha')) {
2858 $action =
'presend';
2861if ($action !=
'presend') {
2866 print
'<div class="fichecenter"><div class="fichehalfleft">';
2867 print
'<a name="builddoc"></a>';
2869 if ($user->rights->expensereport->creer && $action !=
'create' && $action !=
'edit') {
2872 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
2873 $genallowed = $user->rights->expensereport->creer;
2874 $delallowed = $user->rights->expensereport->creer;
2876 print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2877 $somethingshown = $formfile->numoffiles;
2889 print
'</div><div class="fichehalfright">';
2891 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2893 $somethingshown =
$formactions->showactions($object,
'expensereport',
null);
2895 print
'</div></div>';
2899$modelmail =
'expensereport_send';
2900$defaulttopic =
'SendExpenseReportRef';
2901$diroutput = $conf->expensereport->dir_output;
2902$trackid =
'exp'.$object->id;
2904include 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...
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
get_date_range($date_start, $date_end, $format='', $outputlangs='', $withparenthesis=1)
Format output for start and end date.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
getImageFileNameForSize($file, $extName, $extImgTarget='')
Return the filename of file to get the thumbs.
getAdvancedPreviewUrl($modulepart, $relativepath, $alldata=0, $param='')
Return URL we can use for advanced preview links.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
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.