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