dolibarr 24.0.0-beta
expensereportline.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2011 Dimitri Mouillard <dmouillard@teclib.com>
3 * Copyright (C) 2015 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2015 Alexandre Spangaro <aspangaro@open-dsi.fr>
5 * Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com>
6 * Copyright (c) 2018-2024 Frédéric France <frederic.france@free.fr>
7 * Copyright (C) 2016-2020 Ferran Marcet <fmarcet@2byte.es>
8 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
9 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
10 * Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 3 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
31require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
32require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport_rule.class.php';
33
38{
42 public $db;
43
47 public $table_element = 'expensereport_det';
48
52 public $error = '';
53
57 public $rowid;
58
62 public $comments;
63
67 public $qty;
68
72 public $value_unit;
73
77 public $date;
78
82 public $dates;
83
87 public $fk_c_type_fees;
88
92 public $fk_c_exp_tax_cat;
93
97 public $fk_expensereport;
98
102 public $type_fees_code;
103
107 public $type_fees_libelle;
108
112 public $type_fees_accountancy_code;
113
117 public $projet_ref;
118
122 public $projet_title;
123
127 public $rang;
128
132 public $vatrate;
133
137 public $vat_src_code;
138
142 public $tva_tx;
143
147 public $localtax1_tx;
148
152 public $localtax2_tx;
153
157 public $localtax1_type;
158
162 public $localtax2_type;
163
167 public $total_ht;
168
172 public $total_tva;
173
177 public $total_ttc;
178
182 public $total_localtax1;
183
187 public $total_localtax2;
188
189 // Multicurrency
193 public $fk_multicurrency;
194
198 public $multicurrency_code;
199
203 public $multicurrency_tx;
204
208 public $multicurrency_total_ht;
209
213 public $multicurrency_total_tva;
214
218 public $multicurrency_total_ttc;
219
223 public $fk_ecm_files;
224
228 public $tcheck_file;
229
233 public $rule_warning_message;
234
235
241 public function __construct($db)
242 {
243 $this->db = $db;
244 }
245
252 public function fetch($rowid)
253 {
254 $sql = 'SELECT fde.rowid, fde.fk_expensereport, fde.fk_c_type_fees, fde.fk_c_exp_tax_cat, fde.fk_projet as fk_project, fde.date,';
255 $sql .= ' fde.tva_tx as vatrate, fde.vat_src_code, fde.comments, fde.qty, fde.value_unit, fde.total_ht, fde.total_tva, fde.total_ttc, fde.fk_ecm_files,';
256 $sql .= ' fde.localtax1_tx, fde.localtax2_tx, fde.localtax1_type, fde.localtax2_type, fde.total_localtax1, fde.total_localtax2, fde.rule_warning_message,';
257 $sql .= ' ctf.code as type_fees_code, ctf.label as type_fees_libelle, fde.tcheck_file,';
258 $sql .= ' pjt.rowid as projet_id, pjt.title as projet_title, pjt.ref as projet_ref';
259 $sql .= ' FROM '.MAIN_DB_PREFIX.'expensereport_det as fde';
260 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_type_fees as ctf ON fde.fk_c_type_fees=ctf.id'; // Sometimes type of expense report has been removed, so we use a left join here.
261 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'projet as pjt ON fde.fk_projet=pjt.rowid';
262 $sql .= ' WHERE fde.rowid = '.((int) $rowid);
263
264 $result = $this->db->query($sql);
265
266 if ($result) {
267 $objp = $this->db->fetch_object($result);
268
269 $this->rowid = $objp->rowid;
270 $this->id = $objp->rowid;
271 //$this->ref = $objp->ref; Undefined property
272 $this->fk_expensereport = $objp->fk_expensereport;
273 $this->comments = $objp->comments;
274 $this->qty = $objp->qty;
275 $this->date = $objp->date;
276 $this->dates = $this->db->jdate($objp->date);
277 $this->value_unit = $objp->value_unit;
278 $this->fk_c_type_fees = $objp->fk_c_type_fees;
279 $this->fk_c_exp_tax_cat = $objp->fk_c_exp_tax_cat;
280 $this->fk_projet = $objp->fk_project; // deprecated
281 $this->fk_project = $objp->fk_project;
282 $this->type_fees_code = $objp->type_fees_code;
283 $this->type_fees_libelle = $objp->type_fees_libelle;
284 $this->projet_ref = $objp->projet_ref;
285 $this->projet_title = $objp->projet_title;
286
287 $this->vatrate = $objp->vatrate;
288 $this->vat_src_code = $objp->vat_src_code;
289 $this->localtax1_tx = $objp->localtax1_tx;
290 $this->localtax2_tx = $objp->localtax2_tx;
291 $this->localtax1_type = $objp->localtax1_type;
292 $this->localtax2_type = $objp->localtax2_type;
293
294 $this->total_ht = $objp->total_ht;
295 $this->total_tva = $objp->total_tva;
296 $this->total_ttc = $objp->total_ttc;
297 $this->total_localtax1 = $objp->total_localtax1;
298 $this->total_localtax2 = $objp->total_localtax2;
299
300 $this->fk_ecm_files = $objp->fk_ecm_files;
301 $this->tcheck_file = $objp->tcheck_file;
302
303 $this->rule_warning_message = $objp->rule_warning_message;
304
305 $this->db->free($result);
306
307 return $this->id;
308 } else {
309 dol_print_error($this->db);
310 return -1;
311 }
312 }
313
321 public function insert($notrigger = 0, $fromaddline = false)
322 {
323 global $user;
324
325 $error = 0;
326
327 dol_syslog("ExpenseReportLine::Insert", LOG_DEBUG);
328
329 // Clean parameters
330 $this->comments = trim($this->comments);
331 if (empty($this->value_unit)) {
332 $this->value_unit = 0;
333 }
334 $this->qty = (float) price2num($this->qty);
335 $this->vatrate = price2num($this->vatrate);
336 if (empty($this->fk_c_exp_tax_cat)) {
337 $this->fk_c_exp_tax_cat = 0;
338 }
339
340 $this->db->begin();
341
342 $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'expensereport_det';
343 $sql .= ' (fk_expensereport, fk_c_type_fees, fk_projet,';
344 $sql .= ' tva_tx, vat_src_code,';
345 $sql .= ' localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
346 $sql .= ' comments, qty, value_unit,';
347 $sql .= ' total_ht, total_tva, total_ttc,';
348 $sql .= ' total_localtax1, total_localtax2,';
349 $sql .= ' date, rule_warning_message, fk_c_exp_tax_cat, fk_ecm_files)';
350 $sql .= " VALUES (".$this->db->escape((string) $this->fk_expensereport).",";
351 $sql .= " ".((int) $this->fk_c_type_fees).",";
352 $sql .= " ".((int) (!empty($this->fk_project) && $this->fk_project > 0) ? $this->fk_project : ((!empty($this->fk_projet) && $this->fk_projet > 0) ? $this->fk_projet : 'null')).",";
353 $sql .= " ".((float) $this->vatrate).",";
354 $sql .= " '".$this->db->escape(empty($this->vat_src_code) ? '' : $this->vat_src_code)."',";
355 $sql .= " ".((float) price2num($this->localtax1_tx)).",";
356 $sql .= " ".((float) price2num($this->localtax2_tx)).",";
357 $sql .= " '".$this->db->escape($this->localtax1_type)."',";
358 $sql .= " '".$this->db->escape($this->localtax2_type)."',";
359 $sql .= " '".$this->db->escape($this->comments)."',";
360 $sql .= " ".((float) $this->qty).",";
361 $sql .= " ".((float) $this->value_unit).",";
362 $sql .= " ".((float) price2num($this->total_ht)).",";
363 $sql .= " ".((float) price2num($this->total_tva)).",";
364 $sql .= " ".((float) price2num($this->total_ttc)).",";
365 $sql .= " ".((float) price2num($this->total_localtax1)).",";
366 $sql .= " ".((float) price2num($this->total_localtax2)).",";
367 $sql .= " '".$this->db->idate($this->date)."',";
368 $sql .= " ".(empty($this->rule_warning_message) ? 'null' : "'".$this->db->escape($this->rule_warning_message)."'").",";
369 $sql .= " ".((int) $this->fk_c_exp_tax_cat).",";
370 $sql .= " ".($this->fk_ecm_files > 0 ? ((int) $this->fk_ecm_files) : 'null');
371 $sql .= ")";
372
373 $resql = $this->db->query($sql);
374 if ($resql) {
375 $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.'expensereport_det');
376
377 if (!$notrigger) {
378 // Call triggers
379 $result = $this->call_trigger('EXPENSE_REPORT_DET_CREATE', $user);
380 if ($result < 0) {
381 $error++;
382 }
383 // End call triggers
384 }
385
386 if (!$fromaddline) {
387 $tmpparent = new ExpenseReport($this->db);
388 $tmpparent->fetch($this->fk_expensereport);
389 $result = $tmpparent->update_price(1);
390 if ($result < 0) {
391 $error++;
392 $this->error = $tmpparent->error;
393 $this->errors = $tmpparent->errors;
394 }
395 }
396 } else {
397 $error++;
398 }
399
400 if (!$error) {
401 $this->db->commit();
402 return $this->id;
403 } else {
404 $this->error = $this->db->lasterror();
405 dol_syslog("ExpenseReportLine::insert Error ".$this->error, LOG_ERR);
406 $this->db->rollback();
407 return -2;
408 }
409 }
410
419 public function getExpAmount(ExpenseReportRule $rule, $fk_user, $mode = 'day')
420 {
421 $amount = 0;
422
423 $sql = 'SELECT SUM(d.total_ttc) as total_amount';
424 $sql .= ' FROM '.MAIN_DB_PREFIX.'expensereport_det d';
425 $sql .= ' INNER JOIN '.MAIN_DB_PREFIX.'expensereport e ON (d.fk_expensereport = e.rowid)';
426 $sql .= ' WHERE e.fk_user_author = '.((int) $fk_user);
427 if (!empty($this->id)) {
428 $sql .= ' AND d.rowid <> '.((int) $this->id);
429 }
430 $sql .= ' AND d.fk_c_type_fees = '.((int) $rule->fk_c_type_fees);
431 if ($mode == 'day' || $mode == 'EX_DAY') {
432 $sql .= " AND d.date = '".dol_print_date($this->date, '%Y-%m-%d')."'";
433 } elseif ($mode == 'mon' || $mode == 'EX_MON') {
434 $sql .= " AND DATE_FORMAT(d.date, '%Y-%m') = '".dol_print_date($this->date, '%Y-%m')."'"; // @todo DATE_FORMAT is forbidden
435 } elseif ($mode == 'year' || $mode == 'EX_YEA') {
436 $sql .= " AND DATE_FORMAT(d.date, '%Y') = '".dol_print_date($this->date, '%Y')."'"; // @todo DATE_FORMAT is forbidden
437 }
438
439 dol_syslog('ExpenseReportLine::getExpAmount');
440
441 $resql = $this->db->query($sql);
442 if ($resql) {
443 $num = $this->db->num_rows($resql);
444 if ($num > 0) {
445 $obj = $this->db->fetch_object($resql);
446 $amount = (float) $obj->total_amount;
447 }
448 } else {
449 dol_print_error($this->db);
450 }
451
452 return $amount + $this->total_ttc;
453 }
454
462 public function update(User $user, $notrigger = 0)
463 {
464 $error = 0;
465
466 // Clean parameters
467 $this->comments = trim($this->comments);
468 $this->vatrate = price2num($this->vatrate);
469 $this->value_unit = price2num($this->value_unit);
470 if (empty($this->fk_c_exp_tax_cat)) {
471 $this->fk_c_exp_tax_cat = 0;
472 }
473
474 $this->db->begin();
475
476 // Update line in database
477 $sql = "UPDATE ".MAIN_DB_PREFIX."expensereport_det SET";
478 $sql .= " comments='".$this->db->escape($this->comments)."'";
479 $sql .= ", value_unit = ".((float) $this->value_unit);
480 $sql .= ", qty=".((float) $this->qty);
481 $sql .= ", date='".$this->db->idate($this->date)."'";
482 $sql .= ", total_ht=".((float) price2num($this->total_ht, 'MT'));
483 $sql .= ", total_tva=".((float) price2num($this->total_tva, 'MT'));
484 $sql .= ", total_ttc=".((float) price2num($this->total_ttc, 'MT'));
485 $sql .= ", total_localtax1=".((float) price2num($this->total_localtax1, 'MT'));
486 $sql .= ", total_localtax2=".((float) price2num($this->total_localtax2, 'MT'));
487 $sql .= ", tva_tx=".((float) $this->vatrate);
488 $sql .= ", vat_src_code='".$this->db->escape($this->vat_src_code)."'";
489 $sql .= ", localtax1_tx=".((float) $this->localtax1_tx);
490 $sql .= ", localtax2_tx=".((float) $this->localtax2_tx);
491 $sql .= ", localtax1_type='".$this->db->escape($this->localtax1_type)."'";
492 $sql .= ", localtax2_type='".$this->db->escape($this->localtax2_type)."'";
493 $sql .= ", rule_warning_message='".$this->db->escape($this->rule_warning_message)."'";
494 $sql .= ", fk_c_exp_tax_cat=".$this->db->escape((string) $this->fk_c_exp_tax_cat);
495 $sql .= ", fk_ecm_files=".($this->fk_ecm_files > 0 ? ((int) $this->fk_ecm_files) : 'null');
496 if ($this->fk_c_type_fees) {
497 $sql .= ", fk_c_type_fees = ".((int) $this->fk_c_type_fees);
498 } else {
499 $sql .= ", fk_c_type_fees=null";
500 }
501 if ($this->fk_project > 0) {
502 $sql .= ", fk_projet=".((int) $this->fk_project);
503 } else {
504 $sql .= ", fk_projet=null";
505 }
506 $sql .= " WHERE rowid = ".((int) ($this->rowid ? $this->rowid : $this->id));
507
508 dol_syslog("ExpenseReportLine::update");
509
510 $resql = $this->db->query($sql);
511 if ($resql) {
512 $tmpparent = new ExpenseReport($this->db);
513 $result = $tmpparent->fetch($this->fk_expensereport);
514 if ($result > 0) {
515 $result = $tmpparent->update_price(1);
516 if ($result < 0) {
517 $error++;
518 $this->error = $tmpparent->error;
519 $this->errors = $tmpparent->errors;
520 }
521 } else {
522 $error++;
523 $this->error = $tmpparent->error;
524 $this->errors = $tmpparent->errors;
525 }
526 } else {
527 $error++;
528 dol_print_error($this->db);
529 }
530
531 if (!$error && !$notrigger) {
532 // Call triggers
533 $result = $this->call_trigger('EXPENSE_REPORT_DET_MODIFY', $user);
534 if ($result < 0) {
535 $error++;
536 }
537 // End call triggers
538 }
539
540 if (!$error) {
541 $this->db->commit();
542 return 1;
543 } else {
544 $this->error = $this->db->lasterror();
545 dol_syslog("ExpenseReportLine::update Error ".$this->error, LOG_ERR);
546 $this->db->rollback();
547 return -2;
548 }
549 }
550}
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage Trips and Expenses.
Class of expense report details lines.
fetch($rowid)
Fetch record for expense report detailed line.
update(User $user, $notrigger=0)
Update line.
getExpAmount(ExpenseReportRule $rule, $fk_user, $mode='day')
Function to get total amount in expense reports for a same rule.
insert($notrigger=0, $fromaddline=false)
Insert a line of expense report.
Class to manage inventories.
Class to manage Dolibarr users.
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.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
print $langs trans('Date')." left Ref Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right Paid right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date
Definition receipt.php:487