dolibarr 19.0.4
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2020 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2015-2022 Alexandre Spangaro <aspangaro@open-dsi.fr>
6 * Copyright (C) 2017 Ferran Marcet <fmarcet@2byte.es>
7 * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
29// Load Dolibarr environment
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';
50}
51
52// Load translation files required by the page
53$langs->loadLangs(array("trips", "bills", "mails"));
54
55$action = GETPOST('action', 'aZ09');
56$cancel = GETPOST('cancel', 'alpha');
57$confirm = GETPOST('confirm', 'alpha');
58$backtopage = GETPOST('backtopage', 'alpha');
59
60$id = GETPOST('id', 'int');
61$date_start = dol_mktime(0, 0, 0, GETPOST('date_debutmonth', 'int'), GETPOST('date_debutday', 'int'), GETPOST('date_debutyear', 'int'));
62$date_end = dol_mktime(0, 0, 0, GETPOST('date_finmonth', 'int'), GETPOST('date_finday', 'int'), GETPOST('date_finyear', 'int'));
63$date = dol_mktime(0, 0, 0, GETPOST('datemonth', 'int'), GETPOST('dateday', 'int'), GETPOST('dateyear', 'int'));
64$fk_project = GETPOST('fk_project', 'int');
65$vatrate = GETPOST('vatrate', 'alpha');
66$ref = GETPOST("ref", 'alpha');
67$comments = GETPOST('comments', 'restricthtml');
68$fk_c_type_fees = GETPOST('fk_c_type_fees', 'int');
69$socid = GETPOST('socid', 'int') ? GETPOST('socid', 'int') : GETPOST('socid_id', 'int');
70
71$childids = $user->getAllChildIds(1);
72
73if (getDolGlobalString('EXPENSEREPORT_PREFILL_DATES_WITH_CURRENT_MONTH')) {
74 if (empty($date_start)) {
75 $date_start = dol_mktime(0, 0, 0, (int) dol_print_date(dol_now(), '%m'), 1, (int) dol_print_date(dol_now(), '%Y'));
76 }
77
78 if (empty($date_end)) {
79 // date('t') => number of days in the month, so last day of the month too
80 $date_end = dol_mktime(0, 0, 0, (int) dol_print_date(dol_now(), '%m'), (int) date('t'), (int) dol_print_date(dol_now(), '%Y'));
81 }
82}
83
84// Hack to use expensereport dir
85$rootfordata = DOL_DATA_ROOT;
86$rootforuser = DOL_DATA_ROOT;
87// If multicompany module is enabled, we redefine the root of data
88if (isModEnabled('multicompany') && !empty($conf->entity) && $conf->entity > 1) {
89 $rootfordata .= '/'.$conf->entity;
90}
91$conf->expensereport->dir_output = $rootfordata.'/expensereport';
92
93// Define $urlwithroot
94$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
95$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
96//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
97
98// PDF
99$hidedetails = (GETPOST('hidedetails', 'int') ? GETPOST('hidedetails', 'int') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS') ? 1 : 0));
100$hidedesc = (GETPOST('hidedesc', 'int') ? GETPOST('hidedesc', 'int') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DESC') ? 1 : 0));
101$hideref = (GETPOST('hideref', 'int') ? GETPOST('hideref', 'int') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_REF') ? 1 : 0));
102
103
104$object = new ExpenseReport($db);
105$extrafields = new ExtraFields($db);
106
107// fetch optionals attributes and labels
108$extrafields->fetch_name_optionals_label($object->table_element);
109
110// Load object
111include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once
112
113// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
114$hookmanager->initHooks(array('expensereportcard', 'globalcard'));
115
116$permissionnote = $user->rights->expensereport->creer; // Used by the include of actions_setnotes.inc.php
117$permissiondellink = $user->rights->expensereport->creer; // Used by the include of actions_dellink.inc.php
118$permissiontoadd = $user->rights->expensereport->creer; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
119
120$upload_dir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($object->ref);
121
122$projectRequired = isModEnabled('project') && getDolGlobalString('EXPENSEREPORT_PROJECT_IS_REQUIRED');
123$fileRequired = getDolGlobalString('EXPENSEREPORT_FILE_IS_REQUIRED');
124
125if ($object->id > 0) {
126 // Check current user can read this expense report
127 $canread = 0;
128 if ($user->hasRight('expensereport', 'readall')) {
129 $canread = 1;
130 }
131 if ($user->hasRight('expensereport', 'lire') && in_array($object->fk_user_author, $childids)) {
132 $canread = 1;
133 }
134 if (!$canread) {
136 }
137}
138
139$candelete = 0;
140if ($user->hasRight('expensereport', 'supprimer')) {
141 $candelete = 1;
142}
143if ($object->statut == ExpenseReport::STATUS_DRAFT && $user->hasRight('expensereport', 'write') && in_array($object->fk_user_author, $childids)) {
144 $candelete = 1;
145}
146
147// Security check
148if ($user->socid) {
149 $socid = $user->socid;
150}
151$result = restrictedArea($user, 'expensereport', $object->id, 'expensereport');
152
153$permissiontoadd = $user->rights->expensereport->creer; // Used by the include of actions_dellink.inc.php
154
155
156/*
157 * Actions
158 */
159$value_unit_ht = price2num(GETPOST('value_unit_ht', 'alpha'), 'MU');
160$value_unit = price2num(GETPOST('value_unit', 'alpha'), 'MU');
161$qty = price2num(GETPOST('qty', 'alpha'));
162
163$parameters = array('socid' => $socid);
164$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
165if ($reshook < 0) {
166 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
167}
168
169if (empty($reshook)) {
170 $backurlforlist = DOL_URL_ROOT.'/expensereport/list.php';
171
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;
176 } else {
177 $backtopage = DOL_URL_ROOT.'/expensereport/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
178 }
179 }
180 }
181
182 if ($cancel) {
183 if (!empty($backtopageforcancel)) {
184 header("Location: ".$backtopageforcancel);
185 exit;
186 } elseif (!empty($backtopage)) {
187 header("Location: ".$backtopage);
188 exit;
189 }
190 $action = '';
191
192 $fk_project = '';
193 $date_start = '';
194 $date_end = '';
195 $date = '';
196 $comments = '';
197 $vatrate = '';
198 $value_unit_ht = '';
199 $value_unit = '';
200 $qty = 1;
201 $fk_c_type_fees = -1;
202 }
203
204 include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php';
205
206 if (!empty(GETPOST('sendit', 'alpha'))) { // If we just submit a file
207 if ($action == 'updateline') {
208 $action = 'editline'; // To avoid to make the updateline now
209 } else {
210 $action = ''; // To avoid to make the addline now
211 }
212 }
213
214 include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once
215
216 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, not include_once
217
218 include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once
219
220 // Action clone object
221 if ($action == 'confirm_clone' && $confirm == 'yes' && $user->hasRight('expensereport', 'creer')) {
222 if (1 == 0 && !GETPOST('clone_content', 'alpha') && !GETPOST('clone_receivers', 'alpha')) {
223 setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
224 } else {
225 if ($object->id > 0) {
226 // Because createFromClone modifies the object, we must clone it so that we can restore it later if it fails
227 $orig = clone $object;
228
229 $result = $object->createFromClone($user, GETPOST('fk_user_author', 'int'));
230 if ($result > 0) {
231 header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
232 exit;
233 } else {
234 setEventMessages($object->error, $object->errors, 'errors');
235 $object = $orig;
236 $action = '';
237 }
238 }
239 }
240 }
241
242 if ($action == 'confirm_delete' && GETPOST("confirm", 'alpha') == "yes" && $id > 0 && $candelete) {
243 $object = new ExpenseReport($db);
244 $result = $object->fetch($id);
245 $result = $object->delete($user);
246 if ($result >= 0) {
247 header("Location: index.php");
248 exit;
249 } else {
250 setEventMessages($object->error, $object->errors, 'errors');
251 }
252 }
253
254 if ($action == 'add' && $user->hasRight('expensereport', 'creer')) {
255 $error = 0;
256
257 $object = new ExpenseReport($db);
258
259 $object->date_debut = $date_start;
260 $object->date_fin = $date_end;
261
262 $object->fk_user_author = GETPOST('fk_user_author', 'int');
263 if (!($object->fk_user_author > 0)) {
264 $object->fk_user_author = $user->id;
265 }
266
267 // Check that expense report is for a user inside the hierarchy, or that advanced permission for all is set
268 if ((!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('expensereport', 'creer'))
269 || (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && !$user->hasRight('expensereport', 'creer') && !$user->hasRight('expensereport', 'writeall_advance'))) {
270 $error++;
271 setEventMessages($langs->trans("NotEnoughPermissions"), null, 'errors');
272 }
273 if (!$error) {
274 if (!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') || !$user->hasRight('expensereport', 'writeall_advance')) {
275 if (!in_array($object->fk_user_author, $childids)) {
276 $error++;
277 setEventMessages($langs->trans("UserNotInHierachy"), null, 'errors');
278 }
279 }
280 }
281
282 $fuser = new User($db);
283 $fuser->fetch($object->fk_user_author);
284
285 $object->status = 1;
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');
290 // Fill array 'array_options' with data from add form
291 if (!$error) {
292 $ret = $extrafields->setOptionalsFromPost(null, $object);
293 if ($ret < 0) {
294 $error++;
295 }
296 }
297
298 if (!$error && !getDolGlobalString('EXPENSEREPORT_ALLOW_OVERLAPPING_PERIODS')) {
299 $overlappingExpenseReportID = $object->periode_existe($fuser, $object->date_debut, $object->date_fin);
300
301 if ($overlappingExpenseReportID > 0) {
302 $error++;
303 setEventMessages($langs->trans("ErrorDoubleDeclaration").' <a href="'.$_SERVER['PHP_SELF'].'?id='.$overlappingExpenseReportID.'">'. $langs->trans('ShowTrip').'</a>', null, 'errors');
304 $action = 'create';
305 }
306 }
307
308 if (!$error) {
309 $db->begin();
310
311 $id = $object->create($user);
312 if ($id <= 0) {
313 $error++;
314 }
315
316 if (!$error) {
317 $db->commit();
318 Header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
319 exit;
320 } else {
321 setEventMessages($object->error, $object->errors, 'errors');
322 $db->rollback();
323 $action = 'create';
324 }
325 }
326 }
327
328 if (($action == 'update' || $action == 'updateFromRefuse') && $user->hasRight('expensereport', 'creer')) {
329 $object = new ExpenseReport($db);
330 $object->fetch($id);
331
332 $object->date_debut = $date_start;
333 $object->date_fin = $date_end;
334
335 if ($object->status < 3) {
336 $object->fk_user_validator = GETPOST('fk_user_validator', 'int');
337 }
338
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;
343
344 $result = $object->update($user);
345 if ($result > 0) {
346 header("Location: ".$_SERVER["PHP_SELF"]."?id=".GETPOST('id', 'int'));
347 exit;
348 } else {
349 setEventMessages($object->error, $object->errors, 'errors');
350 }
351 }
352
353 if ($action == 'update_extras') {
354 $object->oldcopy = dol_clone($object, 2);
355
356 // Fill array 'array_options' with data from update form
357 $ret = $extrafields->setOptionalsFromPost(null, $object, GETPOST('attribute', 'restricthtml'));
358 if ($ret < 0) {
359 $error++;
360 }
361
362 if (!$error) {
363 // Actions on extra fields
364 $result = $object->insertExtraFields('EXPENSEREPORT_MODIFY');
365 if ($result < 0) {
366 setEventMessages($object->error, $object->errors, 'errors');
367 $error++;
368 }
369 }
370
371 if ($error) {
372 $action = 'edit_extras';
373 }
374 }
375
376 if ($action == "confirm_validate" && GETPOST("confirm", 'alpha') == "yes" && $id > 0 && $user->hasRight('expensereport', 'creer')) {
377 $error = 0;
378
379 $db->begin();
380
381 $object = new ExpenseReport($db);
382 $object->fetch($id);
383
384 $result = $object->setValidate($user);
385
386 if ($result >= 0) {
387 // Define output language
388 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
389 $outputlangs = $langs;
390 $newlang = '';
391 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
392 $newlang = GETPOST('lang_id', 'aZ09');
393 }
394 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
395 $newlang = $object->thirdparty->default_lang;
396 }
397 if (!empty($newlang)) {
398 $outputlangs = new Translate("", $conf);
399 $outputlangs->setDefaultLang($newlang);
400 }
401 $model = $object->model_pdf;
402 $ret = $object->fetch($id); // Reload to get new records
403
404 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
405 }
406 } else {
407 setEventMessages($object->error, $object->errors, 'errors');
408 $error++;
409 }
410
411 if (!$error && $result > 0 && $object->fk_user_validator > 0) {
412 $langs->load("mails");
413
414 // TO
415 $destinataire = new User($db);
416 $destinataire->fetch($object->fk_user_validator);
417 $emailTo = $destinataire->email;
418
419 // FROM
420 $expediteur = new User($db);
421 $expediteur->fetch($object->fk_user_author);
422 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
423
424 if ($emailTo && $emailFrom) {
425 $filename = array();
426 $filedir = array();
427 $mimetype = array();
428
429 // SUBJECT
430 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
431 if (getDolGlobalString('MAIN_APPLICATION_TITLE')) {
432 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
433 }
434
435 $subject = $societeName." - ".$langs->transnoentities("ExpenseReportWaitingForApproval");
436
437 // CONTENT
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);
441
442 // Rebuild pdf
443 /*
444 $object->setDocModel($user,"");
445 $resultPDF = expensereport_pdf_create($db,$id,'',"",$langs);
446
447 if($resultPDF):
448 // ATTACHMENT
449 array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
450 array_push($filedir,$conf->expensereport->dir_output . "/" . dol_sanitizeFileName($object->ref) . "/" . dol_sanitizeFileName($object->ref).".pdf");
451 array_push($mimetype,"application/pdf");
452 */
453
454 // PREPARE SEND
455 $mailfile = new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, '', '', 0, -1);
456
457 if ($mailfile) {
458 // SEND
459 $result = $mailfile->sendfile();
460 if ($result) {
461 $mesg = $langs->trans('MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
462 setEventMessages($mesg, null, 'mesgs');
463 } else {
464 $langs->load("other");
465 if (!empty($mailfile->error) || !empty($mailfile->errors)) {
466 $mesg = '';
467 $mesg .= $langs->transnoentities('ErrorFailedToSendMail', dol_escape_htmltag($emailFrom), dol_escape_htmltag($emailTo));
468 if (!empty($mailfile->error)) {
469 $mesg .= '<br>' . $mailfile->error;
470 }
471 if (!empty($mailfile->errors) && is_array($mailfile->errors)) {
472 $mesg .= '<br>' . implode('<br>', $mailfile->errors);
473 }
474 setEventMessages($mesg, null, 'errors');
475 } else {
476 setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
477 }
478 }
479 } else {
480 setEventMessages($mailfile->error, $mailfile->errors, 'errors');
481 $action = '';
482 }
483 } else {
484 setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
485 $action = '';
486 }
487 }
488
489 if (!$error) {
490 $db->commit();
491 header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
492 exit;
493 } else {
494 $db->rollback();
495 }
496 }
497
498 if ($action == "confirm_save_from_refuse" && GETPOST("confirm", 'alpha') == "yes" && $id > 0 && $user->hasRight('expensereport', 'creer')) {
499 $object = new ExpenseReport($db);
500 $object->fetch($id);
501 $result = $object->set_save_from_refuse($user);
502
503 if ($result > 0) {
504 // Define output language
505 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
506 $outputlangs = $langs;
507 $newlang = '';
508 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
509 $newlang = GETPOST('lang_id', 'aZ09');
510 }
511 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
512 $newlang = $object->thirdparty->default_lang;
513 }
514 if (!empty($newlang)) {
515 $outputlangs = new Translate("", $conf);
516 $outputlangs->setDefaultLang($newlang);
517 }
518 $model = $object->model_pdf;
519 $ret = $object->fetch($id); // Reload to get new records
520
521 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
522 }
523 }
524
525 if ($result > 0) {
526 // Send mail
527
528 // TO
529 $destinataire = new User($db);
530 $destinataire->fetch($object->fk_user_validator);
531 $emailTo = $destinataire->email;
532
533 // FROM
534 $expediteur = new User($db);
535 $expediteur->fetch($object->fk_user_author);
536 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
537
538 if ($emailFrom && $emailTo) {
539 $filename = array();
540 $filedir = array();
541 $mimetype = array();
542
543 // SUBJECT
544 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
545 if (getDolGlobalString('MAIN_APPLICATION_TITLE')) {
546 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
547 }
548
549 $subject = $societeName." - ".$langs->transnoentities("ExpenseReportWaitingForReApproval");
550
551 // CONTENT
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);
555
556 // Rebuild pdf
557 /*
558 $object->setDocModel($user,"");
559 $resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
560
561 if($resultPDF)
562 {
563 // ATTACHMENT
564 $filename=array(); $filedir=array(); $mimetype=array();
565 array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
566 array_push($filedir,$conf->expensereport->dir_output . "/" . dol_sanitizeFileName($object->ref) . "/" . dol_sanitizeFileName($object->ref_number).".pdf");
567 array_push($mimetype,"application/pdf");
568 }
569 */
570
571
572 // PREPARE SEND
573 $mailfile = new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, '', '', 0, -1);
574
575 if ($mailfile) {
576 // SEND
577 $result = $mailfile->sendfile();
578 if ($result) {
579 $mesg = $langs->trans('MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
580 setEventMessages($mesg, null, 'mesgs');
581 header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
582 exit;
583 } else {
584 $langs->load("other");
585 if ($mailfile->error) {
586 $mesg = '';
587 $mesg .= $langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo);
588 $mesg .= '<br>'.$mailfile->error;
589 setEventMessages($mesg, null, 'errors');
590 } else {
591 setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
592 }
593 }
594 } else {
595 setEventMessages($mailfile->error, $mailfile->errors, 'errors');
596 $action = '';
597 }
598 } else {
599 setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
600 $action = '';
601 }
602 } else {
603 setEventMessages($object->error, $object->errors, 'errors');
604 }
605 }
606
607 // Approve
608 if ($action == "confirm_approve" && GETPOST("confirm", 'alpha') == "yes" && $id > 0 && $user->hasRight('expensereport', 'approve')) {
609 $object = new ExpenseReport($db);
610 $object->fetch($id);
611
612 $result = $object->setApproved($user);
613
614 if ($result > 0) {
615 // Define output language
616 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
617 $outputlangs = $langs;
618 $newlang = '';
619 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
620 $newlang = GETPOST('lang_id', 'aZ09');
621 }
622 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
623 $newlang = $object->thirdparty->default_lang;
624 }
625 if (!empty($newlang)) {
626 $outputlangs = new Translate("", $conf);
627 $outputlangs->setDefaultLang($newlang);
628 }
629 $model = $object->model_pdf;
630 $ret = $object->fetch($id); // Reload to get new records
631
632 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
633 }
634 }
635
636 if ($result > 0) {
637 // Send mail
638
639 // TO
640 $destinataire = new User($db);
641 $destinataire->fetch($object->fk_user_author);
642 $emailTo = $destinataire->email;
643
644 // CC
645 $emailCC = getDolGlobalString('NDF_CC_EMAILS');
646 if (empty($emailTo)) {
647 $emailTo = $emailCC;
648 }
649
650 // FROM
651 $expediteur = new User($db);
652 $expediteur->fetch($object->fk_user_approve > 0 ? $object->fk_user_approve : $object->fk_user_validator);
653 $emailFrom = getDolGlobalString('MAIN_MAIL_EMAIL_FROM');
654
655 if ($emailFrom && $emailTo) {
656 $filename = array();
657 $filedir = array();
658 $mimetype = array();
659
660 // SUBJECT
661 $societeName = getDolGlobalString('MAIN_INFO_SOCIETE_NOM');
662 if (getDolGlobalString('MAIN_APPLICATION_TITLE')) {
663 $societeName = getDolGlobalString('MAIN_APPLICATION_TITLE');
664 }
665
666 $subject = $societeName." - ".$langs->transnoentities("ExpenseReportApproved");
667
668 // CONTENT
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);
672
673 // Rebuilt pdf
674 /*
675 $object->setDocModel($user,"");
676 $resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
677
678 if($resultPDF
679 {
680 // ATTACHMENT
681 $filename=array(); $filedir=array(); $mimetype=array();
682 array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
683 array_push($filedir, $conf->expensereport->dir_output."/".dol_sanitizeFileName($object->ref)."/".dol_sanitizeFileName($object->ref).".pdf");
684 array_push($mimetype,"application/pdf");
685 }
686 */
687
688 $mailfile = new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, '', '', 0, -1);
689
690 if ($mailfile) {
691 // SEND
692 $result = $mailfile->sendfile();
693 if ($result) {
694 $mesg = $langs->trans('MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
695 setEventMessages($mesg, null, 'mesgs');
696 header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
697 exit;
698 } else {
699 $langs->load("other");
700 if ($mailfile->error) {
701 $mesg = '';
702 $mesg .= $langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo);
703 $mesg .= '<br>'.$mailfile->error;
704 setEventMessages($mesg, null, 'errors');
705 } else {
706 setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
707 }
708 }
709 } else {
710 setEventMessages($mailfile->error, $mailfile->errors, 'errors');
711 $action = '';
712 }
713 } else {
714 setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
715 $action = '';
716 }
717 } else {
718 setEventMessages($langs->trans("FailedtoSetToApprove"), null, 'warnings');
719 $action = '';
720 }
721 }
722
723 if ($action == "confirm_refuse" && GETPOST('confirm', 'alpha') == "yes" && $id > 0 && $user->hasRight('expensereport', 'approve')) {
724 $object = new ExpenseReport($db);
725 $object->fetch($id);
726
727 $detailRefuse = GETPOST('detail_refuse', 'alpha');
728 $result = $object->setDeny($user, $detailRefuse);
729
730 if ($result > 0) {
731 // Define output language
732 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
733 $outputlangs = $langs;
734 $newlang = '';
735 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
736 $newlang = GETPOST('lang_id', 'aZ09');
737 }
738 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
739 $newlang = $object->thirdparty->default_lang;
740 }
741 if (!empty($newlang)) {
742 $outputlangs = new Translate("", $conf);
743 $outputlangs->setDefaultLang($newlang);
744 }
745 $model = $object->model_pdf;
746 $ret = $object->fetch($id); // Reload to get new records
747
748 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
749 }
750 }
751
752 if ($result > 0) {
753 // Send mail
754
755 // TO
756 $destinataire = new User($db);
757 $destinataire->fetch($object->fk_user_author);
758 $emailTo = $destinataire->email;
759
760 // FROM
761 $expediteur = new User($db);
762 $expediteur->fetch($object->fk_user_refuse);
763 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
764
765 if ($emailFrom && $emailTo) {
766 $filename = array();
767 $filedir = array();
768 $mimetype = array();
769
770 // SUBJECT
771 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
772 if (getDolGlobalString('MAIN_APPLICATION_TITLE')) {
773 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
774 }
775
776 $subject = $societeName." - ".$langs->transnoentities("ExpenseReportRefused");
777
778 // CONTENT
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);
782
783 // Rebuilt pdf
784 /*
785 $object->setDocModel($user,"");
786 $resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
787
788 if($resultPDF
789 {
790 // ATTACHMENT
791 $filename=array(); $filedir=array(); $mimetype=array();
792 array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
793 array_push($filedir, $conf->expensereport->dir_output."/".dol_sanitizeFileName($object->ref)."/".dol_sanitizeFileName($object->ref).".pdf");
794 array_push($mimetype,"application/pdf");
795 }
796 */
797
798 // PREPARE SEND
799 $mailfile = new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, '', '', 0, -1);
800
801 if ($mailfile) {
802 // SEND
803 $result = $mailfile->sendfile();
804 if ($result) {
805 $mesg = $langs->trans('MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
806 setEventMessages($mesg, null, 'mesgs');
807 header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
808 exit;
809 } else {
810 $langs->load("other");
811 if ($mailfile->error) {
812 $mesg = '';
813 $mesg .= $langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo);
814 $mesg .= '<br>'.$mailfile->error;
815 setEventMessages($mesg, null, 'errors');
816 } else {
817 setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
818 }
819 }
820 } else {
821 setEventMessages($mailfile->error, $mailfile->errors, 'errors');
822 $action = '';
823 }
824 } else {
825 setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
826 $action = '';
827 }
828 } else {
829 setEventMessages($langs->trans("FailedtoSetToDeny"), null, 'warnings');
830 $action = '';
831 }
832 }
833
834 //var_dump($user->id == $object->fk_user_validator);exit;
835 if ($action == "confirm_cancel" && GETPOST('confirm', 'alpha') == "yes" && $id > 0 && $user->hasRight('expensereport', 'creer')) {
836 if (!GETPOST('detail_cancel', 'alpha')) {
837 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Comment")), null, 'errors');
838 } else {
839 $object = new ExpenseReport($db);
840 $object->fetch($id);
841
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);
845
846 if ($result > 0) {
847 // Define output language
848 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
849 $outputlangs = $langs;
850 $newlang = '';
851 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
852 $newlang = GETPOST('lang_id', 'aZ09');
853 }
854 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
855 $newlang = $object->thirdparty->default_lang;
856 }
857 if (!empty($newlang)) {
858 $outputlangs = new Translate("", $conf);
859 $outputlangs->setDefaultLang($newlang);
860 }
861 $model = $object->model_pdf;
862 $ret = $object->fetch($id); // Reload to get new records
863
864 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
865 }
866 }
867
868 if ($result > 0) {
869 // Send mail
870
871 // TO
872 $destinataire = new User($db);
873 $destinataire->fetch($object->fk_user_author);
874 $emailTo = $destinataire->email;
875
876 // FROM
877 $expediteur = new User($db);
878 $expediteur->fetch($object->fk_user_cancel);
879 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
880
881 if ($emailFrom && $emailTo) {
882 $filename = array();
883 $filedir = array();
884 $mimetype = array();
885
886 // SUBJECT
887 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
888 if (getDolGlobalString('MAIN_APPLICATION_TITLE')) {
889 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
890 }
891
892 $subject = $societeName." - ".$langs->transnoentities("ExpenseReportCanceled");
893
894 // CONTENT
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);
898
899 // Rebuilt pdf
900 /*
901 $object->setDocModel($user,"");
902 $resultPDF = expensereport_pdf_create($db,$object,'',"",$langs);
903
904 if($resultPDF
905 {
906 // ATTACHMENT
907 $filename=array(); $filedir=array(); $mimetype=array();
908 array_push($filename,dol_sanitizeFileName($object->ref).".pdf");
909 array_push($filedir, $conf->expensereport->dir_output."/".dol_sanitizeFileName($object->ref)."/".dol_sanitizeFileName($object->ref).".pdf");
910 array_push($mimetype,"application/pdf");
911 }
912 */
913
914 // PREPARE SEND
915 $mailfile = new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, '', '', 0, -1);
916
917 if ($mailfile) {
918 // SEND
919 $result = $mailfile->sendfile();
920 if ($result) {
921 $mesg = $langs->trans('MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
922 setEventMessages($mesg, null, 'mesgs');
923 header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
924 exit;
925 } else {
926 $langs->load("other");
927 if ($mailfile->error) {
928 $mesg = '';
929 $mesg .= $langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo);
930 $mesg .= '<br>'.$mailfile->error;
931 setEventMessages($mesg, null, 'errors');
932 } else {
933 setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
934 }
935 }
936 } else {
937 setEventMessages($mailfile->error, $mailfile->errors, 'errors');
938 $action = '';
939 }
940 } else {
941 setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
942 $action = '';
943 }
944 } else {
945 setEventMessages($langs->trans("FailedToSetToCancel"), null, 'warnings');
946 $action = '';
947 }
948 } else {
949 setEventMessages($object->error, $object->errors, 'errors');
950 }
951 }
952 }
953
954 if ($action == "confirm_setdraft" && GETPOST('confirm', 'alpha') == "yes" && $id > 0 && $user->hasRight('expensereport', 'creer')) {
955 $object = new ExpenseReport($db);
956 $object->fetch($id);
957 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
958 $result = $object->setStatut(0);
959
960 if ($result > 0) {
961 // Define output language
962 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
963 $outputlangs = $langs;
964 $newlang = '';
965 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
966 $newlang = GETPOST('lang_id', 'aZ09');
967 }
968 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
969 $newlang = $object->thirdparty->default_lang;
970 }
971 if (!empty($newlang)) {
972 $outputlangs = new Translate("", $conf);
973 $outputlangs->setDefaultLang($newlang);
974 }
975 $model = $object->model_pdf;
976 $ret = $object->fetch($id); // Reload to get new records
977
978 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
979 }
980 }
981
982 if ($result > 0) {
983 header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
984 exit;
985 } else {
986 setEventMessages($object->error, $object->errors, 'errors');
987 }
988 } else {
989 setEventMessages("NOT_AUTHOR", null, 'errors');
990 }
991 }
992
993 if ($action == 'set_unpaid' && $id > 0 && $user->hasRight('expensereport', 'to_paid')) {
994 $object = new ExpenseReport($db);
995 $object->fetch($id);
996
997 $result = $object->setUnpaid($user);
998
999 if ($result > 0) {
1000 // Define output language
1001 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
1002 $outputlangs = $langs;
1003 $newlang = '';
1004 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1005 $newlang = GETPOST('lang_id', 'aZ09');
1006 }
1007 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1008 $newlang = $object->thirdparty->default_lang;
1009 }
1010 if (!empty($newlang)) {
1011 $outputlangs = new Translate("", $conf);
1012 $outputlangs->setDefaultLang($newlang);
1013 }
1014 $model = $object->model_pdf;
1015 $ret = $object->fetch($id); // Reload to get new records
1016
1017 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1018 }
1019 }
1020 }
1021
1022 if ($action == 'set_paid' && $id > 0 && $user->hasRight('expensereport', 'to_paid')) {
1023 $object = new ExpenseReport($db);
1024 $object->fetch($id);
1025
1026 $result = $object->setPaid($id, $user);
1027
1028 if ($result > 0) {
1029 // Define output language
1030 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
1031 $outputlangs = $langs;
1032 $newlang = '';
1033 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1034 $newlang = GETPOST('lang_id', 'aZ09');
1035 }
1036 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1037 $newlang = $object->thirdparty->default_lang;
1038 }
1039 if (!empty($newlang)) {
1040 $outputlangs = new Translate("", $conf);
1041 $outputlangs->setDefaultLang($newlang);
1042 }
1043 $model = $object->model_pdf;
1044 $ret = $object->fetch($id); // Reload to get new records
1045
1046 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1047 }
1048 }
1049
1050 if ($result > 0) {
1051 // Send mail
1052
1053 // TO
1054 $destinataire = new User($db);
1055 $destinataire->fetch($object->fk_user_author);
1056 $emailTo = $destinataire->email;
1057
1058 // FROM
1059 $expediteur = new User($db);
1060 $expediteur->fetch($user->id);
1061 $emailFrom = $conf->global->MAIN_MAIL_EMAIL_FROM;
1062
1063 if ($emailFrom && $emailTo) {
1064 $filename = array();
1065 $filedir = array();
1066 $mimetype = array();
1067
1068 // SUBJECT
1069 $societeName = $conf->global->MAIN_INFO_SOCIETE_NOM;
1070 if (getDolGlobalString('MAIN_APPLICATION_TITLE')) {
1071 $societeName = $conf->global->MAIN_APPLICATION_TITLE;
1072 }
1073
1074 $subject = $societeName." - ".$langs->transnoentities("ExpenseReportPaid");
1075
1076 // CONTENT
1077 $link = $urlwithroot.'/expensereport/card.php?id='.$object->id;
1078 $link = '<a href="'.$link.'">'.$link.'</a>';
1079 $message = $langs->transnoentities("ExpenseReportPaidMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link);
1080
1081 // Generate pdf before attachment
1082 $object->setDocModel($user, "");
1083 $resultPDF = expensereport_pdf_create($db, $object, '', "", $langs);
1084
1085 // PREPARE SEND
1086 $mailfile = new CMailFile($subject, $emailTo, $emailFrom, $message, $filedir, $mimetype, $filename, '', '', 0, -1);
1087
1088 if ($mailfile) {
1089 // SEND
1090 $result = $mailfile->sendfile();
1091 if ($result) {
1092 $mesg = $langs->trans('MailSuccessfulySent', $mailfile->getValidAddress($emailFrom, 2), $mailfile->getValidAddress($emailTo, 2));
1093 setEventMessages($mesg, null, 'mesgs');
1094 header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
1095 exit;
1096 } else {
1097 $langs->load("other");
1098 if ($mailfile->error) {
1099 $mesg = '';
1100 $mesg .= $langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo);
1101 $mesg .= '<br>'.$mailfile->error;
1102 setEventMessages($mesg, null, 'errors');
1103 } else {
1104 setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings');
1105 }
1106 }
1107 } else {
1108 setEventMessages($mailfile->error, $mailfile->errors, 'errors');
1109 $action = '';
1110 }
1111 } else {
1112 setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings');
1113 $action = '';
1114 }
1115 } else {
1116 setEventMessages($langs->trans("FailedToSetPaid"), null, 'warnings');
1117 $action = '';
1118 }
1119 }
1120
1121 if ($action == "addline" && $user->hasRight('expensereport', 'creer')) {
1122 $error = 0;
1123
1124 // First save uploaded file
1125 $fk_ecm_files = 0;
1126 if (GETPOSTISSET('attachfile')) {
1127 $arrayoffiles = GETPOST('attachfile', 'array');
1128 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1129 include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
1130 $entityprefix = ($conf->entity != '1') ? $conf->entity.'/' : '';
1131 $relativepath = 'expensereport/'.$object->ref.'/'.$arrayoffiles[0];
1132 $ecmfiles = new EcmFiles($db);
1133 $ecmfiles->fetch(0, '', $relativepath);
1134 $fk_ecm_files = $ecmfiles->id;
1135 }
1136 }
1137
1138 // if VAT is not used in Dolibarr, set VAT rate to 0 because VAT rate is necessary.
1139 if (empty($vatrate)) {
1140 $vatrate = "0.000";
1141 }
1142 $tmpvat = price2num(preg_replace('/\s*\‍(.*\‍)/', '', $vatrate));
1143
1144 $value_unit_ht = price2num(GETPOST('value_unit_ht', 'alpha'), 'MU');
1145 $value_unit = price2num(GETPOST('value_unit', 'alpha'), 'MU');
1146 if (empty($value_unit)) {
1147 $value_unit = price2num($value_unit_ht + ($value_unit_ht * $tmpvat / 100), 'MU');
1148 }
1149
1150 $fk_c_exp_tax_cat = GETPOST('fk_c_exp_tax_cat', 'int');
1151
1152 $qty = price2num(GETPOST('qty', 'alpha'));
1153 if (empty($qty)) {
1154 $qty = 1;
1155 }
1156
1157 if (!($fk_c_type_fees > 0)) {
1158 $error++;
1159 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), null, 'errors');
1160 $action = '';
1161 }
1162
1163 if ((float) $tmpvat < 0 || $tmpvat === '') {
1164 $error++;
1165 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("VAT")), null, 'errors');
1166 $action = '';
1167 }
1168
1169 // If no date entered
1170 if (empty($date) || $date == "--") {
1171 $error++;
1172 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), null, 'errors');
1173 } elseif ($date < $object->date_debut || $date > ($object->date_fin + (24 * 3600 - 1))) {
1174 // Warning if date out of range
1175 $langs->load("errors");
1176 setEventMessages($langs->trans("WarningDateOfLineMustBeInExpenseReportRange"), null, 'warnings');
1177 }
1178
1179 // If no price entered
1180 if ($value_unit == 0) {
1181 $error++;
1182 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("PriceUTTC")), null, 'errors');
1183 }
1184
1185 // If no project entered
1186 if ($projectRequired && $fk_project <= 0) {
1187 $error++;
1188 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Project")), null, 'errors');
1189 }
1190
1191 // If no file associated
1192 if ($fileRequired && $fk_ecm_files == 0) {
1193 $error++;
1194 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("File")), null, 'errors');
1195 }
1196
1197 if (!$error) {
1198 $type = 0; // TODO What if service ? We should take the type product/service from the type of expense report llx_c_type_fees
1199
1200 // Insert line
1201 $result = $object->addline($qty, $value_unit, $fk_c_type_fees, $vatrate, $date, $comments, $fk_project, $fk_c_exp_tax_cat, $type, $fk_ecm_files);
1202 if ($result > 0) {
1203 $ret = $object->fetch($object->id); // Reload to get new records
1204
1205 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
1206 // Define output language
1207 $outputlangs = $langs;
1208 $newlang = GETPOST('lang_id', 'alpha');
1209 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1210 $user = new User($db);
1211 $user->fetch($object->fk_user_author);
1212 $newlang = $user->lang;
1213 }
1214 if (!empty($newlang)) {
1215 $outputlangs = new Translate("", $conf);
1216 $outputlangs->setDefaultLang($newlang);
1217 }
1218
1219 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1220 }
1221
1222 unset($qty);
1223 unset($value_unit_ht);
1224 unset($value_unit);
1225 unset($vatrate);
1226 unset($comments);
1227 unset($fk_c_type_fees);
1228 unset($fk_project);
1229
1230 unset($date);
1231 } else {
1232 $error++;
1233 setEventMessages($object->error, $object->errors, 'errors');
1234 }
1235 }
1236
1237 if (!$error) {
1238 header("Location: ".$_SERVER["PHP_SELF"]."?id=".GETPOST('id', 'int'));
1239 exit;
1240 } else {
1241 $action = '';
1242 }
1243 }
1244
1245 if ($action == 'confirm_delete_line' && GETPOST("confirm", 'alpha') == "yes" && $user->hasRight('expensereport', 'creer')) {
1246 $object = new ExpenseReport($db);
1247 $object->fetch($id);
1248
1249 $object_ligne = new ExpenseReportLine($db);
1250 $object_ligne->fetch(GETPOST("rowid", 'int'));
1251 $total_ht = $object_ligne->total_ht;
1252 $total_tva = $object_ligne->total_tva;
1253
1254 $result = $object->deleteline(GETPOST("rowid", 'int'), $user);
1255 if ($result >= 0) {
1256 if ($result > 0) {
1257 // Define output language
1258 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
1259 $outputlangs = $langs;
1260 $newlang = '';
1261 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1262 $newlang = GETPOST('lang_id', 'aZ09');
1263 }
1264 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1265 $newlang = $object->thirdparty->default_lang;
1266 }
1267 if (!empty($newlang)) {
1268 $outputlangs = new Translate("", $conf);
1269 $outputlangs->setDefaultLang($newlang);
1270 }
1271 $model = $object->model_pdf;
1272 $ret = $object->fetch($id); // Reload to get new records
1273
1274 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1275 }
1276 }
1277
1278 header("Location: ".$_SERVER["PHP_SELF"]."?id=".GETPOST('id', 'int'));
1279 exit;
1280 } else {
1281 setEventMessages($object->error, $object->errors, 'errors');
1282 }
1283 }
1284
1285 if ($action == "updateline" && $user->hasRight('expensereport', 'creer')) {
1286 $object = new ExpenseReport($db);
1287 $object->fetch($id);
1288
1289 // First save uploaded file
1290 $fk_ecm_files = 0;
1291 if (GETPOSTISSET('attachfile')) {
1292 $arrayoffiles = GETPOST('attachfile', 'array');
1293 if (is_array($arrayoffiles) && !empty($arrayoffiles[0])) {
1294 include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
1295 $relativepath = 'expensereport/'.$object->ref.'/'.$arrayoffiles[0];
1296 $ecmfiles = new EcmFiles($db);
1297 $ecmfiles->fetch(0, '', $relativepath);
1298 $fk_ecm_files = $ecmfiles->id;
1299 }
1300 }
1301
1302 $rowid = GETPOST('rowid', 'int');
1303 $type_fees_id = GETPOST('fk_c_type_fees', 'int');
1304 $fk_c_exp_tax_cat = GETPOST('fk_c_exp_tax_cat', 'int');
1305 $projet_id = $fk_project;
1306 $comments = GETPOST('comments', 'restricthtml');
1307 $qty = price2num(GETPOST('qty', 'alpha'));
1308 $vatrate = GETPOST('vatrate', 'alpha');
1309
1310 // if VAT is not used in Dolibarr, set VAT rate to 0 because VAT rate is necessary.
1311 if (empty($vatrate)) {
1312 $vatrate = "0.000";
1313 }
1314 $tmpvat = price2num(preg_replace('/\s*\‍(.*\‍)/', '', $vatrate));
1315
1316 $value_unit_ht = price2num(GETPOST('value_unit_ht', 'alpha'), 'MU');
1317 $value_unit = price2num(GETPOST('value_unit', 'alpha'), 'MU');
1318 if (empty($value_unit)) {
1319 $value_unit = price2num($value_unit_ht + ($value_unit_ht * $tmpvat / 100), 'MU');
1320 }
1321
1322 if (!GETPOST('fk_c_type_fees', 'int') > 0) {
1323 $error++;
1324 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), null, 'errors');
1325 $action = '';
1326 }
1327 if ((float) $tmpvat < 0 || $tmpvat == '') {
1328 $error++;
1329 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Vat")), null, 'errors');
1330 $action = '';
1331 }
1332 // Warning if date out of range
1333 if ($date < $object->date_debut || $date > ($object->date_fin + (24 * 3600 - 1))) {
1334 $langs->load("errors");
1335 setEventMessages($langs->trans("WarningDateOfLineMustBeInExpenseReportRange"), null, 'warnings');
1336 }
1337
1338 // If no project entered
1339 if ($projectRequired && $projet_id <= 0) {
1340 $error++;
1341 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Project")), null, 'errors');
1342 }
1343
1344 if (!$error) {
1345 // TODO Use update method of ExpenseReportLine
1346 $result = $object->updateline($rowid, $type_fees_id, $projet_id, $vatrate, $comments, $qty, $value_unit, $date, $id, $fk_c_exp_tax_cat, $fk_ecm_files);
1347 if ($result >= 0) {
1348 if ($result > 0) {
1349 // Define output language
1350 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
1351 $outputlangs = $langs;
1352 $newlang = '';
1353 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1354 $newlang = GETPOST('lang_id', 'aZ09');
1355 }
1356 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
1357 $newlang = $object->thirdparty->default_lang;
1358 }
1359 if (!empty($newlang)) {
1360 $outputlangs = new Translate("", $conf);
1361 $outputlangs->setDefaultLang($newlang);
1362 }
1363 $model = $object->model_pdf;
1364 $ret = $object->fetch($id); // Reload to get new records
1365
1366 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
1367 }
1368
1369 unset($qty);
1370 unset($value_unit_ht);
1371 unset($value_unit);
1372 unset($vatrate);
1373 unset($comments);
1374 unset($fk_c_type_fees);
1375 unset($fk_project);
1376 unset($date);
1377 }
1378
1379 //header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
1380 //exit;
1381 } else {
1382 setEventMessages($object->error, $object->errors, 'errors');
1383 }
1384 }
1385 }
1386
1387 // Actions when printing a doc from card
1388 include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
1389
1390 // Actions to send emails
1391 $triggersendname = 'EXPENSEREPORT_SENTBYMAIL';
1392 $autocopy = 'MAIN_MAIL_AUTOCOPY_EXPENSEREPORT_TO';
1393 $trackid = 'exp'.$object->id;
1394 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
1395
1396 // Actions to build doc
1397 $upload_dir = $conf->expensereport->dir_output;
1398 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
1399}
1400
1401
1402/*
1403 * View
1404 */
1405
1406$title = $langs->trans("ExpenseReport")." - ".$langs->trans("Card");
1407$help_url = "EN:Module_Expense_Reports|FR:Module_Notes_de_frais";
1408
1409llxHeader("", $title, $help_url);
1410
1411$form = new Form($db);
1412$formfile = new FormFile($db);
1413$formproject = new FormProjets($db);
1414$projecttmp = new Project($db);
1415$paymentexpensereportstatic = new PaymentExpenseReport($db);
1416$bankaccountstatic = new Account($db);
1417$ecmfilesstatic = new EcmFiles($db);
1418$formexpensereport = new FormExpenseReport($db);
1419
1420// Create
1421if ($action == 'create') {
1422 print load_fiche_titre($langs->trans("NewTrip"), '', 'trip');
1423
1424 print '<form action="'.$_SERVER['PHP_SELF'].'" method="post" name="create">';
1425 print '<input type="hidden" name="token" value="'.newToken().'">';
1426 print '<input type="hidden" name="action" value="add">';
1427 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
1428
1429 print dol_get_fiche_head('');
1430
1431 print '<table class="border centpercent">';
1432 print '<tbody>';
1433
1434 // Date start
1435 print '<tr>';
1436 print '<td class="titlefieldcreate fieldrequired">'.$langs->trans("DateStart").'</td>';
1437 print '<td>';
1438 print $form->selectDate($date_start ? $date_start : -1, 'date_debut', 0, 0, 0, '', 1, 1);
1439 print '</td>';
1440 print '</tr>';
1441
1442 // Date end
1443 print '<tr>';
1444 print '<td class="fieldrequired">'.$langs->trans("DateEnd").'</td>';
1445 print '<td>';
1446 print $form->selectDate($date_end ? $date_end : -1, 'date_fin', 0, 0, 0, '', 1, 1);
1447 print '</td>';
1448 print '</tr>';
1449
1450 // User for expense report
1451 print '<tr>';
1452 print '<td class="fieldrequired">'.$langs->trans("User").'</td>';
1453 print '<td>';
1454 $defaultselectuser = $user->id;
1455 if (GETPOST('fk_user_author', 'int') > 0) {
1456 $defaultselectuser = GETPOST('fk_user_author', 'int');
1457 }
1458 $include_users = 'hierarchyme';
1459 if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS') && $user->hasRight('expensereport', 'writeall_advance')) {
1460 $include_users = array();
1461 }
1462 $s = $form->select_dolusers($defaultselectuser, "fk_user_author", 0, "", 0, $include_users, '', '0,'.$conf->entity);
1463 print $s;
1464 print '</td>';
1465 print '</tr>';
1466
1467 // Approver
1468 print '<tr>';
1469 print '<td>'.$langs->trans("VALIDATOR").'</td>';
1470 print '<td>';
1471 $object = new ExpenseReport($db);
1472 $include_users = $object->fetch_users_approver_expensereport();
1473 if (empty($include_users)) {
1474 print img_warning().' '.$langs->trans("NobodyHasPermissionToValidateExpenseReport");
1475 } else {
1476 $defaultselectuser = (empty($user->fk_user_expense_validator) ? $user->fk_user : $user->fk_user_expense_validator); // Will work only if supervisor has permission to approve so is inside include_users
1477 if (getDolGlobalString('EXPENSEREPORT_DEFAULT_VALIDATOR')) {
1478 $defaultselectuser = $conf->global->EXPENSEREPORT_DEFAULT_VALIDATOR; // Can force default approver
1479 }
1480 if (GETPOST('fk_user_validator', 'int') > 0) {
1481 $defaultselectuser = GETPOST('fk_user_validator', 'int');
1482 }
1483 $s = $form->select_dolusers($defaultselectuser, "fk_user_validator", 1, "", ((empty($defaultselectuser) || !getDolGlobalString('EXPENSEREPORT_DEFAULT_VALIDATOR_UNCHANGEABLE')) ? 0 : 1), $include_users);
1484 print $form->textwithpicto($s, $langs->trans("AnyOtherInThisListCanValidate"));
1485 }
1486 print '</td>';
1487 print '</tr>';
1488
1489 // Payment mode
1490 if (getDolGlobalString('EXPENSEREPORT_ASK_PAYMENTMODE_ON_CREATION')) {
1491 print '<tr>';
1492 print '<td>'.$langs->trans("ModePaiement").'</td>';
1493 print '<td>';
1494 $form->select_types_paiements('', 'fk_c_paiement');
1495 print '</td>';
1496 print '</tr>';
1497 }
1498
1499 // Public note
1500 $note_public = GETPOSTISSET('note_public') ? GETPOST('note_public', 'restricthtml') : '';
1501
1502 print '<tr>';
1503 print '<td class="tdtop">'.$langs->trans('NotePublic').'</td>';
1504 print '<td>';
1505
1506 $doleditor = new DolEditor('note_public', $note_public, '', 80, 'dolibarr_notes', 'In', 0, false, !getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3, '90%');
1507 print $doleditor->Create(1);
1508 print '</td></tr>';
1509
1510 // Private note
1511 $note_private = GETPOSTISSET('note_private') ? GETPOST('note_private', 'restricthtml') : '';
1512
1513 if (empty($user->socid)) {
1514 print '<tr>';
1515 print '<td class="tdtop">'.$langs->trans('NotePrivate').'</td>';
1516 print '<td>';
1517
1518 $doleditor = new DolEditor('note_private', $note_private, '', 80, 'dolibarr_notes', 'In', 0, false, !getDolGlobalString('FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3, '90%');
1519 print $doleditor->Create(1);
1520 print '</td></tr>';
1521 }
1522
1523 // Other attributes
1524 $parameters = array('colspan' => ' colspan="3"', 'cols' => 3);
1525 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by
1526 print $hookmanager->resPrint;
1527 if (empty($reshook)) {
1528 print $object->showOptionals($extrafields, 'create', $parameters);
1529 }
1530
1531 print '<tbody>';
1532 print '</table>';
1533
1534 print dol_get_fiche_end();
1535
1536 print $form->buttonsSaveCancel("AddTrip");
1537
1538 print '</form>';
1539} elseif ($id > 0 || $ref) {
1540 $result = $object->fetch($id, $ref);
1541
1542 if ($result > 0) {
1543 if (!in_array($object->fk_user_author, $user->getAllChildIds(1))) {
1544 if (!$user->hasRight('expensereport', 'readall') && !$user->hasRight('expensereport', 'lire_tous')
1545 && (!getDolGlobalString('MAIN_USE_ADVANCED_PERMS') || !$user->hasRight('expensereport', 'writeall_advance'))) {
1546 print load_fiche_titre($langs->trans('TripCard'), '', 'trip');
1547
1548 print '<div class="tabBar">';
1549 print $langs->trans('NotUserRightToView');
1550 print '</div>';
1551
1552 // End of page
1553 llxFooter();
1554 $db->close();
1555
1556 exit;
1557 }
1558 }
1559
1560 $head = expensereport_prepare_head($object);
1561
1562 if ($action == 'edit' && ($object->status < 3 || $object->status == 99)) {
1563 print "<form name='update' action=\"".$_SERVER['PHP_SELF']."\" method=\"post\">\n";
1564 print '<input type="hidden" name="token" value="'.newToken().'">';
1565 print '<input type="hidden" name="id" value="'.$id.'">';
1566 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
1567
1568 print dol_get_fiche_head($head, 'card', $langs->trans("ExpenseReport"), 0, 'trip');
1569
1570 if ($object->status == 99) {
1571 print '<input type="hidden" name="action" value="updateFromRefuse">';
1572 } else {
1573 print '<input type="hidden" name="action" value="update">';
1574 }
1575
1576 $linkback = '<a href="'.DOL_URL_ROOT.'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
1577
1578 print '<table class="border centpercent">';
1579
1580 print '<tr>';
1581 print '<td>'.$langs->trans("User").'</td>';
1582 print '<td>';
1583 $userfee = new User($db);
1584 if ($object->fk_user_author > 0) {
1585 $userfee->fetch($object->fk_user_author);
1586 print $userfee->getNomUrl(-1);
1587 }
1588 print '</td></tr>';
1589
1590 // Ref
1591 print '<tr><td class="titlefieldcreate">'.$langs->trans("Ref").'</td><td>';
1592 print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', '');
1593 print '</td></tr>';
1594
1595 print '<tr>';
1596 print '<td>'.$langs->trans("DateStart").'</td>';
1597 print '<td>';
1598 print $form->selectDate($object->date_debut, 'date_debut');
1599 print '</td>';
1600 print '</tr>';
1601 print '<tr>';
1602 print '<td>'.$langs->trans("DateEnd").'</td>';
1603 print '<td>';
1604 print $form->selectDate($object->date_fin, 'date_fin');
1605 print '</td>';
1606 print '</tr>';
1607
1608 if (getDolGlobalString('EXPENSEREPORT_ASK_PAYMENTMODE_ON_CREATION')) {
1609 print '<tr>';
1610 print '<td>'.$langs->trans("ModePaiement").'</td>';
1611 print '<td>';
1612 $form->select_types_paiements($object->fk_c_paiement, 'fk_c_paiement');
1613 print '</td>';
1614 print '</tr>';
1615 }
1616
1617 if ($object->status < 3) {
1618 print '<tr>';
1619 print '<td>'.$langs->trans("VALIDATOR").'</td>'; // Approbator
1620 print '<td>';
1621 $include_users = $object->fetch_users_approver_expensereport();
1622 $s = $form->select_dolusers($object->fk_user_validator, "fk_user_validator", 1, "", 0, $include_users);
1623 print $form->textwithpicto($s, $langs->trans("AnyOtherInThisListCanValidate"));
1624 print '</td>';
1625 print '</tr>';
1626 } else {
1627 print '<tr>';
1628 print '<td>'.$langs->trans("VALIDOR").'</td>';
1629 print '<td>';
1630 $userfee = new User($db);
1631 $userfee->fetch($object->fk_user_valid);
1632 print $userfee->getNomUrl(-1);
1633 print '</td></tr>';
1634 }
1635
1636 if ($object->status == 6) {
1637 print '<tr>';
1638 print '<td>'.$langs->trans("AUTHORPAIEMENT").'</td>';
1639 print '<td>';
1640 $userfee = new User($db);
1641 $userfee->fetch($user->id);
1642 print $userfee->getNomUrl(-1);
1643 print '</td></tr>';
1644 }
1645
1646 // Other attributes
1647 //$cols = 3;
1648 //include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_edit.tpl.php';
1649
1650 print '</table>';
1651
1652 print dol_get_fiche_end();
1653
1654 print $form->buttonsSaveCancel("Modify");
1655
1656 print '</form>';
1657 } else {
1658 $taxlessUnitPriceDisabled = getDolGlobalString('EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY') ? ' disabled' : '';
1659
1660 print dol_get_fiche_head($head, 'card', $langs->trans("ExpenseReport"), -1, 'trip');
1661
1662 $formconfirm = '';
1663
1664 // Clone confirmation
1665 if ($action == 'clone') {
1666 // Create an array for form
1667 $criteriaforfilter = 'hierarchyme';
1668 if ($user->hasRight('expensereport', 'readall')) {
1669 $criteriaforfilter = '';
1670 }
1671 $formquestion = array(
1672 'text' => '',
1673 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'))
1674 );
1675 // Paiement incomplet. On demande si motif = escompte ou autre
1676 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneExpenseReport', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
1677 }
1678
1679 if ($action == 'save') {
1680 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id, $langs->trans("SaveTrip"), $langs->trans("ConfirmSaveTrip"), "confirm_validate", "", "", 1);
1681 }
1682
1683 if ($action == 'save_from_refuse') {
1684 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id, $langs->trans("SaveTrip"), $langs->trans("ConfirmSaveTrip"), "confirm_save_from_refuse", "", "", 1);
1685 }
1686
1687 if ($action == 'delete') {
1688 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id, $langs->trans("DeleteTrip"), $langs->trans("ConfirmDeleteTrip"), "confirm_delete", "", "", 1);
1689 }
1690
1691 if ($action == 'validate') {
1692 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id, $langs->trans("ValideTrip"), $langs->trans("ConfirmValideTrip"), "confirm_approve", "", "", 1);
1693 }
1694
1695 if ($action == 'paid') {
1696 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id, $langs->trans("PaidTrip"), $langs->trans("ConfirmPaidTrip"), "confirm_paid", "", "", 1);
1697 }
1698
1699 if ($action == 'cancel') {
1700 $array_input = array('text'=>$langs->trans("ConfirmCancelTrip"), array('type'=>"text", 'label'=>'<strong>'.$langs->trans("Comment").'</strong>', 'name'=>"detail_cancel", 'value'=>""));
1701 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id, $langs->trans("Cancel"), "", "confirm_cancel", $array_input, "", 1);
1702 }
1703
1704 if ($action == 'setdraft') {
1705 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id, $langs->trans("BrouillonnerTrip"), $langs->trans("ConfirmBrouillonnerTrip"), "confirm_setdraft", "", "", 1);
1706 }
1707
1708 if ($action == 'refuse') { // Deny
1709 $array_input = array('text'=>$langs->trans("ConfirmRefuseTrip"), array('type'=>"text", 'label'=>$langs->trans("Comment"), 'name'=>"detail_refuse", 'value'=>""));
1710 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id, $langs->trans("Deny"), '', "confirm_refuse", $array_input, "yes", 1);
1711 }
1712
1713 if ($action == 'delete_line') {
1714 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id."&rowid=".GETPOST('rowid', 'int'), $langs->trans("DeleteLine"), $langs->trans("ConfirmDeleteLine"), "confirm_delete_line", '', 'yes', 1);
1715 }
1716
1717 // Print form confirm
1718 print $formconfirm;
1719
1720 // Expense report card
1721 $linkback = '<a href="'.DOL_URL_ROOT.'/expensereport/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
1722
1723 $morehtmlref = '<div class="refidno">';
1724 $morehtmlref .= '</div>';
1725
1726 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
1727
1728 print '<div class="fichecenter">';
1729 print '<div class="fichehalfleft">';
1730 print '<div class="underbanner clearboth"></div>';
1731
1732 print '<table class="border tableforfield centpercent">';
1733
1734 // Author
1735 print '<tr>';
1736 print '<td class="titlefield">'.$langs->trans("User").'</td>';
1737 print '<td>';
1738 if ($object->fk_user_author > 0) {
1739 $userauthor = new User($db);
1740 $result = $userauthor->fetch($object->fk_user_author);
1741 if ($result < 0) {
1742 dol_print_error('', $userauthor->error);
1743 } elseif ($result > 0) {
1744 print $userauthor->getNomUrl(-1);
1745 }
1746 }
1747 print '</td></tr>';
1748
1749 // Period
1750 print '<tr>';
1751 print '<td class="titlefield">'.$langs->trans("Period").'</td>';
1752 print '<td>';
1753 print get_date_range($object->date_debut, $object->date_fin, 'day', $langs, 0);
1754 print '</td>';
1755 print '</tr>';
1756 if (getDolGlobalString('EXPENSEREPORT_ASK_PAYMENTMODE_ON_CREATION')) {
1757 print '<tr>';
1758 print '<td>'.$langs->trans("ModePaiement").'</td>';
1759 print '<td>'.$object->fk_c_paiement.'</td>';
1760 print '</tr>';
1761 }
1762
1763 // Validation date
1764 print '<tr>';
1765 print '<td>'.$langs->trans("DATE_SAVE").'</td>';
1766 print '<td>'.dol_print_date($object->date_valid, 'dayhour', 'tzuser');
1767 if ($object->status == 2 && $object->hasDelay('toapprove')) {
1768 print ' '.img_warning($langs->trans("Late").' - '.$langs->trans("ToApprove"));
1769 }
1770 if ($object->status == 5 && $object->hasDelay('topay')) {
1771 print ' '.img_warning($langs->trans("Late").' - '.$langs->trans("ToPay"));
1772 }
1773 print '</td></tr>';
1774 print '</tr>';
1775
1776 // User to inform for approval
1777 if ($object->status <= ExpenseReport::STATUS_VALIDATED) { // informed
1778 print '<tr>';
1779 print '<td>'.$langs->trans("VALIDATOR").'</td>'; // approver
1780 print '<td>';
1781 if ($object->fk_user_validator > 0) {
1782 $userfee = new User($db);
1783 $result = $userfee->fetch($object->fk_user_validator);
1784 if ($result > 0) {
1785 print $userfee->getNomUrl(-1);
1786 }
1787 if (empty($userfee->email) || !isValidEmail($userfee->email)) {
1788 $langs->load("errors");
1789 print img_warning($langs->trans("ErrorBadEMail", $userfee->email));
1790 }
1791 }
1792 print '</td></tr>';
1793 } elseif ($object->status == ExpenseReport::STATUS_CANCELED) {
1794 print '<tr>';
1795 print '<td>'.$langs->trans("CANCEL_USER").'</span></td>';
1796 print '<td>';
1797 if ($object->fk_user_cancel > 0) {
1798 $userfee = new User($db);
1799 $result = $userfee->fetch($object->fk_user_cancel);
1800 if ($result > 0) {
1801 print $userfee->getNomUrl(-1);
1802 }
1803 }
1804 print '</td></tr>';
1805
1806 print '<tr>';
1807 print '<td>'.$langs->trans("MOTIF_CANCEL").'</td>';
1808 print '<td>'.$object->detail_cancel.'</td></tr>';
1809 print '</tr>';
1810 print '<tr>';
1811 print '<td>'.$langs->trans("DATE_CANCEL").'</td>';
1812 print '<td>'.dol_print_date($object->date_cancel, 'dayhour', 'tzuser').'</td></tr>';
1813 print '</tr>';
1814 } else {
1815 print '<tr>';
1816 print '<td>'.$langs->trans("ApprovedBy").'</td>';
1817 print '<td>';
1818 if ($object->fk_user_approve > 0) {
1819 $userapp = new User($db);
1820 $result = $userapp->fetch($object->fk_user_approve);
1821 if ($result > 0) {
1822 print $userapp->getNomUrl(-1);
1823 }
1824 }
1825 print '</td></tr>';
1826
1827 print '<tr>';
1828 print '<td>'.$langs->trans("DateApprove").'</td>';
1829 print '<td>'.dol_print_date($object->date_approve, 'dayhour', 'tzuser').'</td></tr>';
1830 print '</tr>';
1831 }
1832
1833 if ($object->status == 99 || !empty($object->detail_refuse)) {
1834 print '<tr>';
1835 print '<td>'.$langs->trans("REFUSEUR").'</td>';
1836 print '<td>';
1837 $userfee = new User($db);
1838 $result = $userfee->fetch($object->fk_user_refuse);
1839 if ($result > 0) {
1840 print $userfee->getNomUrl(-1);
1841 }
1842 print '</td></tr>';
1843
1844 print '<tr>';
1845 print '<td>'.$langs->trans("DATE_REFUS").'</td>';
1846 print '<td>'.dol_print_date($object->date_refuse, 'dayhour', 'tzuser');
1847 if ($object->detail_refuse) {
1848 print ' - '.$object->detail_refuse;
1849 }
1850 print '</td>';
1851 print '</tr>';
1852 }
1853
1854 if ($object->status == $object::STATUS_CLOSED) {
1855 /* TODO this fields are not yet filled
1856 print '<tr>';
1857 print '<td>'.$langs->trans("AUTHORPAIEMENT").'</td>';
1858 print '<td>';
1859 $userfee=new User($db);
1860 $userfee->fetch($object->fk_user_paid);
1861 print $userfee->getNomUrl(-1);
1862 print '</td></tr>';
1863 print '<tr>';
1864 print '<td>'.$langs->trans("DATE_PAIEMENT").'</td>';
1865 print '<td>'.$object->date_paiement.'</td></tr>';
1866 print '</tr>';
1867 */
1868 }
1869
1870 // Other attributes
1871 $cols = 2;
1872 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1873
1874 print '</table>';
1875
1876 print '</div>';
1877 print '<div class="fichehalfright">';
1878 print '<div class="underbanner clearboth"></div>';
1879
1880 print '<table class="border tableforfield centpercent">';
1881
1882 // Amount
1883 print '<tr>';
1884 print '<td class="titlefieldmiddle">'.$langs->trans("AmountHT").'</td>';
1885 print '<td class="nowrap amountcard">'.price($object->total_ht, 1, '', 1, - 1, - 1, $conf->currency).'</td>';
1886 $rowspan = 5;
1887 if ($object->status <= ExpenseReport::STATUS_VALIDATED) {
1888 $rowspan++;
1889 } elseif ($object->status == ExpenseReport::STATUS_CANCELED) {
1890 $rowspan += 2;
1891 } else {
1892 $rowspan += 2;
1893 }
1894 if ($object->status == ExpenseReport::STATUS_REFUSED || !empty($object->detail_refuse)) {
1895 $rowspan += 2;
1896 }
1897 if ($object->status == ExpenseReport::STATUS_CLOSED) {
1898 $rowspan += 2;
1899 }
1900 print "</td>";
1901 print '</tr>';
1902
1903 print '<tr>';
1904 print '<td>'.$langs->trans("AmountVAT").'</td>';
1905 print '<td class="nowrap amountcard">'.price($object->total_tva, 1, '', 1, -1, -1, $conf->currency).'</td>';
1906 print '</tr>';
1907
1908 // Amount Local Taxes
1909 if ($mysoc->localtax1_assuj == "1" || $object->total_localtax1 != 0) { // Localtax1
1910 print '<tr><td>'.$langs->transcountry("AmountLT1", $mysoc->country_code).'</td>';
1911 print '<td class="valuefield">'.price($object->total_localtax1, 1, '', 1, -1, -1, $conf->currency).'</td></tr>';
1912 }
1913 if ($mysoc->localtax2_assuj == "1" || $object->total_localtax2 != 0) { // Localtax2 IRPF
1914 print '<tr><td>'.$langs->transcountry("AmountLT2", $mysoc->country_code).'</td>';
1915 print '<td class="valuefield">'.price($object->total_localtax2, 1, '', 1, -1, -1, $conf->currency).'</td></tr>';
1916 }
1917
1918 print '<tr>';
1919 print '<td>'.$langs->trans("AmountTTC").'</td>';
1920 print '<td class="nowrap amountcard">'.price($object->total_ttc, 1, '', 1, -1, -1, $conf->currency).'</td>';
1921 print '</tr>';
1922
1923 // List of payments already done
1924 $nbcols = 3;
1925 $nbrows = 0;
1926 if (isModEnabled("banque")) {
1927 $nbrows++;
1928 $nbcols++;
1929 }
1930
1931 print '<table class="noborder paymenttable centpercent">';
1932
1933 print '<tr class="liste_titre">';
1934 print '<td class="liste_titre">'.$langs->trans('Payments').'</td>';
1935 print '<td class="liste_titre">'.$langs->trans('Date').'</td>';
1936 print '<td class="liste_titre">'.$langs->trans('Type').'</td>';
1937 if (isModEnabled("banque")) {
1938 print '<td class="liste_titre right">'.$langs->trans('BankAccount').'</td>';
1939 }
1940 print '<td class="liste_titre right">'.$langs->trans('Amount').'</td>';
1941 print '<td class="liste_titre" width="18">&nbsp;</td>';
1942 print '</tr>';
1943
1944 // Payments already done (from payment on this expensereport)
1945 $sql = "SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,";
1946 $sql .= "c.code as payment_code, c.libelle as payment_type,";
1947 $sql .= "ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal";
1948 $sql .= " FROM ".MAIN_DB_PREFIX."expensereport as e, ".MAIN_DB_PREFIX."payment_expensereport as p";
1949 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as c ON p.fk_typepayment = c.id";
1950 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid';
1951 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid';
1952 $sql .= " WHERE e.rowid = ".((int) $id);
1953 $sql .= " AND p.fk_expensereport = e.rowid";
1954 $sql .= ' AND e.entity IN ('.getEntity('expensereport').')';
1955 $sql .= " ORDER BY dp";
1956
1957 $resql = $db->query($sql);
1958 if ($resql) {
1959 $num = $db->num_rows($resql);
1960 $i = 0;
1961 $totalpaid = 0;
1962 while ($i < $num) {
1963 $objp = $db->fetch_object($resql);
1964
1965 $paymentexpensereportstatic->id = $objp->rowid;
1966 $paymentexpensereportstatic->datep = $db->jdate($objp->dp);
1967 $paymentexpensereportstatic->ref = $objp->rowid;
1968 $paymentexpensereportstatic->num_payment = $objp->num_payment;
1969 $paymentexpensereportstatic->type_code = $objp->payment_code;
1970 $paymentexpensereportstatic->type_label = $objp->payment_type;
1971
1972 print '<tr class="oddseven">';
1973 print '<td>';
1974 print $paymentexpensereportstatic->getNomUrl(1);
1975 print '</td>';
1976 print '<td>'.dol_print_date($db->jdate($objp->dp), 'day')."</td>\n";
1977 $labeltype = $langs->trans("PaymentType".$objp->payment_code) != "PaymentType".$objp->payment_code ? $langs->trans("PaymentType".$objp->payment_code) : $objp->payment_type;
1978 print "<td>".$labeltype.' '.$objp->num_payment."</td>\n";
1979 // Bank account
1980 if (isModEnabled("banque")) {
1981 $bankaccountstatic->id = $objp->baid;
1982 $bankaccountstatic->ref = $objp->baref;
1983 $bankaccountstatic->label = $objp->baref;
1984 $bankaccountstatic->number = $objp->banumber;
1985
1986 if (isModEnabled('accounting')) {
1987 $bankaccountstatic->account_number = $objp->account_number;
1988
1989 $accountingjournal = new AccountingJournal($db);
1990 $accountingjournal->fetch($objp->fk_accountancy_journal);
1991 $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
1992 }
1993
1994 print '<td class="right">';
1995 if ($bankaccountstatic->id) {
1996 print $bankaccountstatic->getNomUrl(1, 'transactions');
1997 }
1998 print '</td>';
1999 }
2000 print '<td class="right">'.price($objp->amount)."</td>";
2001 print '<td></td>';
2002 print "</tr>";
2003 $totalpaid += $objp->amount;
2004 $i++;
2005 }
2006 if (!is_null($totalpaid)) {
2007 $totalpaid = price2num($totalpaid); // Round $totalpaid to fix floating problem after addition into loop
2008 }
2009
2010 $remaintopay = price2num($object->total_ttc - $totalpaid);
2011 $resteapayeraffiche = $remaintopay;
2012
2013 $cssforamountpaymentcomplete = 'amountpaymentcomplete';
2014
2015 if ($object->status == ExpenseReport::STATUS_REFUSED) {
2016 $cssforamountpaymentcomplete = 'amountpaymentneutral';
2017 $resteapayeraffiche = 0;
2018 } elseif ($object->paid == 0) {
2019 $cssforamountpaymentcomplete = 'amountpaymentneutral';
2020 }
2021 print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AlreadyPaid").':</td><td class="right">'.price($totalpaid).'</td><td></td></tr>';
2022 print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("AmountExpected").':</td><td class="right">'.price($object->total_ttc).'</td><td></td></tr>';
2023
2024 print '<tr><td colspan="'.$nbcols.'" class="right">'.$langs->trans("RemainderToPay").':</td>';
2025 print '<td class="right'.($resteapayeraffiche ? ' amountremaintopay' : (' '.$cssforamountpaymentcomplete)).'">'.price($resteapayeraffiche).'</td><td></td></tr>';
2026
2027 $db->free($resql);
2028 } else {
2029 dol_print_error($db);
2030 }
2031 print "</table>";
2032
2033 print '</div>';
2034 print '</div>';
2035
2036 print '<div class="clearboth"></div><br>';
2037
2038 print '<div style="clear: both;"></div>';
2039
2040 $actiontouse = 'updateline';
2041 if (($object->status == 0 || $object->status == 99) && $action != 'editline') {
2042 $actiontouse = 'addline';
2043 }
2044
2045 print '<form name="expensereport" action="'.$_SERVER["PHP_SELF"].'" enctype="multipart/form-data" method="post" >';
2046 print '<input type="hidden" name="token" value="'.newToken().'">';
2047 print '<input type="hidden" name="action" value="'.$actiontouse.'">';
2048 print '<input type="hidden" name="id" value="'.$object->id.'">';
2049 print '<input type="hidden" name="fk_expensereport" value="'.$object->id.'" />';
2050 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
2051 print '<input type="hidden" name="page_y" value="">';
2052
2053 print '<div class="div-table-responsive-no-min">';
2054 print '<table id="tablelines" class="noborder centpercent">';
2055
2056 if (!empty($object->lines)) {
2057 $i = 0;
2058 $total = 0;
2059
2060 print '<tr class="liste_titre headerexpensereportdet">';
2061 print '<td class="center linecollinenb">'.$langs->trans('LineNb').'</td>';
2062 //print '<td class="center">'.$langs->trans('Piece').'</td>';
2063 print '<td class="center linecoldate">'.$langs->trans('Date').'</td>';
2064 if (isModEnabled('project')) {
2065 print '<td class="minwidth100imp linecolproject">'.$langs->trans('Project').'</td>';
2066 }
2067 print '<td class="center linecoltype">'.$langs->trans('Type').'</td>';
2068 if (getDolGlobalString('MAIN_USE_EXPENSE_IK')) {
2069 print '<td class="center linecolcarcategory">'.$langs->trans('CarCategory').'</td>';
2070 }
2071 print '<td class="linecoldescription">'.$langs->trans('Description').'</td>';
2072 print '<td class="right linecolvat">'.$langs->trans('VAT').'</td>';
2073 print '<td class="right linecolpriceuht">'.$langs->trans('PriceUHT').'</td>';
2074 print '<td class="right linecolpriceuttc">'.$langs->trans('PriceUTTC').'</td>';
2075 print '<td class="right linecolqty">'.$langs->trans('Qty').'</td>';
2076 if ($action != 'editline') {
2077 print '<td class="right linecolamountht">'.$langs->trans('AmountHT').'</td>';
2078 print '<td class="right linecolamountttc">'.$langs->trans('AmountTTC').'</td>';
2079 }
2080 // Picture
2081 print '<td>';
2082 print '</td>';
2083
2084 // Information if theres a rule restriction
2085 print '<td>';
2086 print '</td>';
2087
2088 // Ajout des boutons de modification/suppression
2089 if (($object->status < 2 || $object->status == 99) && $user->hasRight('expensereport', 'creer')) {
2090 print '<td class="right"></td>';
2091 }
2092 print '</tr>';
2093
2094 foreach ($object->lines as &$line) {
2095 $numline = $i + 1;
2096
2097 if ($action != 'editline' || $line->id != GETPOST('rowid', 'int')) {
2098 print '<tr class="oddeven linetr" data-id="'.$line->id.'">';
2099
2100 // Num
2101 print '<td class="center linecollinenb">';
2102 print $numline;
2103 print '</td>';
2104
2105 // Date
2106 print '<td class="center linecoldate">'.dol_print_date($db->jdate($line->date), 'day').'</td>';
2107
2108 // Project
2109 if (isModEnabled('project')) {
2110 print '<td class="lineproject">';
2111 if ($line->fk_project > 0) {
2112 $projecttmp->id = $line->fk_project;
2113 $projecttmp->ref = $line->projet_ref;
2114 $projecttmp->title = $line->projet_title;
2115 print $projecttmp->getNomUrl(1);
2116 }
2117 print '</td>';
2118 }
2119
2120 $titlealt = '';
2121 if (isModEnabled('accounting')) {
2122 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
2123 $accountingaccount = new AccountingAccount($db);
2124 $resaccountingaccount = $accountingaccount->fetch(0, $line->type_fees_accountancy_code, 1);
2125 //$titlealt .= '<span class="opacitymedium">';
2126 $titlealt .= $langs->trans("AccountancyCode").': ';
2127 if ($resaccountingaccount > 0) {
2128 $titlealt .= $accountingaccount->account_number;
2129 } else {
2130 $titlealt .= $langs->trans("NotFound");
2131 }
2132 //$titlealt .= '</span>';
2133 }
2134
2135 // Type of fee
2136 print '<td class="center linecoltype" title="'.dol_escape_htmltag($titlealt).'">';
2137 $labeltype = ($langs->trans(($line->type_fees_code)) == $line->type_fees_code ? $line->type_fees_libelle : $langs->trans($line->type_fees_code));
2138 print $labeltype;
2139 print '</td>';
2140
2141 // IK
2142 if (getDolGlobalString('MAIN_USE_EXPENSE_IK')) {
2143 print '<td class="fk_c_exp_tax_cat linecoltaxcat">';
2144 $exp_tax_cat_label = dol_getIdFromCode($db, $line->fk_c_exp_tax_cat, 'c_exp_tax_cat', 'rowid', 'label');
2145 print $langs->trans($exp_tax_cat_label);
2146 print '</td>';
2147 }
2148
2149 // Comment
2150 print '<td class="left linecolcomment">'.dol_nl2br($line->comments).'</td>';
2151
2152 // VAT rate
2153 print '<td class="right linecolvatrate">'.vatrate($line->vatrate.($line->vat_src_code ? ' ('.$line->vat_src_code.')' : ''), true).'</td>';
2154
2155 // Unit price HT
2156 print '<td class="right linecolunitht">';
2157 if (!empty($line->value_unit_ht)) {
2158 print price($line->value_unit_ht);
2159 } else {
2160 $tmpvat = price2num(preg_replace('/\s*\‍(.*\‍)/', '', $line->vatrate));
2161 $pricenettoshow = price2num($line->value_unit / (1 + $tmpvat / 100), 'MU');
2162 print price($pricenettoshow);
2163 }
2164 print '</td>';
2165
2166 print '<td class="right linecolunitttc">'.price($line->value_unit).'</td>';
2167
2168 print '<td class="right linecolqty">'.dol_escape_htmltag($line->qty).'</td>';
2169
2170 if ($action != 'editline') {
2171 print '<td class="right linecoltotalht">'.price($line->total_ht).'</td>';
2172 print '<td class="right linecoltotalttc">'.price($line->total_ttc).'</td>';
2173 }
2174
2175 // Column with preview
2176 print '<td class="center linecolpreview">';
2177 if ($line->fk_ecm_files > 0) {
2178 $modulepart = 'expensereport';
2179 $maxheightmini = 32;
2180
2181 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2182 if ($result > 0) {
2183 $relativepath = preg_replace('/expensereport\//', '', $ecmfilesstatic->filepath);
2184 $fileinfo = pathinfo($ecmfilesstatic->filepath.'/'.$ecmfilesstatic->filename);
2185 if (image_format_supported($fileinfo['basename']) > 0) {
2186 $minifile = getImageFileNameForSize($fileinfo['basename'], '_mini'); // For new thumbs using same ext (in lower case howerver) than original
2187 if (!dol_is_file($conf->expensereport->dir_output.'/'.$relativepath.'/'.$minifile)) {
2188 $minifile = getImageFileNameForSize($fileinfo['basename'], '_mini', '.png'); // For backward compatibility of old thumbs that were created with filename in lower case and with .png extension
2189 }
2190 //print $file['path'].'/'.$minifile.'<br>';
2191 $urlforhref = getAdvancedPreviewUrl($modulepart, $relativepath.'/'.$fileinfo['filename'].'.'.strtolower($fileinfo['extension']), 1, '&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
2192 if (empty($urlforhref)) {
2193 $urlforhref = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.(empty($object->entity) ? $conf->entity : $object->entity).'&file='.urlencode($relativepath.$fileinfo['filename'].'.'.strtolower($fileinfo['extension']));
2194 print '<a href="'.$urlforhref.'" class="aphoto" target="_blank" rel="noopener noreferrer">';
2195 } else {
2196 print '<a href="'.$urlforhref['url'].'" class="'.$urlforhref['css'].'" target="'.$urlforhref['target'].'" mime="'.$urlforhref['mime'].'">';
2197 }
2198 print '<img class="photo" height="'.$maxheightmini.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.(empty($object->entity) ? $conf->entity : $object->entity).'&file='.urlencode($relativepath.'/'.$minifile).'" title="">';
2199 print '</a>';
2200 } else {
2201 $modulepart = 'expensereport';
2202 $thumbshown = 0;
2203 if (preg_match('/\.pdf$/i', $ecmfilesstatic->filename)) {
2204 $filepdf = $conf->expensereport->dir_output.'/'.$relativepath.'/'.$ecmfilesstatic->filename;
2205 $fileimage = $conf->expensereport->dir_output.'/'.$relativepath.'/'.$ecmfilesstatic->filename.'_preview.png';
2206 $relativepathimage = $relativepath.'/'.$ecmfilesstatic->filename.'_preview.png';
2207
2208 $pdfexists = file_exists($filepdf);
2209 if ($pdfexists) {
2210 // Conversion du PDF en image png si fichier png non existant
2211 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2212 if (!getDolGlobalString('MAIN_DISABLE_PDF_THUMBS')) { // If you experience trouble with pdf thumb generation and imagick, you can disable here.
2213 include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
2214 $ret = dol_convert_file($filepdf, 'png', $fileimage, '0'); // Convert first page of PDF into a file _preview.png
2215 if ($ret < 0) {
2216 $error++;
2217 }
2218 }
2219 }
2220 }
2221
2222 if ($pdfexists && !$error) {
2223 $heightforphotref = 70;
2224 if (!empty($conf->dol_optimize_smallscreen)) {
2225 $heightforphotref = 60;
2226 }
2227 // If the preview file is found
2228 if (file_exists($fileimage)) {
2229 $thumbshown = 1;
2230 $urlforhref = getAdvancedPreviewUrl($modulepart, $relativepath.'/'.$fileinfo['filename'].'.'.strtolower($fileinfo['extension']), 1, '&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
2231 print '<a href="'.$urlforhref['url'].'" class="'.$urlforhref['css'].'" target="'.$urlforhref['target'].'" mime="'.$urlforhref['mime'].'">';
2232 print '<img height="'.$heightforphotref.'" class="photo photowithmargin photowithborder" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=apercu'.$modulepart.'&amp;file='.urlencode($relativepathimage).'">';
2233 print '</a>';
2234 }
2235 }
2236 }
2237
2238 if (!$thumbshown && $fileinfo['extension'] == 'pdf' && !empty($filepdf) && !empty($relativepath) && !empty($fileinfo['filename'])) {
2239 $formFile = new FormFile($db);
2240 $imgpreview = $formFile->showPreview([], $modulepart, $relativepath.'/'.$fileinfo['filename'].'.'.strtolower($fileinfo['extension']), 0);
2241 print $imgpreview;
2242 } elseif (!$thumbshown) {
2243 print img_mime($ecmfilesstatic->filename);
2244 }
2245 }
2246 }
2247 }
2248 print '</td>';
2249
2250 print '<td class="nowrap right linecolwarning">';
2251 print !empty($line->rule_warning_message) ? img_warning(html_entity_decode($line->rule_warning_message)) : '&nbsp;';
2252 print '</td>';
2253
2254 // Ajout des boutons de modification/suppression
2255 if (($object->status < ExpenseReport::STATUS_VALIDATED || $object->status == ExpenseReport::STATUS_REFUSED) && $user->hasRight('expensereport', 'creer')) {
2256 print '<td class="nowrap right linecolaction">';
2257
2258 print '<a class="editfielda reposition paddingrightonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=editline&token='.newToken().'&rowid='.$line->rowid.'">';
2259 print img_edit();
2260 print '</a> &nbsp; ';
2261 print '<a class="paddingrightonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete_line&token='.newToken().'&rowid='.$line->rowid.'">';
2262 print img_delete();
2263 print '</a>';
2264
2265 print '</td>';
2266 }
2267
2268 print '</tr>';
2269 }
2270
2271 if ($action == 'editline' && $line->id == GETPOST('rowid', 'int')) {
2272 // Add line with link to add new file or attach line to an existing file
2273 $colspan = 11;
2274 if (isModEnabled('project')) {
2275 $colspan++;
2276 }
2277 if (getDolGlobalString('MAIN_USE_EXPENSE_IK')) {
2278 $colspan++;
2279 }
2280
2281 print '<!-- line of expense report -->'."\n";
2282 print '<tr class="tredited">';
2283
2284 print '<td class="center">';
2285 print $numline;
2286 print '</td>';
2287
2288 print '<td colspan="'.($colspan - 1).'" class="liste_titre"> ';
2289 print '<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans("UploadANewFileNow");
2290 print img_picto($langs->trans("UploadANewFileNow"), 'chevron-down', '', false, 0, 0, '', 'marginleftonly');
2291 print '</a>';
2292 if (!getDolGlobalString('EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES')) {
2293 print ' &nbsp; - &nbsp; <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans("AttachTheNewLineToTheDocument");
2294 print img_picto($langs->trans("AttachTheNewLineToTheDocument"), 'chevron-down', '', false, 0, 0, '', 'marginleftonly');
2295 print '</a>';
2296 }
2297
2298 print '<!-- Code to open/close section to submit or link files in edit mode -->'."\n";
2299 print '<script type="text/javascript">'."\n";
2300 print '$(document).ready(function() {
2301 $( ".auploadnewfilenow" ).click(function() {
2302 jQuery(".truploadnewfilenow").toggle();
2303 jQuery(".trattachnewfilenow").hide();
2304 return false;
2305 });
2306 $( ".aattachtodoc" ).click(function() {
2307 jQuery(".trattachnewfilenow").toggle();
2308 jQuery(".truploadnewfilenow").hide();
2309 return false;
2310 });';
2311 if (is_array(GETPOST('attachfile', 'array')) && count(GETPOST('attachfile', 'array'))) {
2312 print 'jQuery(".trattachnewfilenow").toggle();'."\n";
2313 }
2314 print '
2315 jQuery("form[name=\"expensereport\"]").submit(function() {
2316 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2317 jQuery("input[name=\"sendit\"]").val("");
2318 }
2319 });
2320 ';
2321 print '
2322 });
2323 ';
2324 print '</script>'."\n";
2325 print '</td></tr>';
2326
2327 $filenamelinked = '';
2328 if ($line->fk_ecm_files > 0) {
2329 $result = $ecmfilesstatic->fetch($line->fk_ecm_files);
2330 if ($result > 0) {
2331 $filenamelinked = $ecmfilesstatic->filename;
2332 }
2333 }
2334
2335 $tredited = 'tredited'; // Case the addfile and linkto file is used for edit (used by following tpl)
2336 include DOL_DOCUMENT_ROOT.'/expensereport/tpl/expensereport_addfile.tpl.php';
2337 include DOL_DOCUMENT_ROOT.'/expensereport/tpl/expensereport_linktofile.tpl.php';
2338
2339 print '<tr class="oddeven tredited">';
2340
2341 print '<td></td>';
2342
2343 // Select date
2344 print '<td class="center">';
2345 print $form->selectDate($line->date, 'date');
2346 print '</td>';
2347
2348 // Select project
2349 if (isModEnabled('project')) {
2350 print '<td>';
2351 $formproject->select_projects(-1, $line->fk_project, 'fk_project', 0, 0, $projectRequired ? 0 : 1, 1, 0, 0, 0, '', 0, 0, 'maxwidth300');
2352 print '</td>';
2353 }
2354
2355 // Select type
2356 print '<td class="center">';
2357 print $formexpensereport->selectTypeExpenseReport($line->fk_c_type_fees, 'fk_c_type_fees');
2358 print '</td>';
2359
2360 if (getDolGlobalString('MAIN_USE_EXPENSE_IK')) {
2361 print '<td class="fk_c_exp_tax_cat">';
2362 $params = array('fk_expense' => $object->id, 'fk_expense_det' => $line->id, 'date' => $line->date);
2363 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);
2364 print '</td>';
2365 }
2366
2367 // Add comments
2368 print '<td>';
2369 print '<textarea name="comments" class="flat_ndf centpercent">'.dol_escape_htmltag($line->comments, 0, 1).'</textarea>';
2370 print '</td>';
2371
2372 // VAT
2373 $selectedvat = price2num($line->vatrate).(!empty($line->vat_src_code) ? ' ('.$line->vat_src_code.')' : '');
2374 print '<td class="right">';
2375 print $form->load_tva('vatrate', (GETPOSTISSET("vatrate") ? GETPOST("vatrate") : $selectedvat), $mysoc, '', 0, 0, '', false, 1);
2376 print '</td>';
2377
2378 // Unit price
2379 print '<td class="right">';
2380 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.' />';
2381 print '</td>';
2382
2383 // Unit price with tax
2384 print '<td class="right">';
2385 print '<input type="text" min="0" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag(price2num($line->value_unit)).'" />';
2386 print '</td>';
2387
2388 // Quantity
2389 print '<td class="right">';
2390 print '<input type="text" min="0" class="input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag($line->qty).'" />'; // We must be able to enter decimal qty
2391 print '</td>';
2392
2393 //print '<td class="right">'.$langs->trans('AmountHT').'</td>';
2394 //print '<td class="right">'.$langs->trans('AmountTTC').'</td>';
2395
2396 // Picture
2397 print '<td class="center">';
2398 //print $line->fk_ecm_files;
2399 print '</td>';
2400 // Information if theres a rule restriction
2401 print '<td class="center">';
2402 print '</td>';
2403
2404 print '<td>';
2405 print '<input type="hidden" name="rowid" value="'.$line->rowid.'">';
2406 print $form->buttonsSaveCancel('Save', 'Cancel', array(), 0, 'small');
2407 print '</td>';
2408
2409 print '</tr>';
2410 }
2411
2412 $i++;
2413 }
2414 }
2415
2416 // Add a new line
2417 if (($object->status == ExpenseReport::STATUS_DRAFT || $object->status == ExpenseReport::STATUS_REFUSED) && $action != 'editline' && $user->hasRight('expensereport', 'creer')) {
2418 $colspan = 12;
2419 if (getDolGlobalString('MAIN_USE_EXPENSE_IK')) {
2420 $colspan++;
2421 }
2422 if (isModEnabled('project')) {
2423 $colspan++;
2424 }
2425 if ($action != 'editline') {
2426 $colspan++;
2427 }
2428
2429 $nbFiles = $nbLinks = 0;
2430 $arrayoffiles = array();
2431 if (!getDolGlobalString('EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES')) {
2432 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
2433 require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
2434 require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
2435 $upload_dir = $conf->expensereport->dir_output."/".dol_sanitizeFileName($object->ref);
2436 $arrayoffiles = dol_dir_list($upload_dir, 'files', 0, '', '(\.meta|_preview.*\.png|'.preg_quote(dol_sanitizeFileName($object->ref.'.pdf'), '/').')$');
2437 $nbFiles = count($arrayoffiles);
2438 $nbLinks = Link::count($db, $object->element, $object->id);
2439 }
2440
2441 // Add line with link to add new file or attach to an existing file
2442 print '<tr class="liste_titre">';
2443 print '<td colspan="'.$colspan.'" class="liste_titre expensereportautoload">';
2444 print '<a href="" class="commonlink auploadnewfilenow reposition">'.$langs->trans("UploadANewFileNow");
2445 print img_picto($langs->trans("UploadANewFileNow"), 'chevron-down', '', false, 0, 0, '', 'marginleftonly');
2446 print '</a>';
2447 if (!getDolGlobalString('EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES')) {
2448 print ' &nbsp; - &nbsp; <a href="" class="commonlink aattachtodoc reposition">'.$langs->trans("AttachTheNewLineToTheDocument");
2449 print img_picto($langs->trans("AttachTheNewLineToTheDocument"), 'chevron-down', '', false, 0, 0, '', 'marginleftonly');
2450 print '</a>';
2451 }
2452
2453 print '<!-- Code to open/close section to submit or link files in the form to add new line -->'."\n";
2454 print '<script type="text/javascript">'."\n";
2455 print '$(document).ready(function() {
2456 $( ".auploadnewfilenow" ).click(function() {
2457 console.log("We click on toggle of auploadnewfilenow");
2458 jQuery(".truploadnewfilenow").toggle();
2459 jQuery(".trattachnewfilenow").hide();
2460 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2461 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2462 } else {
2463 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2464 }
2465 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2466 return false;
2467 });
2468 $( ".aattachtodoc" ).click(function() {
2469 console.log("We click on toggle of aattachtodoc");
2470 jQuery(".trattachnewfilenow").toggle();
2471 jQuery(".truploadnewfilenow").hide();
2472 // TODO Switch css fa-chevron-dow and add fa-chevron-up
2473 return false;
2474 });'."\n";
2475 if (is_array(GETPOST('attachfile', 'array')) && count(GETPOST('attachfile', 'array')) && $action != 'updateline') {
2476 print 'jQuery(".trattachnewfilenow").show();'."\n";
2477 }
2478 print '
2479 jQuery("form[name=\"expensereport\"]").submit(function() {
2480 if (jQuery(".truploadnewfilenow").is(":hidden")) {
2481 /* 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. */
2482 jQuery("input[name=\"sendit\"]").val("");
2483 jQuery("input[name=\"sendit\"]").prop("name", "senditdisabled");
2484 } else {
2485 jQuery("input[name=\"senditdisabled\"]").prop("name", "sendit");
2486 }
2487 });
2488 ';
2489 print '
2490 });
2491 ';
2492 print '</script>'."\n";
2493 print '</td></tr>';
2494
2495 $tredited = ''; // Case the addfile and linkto file is used for edit (used by following tpl)
2496 include DOL_DOCUMENT_ROOT.'/expensereport/tpl/expensereport_linktofile.tpl.php';
2497 include DOL_DOCUMENT_ROOT.'/expensereport/tpl/expensereport_addfile.tpl.php';
2498
2499 print '<tr class="liste_titre expensereportcreate">';
2500 print '<td></td>';
2501 print '<td class="center expensereportcreatedate">'.$langs->trans('Date').'</td>';
2502 if (isModEnabled('project')) {
2503 print '<td class="minwidth100imp">'.$form->textwithpicto($langs->trans('Project'), $langs->trans("ClosedProjectsAreHidden")).'</td>';
2504 }
2505 print '<td class="center expensereportcreatetype">'.$langs->trans('Type').'</td>';
2506 if (getDolGlobalString('MAIN_USE_EXPENSE_IK')) {
2507 print '<td>'.$langs->trans('CarCategory').'</td>';
2508 }
2509 print '<td class="expensereportcreatedescription">'.$langs->trans('Description').'</td>';
2510 print '<td class="right expensereportcreatevat">'.$langs->trans('VAT').'</td>';
2511 print '<td class="right expensereportcreatepriceuth">'.$langs->trans('PriceUHT').'</td>';
2512 print '<td class="right expensereportcreatepricettc">'.$langs->trans('PriceUTTC').'</td>';
2513 print '<td class="right expensereportcreateqty">'.$langs->trans('Qty').'</td>';
2514 print '<td></td>';
2515 print '<td></td>';
2516 print '<td></td>';
2517 print '<td></td>';
2518 print '<td></td>';
2519 print '</tr>';
2520 print '<tr class="oddeven nohover">';
2521
2522 // Line number
2523 print '<td></td>';
2524
2525 // Select date
2526 print '<td class="center inputdate">';
2527 print $form->selectDate(!empty($date) ? $date : -1, 'date', 0, 0, 0, '', 1, 1);
2528 print '</td>';
2529
2530 // Select project
2531 if (isModEnabled('project')) {
2532 print '<td class="inputproject">';
2533 $formproject->select_projects(-1, !empty($fk_project) ? $fk_project : 0, 'fk_project', 0, 0, $projectRequired ? 0 : 1, -1, 0, 0, 0, '', 0, 0, 'maxwidth300');
2534 print '</td>';
2535 }
2536
2537 // Select type
2538 print '<td class="center inputtype">';
2539 print $formexpensereport->selectTypeExpenseReport(!empty($fk_c_type_fees) ? $fk_c_type_fees : "", 'fk_c_type_fees', 1);
2540 print '</td>';
2541
2542 if (getDolGlobalString('MAIN_USE_EXPENSE_IK')) {
2543 print '<td class="fk_c_exp_tax_cat">';
2544 $params = array('fk_expense' => $object->id);
2545 print $form->selectExpenseCategories('', 'fk_c_exp_tax_cat', 1, array(), 'fk_c_type_fees', $userauthor->default_c_exp_tax_cat, $params, 0);
2546 print '</td>';
2547 }
2548
2549 // Add comments
2550 print '<td class="inputcomment">';
2551 print '<textarea class="flat_ndf centpercent" name="comments" rows="'.ROWS_2.'">'.dol_escape_htmltag(!empty($comments) ? $comments : "", 0, 1).'</textarea>';
2552 print '</td>';
2553
2554 // Select VAT
2555 print '<td class="right inputvat">';
2556 $defaultvat = -1;
2557 if (getDolGlobalString('EXPENSEREPORT_NO_DEFAULT_VAT')) {
2558 // If option to have no default VAT on expense report is on, we force MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS
2559 $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS = 'none';
2560 }
2561 print $form->load_tva('vatrate', (!empty($vatrate) ? $vatrate : $defaultvat), $mysoc, '', 0, 0, '', false, 1);
2562 print '</td>';
2563
2564 // Unit price net
2565 print '<td class="right inputpricenet">';
2566 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.' />';
2567 print '</td>';
2568
2569 // Unit price with tax
2570 print '<td class="right inputtax">';
2571 print '<input type="text" class="right maxwidth50" id="value_unit" name="value_unit" value="'.dol_escape_htmltag((!empty($value_unit) ? $value_unit : 0)).'">';
2572 print '</td>';
2573
2574 // Quantity
2575 print '<td class="right inputqty">';
2576 print '<input type="text" min="0" class=" input_qty right maxwidth50" name="qty" value="'.dol_escape_htmltag(!empty($qty) ? $qty : 1).'">'; // We must be able to enter decimal qty
2577 print '</td>';
2578
2579 // Picture
2580 print '<td></td>';
2581
2582 if ($action != 'editline') {
2583 print '<td class="right"></td>';
2584 print '<td class="right"></td>';
2585 }
2586
2587 print '<td class="center inputbuttons">';
2588 print $form->buttonsSaveCancel("Add", '', '', 1, 'reposition');
2589 print '</td>';
2590
2591 print '</tr>';
2592 } // Fin si c'est payé/validé
2593
2594 print '</table>';
2595 print '</div>';
2596
2597 print '<script>
2598
2599 /* JQuery for product free or predefined select */
2600 jQuery(document).ready(function() {
2601 jQuery("#value_unit_ht").keyup(function(event) {
2602 console.log(event.which); // discard event tag and arrows
2603 if (event.which != 9 && (event.which < 37 ||event.which > 40) && jQuery("#value_unit_ht").val() != "") {
2604 jQuery("#value_unit").val("");
2605 }
2606 });
2607 jQuery("#value_unit").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").val() != "") {
2610 jQuery("#value_unit_ht").val("");
2611 }
2612 });
2613 ';
2614
2615 if (getDolGlobalString('MAIN_USE_EXPENSE_IK')) {
2616 print '
2617
2618 /* unit price coef calculation */
2619 jQuery(".input_qty, #fk_c_type_fees, #select_fk_c_exp_tax_cat, #vatrate ").change(function(event) {
2620 console.log("We change a parameter");
2621
2622 let type_fee = jQuery("#fk_c_type_fees").find(":selected").val();
2623 let tax_cat = jQuery("#select_fk_c_exp_tax_cat").find(":selected").val();
2624 let tva = jQuery("#vatrate").find(":selected").val();
2625 let qty = jQuery(".input_qty").val();
2626
2627 let path = "'.dol_buildpath("/expensereport/ajax/ajaxik.php", 1).'";
2628 path += "?fk_c_exp_tax_cat="+tax_cat;
2629 path += "&fk_expense="+'.((int) $object->id).';
2630 path += "&vatrate="+tva;
2631 path += "&qty="+qty;
2632
2633 if (type_fee == 4) { // frais_kilométriques
2634 if (tax_cat == "" || parseInt(tax_cat) <= 0){
2635 return ;
2636 }
2637
2638 jQuery.ajax({
2639 url: path,
2640 async: true,
2641 dataType: "json",
2642 success: function(response) {
2643 if (response.response_status == "success"){';
2644
2645 if (getDolGlobalString('EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY')) {
2646 print '
2647 jQuery("#value_unit").val(parseFloat(response.data) * (100 + parseFloat(tva)) / 100);
2648 jQuery("#value_unit").trigger("change");
2649 ';
2650 } else {
2651 print '
2652 jQuery("#value_unit_ht").val(response.data);
2653 jQuery("#value_unit_ht").trigger("change");
2654 jQuery("#value_unit").val("");
2655 ';
2656 }
2657
2658 print '
2659 } else if(response.response_status == "error" && response.errorMessage != undefined && response.errorMessage.length > 0 ) {
2660 console.log("We get an error result");
2661 $.jnotify(response.errorMessage, "error", {timeout: 0, type: "error"},{ remove: function (){} } );
2662 }
2663 }
2664 });
2665 }
2666
2667 /*console.log(event.which); // discard event tag and arrows
2668 if (event.which != 9 && (event.which < 37 || event.which > 40) && jQuery("#value_unit").val() != "") {
2669 jQuery("#value_unit_ht").val("");
2670 }*/
2671 });
2672 ';
2673 }
2674
2675 print '
2676
2677 });
2678
2679 </script>';
2680
2681 print '</form>';
2682
2683 print dol_get_fiche_end();
2684 }
2685 } else {
2686 dol_print_error($db);
2687 }
2688} else {
2689 print 'Record not found';
2690
2691 llxFooter();
2692 exit(1);
2693}
2694
2695
2696/*
2697 * Action bar
2698 */
2699
2700print '<div class="tabsAction">';
2701
2702if ($action != 'create' && $action != 'edit' && $action != 'editline') {
2703 $object = new ExpenseReport($db);
2704 $object->fetch($id, $ref);
2705
2706 // Send
2707 if (empty($user->socid)) {
2708 if ($object->status > ExpenseReport::STATUS_DRAFT) {
2709 //if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->expensereport->expensereport_advance->send)) {
2710 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>';
2711 //} else
2712 // print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">' . $langs->trans('SendMail') . '</a></div>';
2713 }
2714 }
2715
2716 /* Si l'état est "Brouillon"
2717 * ET user à droit "creer/supprimer"
2718 * ET fk_user_author == user courant
2719 * Afficher : "Enregistrer" / "Modifier" / "Supprimer"
2720 */
2721 if ($user->hasRight('expensereport', 'creer') && $object->status == ExpenseReport::STATUS_DRAFT) {
2722 if (in_array($object->fk_user_author, $user->getAllChildIds(1)) || $user->hasRight('expensereport', 'writeall_advance')) {
2723 // Modify
2724 print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=edit&token='.newToken().'&id='.$object->id.'">'.$langs->trans('Modify').'</a></div>';
2725
2726 // Validate
2727 if (count($object->lines) > 0) {
2728 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>';
2729 }
2730 }
2731 }
2732
2733 /* Si l'état est "Refusée"
2734 * ET user à droit "creer/supprimer"
2735 * ET fk_user_author == user courant
2736 * Afficher : "Enregistrer" / "Modifier" / "Supprimer"
2737 */
2738 if ($user->hasRight('expensereport', 'creer') && $object->status == ExpenseReport::STATUS_REFUSED) {
2739 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2740 // Modify
2741 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>';
2742
2743 // setdraft (le statut refusée est identique à brouillon)
2744 //print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=brouillonner&id='.$id.'">'.$langs->trans('ReOpen').'</a>';
2745 // Enregistrer depuis le statut "Refusée"
2746 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>';
2747 }
2748 }
2749
2750 if ($user->hasRight('expensereport', 'to_paid') && $object->status == ExpenseReport::STATUS_APPROVED) {
2751 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2752 // setdraft
2753 print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=setdraft&token='.newToken().'&id='.$object->id.'">'.$langs->trans('SetToDraft').'</a></div>';
2754 }
2755 }
2756
2757 /* Si l'état est "En attente d'approbation"
2758 * ET user à droit de "approve"
2759 * ET fk_user_validator == user courant
2760 * Afficher : "Valider" / "Refuser" / "Supprimer"
2761 */
2762 if ($object->status == ExpenseReport::STATUS_VALIDATED) {
2763 if (in_array($object->fk_user_author, $user->getAllChildIds(1))) {
2764 // set draft
2765 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>';
2766 }
2767 }
2768
2769 if ($user->hasRight('expensereport', 'approve') && $object->status == ExpenseReport::STATUS_VALIDATED) {
2770 //if($object->fk_user_validator==$user->id)
2771 //{
2772 // Validate
2773 print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=validate&id='.$object->id.'">'.$langs->trans('Approve').'</a></div>';
2774 // Deny
2775 print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=refuse&id='.$object->id.'">'.$langs->trans('Deny').'</a></div>';
2776 //}
2777
2778 if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) {
2779 // Cancel
2780 print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=cancel&id='.$object->id.'">'.$langs->trans("Cancel").'</a></div>';
2781 }
2782 }
2783
2784
2785 // If status is Approved
2786 // ---------------------
2787
2788 if ($user->hasRight('expensereport', 'approve') && $object->status == ExpenseReport::STATUS_APPROVED) {
2789 print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=refuse&id='.$object->id.'">'.$langs->trans('Deny').'</a></div>';
2790 }
2791
2792 // If bank module is used
2793 if ($user->hasRight('expensereport', 'to_paid') && isModEnabled("banque") && $object->status == ExpenseReport::STATUS_APPROVED) {
2794 // Pay
2795 if ($remaintopay == 0) {
2796 print '<div class="inline-block divButAction"><span class="butActionRefused classfortooltip" title="'.$langs->trans("DisabledBecauseRemainderToPayIsZero").'">'.$langs->trans('DoPayment').'</span></div>';
2797 } else {
2798 print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/expensereport/payment/payment.php?id='.$object->id.'&amp;action=create">'.$langs->trans('DoPayment').'</a></div>';
2799 }
2800 }
2801
2802 // If bank module is not used
2803 if (($user->hasRight('expensereport', 'to_paid') || empty(isModEnabled("banque"))) && $object->status == ExpenseReport::STATUS_APPROVED) {
2804 //if ((round($remaintopay) == 0 || !isModEnabled("banque")) && $object->paid == 0)
2805 if ($object->paid == 0) {
2806 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>";
2807 }
2808 }
2809
2810 if ($user->hasRight('expensereport', 'creer') && ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) && $object->status == ExpenseReport::STATUS_APPROVED) {
2811 // Cancel
2812 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>';
2813 }
2814
2815 // TODO Replace this. It should be SetUnpaid and should go back to status unpaid not canceled.
2816 if (($user->hasRight('expensereport', 'approve') || $user->hasRight('expensereport', 'to_paid')) && $object->status == ExpenseReport::STATUS_CLOSED) {
2817 // Cancel
2818 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>';
2819 }
2820
2821 if ($user->hasRight('expensereport', 'to_paid') && $object->paid && $object->status == ExpenseReport::STATUS_CLOSED) {
2822 // Set unpaid
2823 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>';
2824 }
2825
2826 // Clone
2827 if ($user->hasRight('expensereport', 'creer')) {
2828 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>';
2829 }
2830
2831 /* If draft, validated, cancel, and user can create, he can always delete its card before it is approved */
2832 if ($user->hasRight('expensereport', 'creer') && $user->id == $object->fk_user_author && $object->status < ExpenseReport::STATUS_APPROVED) {
2833 // Delete
2834 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>';
2835 } elseif ($candelete && $object->status != ExpenseReport::STATUS_CLOSED) {
2836 // Delete
2837 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>';
2838 }
2839
2840 $parameters = array();
2841 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
2842}
2843
2844print '</div>';
2845
2846
2847// Select mail models is same action as presend
2848if (GETPOST('modelselected', 'alpha')) {
2849 $action = 'presend';
2850}
2851
2852if ($action != 'presend') {
2853 /*
2854 * Generate documents
2855 */
2856
2857 print '<div class="fichecenter"><div class="fichehalfleft">';
2858 print '<a name="builddoc"></a>'; // ancre
2859
2860 if ($user->hasRight('expensereport', 'creer') && $action != 'create' && $action != 'edit') {
2861 $filename = dol_sanitizeFileName($object->ref);
2862 $filedir = $conf->expensereport->dir_output."/".dol_sanitizeFileName($object->ref);
2863 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
2864 $genallowed = $user->rights->expensereport->creer;
2865 $delallowed = $user->rights->expensereport->creer;
2866 $var = true;
2867 print $formfile->showdocuments('expensereport', $filename, $filedir, $urlsource, $genallowed, $delallowed);
2868 $somethingshown = $formfile->numoffiles;
2869 }
2870
2871 // Disabled for expensereport, there is no thirdparty on expensereport, so nothing to define the list of other object we can suggest to link to
2872 /*
2873 if ($action != 'create' && $action != 'edit' && ($id || $ref))
2874 {
2875 $linktoelem = $form->showLinkToObjectBlock($object, null, array('expensereport'));
2876 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2877 }
2878 */
2879
2880 print '</div><div class="fichehalfright">';
2881 // List of actions on element
2882 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
2883 $formactions = new FormActions($db);
2884 $somethingshown = $formactions->showactions($object, 'expensereport', null);
2885
2886 print '</div></div>';
2887}
2888
2889// Presend form
2890$modelmail = 'expensereport_send';
2891$defaulttopic = 'SendExpenseReportRef';
2892$diroutput = $conf->expensereport->dir_output;
2893$trackid = 'exp'.$object->id;
2894
2895include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
2896
2897
2898llxFooter();
2899
2900$db->close();
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.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage bank accounts.
Class to manage accounting accounts.
Class to manage accounting journals.
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
Class to manage a WYSIWYG editor.
Class to manage ECM files.
Class to manage Trips and Expenses.
const STATUS_DRAFT
Draft status.
const STATUS_APPROVED
Classified approved.
const STATUS_CANCELED
Classified canceled.
const STATUS_CLOSED
Classified paid.
const STATUS_REFUSED
Classified refused.
const STATUS_VALIDATED
Validated (need to be paid)
Class of expense report details lines.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to manage generation of HTML components for contract module.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
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.
Definition files.lib.php:62
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 a Dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
getImageFileNameForSize($file, $extName, $extImgTarget='')
Return the filename of file to get the thumbs.
getAdvancedPreviewUrl($modulepart, $relativepath, $alldata=0, $param='')
Return URL we can use for advanced preview links.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.