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>';
1934 if (isModEnabled(
"banque")) {
1939 print
'<table class="noborder paymenttable centpercent">';
1941 print
'<tr class="liste_titre">';
1942 print
'<td class="liste_titre">'.$langs->trans(
'Payments').
'</td>';
1943 print
'<td class="liste_titre">'.$langs->trans(
'Date').
'</td>';
1944 print
'<td class="liste_titre">'.$langs->trans(
'Type').
'</td>';
1945 if (isModEnabled(
"banque")) {
1946 print
'<td class="liste_titre right">'.$langs->trans(
'BankAccount').
'</td>';
1948 print
'<td class="liste_titre right">'.$langs->trans(
'Amount').
'</td>';
1949 print
'<td class="liste_titre" width="18"> </td>';
1953 $sql =
"SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,";
1954 $sql .=
"c.code as payment_code, c.libelle as payment_type,";
1955 $sql .=
"ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal";
1956 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expensereport as e, ".MAIN_DB_PREFIX.
"payment_expensereport as p";
1957 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as c ON p.fk_typepayment = c.id";
1958 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank as b ON p.fk_bank = b.rowid';
1959 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'bank_account as ba ON b.fk_account = ba.rowid';
1960 $sql .=
" WHERE e.rowid = ".((int) $id);
1961 $sql .=
" AND p.fk_expensereport = e.rowid";
1962 $sql .=
' AND e.entity IN ('.getEntity(
'expensereport').
')';
1963 $sql .=
" ORDER BY dp";
1965 $resql = $db->query($sql);
1967 $num = $db->num_rows($resql);
1968 $i = 0; $totalpaid = 0;
1970 $objp = $db->fetch_object($resql);
1972 $paymentexpensereportstatic->id = $objp->rowid;
1973 $paymentexpensereportstatic->datep = $db->jdate($objp->dp);
1974 $paymentexpensereportstatic->ref = $objp->rowid;
1975 $paymentexpensereportstatic->num_payment = $objp->num_payment;
1976 $paymentexpensereportstatic->type_code = $objp->payment_code;
1977 $paymentexpensereportstatic->type_label = $objp->payment_type;
1979 print
'<tr class="oddseven">';
1981 print $paymentexpensereportstatic->getNomUrl(1);
1983 print
'<td>'.dol_print_date($db->jdate($objp->dp),
'day').
"</td>\n";
1984 $labeltype = $langs->trans(
"PaymentType".$objp->payment_code) != (
"PaymentType".$objp->payment_code) ? $langs->trans(
"PaymentType".$objp->payment_code) : $objp->payment_type;
1985 print
"<td>".$labeltype.
' '.$objp->num_payment.
"</td>\n";
1987 if (isModEnabled(
"banque")) {
1988 $bankaccountstatic->id = $objp->baid;
1989 $bankaccountstatic->ref = $objp->baref;
1990 $bankaccountstatic->label = $objp->baref;
1991 $bankaccountstatic->number = $objp->banumber;
1993 if (isModEnabled(
'accounting')) {
1994 $bankaccountstatic->account_number = $objp->account_number;
1997 $accountingjournal->fetch($objp->fk_accountancy_journal);
1998 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1,
'', 1);
2001 print
'<td class="right">';
2002 if ($bankaccountstatic->id) {
2003 print $bankaccountstatic->getNomUrl(1,
'transactions');
2007 print
'<td class="right">'.price($objp->amount).
"</td>";
2010 $totalpaid += $objp->amount;
2013 if (!is_null($totalpaid)) {
2017 $remaintopay =
price2num($object->total_ttc - $totalpaid);
2018 $resteapayeraffiche = $remaintopay;
2020 $cssforamountpaymentcomplete =
'amountpaymentcomplete';
2023 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2024 $resteapayeraffiche = 0;
2025 } elseif ($object->paid == 0) {
2026 $cssforamountpaymentcomplete =
'amountpaymentneutral';
2028 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AlreadyPaid").
':</td><td class="right">'.
price($totalpaid).
'</td><td></td></tr>';
2029 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"AmountExpected").
':</td><td class="right">'.
price($object->total_ttc).
'</td><td></td></tr>';
2031 print
'<tr><td colspan="'.$nbcols.
'" class="right">'.$langs->trans(
"RemainderToPay").
':</td>';
2032 print
'<td class="right'.($resteapayeraffiche ?
' amountremaintopay' : (
' '.$cssforamountpaymentcomplete)).
'">'.
price($resteapayeraffiche).
'</td><td></td></tr>';
2043 print
'<div class="clearboth"></div><br>';
2045 print
'<div style="clear: both;"></div>';
2047 $actiontouse =
'updateline';
2048 if (($object->status == 0 || $object->status == 99) && $action !=
'editline') {
2049 $actiontouse =
'addline';
2052 print
'<form name="expensereport" action="'.$_SERVER[
"PHP_SELF"].
'" enctype="multipart/form-data" method="post" >';
2053 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2054 print
'<input type="hidden" name="action" value="'.$actiontouse.
'">';
2055 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2056 print
'<input type="hidden" name="fk_expensereport" value="'.$object->id.
'" />';
2057 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2058 print
'<input type="hidden" name="page_y" value="">';
2060 print
'<div class="div-table-responsive-no-min">';
2061 print
'<table id="tablelines" class="noborder centpercent">';
2063 if (!empty($object->lines)) {
2066 print
'<tr class="liste_titre headerexpensereportdet">';
2067 print
'<td class="center linecollinenb">'.$langs->trans(
'LineNb').
'</td>';
2069 print
'<td class="center linecoldate">'.$langs->trans(
'Date').
'</td>';
2070 if (isModEnabled(
'project')) {
2071 print
'<td class="minwidth100imp linecolproject">'.$langs->trans(
'Project').
'</td>';
2073 print
'<td class="center linecoltype">'.$langs->trans(
'Type').
'</td>';
2074 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2075 print
'<td class="center linecolcarcategory">'.$langs->trans(
'CarCategory').
'</td>';
2077 print
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
2078 print
'<td class="right linecolvat">'.$langs->trans(
'VAT').
'</td>';
2079 print
'<td class="right linecolpriceuht">'.$langs->trans(
'PriceUHT').
'</td>';
2080 print
'<td class="right linecolpriceuttc">'.$langs->trans(
'PriceUTTC').
'</td>';
2081 print
'<td class="right linecolqty">'.$langs->trans(
'Qty').
'</td>';
2082 if ($action !=
'editline') {
2083 print
'<td class="right linecolamountht">'.$langs->trans(
'AmountHT').
'</td>';
2084 print
'<td class="right linecolamountttc">'.$langs->trans(
'AmountTTC').
'</td>';
2095 if (($object->status < 2 || $object->status == 99) && $user->rights->expensereport->creer) {
2096 print
'<td class="right"></td>';
2100 foreach ($object->lines as &$line) {
2103 if ($action !=
'editline' || $line->id !=
GETPOST(
'rowid',
'int')) {
2104 print
'<tr class="oddeven linetr" data-id="'.$line->id.
'">';
2107 print
'<td class="center linecollinenb">';
2112 print
'<td class="center linecoldate">'.dol_print_date($db->jdate($line->date),
'day').
'</td>';
2115 if (isModEnabled(
'project')) {
2116 print
'<td class="lineproject">';
2117 if ($line->fk_project > 0) {
2118 $projecttmp->id = $line->fk_project;
2119 $projecttmp->ref = $line->projet_ref;
2120 $projecttmp->title = $line->projet_title;
2121 print $projecttmp->getNomUrl(1);
2127 if (isModEnabled(
'accounting')) {
2128 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
2130 $resaccountingaccount = $accountingaccount->fetch(0, $line->type_fees_accountancy_code, 1);
2132 $titlealt .= $langs->trans(
"AccountancyCode").
': ';
2133 if ($resaccountingaccount > 0) {
2134 $titlealt .= $accountingaccount->account_number;
2136 $titlealt .= $langs->trans(
"NotFound");
2142 print
'<td class="center linecoltype" title="'.dol_escape_htmltag($titlealt).
'">';
2143 $labeltype = ($langs->trans(($line->type_fees_code)) == $line->type_fees_code ? $line->type_fees_libelle : $langs->trans($line->type_fees_code));
2148 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2149 print
'<td class="fk_c_exp_tax_cat linecoltaxcat">';
2150 $exp_tax_cat_label =
dol_getIdFromCode($db, $line->fk_c_exp_tax_cat,
'c_exp_tax_cat',
'rowid',
'label');
2151 print $langs->trans($exp_tax_cat_label);
2156 print
'<td class="left linecolcomment">'.dol_nl2br($line->comments).
'</td>';
2159 print
'<td class="right linecolvatrate">'.vatrate($line->vatrate.($line->vat_src_code ?
' ('.$line->vat_src_code.
')' :
''), true).
'</td>';
2162 print
'<td class="right linecolunitht">';
2163 if (!empty($line->value_unit_ht)) {
2164 print
price($line->value_unit_ht);
2166 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $line->vatrate));
2167 $pricenettoshow =
price2num($line->value_unit / (1 + $tmpvat / 100),
'MU');
2168 print
price($pricenettoshow);
2172 print
'<td class="right linecolunitttc">'.price($line->value_unit).
'</td>';
2174 print
'<td class="right linecolqty">'.dol_escape_htmltag($line->qty).
'</td>';
2176 if ($action !=
'editline') {
2177 print
'<td class="right linecoltotalht">'.price($line->total_ht).
'</td>';
2178 print
'<td class="right linecoltotalttc">'.price($line->total_ttc).
'</td>';
2182 print
'<td class="center linecolpreview">';
2183 if ($line->fk_ecm_files > 0) {
2184 $modulepart =
'expensereport';
2185 $maxheightmini = 32;
2187 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2189 $relativepath = preg_replace(
'/expensereport\//',
'', $ecmfilesstatic->filepath);
2190 $fileinfo = pathinfo($ecmfilesstatic->filepath.
'/'.$ecmfilesstatic->filename);
2193 if (!
dol_is_file($conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$minifile)) {
2197 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity));
2198 if (empty($urlforhref)) {
2199 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
2200 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
2202 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2204 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="">';
2207 $modulepart =
'expensereport';
2209 if (preg_match(
'/\.pdf$/i', $ecmfilesstatic->filename)) {
2210 $filepdf = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename;
2211 $fileimage = $conf->expensereport->dir_output.
'/'.$relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2212 $relativepathimage = $relativepath.
'/'.$ecmfilesstatic->filename.
'_preview.png';
2214 $pdfexists = file_exists($filepdf);
2217 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2218 if (empty($conf->global->MAIN_DISABLE_PDF_THUMBS)) {
2219 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2228 if ($pdfexists && !$error) {
2229 $heightforphotref = 70;
2230 if (!empty($conf->dol_optimize_smallscreen)) {
2231 $heightforphotref = 60;
2234 if (file_exists($fileimage)) {
2236 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity));
2237 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
2238 print
'<img height="'.$heightforphotref.
'" class="photo photowithmargin photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2244 if (!$thumbshown && $fileinfo[
'extension'] ==
'pdf' && !empty($filepdf) && !empty($relativepath) && !empty($fileinfo[
'filename'])) {
2246 $imgpreview = $formFile->showPreview([], $modulepart, $relativepath.
'/'.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 0);
2248 } elseif (!$thumbshown) {
2249 print
img_mime($ecmfilesstatic->filename);
2256 print
'<td class="nowrap right linecolwarning">';
2257 print !empty($line->rule_warning_message) ?
img_warning(html_entity_decode($line->rule_warning_message)) :
' ';
2262 print
'<td class="nowrap right linecolaction">';
2264 print
'<a class="editfielda reposition paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$line->rowid.
'">';
2266 print
'</a> ';
2267 print
'<a class="paddingrightonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete_line&token='.newToken().
'&rowid='.$line->rowid.
'">';
2277 if ($action ==
'editline' && $line->id ==
GETPOST(
'rowid',
'int')) {
2280 if (isModEnabled(
'project')) {
2283 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2287 print
'<!-- line of expense report -->'.
"\n";
2288 print
'<tr class="tredited">';
2290 print
'<td class="center">';
2294 print
'<td colspan="'.($colspan - 1).
'" class="liste_titre"> ';
2295 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2296 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2298 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2299 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2300 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2304 print
'<!-- Code to open/close section to submit or link files in edit mode -->'.
"\n";
2305 print
'<script type="text/javascript">'.
"\n";
2306 print
'$(document).ready(function() {
2307 $( ".auploadnewfilenow" ).click(function() {
2308 jQuery(".truploadnewfilenow").toggle();
2309 jQuery(".trattachnewfilenow").hide();
2312 $( ".aattachtodoc" ).click(function() {
2313 jQuery(".trattachnewfilenow").toggle();
2314 jQuery(".truploadnewfilenow").hide();
2317 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array'))) {
2318 print
'jQuery(".trattachnewfilenow").toggle();'.
"\n";
2321 jQuery("form[name=\"expensereport\"]").submit(function() {
2322 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2323 jQuery("input[name=\"sendit\"]").val("");
2330 print
'</script>'.
"\n";
2333 $filenamelinked =
'';
2334 if ($line->fk_ecm_files > 0) {
2335 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2337 $filenamelinked = $ecmfilesstatic->filename;
2341 $tredited =
'tredited';
2342 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2343 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2345 print
'<tr class="oddeven tredited">';
2350 print
'<td class="center">';
2351 print $form->selectDate($line->date,
'date');
2355 if (isModEnabled(
'project')) {
2357 $formproject->select_projects(-1, $line->fk_project,
'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2362 print
'<td class="center">';
2363 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees,
'fk_c_type_fees');
2366 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2367 print
'<td class="fk_c_exp_tax_cat">';
2368 $params = array(
'fk_expense' => $object->id,
'fk_expense_det' => $line->id,
'date' => $line->date);
2369 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);
2375 print
'<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).
'</textarea>';
2379 $selectedvat =
price2num($line->vatrate).(!empty($line->vat_src_code) ?
' ('.$line->vat_src_code.
')' :
'');
2380 print
'<td class="right">';
2381 print $form->load_tva(
'vatrate', (GETPOSTISSET(
"vatrate") ?
GETPOST(
"vatrate") : $selectedvat), $mysoc,
'', 0, 0,
'', false, 1);
2385 print
'<td class="right">';
2386 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.
' />';
2390 print
'<td class="right">';
2391 print
'<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(
price2num($line->value_unit)).
'" />';
2395 print
'<td class="right">';
2396 print
'<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).
'" />';
2403 print
'<td class="center">';
2407 print
'<td class="center">';
2411 print
'<input type="hidden" name="rowid" value="'.$line->rowid.
'">';
2412 print $form->buttonsSaveCancel(
'Save',
'Cancel', array(), 0,
'small');
2425 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2428 if (isModEnabled(
'project')) {
2431 if ($action !=
'editline') {
2435 $nbFiles = $nbLinks = 0;
2436 $arrayoffiles = array();
2437 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2438 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2439 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2440 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2443 $nbFiles = count($arrayoffiles);
2444 $nbLinks =
Link::count($db, $object->element, $object->id);
2448 print
'<tr class="liste_titre">';
2449 print
'<td colspan="'.$colspan.
'" class="liste_titre expensereportautoload">';
2450 print
'<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans(
"UploadANewFileNow");
2451 print
img_picto($langs->trans(
"UploadANewFileNow"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2453 if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) {
2454 print
' - <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans(
"AttachTheNewLineToTheDocument");
2455 print
img_picto($langs->trans(
"AttachTheNewLineToTheDocument"),
'chevron-down',
'',
false, 0, 0,
'',
'marginleftonly');
2459 print
'<!-- Code to open/close section to submit or link files in the form to add new line -->'.
"\n";
2460 print
'<script type="text/javascript">'.
"\n";
2461 print
'$(document).ready(function() {
2462 $( ".auploadnewfilenow" ).click(function() {
2463 console.log("We click on toggle of auploadnewfilenow");
2464 jQuery(".truploadnewfilenow").toggle();
2465 jQuery(".trattachnewfilenow").hide();
2466 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2467 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2469 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2471 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2474 $( ".aattachtodoc" ).click(function() {
2475 console.log("We click on toggle of aattachtodoc");
2476 jQuery(".trattachnewfilenow").toggle();
2477 jQuery(".truploadnewfilenow").hide();
2478 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2481 if (is_array(
GETPOST(
'attachfile',
'array')) && count(
GETPOST(
'attachfile',
'array')) && $action !=
'updateline') {
2482 print
'jQuery(".trattachnewfilenow").show();'.
"\n";
2485 jQuery("form[name=\"expensereport\"]").submit(function() {
2486 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2487 /* 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. */
2488 jQuery("input[name=\"sendit\"]").val("");
2489 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2491 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2498 print
'</script>'.
"\n";
2502 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_linktofile.tpl.php';
2503 include DOL_DOCUMENT_ROOT.
'/expensereport/tpl/expensereport_addfile.tpl.php';
2505 print
'<tr class="liste_titre expensereportcreate">';
2507 print
'<td class="center expensereportcreatedate">'.$langs->trans(
'Date').
'</td>';
2508 if (isModEnabled(
'project')) {
2509 print
'<td class="minwidth100imp">'.$form->textwithpicto($langs->trans(
'Project'), $langs->trans(
"ClosedProjectsAreHidden")).
'</td>';
2511 print
'<td class="center expensereportcreatetype">'.$langs->trans(
'Type').
'</td>';
2512 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2513 print
'<td>'.$langs->trans(
'CarCategory').
'</td>';
2515 print
'<td class="expensereportcreatedescription">'.$langs->trans(
'Description').
'</td>';
2516 print
'<td class="right expensereportcreatevat">'.$langs->trans(
'VAT').
'</td>';
2517 print
'<td class="right expensereportcreatepriceuth">'.$langs->trans(
'PriceUHT').
'</td>';
2518 print
'<td class="right expensereportcreatepricettc">'.$langs->trans(
'PriceUTTC').
'</td>';
2519 print
'<td class="right expensereportcreateqty">'.$langs->trans(
'Qty').
'</td>';
2526 print
'<tr class="oddeven nohover">';
2532 print
'<td class="center inputdate">';
2533 print $form->selectDate(!empty($date) ? $date : -1,
'date', 0, 0, 0,
'', 1, 1);
2537 if (isModEnabled(
'project')) {
2538 print
'<td class="inputproject">';
2539 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0,
'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0,
'', 0, 0,
'maxwidth300');
2544 print
'<td class="center inputtype">';
2545 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees :
"",
'fk_c_type_fees', 1);
2548 if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2549 print
'<td class="fk_c_exp_tax_cat">';
2550 $params = array(
'fk_expense' => $object->id);
2551 print $form->selectExpenseCategories(
'',
'fk_c_exp_tax_cat', 1, array(),
'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2556 print
'<td class="inputcomment">';
2557 print
'<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.
'">'.
dol_escape_htmltag(!empty($comments) ? $comments :
"", 0, 1).
'</textarea>';
2561 print
'<td class="right inputvat">';
2563 if (!empty($conf->global->EXPENSEREPORT_NO_DEFAULT_VAT)) {
2565 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS =
'none';
2567 print $form->load_tva(
'vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), $mysoc,
'', 0, 0,
'', false, 1);
2571 print
'<td class="right inputpricenet">';
2572 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.
' />';
2576 print
'<td class="right inputtax">';
2577 print
'<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit : 0)).
'">';
2581 print
'<td class="right inputqty">';
2582 print
'<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).
'">';
2588 if ($action !=
'editline') {
2589 print
'<td class="right"></td>';
2590 print
'<td class="right"></td>';
2593 print
'<td class="center inputbuttons">';
2594 print $form->buttonsSaveCancel(
"Add",
'',
'', 1,
'reposition');
2605 /* JQuery for product free or predefined select */
2606 jQuery(document).ready(function() {
2607 jQuery("#value_unit_ht").keyup(function(event) {
2608 console.log(event.which); // discard event tag and arrows
2609 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2610 jQuery("#value_unit").val("");
2613 jQuery("#value_unit").keyup(function(event) {
2614 console.log(event.which); // discard event tag and arrows
2615 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2616 jQuery("#value_unit_ht").val("");
2621 if (! empty($conf->global->MAIN_USE_EXPENSE_IK)) {
2624 /* unit price coéf calculation */
2625 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2627 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2628 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2629 let tva = jQuery("#vatrate").find(":selected").val();
2630 let qty = jQuery(".input_qty").val();
2634 let path = "'.dol_buildpath(
"/expensereport/ajax/ajaxik.php", 1) .
'";
2635 path += "?fk_c_exp_tax_cat="+tax_cat;
2636 path +="&fk_expense="+'.$object->id.
';
2637 path += "&vatrate="+tva;
2638 path += "&qty="+qty;
2640 if (type_fee == 4) { // frais_kilométriques
2642 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2650 ,success:function(response) {
2651 if (response.response_status == "success"){';
2653 if (!empty($conf->global->EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY)) {
2655 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2656 jQuery("#value_unit").trigger("change");
2660 jQuery("#value_unit_ht").val(response.data);
2661 jQuery("#value_unit_ht").trigger("change");
2662 jQuery("#value_unit").val("");
2667 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ){
2668 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2675 /*console.log(event.which); // discard event tag and arrows
2676 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2677 jQuery("#value_unit_ht").val("");
2697 print
'Record not found';
2708print
'<div class="tabsAction">';
2710if ($action !=
'create' && $action !=
'edit' && $action !=
'editline') {
2712 $object->fetch($id, $ref);
2715 if (empty($user->socid)) {
2718 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>';
2730 if (in_array($object->fk_user_author, $user->getAllChildIds(1)) || !empty($user->rights->expensereport->writeall_advance)) {
2732 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=edit&token='.newToken().
'&id='.$object->id.
'">'.$langs->trans(
'Modify').
'</a></div>';
2735 if (count($object->lines) > 0) {
2736 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>';
2747 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2749 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>';
2754 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>';
2759 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2761 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>';
2771 if (in_array($object->fk_user_author, $user->getAllChildIds(1))) {
2773 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>';
2781 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=validate&id='.$object->id.
'">'.$langs->trans(
'Approve').
'</a></div>';
2783 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2786 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2788 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=cancel&id='.$object->id.
'">'.$langs->trans(
"Cancel").
'</a></div>';
2797 print
'<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?action=refuse&id='.$object->id.
'">'.$langs->trans(
'Deny').
'</a></div>';
2803 if ($remaintopay == 0) {
2804 print
'<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans(
"DisabledBecauseRemainderToPayIsZero").
'">'.$langs->trans(
'DoPayment').
'</span></div>';
2806 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>';
2813 if ($object->paid == 0) {
2814 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>";
2818 if ($user->rights->expensereport->creer && ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) && $object->status ==
ExpenseReport::STATUS_APPROVED) {
2820 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>';
2824 if (($user->rights->expensereport->approve || $user->rights->expensereport->to_paid) && $object->status ==
ExpenseReport::STATUS_CLOSED) {
2826 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>';
2831 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>';
2835 if ($user->rights->expensereport->creer) {
2836 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>';
2842 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>';
2845 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>';
2848 $parameters = array();
2849 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2856if (
GETPOST(
'modelselected',
'alpha')) {
2857 $action =
'presend';
2860if ($action !=
'presend') {
2865 print
'<div class="fichecenter"><div class="fichehalfleft">';
2866 print
'<a name="builddoc"></a>';
2868 if ($user->rights->expensereport->creer && $action !=
'create' && $action !=
'edit') {
2871 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
2872 $genallowed = $user->rights->expensereport->creer;
2873 $delallowed = $user->rights->expensereport->creer;
2875 print $formfile->showdocuments(
'expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2876 $somethingshown = $formfile->numoffiles;
2888 print
'</div><div class="fichehalfright">';
2890 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2892 $somethingshown =
$formactions->showactions($object,
'expensereport',
null);
2894 print
'</div></div>';
2898$modelmail =
'expensereport_send';
2899$defaulttopic =
'SendExpenseReportRef';
2900$diroutput = $conf->expensereport->dir_output;
2901$trackid =
'exp'.$object->id;
2903include 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.