dolibarr 19.0.3
fournisseur.facture-rec.class.php
1<?php
2/* Copyright (C) 2003-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2019 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2009-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2010-2011 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2012 Cedric Salvador <csalvador@gpcsolutions.fr>
7 * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
8 * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
9 * Copyright (C) 2017-2020 Frédéric France <frederic.france@netlogic.fr>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
31require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
32require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
33require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
35
36
41{
42 const TRIGGER_PREFIX = 'SUPPLIERBILLREC';
46 public $element = 'invoice_supplier_rec';
47
51 public $table_element = 'facture_fourn_rec';
52
56 public $table_element_line = 'facture_fourn_det_rec';
57
61 public $fk_element = 'fk_facture_fourn';
62
66 public $picto = 'bill';
67
71 protected $table_ref_field = 'titre';
72
77 public $titre;
81 public $title;
82
83 public $ref_supplier;
84 public $socid;
85
89 public $fk_soc;
90
91 public $suspended; // status
92
97 public $libelle;
101 public $label;
102
107 public $amount;
112 public $remise;
113
114 public $vat_src_code;
115 public $localtax1;
116 public $localtax2;
117
118 public $user_author;
119 public $user_modif;
120 public $fk_project;
121
122 public $mode_reglement_id;
123 public $mode_reglement_code;
124 public $cond_reglement_code;
125 public $cond_reglement_doc;
126 public $cond_reglement_id;
127
128 public $date_lim_reglement;
129
130 public $usenewprice = 0;
131 public $frequency;
132 public $unit_frequency;
133 public $date_when;
134 public $date_last_gen;
135 public $nb_gen_done;
136 public $nb_gen_max;
137 public $auto_validate; // 0 to create in draft, 1 to create and validate the new invoice
138 public $generate_pdf; // 1 to generate PDF on invoice generation (default)
139
140 public $model_pdf;
141
146 public $lines = array();
147
148
149 /* Override fields in CommonObject
150 public $entity;
151 public $date_creation;
152 public $date_modification;
153 public $total_ht;
154 public $total_tva;
155 public $total_ttc;
156 public $fk_account;
157 public $mode_reglement;
158 public $cond_reglement;
159 public $note_public;
160 public $note_private;
161 */
162
187 // BEGIN MODULEBUILDER PROPERTIES
191 public $fields = array(
192 'rowid' =>array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>10),
193 'titre' =>array('type'=>'varchar(100)', 'label'=>'Titre', 'enabled'=>1, 'showoncombobox' => 1, 'visible'=>-1, 'position'=>15),
194 'ref_supplier' =>array('type'=>'varchar(180)', 'label'=>'RefSupplier', 'enabled'=>1, 'showoncombobox' => 1, 'visible'=>-1, 'position'=>20),
195 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>25, 'index'=>1),
196 'fk_soc' =>array('type'=>'integer:Societe:societe/class/societe.class.php', 'label'=>'ThirdParty', 'enabled'=>'isModEnabled("societe")', 'visible'=>-1, 'notnull'=>1, 'position'=>30),
197 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>35),
198 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>40),
199 'suspended' =>array('type'=>'integer', 'label'=>'Suspended', 'enabled'=>1, 'visible'=>-1, 'position'=>225),
200 'libelle' =>array('type'=>'varchar(100)', 'label'=>'Libelle', 'enabled'=>1, 'showoncombobox' => 0, 'visible'=>-1, 'position'=>15),
201
202 'localtax1' =>array('type'=>'double(24,8)', 'label'=>'Localtax1', 'enabled'=>1, 'visible'=>-1, 'position'=>60, 'isameasure'=>1),
203 'localtax2' =>array('type'=>'double(24,8)', 'label'=>'Localtax2', 'enabled'=>1, 'visible'=>-1, 'position'=>65, 'isameasure'=>1),
204 'total_ht' =>array('type'=>'double(24,8)', 'label'=>'Total', 'enabled'=>1, 'visible'=>-1, 'position'=>70, 'isameasure'=>1),
205 'total_tva' =>array('type'=>'double(24,8)', 'label'=>'Tva', 'enabled'=>1, 'visible'=>-1, 'position'=>55, 'isameasure'=>1),
206 'total_ttc' =>array('type'=>'double(24,8)', 'label'=>'Total ttc', 'enabled'=>1, 'visible'=>-1, 'position'=>75, 'isameasure'=>1),
207
208 'fk_user_author' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'Fk user author', 'enabled'=>1, 'visible'=>-1, 'position'=>80),
209 'fk_user_modif' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'position'=>210),
210 'fk_projet' =>array('type'=>'integer:Project:projet/class/project.class.php:1:fk_statut=1', 'label'=>'Fk projet', 'enabled'=>"isModEnabled('project')", 'visible'=>-1, 'position'=>85),
211 'fk_account' =>array('type'=>'integer', 'label'=>'Fk account', 'enabled'=>'isModEnabled("banque")', 'visible'=>-1, 'position'=>175),
212 'fk_cond_reglement' =>array('type'=>'integer', 'label'=>'Fk cond reglement', 'enabled'=>1, 'visible'=>-1, 'position'=>90),
213 'fk_mode_reglement' =>array('type'=>'integer', 'label'=>'Fk mode reglement', 'enabled'=>1, 'visible'=>-1, 'position'=>95),
214 'date_lim_reglement' =>array('type'=>'date', 'label'=>'Date lim reglement', 'enabled'=>1, 'visible'=>-1, 'position'=>100),
215
216 'note_private' =>array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>105),
217 'note_public' =>array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>110),
218 'modelpdf' =>array('type'=>'varchar(255)', 'label'=>'Modelpdf', 'enabled'=>1, 'visible'=>-1, 'position'=>115),
219
220 'fk_multicurrency' =>array('type'=>'integer', 'label'=>'Fk multicurrency', 'enabled'=>1, 'visible'=>-1, 'position'=>180),
221 'multicurrency_code' =>array('type'=>'varchar(255)', 'label'=>'Multicurrency code', 'enabled'=>1, 'visible'=>-1, 'position'=>185),
222 'multicurrency_tx' =>array('type'=>'double(24,8)', 'label'=>'Multicurrency tx', 'enabled'=>1, 'visible'=>-1, 'position'=>190, 'isameasure'=>1),
223 'multicurrency_total_ht' =>array('type'=>'double(24,8)', 'label'=>'Multicurrency total ht', 'enabled'=>1, 'visible'=>-1, 'position'=>195, 'isameasure'=>1),
224 'multicurrency_total_tva' =>array('type'=>'double(24,8)', 'label'=>'Multicurrency total tva', 'enabled'=>1, 'visible'=>-1, 'position'=>200, 'isameasure'=>1),
225 'multicurrency_total_ttc' =>array('type'=>'double(24,8)', 'label'=>'Multicurrency total ttc', 'enabled'=>1, 'visible'=>-1, 'position'=>205, 'isameasure'=>1),
226
227 'usenewprice' =>array('type'=>'integer', 'label'=>'UseNewPrice', 'enabled'=>1, 'visible'=>0, 'position'=>155),
228 'frequency' =>array('type'=>'integer', 'label'=>'Frequency', 'enabled'=>1, 'visible'=>-1, 'position'=>150),
229 'unit_frequency' =>array('type'=>'varchar(2)', 'label'=>'Unit frequency', 'enabled'=>1, 'visible'=>-1, 'position'=>125),
230
231 'date_when' =>array('type'=>'datetime', 'label'=>'Date when', 'enabled'=>1, 'visible'=>-1, 'position'=>130),
232 'date_last_gen' =>array('type'=>'datetime', 'label'=>'Date last gen', 'enabled'=>1, 'visible'=>-1, 'position'=>135),
233 'nb_gen_done' =>array('type'=>'integer', 'label'=>'Nb gen done', 'enabled'=>1, 'visible'=>-1, 'position'=>140),
234 'nb_gen_max' =>array('type'=>'integer', 'label'=>'Nb gen max', 'enabled'=>1, 'visible'=>-1, 'position'=>145),
235 'revenuestamp' =>array('type'=>'double(24,8)', 'label'=>'RevenueStamp', 'enabled'=>1, 'visible'=>-1, 'position'=>160, 'isameasure'=>1),
236 'auto_validate' =>array('type'=>'integer', 'label'=>'Auto validate', 'enabled'=>1, 'visible'=>-1, 'position'=>165),
237 'generate_pdf' =>array('type'=>'integer', 'label'=>'Generate pdf', 'enabled'=>1, 'visible'=>-1, 'position'=>170),
238
239 );
240 // END MODULEBUILDER PROPERTIES
241
242 const STATUS_NOTSUSPENDED = 0;
243 const STATUS_SUSPENDED = 1;
244
245
246
252 public function __construct($db)
253 {
254 $this->db = $db;
255 }
256
265 public function create($user, $facFournId, $notrigger = 0)
266 {
267 global $conf;
268
269 $error = 0;
270 $now = dol_now();
271
272 // Clean parameters
273 $this->titre = empty($this->titre) ? '' : $this->titre; // deprecated
274 $this->title = empty($this->title) ? '' : $this->title;
275 $keyforref = $this->table_ref_field;
276 $this->ref = $this->$keyforref;
277 $this->ref_supplier = empty($this->ref_supplier) ? '' : $this->ref_supplier;
278 $this->usenewprice = empty($this->usenewprice) ? 0 : $this->usenewprice;
279 $this->suspended = empty($this->suspended) ? 0 : $this->suspended;
280 // No frequency defined then no next date to execution
281 if (empty($this->frequency)) {
282 $this->frequency = 0;
283 $this->date_when = null;
284 }
285 $this->frequency = abs($this->frequency);
286 $this->nb_gen_done = 0;
287 $this->nb_gen_max = empty($this->nb_gen_max) ? 0 : $this->nb_gen_max;
288 $this->auto_validate = empty($this->auto_validate) ? 0 : $this->auto_validate;
289 $this->generate_pdf = empty($this->generate_pdf) ? 0 : $this->generate_pdf;
290
291 $this->db->begin();
292
293 // On charge la facture fournisseur depuis laquelle on crée la facture fournisseur modèle
294 $facfourn_src = new FactureFournisseur($this->db);
295 $result = $facfourn_src->fetch($facFournId);
296 if ($result > 0) {
297 $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn_rec (';
298 $sql .= 'titre';
299 $sql .= ', ref_supplier';
300 $sql .= ', entity';
301 $sql .= ', fk_soc';
302 $sql .= ', datec';
303 $sql .= ', suspended';
304 $sql .= ', libelle';
305 $sql .= ', total_ttc';
306 $sql .= ', fk_user_author';
307 $sql .= ', fk_projet';
308 $sql .= ', fk_account';
309 $sql .= ', fk_cond_reglement';
310 $sql .= ', fk_mode_reglement';
311 $sql .= ', date_lim_reglement';
312 $sql .= ', note_private';
313 $sql .= ', note_public';
314 $sql .= ', modelpdf';
315 $sql .= ', fk_multicurrency';
316 $sql .= ', multicurrency_code';
317 $sql .= ', multicurrency_tx';
318 $sql .= ', usenewprice';
319 $sql .= ', frequency';
320 $sql .= ', unit_frequency';
321 $sql .= ', date_when';
322 $sql .= ', date_last_gen';
323 $sql .= ', nb_gen_done';
324 $sql .= ', nb_gen_max';
325 $sql .= ', auto_validate';
326 $sql .= ', generate_pdf';
327 $sql .= ') VALUES (';
328 $sql .= "'".$this->db->escape($this->title)."'";
329 $sql .= ", '".$this->db->escape($this->ref_supplier)."'";
330 $sql .= ", ".((int) $conf->entity);
331 $sql .= ", ".((int) $facfourn_src->socid);
332 $sql .= ", '".$this->db->idate($now)."'";
333 $sql .= ", ".((int) $this->suspended);
334 $sql .= ", '".$this->db->escape($this->libelle)."'";
335 $sql .= ", " .(!empty($facfourn_src->total_ttc) ? (float) $facfourn_src->total_ttc : '0'); // amount
336 $sql .= ", " .((int) $user->id);
337 $sql .= ", " .(!empty($this->fk_project) ? ((int) $this->fk_project) : 'NULL');
338 $sql .= ", " .(!empty($facfourn_src->fk_account) ? ((int) $facfourn_src->fk_account) : 'NULL');
339 $sql .= ", " .($this->cond_reglement_id > 0 ? (int) $this->cond_reglement_id : 'NULL');
340 $sql .= ", " .($this->mode_reglement_id > 0 ? (int) $this->mode_reglement_id : 'NULL');
341 $sql .= ", ".($facfourn_src->date_echeance > 0 ? "'".$this->db->idate($facfourn_src->date_echeance)."'" : 'NULL'); // date_lim_reglement
342 $sql .= ", " .(!empty($this->note_private) ? "'".$this->db->escape($this->note_private)."'" : 'NULL');
343 $sql .= ", " .(!empty($this->note_public) ? "'".$this->db->escape($this->note_public)."'" : 'NULL');
344 $sql .= ", " .(!empty($this->model_pdf) ? "'".$this->db->escape($this->model_pdf)."'" : 'NULL');
345 $sql .= ", " . (int) $facfourn_src->fk_multicurrency;
346 $sql .= ", '".$this->db->escape($facfourn_src->multicurrency_code)."'";
347 $sql .= ", " . (float) $facfourn_src->multicurrency_tx;
348 $sql .= ", " . (int) $this->usenewprice;
349 $sql .= ", " . (int) $this->frequency;
350 $sql .= ", '".$this->db->escape($this->unit_frequency)."'";
351 $sql .= ", " .(!empty($this->date_when) ? "'".$this->db->idate($this->date_when)."'" : 'NULL');
352 $sql .= ", " .(!empty($this->date_last_gen) ? "'".$this->db->idate($this->date_last_gen)."'" : 'NULL');
353 $sql .= ", " . (int) $this->nb_gen_done;
354 $sql .= ", " . (int) $this->nb_gen_max;
355 $sql .= ", " . (int) $this->auto_validate;
356 $sql .= ", " . (int) $this->generate_pdf;
357 $sql .= ')';
358
359 if ($this->db->query($sql)) {
360 $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX. 'facture_fourn_rec');
361
362 // Fields used into addline later
363 $this->fk_multicurrency = $facfourn_src->fk_multicurrency;
364
365 $this->multicurrency_code = $facfourn_src->multicurrency_code;
366 $this->multicurrency_tx = $facfourn_src->multicurrency_tx;
367
368 // Add lines
369 $num = count($facfourn_src->lines);
370 for ($i = 0; $i < $num; $i++) {
371 $tva_tx = $facfourn_src->lines[$i]->tva_tx;
372 if (!empty($facfourn_src->lines[$i]->vat_src_code) && !preg_match('/\‍(/', $tva_tx)) {
373 $tva_tx .= ' ('.$facfourn_src->lines[$i]->vat_src_code.')';
374 }
375
376 $result_insert = $this->addline(
377 $facfourn_src->lines[$i]->fk_product,
378 $facfourn_src->lines[$i]->ref_supplier,
379 $facfourn_src->lines[$i]->label,
380 $facfourn_src->lines[$i]->description,
381 $facfourn_src->lines[$i]->pu_ht,
382 $facfourn_src->lines[$i]->pu_ttc,
383 $facfourn_src->lines[$i]->qty,
384 $facfourn_src->lines[$i]->remise_percent,
385 $tva_tx,
386 $facfourn_src->lines[$i]->localtax1_tx,
387 $facfourn_src->lines[$i]->localtax2_tx,
388 'HT',
389 $facfourn_src->lines[$i]->product_type,
390 $facfourn_src->lines[$i]->date_start,
391 $facfourn_src->lines[$i]->date_end,
392 $facfourn_src->lines[$i]->info_bits,
393 $facfourn_src->lines[$i]->special_code,
394 $facfourn_src->lines[$i]->rang,
395 $facfourn_src->lines[$i]->fk_unit
396 );
397
398 if ($result_insert < 0) {
399 $error++;
400 } else {
401 $objectline = new FactureFournisseurLigneRec($this->db);
402
403 $result2 = $objectline->fetch($result_insert);
404 if ($result2 > 0) {
405 // Extrafields
406 if (method_exists($facfourn_src->lines[$i], 'fetch_optionals')) {
407 $facfourn_src->lines[$i]->fetch_optionals($facfourn_src->lines[$i]->id);
408 $objectline->array_options = $facfourn_src->lines[$i]->array_options;
409 }
410
411 $result = $objectline->insertExtraFields();
412 if ($result < 0) {
413 $error++;
414 }
415 } elseif ($result2 < 0) {
416 $this->errors[] = $objectline->error;
417 $error++;
418 }
419 }
420 }
421
422 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) { // To use new linkedObjectsIds instead of old linked_objects
423 $this->linked_objects = $this->linkedObjectsIds; // TODO Replace linked_objects with linkedObjectsIds
424 }
425
426 // Add object linked
427 if (!$error && $this->id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
428 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
429 if (is_array($tmp_origin_id)) { // New behaviour, if linked_object can have several links per type, so is something like array('contract'=>array(id1, id2, ...))
430 foreach ($tmp_origin_id as $origin_id) {
431 $ret = $this->add_object_linked($origin, $origin_id);
432 if (!$ret) {
433 $this->error = $this->db->lasterror();
434 $error++;
435 }
436 }
437 } else { // Old behaviour, if linked_object has only one link per type, so is something like array('contract'=>id1))
438 $origin_id = $tmp_origin_id;
439 $ret = $this->add_object_linked($origin, $origin_id);
440 if (!$ret) {
441 $this->error = $this->db->lasterror();
442 $error++;
443 }
444 }
445 }
446 }
447
448 if (!$error) {
449 $result = $this->insertExtraFields();
450 if ($result < 0) {
451 $error++;
452 }
453 }
454
455 if (!$error && !$notrigger) {
456 // Call trigger
457 $result = $this->call_trigger('SUPPLIERBILLREC_CREATE', $user);
458 if ($result < 0) {
459 $this->db->rollback();
460 return -2;
461 }
462 // End call triggers
463 }
464
465 if ($error) {
466 $this->db->rollback();
467 return -3;
468 } else {
469 $this->db->commit();
470 return $this->id;
471 }
472 } else {
473 $this->error = $this->db->lasterror();
474 $this->db->rollback();
475 return -2;
476 }
477 } else {
478 $this->db->rollback();
479 return -1;
480 }
481 }
482
483
491 public function update(User $user, $notrigger = 0)
492 {
493 $error = 0;
494
495 $sql = "UPDATE ".MAIN_DB_PREFIX."facture_fourn_rec SET";
496 $sql .= " titre = '" . (!empty($this->title) ? $this->db->escape($this->title) : "")."'," ;
497 $sql .= " ref_supplier = '". (!empty($this->ref_supplier) ? $this->db->escape($this->ref_supplier) : "")."',";
498 $sql .= " entity = ". (!empty($this->entity) ? ((int) $this->entity) : 1) . ',';
499 if (!empty($this->socid) && $this->socid > 0) {
500 $sql .= " fk_soc = ". ((int) $this->socid). ',';
501 } elseif (!empty($this->fk_soc) && $this->fk_soc > 0) { // For backward compatibility
502 $sql .= " fk_soc = ". ((int) $this->fk_soc). ',';
503 }
504 $sql .= " suspended = ". (!empty($this->suspended) ? ((int) $this->suspended) : 0) . ',';
505 $sql .= " libelle = ". (!empty($this->libelle) ? "'".$this->db->escape($this->libelle)."'" : 'NULL') . ",";
506 $sql .= " vat_src_code = ". (!empty($this->vat_src_code) ? "'".$this->db->escape($this->vat_src_code)."'" : 'NULL') . ',';
507 $sql .= " localtax1 = ". (!empty($this->localtax1) ? ((float) $this->localtax1) : 0.00) . ',';
508 $sql .= " localtax2 = ". (!empty($this->localtax2) ? ((float) $this->localtax2) : 0.00) . ',';
509 $sql .= " total_ht = ". (!empty($this->total_ht) ? ((float) $this->total_ht) : 0.00) . ',';
510 $sql .= " total_tva = ". (!empty($this->total_tva) ? ((float) $this->total_tva) : 0.00) . ',';
511 $sql .= " total_ttc = ". (!empty($this->total_ttc) ? ((float) $this->total_ttc) : 0.00) . ',';
512 $sql .= " fk_user_modif = ". ((int) $user->id) . ',';
513 $sql .= " fk_projet = ". (!empty($this->fk_project) ? ((int) $this->fk_project) : 'NULL') . ',';
514 $sql .= " fk_account = ". (!empty($this->fk_account) ? ((int) $this->fk_account) : 'NULL') . ',';
515 $sql .= " fk_mode_reglement = ". (!empty($this->mode_reglement_id) ? ((int) $this->mode_reglement_id) : 'NULL') . ',';
516 $sql .= " fk_cond_reglement = ". (!empty($this->cond_reglement_id) ? ((int) $this->cond_reglement_id) : 'NULL') . ',';
517 $sql .= " date_lim_reglement = ". (!empty($this->date_lim_reglement) ? "'".$this->db->idate($this->date_lim_reglement)."'" : 'NULL') . ',';
518 $sql .= " note_private = '". (!empty($this->note_private) ? $this->db->escape($this->note_private) : '') . "',";
519 $sql .= " note_public = '". (!empty($this->note_public) ? $this->db->escape($this->note_public) : '') . "',";
520 $sql .= " modelpdf = ". (!empty($this->model_pdf) ? "'".$this->db->escape($this->model_pdf)."'" : 'NULL') . ",";
521 $sql .= " fk_multicurrency = ". (!empty($this->fk_multicurrency) ? ((int) $this->fk_multicurrency) : 'NULL') . ',';
522 $sql .= " multicurrency_code = ". (!empty($this->multicurrency_code) ? "'".$this->db->escape($this->multicurrency_code)."'" : 'NULL') . ",";
523 $sql .= " multicurrency_tx = ". (!empty($this->multicurrency_tx) ? ((float) $this->multicurrency_tx) : 1) . ',';
524 $sql .= " multicurrency_total_ht = ". (!empty($this->multicurrency_total_ht) ? ((float) $this->multicurrency_total_ht) : 0.00) . ',';
525 $sql .= " multicurrency_total_tva = ". (!empty($this->multicurrency_total_tva) ? ((float) $this->multicurrency_total_tva) : 0.00) . ',';
526 $sql .= " multicurrency_total_ttc = ". (!empty($this->multicurrency_total_ttc) ? ((float) $this->multicurrency_total_ttc) : 0.00) . ',';
527 $sql .= " usenewprice = ". (!empty($this->usenewprice) ? ((int) $this->usenewprice) : 0) . ',';
528 $sql .= " frequency = ". (!empty($this->frequency) ? ((int) $this->frequency) : 0). ',';
529 $sql .= " unit_frequency = '". (!empty($this->unit_frequency) ? $this->db->escape($this->unit_frequency) : ''). "',";
530 $sql .= " date_when = ". (!empty($this->date_when) ? "'".$this->db->idate($this->date_when)."'" : 'NULL') . ',';
531 $sql .= " date_last_gen = ". (!empty($this->date_last_gen) ? "'".$this->db->idate($this->date_last_gen)."'" : 'NULL') . ',';
532 $sql .= " nb_gen_done = ". (!empty($this->nb_gen_done) ? ((int) $this->nb_gen_done) : 0) . ',';
533 $sql .= " nb_gen_max = ". (!empty($this->nb_gen_max) ? ((int) $this->nb_gen_max) : 0) . ',';
534 $sql .= " auto_validate = ". (!empty($this->auto_validate) ? ((int) $this->auto_validate) : 0);
535 $sql .= " WHERE rowid = ". (int) $this->id;
536
537 $this->db->begin();
538
539 dol_syslog(get_class($this)."::update", LOG_DEBUG);
540 $resql = $this->db->query($sql);
541 if ($resql) {
542 if (!$error) {
543 $result = $this->insertExtraFields();
544 if ($result < 0) {
545 $error++;
546 }
547 }
548
549 if (!$error && !$notrigger) {
550 // Call trigger
551 $result = $this->call_trigger('SUPPLIERBILLREC_MODIFY', $user);
552 if ($result < 0) {
553 $this->db->rollback();
554 return -2;
555 }
556 // End call triggers
557 }
558 $this->db->commit();
559 return 1;
560 } else {
561 $this->error = $this->db->lasterror();
562 $this->db->rollback();
563 return -2;
564 }
565 }
566
575 public function fetch($rowid, $ref = '', $ref_ext = '')
576 {
577 $sql = 'SELECT f.rowid, f.titre as title, f.ref_supplier, f.entity, f.fk_soc';
578 $sql .= ', f.datec, f.tms, f.suspended';
579 $sql .= ', f.libelle as label';
580 $sql .= ', f.vat_src_code, f.localtax1, f.localtax2';
581 $sql .= ', f.total_tva, f.total_ht, f.total_ttc';
582 $sql .= ', f.fk_user_author, f.fk_user_modif';
583 $sql .= ', f.fk_projet as fk_project, f.fk_account';
584 $sql .= ', f.fk_mode_reglement, p.code as mode_reglement_code, p.libelle as mode_reglement_libelle';
585 $sql .= ', f.fk_cond_reglement, c.code as cond_reglement_code, c.libelle as cond_reglement_libelle, c.libelle_facture as cond_reglement_libelle_doc';
586 $sql .= ', f.date_lim_reglement';
587 $sql .= ', f.note_private, f.note_public, f.modelpdf as model_pdf';
588 $sql .= ', f.fk_multicurrency, f.multicurrency_code, f.multicurrency_tx, f.multicurrency_total_ht, f.multicurrency_total_tva, f.multicurrency_total_ttc';
589 $sql .= ', f.usenewprice, f.frequency, f.unit_frequency, f.date_when, f.date_last_gen, f.nb_gen_done, f.nb_gen_max, f.auto_validate';
590 $sql .= ', f.generate_pdf';
591 $sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn_rec as f';
592 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_payment_term as c ON f.fk_cond_reglement = c.rowid';
593 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as p ON f.fk_mode_reglement = p.id';
594 $sql .= ' WHERE f.entity IN ('.getEntity('invoice').')';
595 if ($rowid) {
596 $sql .= ' AND f.rowid='. (int) $rowid;
597 } elseif ($ref) {
598 $sql .= " AND f.titre='".$this->db->escape($ref)."'";
599 } else {
600 $sql .= ' AND f.rowid = 0';
601 }
602
603 $result = $this->db->query($sql);
604 if ($result) {
605 if ($this->db->num_rows($result)) {
606 $obj = $this->db->fetch_object($result);
607
608 $keyforref = $this->table_ref_field;
609
610 $this->id = $obj->rowid;
611 $this->titre = $obj->title;
612 $this->title = $obj->title;
613 $this->ref = $obj->title;
614 $this->ref_supplier = $obj->ref_supplier;
615 $this->entity = $obj->entity;
616 $this->socid = $obj->fk_soc;
617 $this->date_creation = $obj->datec;
618 $this->date_modification = $obj->tms;
619 $this->suspended = $obj->suspended;
620 $this->libelle = $obj->label;
621 $this->label = $obj->label;
622 $this->vat_src_code = $obj->vat_src_code;
623 $this->total_localtax1 = $obj->localtax1;
624 $this->total_localtax2 = $obj->localtax2;
625 $this->total_ht = $obj->total_ht;
626 $this->total_tva = $obj->total_tva;
627 $this->total_ttc = $obj->total_ttc;
628 $this->user_author = $obj->fk_user_author;
629 $this->user_modif = $obj->fk_user_modif;
630 $this->fk_project = $obj->fk_project;
631 $this->fk_account = $obj->fk_account;
632 $this->mode_reglement_id = $obj->fk_mode_reglement;
633 $this->mode_reglement_code = $obj->mode_reglement_code;
634 $this->mode_reglement = $obj->mode_reglement_libelle;
635 $this->cond_reglement_id = $obj->fk_cond_reglement;
636 $this->cond_reglement_code = $obj->cond_reglement_code;
637 $this->cond_reglement = $obj->cond_reglement_libelle;
638 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
639 $this->date_lim_reglement = $this->db->jdate($obj->date_lim_reglement);
640 $this->note_private = $obj->note_private;
641 $this->note_public = $obj->note_public;
642 $this->model_pdf = $obj->model_pdf;
643
644 // Multicurrency
645 $this->fk_multicurrency = $obj->fk_multicurrency;
646 $this->multicurrency_code = $obj->multicurrency_code;
647 $this->multicurrency_tx = $obj->multicurrency_tx;
648 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
649 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
650 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
651
652 $this->usenewprice = $obj->usenewprice;
653 $this->frequency = $obj->frequency;
654 $this->unit_frequency = $obj->unit_frequency;
655 $this->date_when = $this->db->jdate($obj->date_when);
656 $this->date_last_gen = $this->db->jdate($obj->date_last_gen);
657 $this->nb_gen_done = $obj->nb_gen_done;
658 $this->nb_gen_max = $obj->nb_gen_max;
659 $this->auto_validate = $obj->auto_validate;
660 $this->generate_pdf = $obj->generate_pdf;
661
662 // Retrieve all extrafield
663 // fetch optionals attributes and labels
664 $this->fetch_optionals();
665
666 /*
667 * Lines
668 */
669 $result = $this->fetch_lines();
670 if ($result < 0) {
671 $this->error = $this->db->lasterror();
672 return -3;
673 }
674 return 1;
675 } else {
676 $this->error = 'Bill with id '.$rowid.' or ref '.$ref.' not found';
677 dol_syslog('Facture::Fetch Error '.$this->error, LOG_ERR);
678 return -2;
679 }
680 } else {
681 $this->error = $this->db->error();
682 return -1;
683 }
684 }
685
686
692 public function getLinesArray()
693 {
694 return $this->fetch_lines();
695 }
696
697 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
703 public function fetch_lines()
704 {
705 // phpcs:enable
706 $this->lines = array();
707
708 // Retrieve all extrafield for line
709 // fetch optionals attributes and labels
710 /*if (!is_object($extrafields)) {
711 require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
712 $extrafields = new ExtraFields($this->db);
713 }
714 $extrafields->fetch_name_optionals_label($this->table_element_line, true);
715 */
716
717 $sql = 'SELECT l.rowid,';
718 $sql .= ' l.fk_facture_fourn, l.fk_parent_line, l.fk_product, l.ref, l.label, l.description,';
719 $sql .= ' l.pu_ht, l.pu_ttc, l.qty, l.remise_percent, l.fk_remise_except, l.vat_src_code, l.tva_tx,';
720 $sql .= ' l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type,';
721 $sql .= ' l.total_ht, l.total_tva, l.total_ttc, total_localtax1, total_localtax2,';
722 $sql .= ' l.product_type, l.date_start, l.date_end,';
723 $sql .= ' l.info_bits, l.special_code, l.rang,';
724 $sql .= ' l.fk_unit, l.import_key, l.fk_user_author, l.fk_user_modif,';
725 $sql .= ' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
726 $sql .= ' p.ref as product_ref, p.fk_product_type as fk_product_type, p.label as product_label, p.description as product_desc';
727 $sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn_det_rec as l';
728 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON l.fk_product = p.rowid';
729 $sql .= ' WHERE l.fk_facture_fourn = '. (int) $this->id;
730 $sql .= ' ORDER BY l.rang';
731
732 dol_syslog('FactureFournisseurRec::fetch_lines', LOG_DEBUG);
733
734 $result = $this->db->query($sql);
735 if ($result) {
736 $num = $this->db->num_rows($result);
737 $i = 0;
738 while ($i < $num) {
739 $objp = $this->db->fetch_object($result);
740
741 $line = new FactureFournisseurLigneRec($this->db);
742
743 $line->id = $objp->rowid;
744 $line->fk_facture_fourn = $objp->fk_facture_fourn;
745 $line->fk_parent = $objp->fk_parent_line;
746 $line->fk_product = $objp->fk_product;
747 $line->ref_supplier = $objp->ref;
748 $line->label = $objp->label;
749 $line->description = $objp->description;
750 $line->pu_ht = $objp->pu_ht;
751 $line->pu_ttc = $objp->pu_ttc;
752 $line->qty = $objp->qty;
753 $line->remise_percent = $objp->remise_percent;
754 $line->fk_remise_except = $objp->fk_remise_except;
755 $line->vat_src_code = $objp->vat_src_code;
756 $line->tva_tx = $objp->tva_tx;
757 $line->localtax1_tx = $objp->localtax1_tx;
758 $line->localtax1_type = $objp->localtax1_type;
759 $line->localtax2_tx = $objp->localtax2_tx;
760 $line->localtax2_type = $objp->localtax2_type;
761 $line->total_ht = $objp->total_ht;
762 $line->total_tva = $objp->total_tva;
763 $line->total_localtax1 = $objp->total_localtax1;
764 $line->total_localtax2 = $objp->total_localtax2;
765 $line->total_ttc = $objp->total_ttc;
766 $line->product_type = $objp->product_type;
767 $line->date_start = $objp->date_start;
768 $line->date_end = $objp->date_end;
769 $line->info_bits = $objp->info_bits ;
770 $line->special_code = $objp->special_code;
771 $line->rang = $objp->rang;
772 $line->fk_unit = $objp->fk_unit;
773 $line->import_key = $objp->import_key;
774 $line->fk_user_author = $objp->fk_user_author;
775 $line->fk_user_modif = $objp->fk_user_modif;
776 $line->fk_multicurrency = $objp->fk_multicurrency;
777 $line->multicurrency_code = $objp->multicurrency_code;
778 $line->multicurrency_subprice = $objp->multicurrency_subprice;
779 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
780 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
781 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
782
783 $line->fetch_optionals();
784
785 $this->lines[$i] = $line;
786
787 $i++;
788 }
789
790 $this->db->free($result);
791 return 1;
792 } else {
793 $this->error = $this->db->lasterror();
794 return -3;
795 }
796 }
797
798
807 public function delete(User $user, $notrigger = 0, $idwarehouse = -1)
808 {
809 $rowid = $this->id;
810
811 dol_syslog(get_class($this)."::delete rowid=".((int) $rowid), LOG_DEBUG);
812
813 $error = 0;
814 $this->db->begin();
815
816 $main = MAIN_DB_PREFIX.'facture_fourn_det_rec';
817 $ef = $main."_extrafields";
818
819 $sqlef = "DELETE FROM ".$ef." WHERE fk_object IN (SELECT rowid FROM ".$main." WHERE fk_facture_fourn = ". (int) $rowid .")";
820 $sql = "DELETE FROM ".MAIN_DB_PREFIX."facture_fourn_det_rec WHERE fk_facture_fourn = ". (int) $rowid;
821
822 if ($this->db->query($sqlef) && $this->db->query($sql)) {
823 $sql = "DELETE FROM ".MAIN_DB_PREFIX."facture_fourn_rec WHERE rowid = ". (int) $rowid;
824 dol_syslog($sql);
825 if ($this->db->query($sql)) {
826 // Delete linked object
827 $res = $this->deleteObjectLinked();
828 if ($res < 0) {
829 $error = -3;
830 }
831 // Delete extrafields
832 $res = $this->deleteExtraFields();
833 if ($res < 0) {
834 $error = -4;
835 }
836 } else {
837 $this->error = $this->db->lasterror();
838 $error = -1;
839 }
840 } else {
841 $this->error = $this->db->lasterror();
842 $error = -2;
843 }
844 if (!$error && !$notrigger) {
845 // Call trigger
846 $result = $this->call_trigger('SUPPLIERBILLREC_DELETE', $user);
847 if ($result < 0) {
848 $error++;
849 }
850 // End call triggers
851 }
852 if (! $error) {
853 $this->db->commit();
854 return 1;
855 } else {
856 $this->db->rollback();
857 return $error;
858 }
859 }
860
887 public function addline($fk_product, $ref, $label, $desc, $pu_ht, $pu_ttc, $qty, $remise_percent, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $price_base_type = 'HT', $type = 0, $date_start = 0, $date_end = 0, $info_bits = 0, $special_code = 0, $rang = -1, $fk_unit = null, $pu_ht_devise = 0)
888 {
889 global $mysoc, $user;
890
891 include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
892
893 $facid = $this->id; //Supplier invoice template ID linked to
894
895 dol_syslog(get_class($this)."::addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,txlocaltax1=$txlocaltax1,txlocaltax2=$txlocaltax2,fk_product=$fk_product,remise_percent=$remise_percent,info_bits=$info_bits,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type,fk_unit=$fk_unit,pu_ht_devise=$pu_ht_devise,date_start_fill=$date_start,date_end_fill=$date_end", LOG_DEBUG);
896
897 // Check if object of the line is product or service
898 if ($type < 0) {
899 return -1;
900 }
901
902 if ($this->suspended == self::STATUS_NOTSUSPENDED) {
903 $localtaxes_type = getLocalTaxesFromRate($txtva, 0, $this->thirdparty, $mysoc);
904
905 // Clean vat code
906 $reg = array();
907 $vat_src_code = '';
908 if (preg_match('/\‍((.*)\‍)/', $txtva, $reg)) {
909 $vat_src_code = $reg[1];
910 $txtva = preg_replace('/\s*\‍(.*\‍)/', '', $txtva); // Remove code into vatrate.
911 }
912
913 // Clean parameters
914 $fk_product = empty($fk_product) ? 0 : $fk_product;
915 $label = empty($label) ? '' : $label;
916 $remise_percent = empty($remise_percent) ? 0 : price2num($remise_percent);
917 $qty = price2num($qty);
918 $pu_ht = price2num($pu_ht);
919 $pu_ttc = price2num($pu_ttc);
920 if (!preg_match('/\‍((.*)\‍)/', $txtva)) {
921 $txtva = price2num($txtva); // $txtva can have format '5.0(XXX)' or '5'
922 }
923 $txlocaltax1 = price2num($txlocaltax1);
924 $txlocaltax2 = price2num($txlocaltax2);
925 $txtva = !empty($txtva) ? $txtva : 0;
926 $txlocaltax1 = !empty($txlocaltax1) ? $txlocaltax1 : 0;
927 $txlocaltax2 = !empty($txlocaltax2) ? $txlocaltax2 : 0;
928 $info_bits = !empty($info_bits) ? $info_bits : 0;
929 $info_bits = !empty($info_bits) ? $info_bits : 0;
930 $pu = $price_base_type == 'HT' ? $pu_ht : $pu_ttc;
931
932 // Calcul du total TTC et de la TVA pour la ligne a partir de qty, pu, remise_percent et txtva
933 // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
934 // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
935
936 $tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
937 $total_ht = $tabprice[0];
938 $total_tva = $tabprice[1];
939 $total_ttc = $tabprice[2];
940 $total_localtax1 = $tabprice[9];
941 $total_localtax2 = $tabprice[10];
942 $pu_ht = $tabprice[3];
943
944 // MultiCurrency
945 $multicurrency_total_ht = $tabprice[16];
946 $multicurrency_total_tva = $tabprice[17];
947 $multicurrency_total_ttc = $tabprice[18];
948 $pu_ht_devise = $tabprice[19];
949
950 $this->db->begin();
951 $product_type = $type;
952 if ($fk_product) {
953 $product = new Product($this->db);
954 $result = $product->fetch($fk_product);
955 if ($result < 0) {
956 return -1;
957 }
958 $product_type = $product->type;
959 if (empty($label)) {
960 $label = $product->label;
961 }
962 }
963
964 $sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'facture_fourn_det_rec (';
965 $sql .= 'fk_facture_fourn';
966 $sql .= ', fk_product';
967 $sql .= ', ref';
968 $sql .= ', label';
969 $sql .= ', description';
970 $sql .= ', pu_ht';
971 $sql .= ', pu_ttc';
972 $sql .= ', qty';
973 $sql .= ', remise_percent';
974 $sql .= ', fk_remise_except';
975 $sql .= ', vat_src_code';
976 $sql .= ', tva_tx';
977 $sql .= ', localtax1_tx';
978 $sql .= ', localtax1_type';
979 $sql .= ', localtax2_tx';
980 $sql .= ', localtax2_type';
981 $sql .= ', total_ht';
982 $sql .= ', total_tva';
983 $sql .= ', total_localtax1';
984 $sql .= ', total_localtax2';
985 $sql .= ', total_ttc';
986 $sql .= ', product_type';
987 $sql .= ', date_start';
988 $sql .= ', date_end';
989 $sql .= ', info_bits';
990 $sql .= ', special_code';
991 $sql .= ', rang';
992 $sql .= ', fk_unit';
993 $sql .= ', fk_user_author';
994 $sql .= ', fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
995 $sql .= ') VALUES (';
996 $sql .= ' ' . (int) $facid; // source supplier invoice id
997 $sql .= ', ' . (!empty($fk_product) ? "'" . $this->db->escape($fk_product) . "'" : 'null');
998 $sql .= ', ' . (!empty($ref) ? "'" . $this->db->escape($ref) . "'" : 'null');
999 $sql .= ', ' . (!empty($label) ? "'" . $this->db->escape($label) . "'" : 'null');
1000 $sql .= ", '" . $this->db->escape($desc) . "'";
1001 $sql .= ', ' . price2num($pu_ht);
1002 $sql .= ', ' . price2num($pu_ttc);
1003 $sql .= ', ' . price2num($qty);
1004 $sql .= ', ' . price2num($remise_percent);
1005 $sql .= ', null';
1006 $sql .= ", '" . $this->db->escape($vat_src_code) . "'";
1007 $sql .= ', ' . price2num($txtva);
1008 $sql .= ', ' . price2num($txlocaltax1);
1009 $sql .= ", '" . $this->db->escape(isset($localtaxes_type[0]) ? $localtaxes_type[0] : '') . "'";
1010 $sql .= ', ' . price2num($txlocaltax2);
1011 $sql .= ", '" . $this->db->escape(isset($localtaxes_type[2]) ? $localtaxes_type[2] : '') . "'";
1012 $sql .= ', ' . price2num($total_ht);
1013 $sql .= ', ' . price2num($total_tva);
1014 $sql .= ', ' . price2num($total_localtax1);
1015 $sql .= ', ' . price2num($total_localtax2);
1016 $sql .= ', ' . price2num($total_ttc);
1017 $sql .= ', ' . (int) $product_type;
1018 $sql .= ', ' . ($date_start > 0 ? (int) $date_start : 'NULL');
1019 $sql .= ', ' . ($date_end > 0 ? (int) $date_end : 'NULL');
1020 $sql .= ', ' . (int) $info_bits;
1021 $sql .= ', ' . (int) $special_code;
1022 $sql .= ', ' . (int) $rang;
1023 $sql .= ', ' . ($fk_unit ? (int) $fk_unit : 'NULL');
1024 $sql .= ', ' . (int) $user->id;
1025 $sql .= ', ' . (int) $this->fk_multicurrency;
1026 $sql .= ", '" . $this->db->escape($this->multicurrency_code) . "'";
1027 $sql .= ', ' . price2num($pu_ht_devise, 'CU');
1028 $sql .= ', ' . price2num($multicurrency_total_ht, 'CT');
1029 $sql .= ', ' . price2num($multicurrency_total_tva, 'CT');
1030 $sql .= ', ' . price2num($multicurrency_total_ttc, 'CT');
1031 $sql .= ')';
1032
1033 dol_syslog(get_class($this). '::addline', LOG_DEBUG);
1034 if ($this->db->query($sql)) {
1035 $lineId = $this->db->last_insert_id(MAIN_DB_PREFIX. 'facture_fourn_det_rec');
1036 $this->update_price();
1037 $this->id = $facid;
1038 $this->db->commit();
1039 return $lineId;
1040 } else {
1041 $this->db->rollback();
1042 $this->error = $this->db->lasterror();
1043
1044 return -1;
1045 }
1046 } else {
1047 $this->error = 'Recurring Invoice is suspended. adding lines not allowed.';
1048
1049 return -1;
1050 }
1051 }
1052
1080 public function updateline($rowid, $fk_product, $ref, $label, $desc, $pu_ht, $qty, $remise_percent, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $price_base_type = 'HT', $type = 0, $date_start = 0, $date_end = 0, $info_bits = 0, $special_code = 0, $rang = -1, $fk_unit = null, $pu_ht_devise = 0, $pu_ttc = 0)
1081 {
1082 global $mysoc, $user;
1083
1084 $facid = $this->id;
1085
1086 dol_syslog(get_class($this). '::updateline facid=' .$facid." rowid=$rowid, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, txlocaltax1=$txlocaltax1, txlocaltax2=$txlocaltax2, fk_product=$fk_product, remise_percent=$remise_percent, info_bits=$info_bits, price_base_type=$price_base_type, pu_ttc=$pu_ttc, type=$type, fk_unit=$fk_unit, pu_ht_devise=$pu_ht_devise", LOG_DEBUG);
1087 include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
1088
1089 // Check parameters
1090 if ($type < 0) {
1091 return -1;
1092 }
1093
1094 if ($this->status == self::STATUS_SUSPENDED) {
1095 // Clean parameters
1096 $fk_product = empty($fk_product) ? 0 : $fk_product;
1097 $label = empty($label) ? '' : $label;
1098 $remise_percent = empty($remise_percent) ? 0 : price2num($remise_percent);
1099 $qty = price2num($qty);
1100 $info_bits = empty($info_bits) ? 0 : $info_bits;
1101 $pu_ht = price2num($pu_ht);
1102 $pu_ttc = price2num($pu_ttc);
1103 $pu_ht_devise = price2num($pu_ht_devise);
1104
1105 if (!preg_match('/\‍((.*)\‍)/', $txtva)) {
1106 $txtva = price2num($txtva); // $txtva can have format '5.0(XXX)' or '5'
1107 }
1108
1109 $txlocaltax1 = empty($txlocaltax1) ? 0 : price2num($txlocaltax1);
1110 $txlocaltax2 = empty($txlocaltax2) ? 0 : price2num($txlocaltax2);
1111 $this->multicurrency_total_ht = empty($this->multicurrency_total_ht) ? 0 : $this->multicurrency_total_ht;
1112 $this->multicurrency_total_tva = empty($this->multicurrency_total_tva) ? 0 : $this->multicurrency_total_tva;
1113 $this->multicurrency_total_ttc = empty($this->multicurrency_total_ttc) ? 0 : $this->multicurrency_total_ttc;
1114
1115 $pu = $price_base_type == 'HT' ? $pu_ht : $pu_ttc;
1116
1117
1118 // Calculate total with, without tax and tax from qty, pu, remise_percent and txtva
1119 // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
1120 // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
1121
1122 $localtaxes_type = getLocalTaxesFromRate($txtva, 0, $this->thirdparty, $mysoc);
1123
1124 // Clean vat code
1125 $vat_src_code = '';
1126 $reg = array();
1127 if (preg_match('/\‍((.*)\‍)/', $txtva, $reg)) {
1128 $vat_src_code = $reg[1];
1129 $txtva = preg_replace('/\s*\‍(.*\‍)/', '', $txtva); // Remove code into vatrate.
1130 }
1131
1132 $tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
1133
1134 $total_ht = $tabprice[0];
1135 $total_tva = $tabprice[1];
1136 $total_ttc = $tabprice[2];
1137 $total_localtax1 = $tabprice[9];
1138 $total_localtax2 = $tabprice[10];
1139 $pu_ht = $tabprice[3];
1140 $pu_tva = $tabprice[4];
1141 $pu_ttc = $tabprice[5];
1142
1143 // MultiCurrency
1144 $multicurrency_total_ht = $tabprice[16];
1145 $multicurrency_total_tva = $tabprice[17];
1146 $multicurrency_total_ttc = $tabprice[18];
1147 $pu_ht_devise = $tabprice[19];
1148
1149 $product_type = $type;
1150 if ($fk_product) {
1151 $product = new Product($this->db);
1152 $result = $product->fetch($fk_product);
1153 $product_type = $product->type;
1154 }
1155
1156 $sql = 'UPDATE ' . MAIN_DB_PREFIX . 'facture_fourn_det_rec SET';
1157 $sql .= ' fk_facture_fourn = ' . ((int) $facid);
1158 $sql .= ', fk_product = ' . ($fk_product > 0 ? ((int) $fk_product) : 'null');
1159 $sql .= ", ref = '" . $this->db->escape($ref) . "'";
1160 $sql .= ", label = '" . $this->db->escape($label) . "'";
1161 $sql .= ", description = '" . $this->db->escape($desc) . "'";
1162 $sql .= ', pu_ht = ' . price2num($pu_ht);
1163 $sql .= ', qty = ' . price2num($qty);
1164 $sql .= ", remise_percent = '" . price2num($remise_percent) . "'";
1165 $sql .= ", vat_src_code = '" . $this->db->escape($vat_src_code) . "'";
1166 $sql .= ', tva_tx = ' . price2num($txtva);
1167 $sql .= ', localtax1_tx = ' . (float) $txlocaltax1;
1168 $sql .= ", localtax1_type = '" . $this->db->escape($localtaxes_type[0]) . "'";
1169 $sql .= ', localtax2_tx = ' . (float) $txlocaltax2;
1170 $sql .= ", localtax2_type = '" . $this->db->escape($localtaxes_type[2]) . "'";
1171 $sql .= ", total_ht = '" . price2num($total_ht) . "'";
1172 $sql .= ", total_tva = '" . price2num($total_tva) . "'";
1173 $sql .= ", total_localtax1 = '" . price2num($total_localtax1) . "'";
1174 $sql .= ", total_localtax2 = '" . price2num($total_localtax2) . "'";
1175 $sql .= ", total_ttc = '" . price2num($total_ttc) . "'";
1176 $sql .= ', product_type = ' . (int) $product_type;
1177 $sql .= ', date_start = ' . (empty($date_start) ? 'NULL' : (int) $date_start);
1178 $sql .= ', date_end = ' . (empty($date_end) ? 'NULL' : (int) $date_end);
1179 $sql .= ', info_bits = ' . (int) $info_bits;
1180 $sql .= ', special_code = ' . (int) $special_code;
1181 $sql .= ', rang = ' . (int) $rang;
1182 $sql .= ', fk_unit = ' . ($fk_unit ? "'" . $this->db->escape($fk_unit) . "'" : 'null');
1183 $sql .= ', fk_user_modif = ' . (int) $user;
1184 $sql .= ', multicurrency_subprice = '.price2num($pu_ht_devise);
1185 $sql .= ', multicurrency_total_ht = '.price2num($multicurrency_total_ht);
1186 $sql .= ', multicurrency_total_tva = '.price2num($multicurrency_total_tva);
1187 $sql .= ', multicurrency_total_ttc = '.price2num($multicurrency_total_ttc);
1188 $sql .= ' WHERE rowid = ' . (int) $rowid;
1189
1190 dol_syslog(get_class($this). '::updateline', LOG_DEBUG);
1191 if ($this->db->query($sql)) {
1192 $this->id = $facid;
1193 $this->update_price();
1194 return 1;
1195 } else {
1196 $this->error = $this->db->lasterror();
1197 return -1;
1198 }
1199 }
1200 return 0;
1201 }
1202
1203
1211 public function getNextNumRef($soc, $mode = 'next')
1212 {
1213 // Not used for recurring invoices
1214 return '';
1215 }
1216
1222 public function getNextDate()
1223 {
1224 if (empty($this->date_when)) {
1225 return false;
1226 }
1227 return dol_time_plus_duree($this->date_when, $this->frequency, $this->unit_frequency);
1228 }
1229
1235 public function isMaxNbGenReached()
1236 {
1237 $ret = false;
1238 if ($this->nb_gen_max > 0 && ($this->nb_gen_done >= $this->nb_gen_max)) {
1239 $ret = true;
1240 }
1241 return $ret;
1242 }
1243
1250 public function strikeIfMaxNbGenReached($ret)
1251 {
1252 // Special case to strike the date
1253 return ($this->isMaxNbGenReached() ? '<strike>' : '').$ret.($this->isMaxNbGenReached() ? '</strike>' : '');
1254 }
1255
1266 public function createRecurringInvoices($restrictioninvoiceid = 0, $forcevalidation = 0)
1267 {
1268 global $conf, $langs, $db, $user, $hookmanager;
1269
1270 $error = 0;
1271 $nb_create = 0;
1272
1273 // Load translation files required by the page
1274 $langs->loadLangs(array('main', 'bills'));
1275
1276 $now = dol_now();
1277 $tmparray = dol_getdate($now);
1278 $today = dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year']); // Today is last second of current day
1279
1280 dol_syslog('createRecurringInvoices restrictioninvoiceid=' .$restrictioninvoiceid. ' forcevalidation=' .$forcevalidation);
1281
1282 $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'facture_fourn_rec';
1283 $sql .= ' WHERE frequency > 0'; // A recurring supplier invoice is an invoice with a frequency
1284 $sql .= " AND (date_when IS NULL OR date_when <= '".$this->db->idate($today)."')";
1285 $sql .= ' AND (nb_gen_done < nb_gen_max OR nb_gen_max = 0)';
1286 $sql .= ' AND suspended = 0';
1287 $sql .= ' AND entity = '. (int) $conf->entity; // MUST STAY = $conf->entity here
1288 if ($restrictioninvoiceid > 0) {
1289 $sql .= ' AND rowid = '. (int) $restrictioninvoiceid;
1290 }
1291 $sql .= $this->db->order('entity', 'ASC');
1292 //print $sql;exit;
1293 $parameters = array(
1294 'restrictioninvoiceid' => $restrictioninvoiceid,
1295 'forcevalidation' => $forcevalidation,
1296 );
1297 $reshook = $hookmanager->executeHooks('beforeCreationOfRecurringInvoices', $parameters, $sql); // note that $sql might be modified by hooks
1298
1299 $resql = $this->db->query($sql);
1300 if ($resql) {
1301 $i = 0;
1302 $num = $this->db->num_rows($resql);
1303
1304 if ($num) {
1305 $this->output .= $langs->trans('FoundXQualifiedRecurringInvoiceTemplate', $num)."\n";
1306 } else {
1307 $this->output .= $langs->trans('NoQualifiedRecurringInvoiceTemplateFound');
1308 }
1309
1310 $saventity = $conf->entity;
1311 $laststep="None";
1312
1313 while ($i < $num) { // Loop on each template invoice. If $num = 0, test is false at first pass.
1314 $line = $this->db->fetch_object($resql);
1315
1316 $this->db->begin();
1317
1318 $invoiceidgenerated = 0;
1319
1320 $new_fac_fourn = null;
1321 $facturerec = new FactureFournisseurRec($this->db);
1322 $laststep="Fetch {$line->rowid}";
1323 $facturerec->fetch($line->rowid);
1324
1325 if ($facturerec->id > 0) {
1326 // Set entity context
1327 $conf->entity = $facturerec->entity;
1328
1329 dol_syslog('createRecurringInvoices Process invoice template id=' .$facturerec->id. ', ref=' .$facturerec->ref. ', entity=' .$facturerec->entity);
1330
1331 $new_fac_fourn = new FactureFournisseur($this->db);
1332 $new_fac_fourn->fac_rec = $facturerec->id; // We will create $facture from this recurring invoice
1333 $new_fac_fourn->fk_fac_rec_source = $facturerec->id; // We will create $facture from this recurring invoice
1334
1335 $new_fac_fourn->type = self::TYPE_STANDARD;
1336 $new_fac_fourn->statut = self::STATUS_DRAFT; // deprecated
1337 $new_fac_fourn->status = self::STATUS_DRAFT;
1338 $new_fac_fourn->date = empty($facturerec->date_when) ? $now : $facturerec->date_when; // We could also use dol_now here but we prefer date_when so invoice has real date when we would like even if we generate later.
1339 $new_fac_fourn->socid = $facturerec->socid;
1340 $new_fac_fourn->lines = $facturerec->lines;
1341 $new_fac_fourn->ref_supplier = $facturerec->ref_supplier;
1342 $new_fac_fourn->model_pdf = $facturerec->model_pdf;
1343 $new_fac_fourn->fk_project = $facturerec->fk_project;
1344 $new_fac_fourn->label = $facturerec->label;
1345 $new_fac_fourn->libelle = $facturerec->label; // deprecated
1346
1347 $invoiceidgenerated = $new_fac_fourn->create($user);
1348 $laststep="Create invoiceidgenerated $invoiceidgenerated";
1349 if ($invoiceidgenerated <= 0) {
1350 $this->errors = $new_fac_fourn->errors;
1351 $this->error = $new_fac_fourn->error;
1352 $error++;
1353 }
1354 if (!$error && ($facturerec->auto_validate || $forcevalidation)) {
1355 $result = $new_fac_fourn->validate($user);
1356 $laststep = "Validate by user {$user->login}";
1357 if ($result <= 0) {
1358 $this->errors = $new_fac_fourn->errors;
1359 $this->error = $new_fac_fourn->error;
1360 $error++;
1361 }
1362 }
1363
1364 if (!$error && $facturerec->generate_pdf) {
1365 // We refresh the object in order to have all necessary data (like date_lim_reglement)
1366 $laststep = "Refresh ".$new_fac_fourn->id;
1367 $new_fac_fourn->fetch($new_fac_fourn->id);
1368 $laststep = "GenerateDocument ".$new_fac_fourn->id;
1369 $result = $new_fac_fourn->generateDocument($facturerec->model_pdf, $langs);
1370 if ($result < 0) {
1371 $this->errors = $new_fac_fourn->errors;
1372 $this->error = $new_fac_fourn->error;
1373 $error++;
1374 }
1375 }
1376 } else {
1377 $error++;
1378 $this->error = 'Failed to load invoice template with id=' .$line->rowid. ', entity=' .$conf->entity."\n";
1379 $this->errors[] = 'Failed to load invoice template with id=' .$line->rowid. ', entity=' .$conf->entity;
1380 dol_syslog('createRecurringInvoices Failed to load invoice template with id=' .$line->rowid. ', entity=' .$conf->entity);
1381 }
1382
1383 if (!$error && $invoiceidgenerated >= 0) {
1384 $facturerec->nb_gen_done++;
1385 $facturerec->date_last_gen = dol_now();
1386 $facturerec->date_when= $facturerec->getNextDate();
1387 $facturerec->update($user);
1388 $this->db->commit('createRecurringInvoices Process invoice template id=' .$facturerec->id. ', title=' .$facturerec->title);
1389 dol_syslog('createRecurringInvoices Process invoice template ' .$facturerec->title. ' is finished with a success generation');
1390 $nb_create++;
1391 $this->output .= $langs->trans('InvoiceGeneratedFromTemplate', $new_fac_fourn->ref, $facturerec->title)."\n";
1392 } else {
1393 $this->db->rollback('createRecurringInvoices Process invoice template error='.$error.' invoiceidgenerated='.$invoiceidgenerated.' LastStep='.$laststep.' id=' .$facturerec->id. ', title=' .$facturerec->title);
1394 }
1395
1396 $parameters = array(
1397 'cpt' => $i,
1398 'total' => $num,
1399 'errorCount' => $error,
1400 'invoiceidgenerated' => $invoiceidgenerated,
1401 'facturerec' => $facturerec, // it's an object which PHP passes by "reference", so modifiable by hooks.
1402 'this' => $this, // it's an object which PHP passes by "reference", so modifiable by hooks.
1403 );
1404 $reshook = $hookmanager->executeHooks('afterCreationOfRecurringInvoice', $parameters, $new_fac_fourn); // note: $facture can be modified by hooks (warning: $facture can be null)
1405
1406 $i++;
1407 }
1408
1409 $conf->entity = $saventity; // Restore entity context
1410 } else {
1411 dol_print_error($this->db);
1412 }
1413
1414 $this->output = trim($this->output);
1415
1416 return $error ? $error : 0;
1417 }
1418
1431 public function getNomUrl($withpicto = 0, $option = '', $max = 0, $short = 0, $moretitle = '', $notooltip = 0, $save_lastsearch_value = -1)
1432 {
1433 global $langs, $hookmanager;
1434
1435 $result = '';
1436
1437 $label = '<u>'.$langs->trans('RepeatableInvoice').'</u>';
1438 if (!empty($this->ref)) {
1439 $label .= '<br><b>'.$langs->trans('Ref').':</b> '.$this->ref;
1440 }
1441 if ($this->frequency > 0) {
1442 $label .= '<br><b>'.$langs->trans('Frequency').':</b> '.$langs->trans('FrequencyPer_'.$this->unit_frequency, $this->frequency);
1443 }
1444 if (!empty($this->date_last_gen)) {
1445 $label .= '<br><b>'.$langs->trans('DateLastGeneration').':</b> '.dol_print_date($this->date_last_gen, 'dayhour');
1446 }
1447 if ($this->frequency > 0) {
1448 if (!empty($this->date_when)) {
1449 $label .= '<br><b>'.$langs->trans('NextDateToExecution').':</b> ';
1450 $label .= (empty($this->suspended) ? '' : '<strike>').dol_print_date($this->date_when, 'day').(empty($this->suspended) ? '' : '</strike>'); // No hour for this property
1451 if (!empty($this->suspended)) {
1452 $label .= ' ('.$langs->trans('Disabled').')';
1453 }
1454 }
1455 }
1456
1457 $url = DOL_URL_ROOT.'/fourn/facture/card-rec.php?facid='.$this->id;
1458
1459 if ($short) {
1460 return $url;
1461 }
1462
1463 if ($option != 'nolink') {
1464 // Add param to save lastsearch_values or not
1465 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1466 if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER['PHP_SELF'])) {
1467 $add_save_lastsearch_values = 1;
1468 }
1469 if ($add_save_lastsearch_values) {
1470 $url .= '&save_lastsearch_values=1';
1471 }
1472 }
1473
1474 $linkstart = '<a href="'.$url.'" title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip">';
1475 $linkend = '</a>';
1476
1477 $result .= $linkstart;
1478 if ($withpicto) {
1479 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
1480 }
1481 if ($withpicto != 2) {
1482 $result .= $this->ref;
1483 }
1484 $result .= $linkend;
1485 global $action;
1486 $hookmanager->initHooks(array($this->element . 'dao'));
1487 $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
1488 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1489 if ($reshook > 0) {
1490 $result = $hookmanager->resPrint;
1491 } else {
1492 $result .= $hookmanager->resPrint;
1493 }
1494 return $result;
1495 }
1496
1504 public function getLibStatut($mode = 0, $alreadypaid = -1)
1505 {
1506 return $this->LibStatut($this->frequency ? 1 : 0, $this->suspended, $mode, $alreadypaid, empty($this->type) ? 0 : $this->type);
1507 }
1508
1509 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1520 public function LibStatut($recur, $status, $mode = 0, $alreadypaid = -1, $type = 0)
1521 {
1522 // phpcs:enable
1523 global $langs;
1524 $langs->load('bills');
1525
1526 $labelStatus = $langs->transnoentitiesnoconv('Active');
1527 $statusType = 'status0';
1528
1529 //print "$recur,$status,$mode,$alreadypaid,$type";
1530 if ($mode == 0) {
1531 if ($recur) {
1532 if ($status == self::STATUS_SUSPENDED) {
1533 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1534 } else {
1535 $labelStatus = $langs->transnoentitiesnoconv('Active');
1536 }
1537 } else {
1538 if ($status == self::STATUS_SUSPENDED) {
1539 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1540 } else {
1541 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1542 }
1543 }
1544 } elseif ($mode == 1) {
1545 $prefix = 'Short';
1546 if ($recur) {
1547 if ($status == self::STATUS_SUSPENDED) {
1548 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1549 } else {
1550 $labelStatus = $langs->transnoentitiesnoconv('Active');
1551 }
1552 } else {
1553 if ($status == self::STATUS_SUSPENDED) {
1554 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1555 } else {
1556 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1557 }
1558 }
1559 } elseif ($mode == 2) {
1560 if ($recur) {
1561 if ($status == self::STATUS_SUSPENDED) {
1562 $statusType = 'status6';
1563 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1564 } else {
1565 $statusType = 'status4';
1566 $labelStatus = $langs->transnoentitiesnoconv('Active');
1567 }
1568 } else {
1569 if ($status == self::STATUS_SUSPENDED) {
1570 $statusType = 'status6';
1571 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1572 } else {
1573 $statusType = 'status0';
1574 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1575 }
1576 }
1577 } elseif ($mode == 3) {
1578 if ($recur) {
1579 $prefix = 'Short';
1580 if ($status == self::STATUS_SUSPENDED) {
1581 $statusType = 'status6';
1582 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1583 } else {
1584 $statusType = 'status4';
1585 $labelStatus = $langs->transnoentitiesnoconv('Active');
1586 }
1587 } else {
1588 if ($status == self::STATUS_SUSPENDED) {
1589 $statusType = 'status6';
1590 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1591 } else {
1592 $statusType = 'status0';
1593 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1594 }
1595 }
1596 } elseif ($mode == 4) {
1597 $prefix = '';
1598 if ($recur) {
1599 if ($status == self::STATUS_SUSPENDED) {
1600 $statusType = 'status6';
1601 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1602 } else {
1603 $statusType = 'status4';
1604 $labelStatus = $langs->transnoentitiesnoconv('Active');
1605 }
1606 } else {
1607 if ($status == self::STATUS_SUSPENDED) {
1608 $statusType = 'status6';
1609 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1610 } else {
1611 $statusType = 'status0';
1612 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1613 }
1614 }
1615 } elseif ($mode == 5 || $mode == 6) {
1616 $prefix = '';
1617 if ($mode == 5) {
1618 $prefix = 'Short';
1619 }
1620 if ($recur) {
1621 if ($status == self::STATUS_SUSPENDED) {
1622 $statusType = 'status6';
1623 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1624 } else {
1625 $statusType = 'status4';
1626 $labelStatus = $langs->transnoentitiesnoconv('Active');
1627 }
1628 } else {
1629 if ($status == self::STATUS_SUSPENDED) {
1630 $statusType = 'status6';
1631 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1632 } else {
1633 $statusType = 'status0';
1634 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1635 }
1636 }
1637 }
1638
1639 $labelStatusShort = $labelStatus;
1640
1641 return dolGetStatus($labelStatus, $labelStatusShort, '', $statusType, $mode);
1642 }
1643
1652 public function initAsSpecimen($option = '')
1653 {
1654 global $user, $langs, $conf;
1655
1656 $now = dol_now();
1657 $arraynow = dol_getdate($now);
1658 $nownotime = dol_mktime(0, 0, 0, $arraynow['mon'], $arraynow['mday'], $arraynow['year']);
1659
1660 // Load array of products prodids
1661 $num_prods = 0;
1662 $prodids = array();
1663
1664 $sql = 'SELECT rowid';
1665 $sql .= ' FROM ' .MAIN_DB_PREFIX. 'product';
1666 $sql .= ' WHERE entity IN (' .getEntity('product'). ')';
1667 $sql .= $this->db->plimit(100);
1668
1669 $resql = $this->db->query($sql);
1670 if ($resql) {
1671 $num_prods = $this->db->num_rows($resql);
1672 $i = 0;
1673 while ($i < $num_prods) {
1674 $i++;
1675 $row = $this->db->fetch_row($resql);
1676 $prodids[$i] = $row[0];
1677 }
1678 }
1679
1680 // Initialize parameters
1681 $this->id = 0;
1682 $this->ref = 'SPECIMEN';
1683 $this->title = 'SPECIMEN';
1684 $this->specimen = 1;
1685 $this->socid = 1;
1686 $this->date = $nownotime;
1687 $this->date_lim_reglement = $nownotime + 3600 * 24 * 30;
1688 $this->cond_reglement_id = 1;
1689 $this->cond_reglement_code = 'RECEP';
1690 $this->date_lim_reglement = $this->calculate_date_lim_reglement();
1691 $this->mode_reglement_id = 0; // Not forced to show payment mode CHQ + VIR
1692 $this->mode_reglement_code = ''; // Not forced to show payment mode CHQ + VIR
1693 $this->note_public = 'This is a comment (public)';
1694 $this->note_private = 'This is a comment (private)';
1695 $this->note = 'This is a comment (private)';
1696 $this->fk_incoterms = 0;
1697 $this->location_incoterms = '';
1698
1699 if (empty($option) || $option != 'nolines') {
1700 // Lines
1701 $nbp = 5;
1702 $xnbp = 0;
1703 while ($xnbp < $nbp) {
1704 $line = new FactureLigne($this->db);
1705 $line->desc = $langs->trans('Description'). ' ' .$xnbp;
1706 $line->qty = 1;
1707 $line->subprice = 100;
1708 $line->tva_tx = 19.6;
1709 $line->localtax1_tx = 0;
1710 $line->localtax2_tx = 0;
1711 $line->remise_percent = 0;
1712 if ($xnbp == 1) { // Qty is negative (product line)
1713 $prodid = mt_rand(1, $num_prods);
1714 $line->fk_product = $prodids[$prodid];
1715 $line->qty = -1;
1716 $line->total_ht = -100;
1717 $line->total_ttc = -119.6;
1718 $line->total_tva = -19.6;
1719 } elseif ($xnbp == 2) { // UP is negative (free line)
1720 $line->subprice = -100;
1721 $line->total_ht = -100;
1722 $line->total_ttc = -119.6;
1723 $line->total_tva = -19.6;
1724 $line->remise_percent = 0;
1725 } elseif ($xnbp == 3) { // Discount is 50% (product line)
1726 $prodid = mt_rand(1, $num_prods);
1727 $line->fk_product = $prodids[$prodid];
1728 $line->total_ht = 50;
1729 $line->total_ttc = 59.8;
1730 $line->total_tva = 9.8;
1731 $line->remise_percent = 50;
1732 } else { // (product line)
1733 $prodid = mt_rand(1, $num_prods);
1734 $line->fk_product = $prodids[$prodid];
1735 $line->total_ht = 100;
1736 $line->total_ttc = 119.6;
1737 $line->total_tva = 19.6;
1738 $line->remise_percent = 00;
1739 }
1740
1741 $this->lines[$xnbp] = $line;
1742 $xnbp++;
1743
1744 $this->total_ht += $line->total_ht;
1745 $this->total_tva += $line->total_tva;
1746 $this->total_ttc += $line->total_ttc;
1747 }
1748 $this->revenuestamp = 0;
1749
1750 // Add a line "offered"
1751 $line = new FactureLigne($this->db);
1752 $line->desc = $langs->trans('Description'). ' (offered line)';
1753 $line->qty = 1;
1754 $line->subprice = 100;
1755 $line->tva_tx = 19.6;
1756 $line->localtax1_tx = 0;
1757 $line->localtax2_tx = 0;
1758 $line->remise_percent = 100;
1759 $line->total_ht = 0;
1760 $line->total_ttc = 0; // 90 * 1.196
1761 $line->total_tva = 0;
1762 $prodid = mt_rand(1, $num_prods);
1763 $line->fk_product = $prodids[$prodid];
1764
1765 $this->lines[$xnbp] = $line;
1766 $xnbp++;
1767 }
1768
1769 $this->usenewprice = 0;
1770 }
1771
1780 public static function replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
1781 {
1782 $tables = array(
1783 'facture_fourn_rec'
1784 );
1785
1786 return CommonObject::commonReplaceThirdparty($dbs, $origin_id, $dest_id, $tables);
1787 }
1788
1796 public function setFrequencyAndUnit($frequency, $unit)
1797 {
1798 if (!$this->table_element) {
1799 dol_syslog(get_class($this). '::setFrequencyAndUnit was called on objet with property table_element not defined', LOG_ERR);
1800 return -1;
1801 }
1802
1803 if (!empty($frequency) && empty($unit)) {
1804 dol_syslog(get_class($this). '::setFrequencyAndUnit was called on objet with params frequency defined but unit not defined', LOG_ERR);
1805 return -2;
1806 }
1807
1808 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1809 $sql .= " SET frequency = ".($frequency ? ((int) $frequency) : "NULL");
1810 if (!empty($unit)) {
1811 $sql .= ", unit_frequency = '".$this->db->escape($unit)."'";
1812 }
1813 $sql .= " WHERE rowid = ".((int) $this->id);
1814
1815 dol_syslog(get_class($this).'::setFrequencyAndUnit', LOG_DEBUG);
1816
1817 if ($this->db->query($sql)) {
1818 $this->frequency = $frequency;
1819 if (!empty($unit)) {
1820 $this->unit_frequency = $unit;
1821 }
1822 return 1;
1823 } else {
1824 $this->error = $this->db->lasterror();
1825 return -1;
1826 }
1827 }
1828
1836 public function setNextDate($date, $increment_nb_gen_done = 0)
1837 {
1838 if (!$this->table_element) {
1839 dol_syslog(get_class($this).'::setNextDate was called on objet with property table_element not defined', LOG_ERR);
1840 return -1;
1841 }
1842 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1843 $sql .= " SET date_when = " .($date ? "'".$this->db->idate($date)."'" : "NULL");
1844 if ($increment_nb_gen_done > 0) {
1845 $sql .= ", nb_gen_done = nb_gen_done + 1";
1846 }
1847 $sql .= " WHERE rowid = " . (int) $this->id;
1848
1849 dol_syslog(get_class($this).'::setNextDate', LOG_DEBUG);
1850
1851 if ($this->db->query($sql)) {
1852 $this->date_when = $date;
1853 if ($increment_nb_gen_done > 0) {
1854 $this->nb_gen_done++;
1855 }
1856 return 1;
1857 } else {
1858 $this->error = $this->db->lasterror();
1859 return -1;
1860 }
1861 }
1862
1869 public function setMaxPeriod($nb)
1870 {
1871 if (!$this->table_element) {
1872 dol_syslog(get_class($this).'::setMaxPeriod was called on objet with property table_element not defined', LOG_ERR);
1873 return -1;
1874 }
1875
1876 if (empty($nb)) {
1877 $nb = 0;
1878 }
1879
1880 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1881 $sql .= " SET nb_gen_max = ". (int) $nb;
1882 $sql .= " WHERE rowid = " . (int) $this->id;
1883
1884 dol_syslog(get_class($this).'::setMaxPeriod', LOG_DEBUG);
1885
1886 if ($this->db->query($sql)) {
1887 $this->nb_gen_max = $nb;
1888 return 1;
1889 } else {
1890 dol_print_error($this->db);
1891 return -1;
1892 }
1893 }
1894
1901 public function setAutoValidate($validate)
1902 {
1903 if (!$this->table_element) {
1904 dol_syslog(get_class($this).'::setAutoValidate was called on objet with property table_element not defined', LOG_ERR);
1905 return -1;
1906 }
1907
1908 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1909 $sql .= " SET auto_validate = ".((int) $validate);
1910 $sql .= " WHERE rowid = " . (int) $this->id;
1911
1912 dol_syslog(get_class($this).'::setAutoValidate', LOG_DEBUG);
1913
1914 if ($this->db->query($sql)) {
1915 $this->auto_validate = $validate;
1916 return 1;
1917 } else {
1918 dol_print_error($this->db);
1919 return -1;
1920 }
1921 }
1922
1929 public function setGeneratePdf($validate)
1930 {
1931 if (!$this->table_element) {
1932 dol_syslog(get_class($this).'::setGeneratePdf was called on objet with property table_element not defined', LOG_ERR);
1933 return -1;
1934 }
1935
1936 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1937 $sql .= " SET generate_pdf = ". (int) $validate;
1938 $sql .= " WHERE rowid = " . (int) $this->id;
1939
1940 dol_syslog(get_class($this).'::setGeneratePdf', LOG_DEBUG);
1941
1942 if ($this->db->query($sql)) {
1943 $this->generate_pdf = $validate;
1944 return 1;
1945 } else {
1946 dol_print_error($this->db);
1947 return -1;
1948 }
1949 }
1950
1957 public function setModelPdf($model)
1958 {
1959 if (!$this->table_element) {
1960 dol_syslog(get_class($this).'::setModelPdf was called on objet with property table_element not defined', LOG_ERR);
1961 return -1;
1962 }
1963
1964 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1965 $sql .= " SET modelpdf = '".$this->db->escape($model)."'";
1966 $sql .= " WHERE rowid = " . (int) $this->id;
1967
1968 dol_syslog(get_class($this).'::setModelPdf', LOG_DEBUG);
1969
1970 if ($this->db->query($sql)) {
1971 $this->model_pdf = $model;
1972 return 1;
1973 } else {
1974 dol_print_error($this->db);
1975 return -1;
1976 }
1977 }
1978}
1979
1980
1981
1987{
1991 public $element = 'invoice_supplier_det_rec';
1992
1996 public $table_element = 'facture_fourn_det_rec';
1997
1998 public $fk_facture_fourn;
1999 public $fk_parent;
2000 public $fk_product;
2001 public $ref_supplier;
2002 public $label;
2003 public $description;
2004 public $pu_ht;
2005 public $pu_ttc;
2006 public $qty;
2007 public $remise_percent;
2008 public $fk_remise_except;
2009 public $vat_src_code;
2010 public $tva_tx;
2011 public $localtax1_tx;
2012 public $localtax1_type;
2013 public $localtax2_tx;
2014 public $localtax2_type;
2015
2016 public $product_type;
2017 public $date_start;
2018 public $date_end;
2019 public $info_bits;
2020 public $special_code;
2021 public $rang;
2022
2023 public $fk_user_author;
2024 public $fk_user_modif;
2025
2026
2034 public function delete(User $user, $notrigger = 0)
2035 {
2036 $error = 0;
2037 $this->db->begin();
2038
2039 if (! $error) {
2040 if (! $notrigger) {
2041 // Call triggers
2042 $result = $this->call_trigger('LINESUPPLIERBILLREC_DELETE', $user);
2043 if ($result < 0) {
2044 $error++;
2045 } // Do also here what you must do to rollback action if trigger fail
2046 // End call triggers
2047 }
2048 }
2049
2050 if (! $error) {
2051 $result = $this->deleteExtraFields();
2052 if ($result < 0) {
2053 $error++;
2054 }
2055 }
2056
2057 if (! $error) {
2058 $sql = 'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element . ' WHERE rowid=' . (int) $this->id;
2059
2060 $res = $this->db->query($sql);
2061 if ($res === false) {
2062 $error++;
2063 $this->errors[] = $this->db->lasterror();
2064 }
2065 }
2066
2067 // Commit or rollback
2068 if ($error) {
2069 $this->db->rollback();
2070 return -1;
2071 } else {
2072 $this->db->commit();
2073 return 1;
2074 }
2075 }
2076
2077
2084 public function fetch($rowid)
2085 {
2086 $sql = 'SELECT l.rowid,';
2087 $sql .= ' l.fk_facture_fourn, l.fk_parent_line, l.fk_product,';
2088 $sql .= ' l.ref as ref_supplier, l.label, l.description, l.pu_ht, l.pu_ttc, l.qty, l.remise_percent, l.fk_remise_except,';
2089 $sql .= ' l.vat_src_code, l.tva_tx, l.localtax1_tx, l.localtax1_type, l.localtax2_tx, l.localtax2_type,';
2090 $sql .= ' l.total_ht, l.total_tva, l.total_localtax1, l.total_localtax2, l.total_ttc,';
2091 $sql .= ' l.product_type, l.date_start, l.date_end,';
2092 $sql .= ' l.info_bits, l.special_code, l.rang, l.fk_unit, l.import_key,';
2093 $sql .= ' l.fk_user_author, l.fk_user_modif, l.fk_multicurrency,';
2094 $sql .= ' l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
2095 $sql .= ' p.ref as product_ref, p.fk_product_type as fk_product_type, p.label as product_label, p.description as product_desc';
2096 $sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn_det_rec as l';
2097 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON l.fk_product = p.rowid';
2098 $sql .= ' WHERE l.rowid = '. (int) $rowid;
2099 $sql .= ' ORDER BY l.rang';
2100
2101 dol_syslog('FactureRec::fetch', LOG_DEBUG);
2102 $result = $this->db->query($sql);
2103 if ($result) {
2104 $objp = $this->db->fetch_object($result);
2105
2106 $this->id = $objp->rowid;
2107 $this->fk_facture_fourn = $objp->fk_facture_fourn;
2108 $this->fk_parent = $objp->fk_parent_line;
2109 $this->fk_product = $objp->fk_product;
2110 $this->ref_supplier = $objp->ref_supplier;
2111 $this->label = $objp->label;
2112 $this->description = $objp->description;
2113 $this->pu_ht = $objp->pu_ht;
2114 $this->pu_ttc = $objp->pu_ttc;
2115 $this->qty = $objp->qty;
2116 $this->remise_percent = $objp->remise_percent;
2117 $this->fk_remise_except = $objp->fk_remise_except;
2118 $this->vat_src_code = $objp->vat_src_code;
2119 $this->tva_tx = $objp->tva_tx;
2120 $this->localtax1_tx = $objp->localtax1_tx;
2121 $this->localtax1_type = $objp->localtax1_type;
2122 $this->localtax2_tx = $objp->localtax2_tx;
2123 $this->localtax2_type = $objp->localtax2_type;
2124 $this->total_ht = $objp->total_ht;
2125 $this->total_tva = $objp->total_tva;
2126 $this->total_localtax1 = $objp->total_localtax1;
2127 $this->total_localtax2 = $objp->total_localtax2;
2128 $this->total_ttc = $objp->total_ttc;
2129 $this->product_type = $objp->product_type;
2130 $this->date_start = $objp->date_start;
2131 $this->date_end = $objp->date_end;
2132 $this->info_bits = $objp->info_bits;
2133 $this->special_code = $objp->special_code;
2134 $this->rang = $objp->rang;
2135 $this->fk_unit = $objp->fk_unit;
2136 $this->import_key = $objp->import_key;
2137 $this->fk_user_author = $objp->fk_user_author;
2138 $this->fk_user_modif = $objp->fk_user_modif;
2139 $this->fk_multicurrency = $objp->fk_multicurrency;
2140 $this->multicurrency_code = $objp->multicurrency_code;
2141 $this->multicurrency_subprice = $objp->multicurrency_subprice;
2142 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
2143 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
2144 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2145
2146 $this->db->free($result);
2147 return 1;
2148 } else {
2149 $this->error = $this->db->lasterror();
2150 return -3;
2151 }
2152 }
2153
2154
2162 public function update(User $user, $notrigger = 0)
2163 {
2164 global $conf;
2165
2166 $error = 0;
2167
2168 include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
2169
2170 $sql = 'UPDATE ' . MAIN_DB_PREFIX . 'facture_fourn_det_rec SET';
2171 $sql .= ' fk_facture_fourn = ' . (int) $this->fk_facture_fourn;
2172 $sql .= ', fk_parent_line = ' . (int) $this->fk_parent;
2173 $sql .= ', fk_product = ' . (int) $this->fk_product;
2174 $sql .= ', ref = ' . (!empty($this->ref) ? "'" . $this->db->escape($this->ref) . "'" : 'NULL');
2175 $sql .= ", label = " . (!empty($this->label) ? "'" . $this->db->escape($this->label) . "'" : 'NULL');
2176 $sql .= ", description = '" . $this->db->escape($this->description) . "'";
2177 $sql .= ', pu_ht = ' . price2num($this->pu_ht);
2178 $sql .= ', pu_ttc = ' . price2num($this->pu_ttc);
2179 $sql .= ', qty = ' . price2num($this->qty);
2180 $sql .= ", remise_percent = '" . price2num($this->remise_percent) . "'";
2181 $sql .= ', fk_remise_except = ' . (int) $this->fk_remise_except;
2182 $sql .= ", vat_src_code = '" . $this->db->escape($this->vat_src_code) . "'";
2183 $sql .= ', tva_tx = ' . price2num($this->tva_tx);
2184 $sql .= ', localtax1_tx = ' . price2num($this->localtax1_tx);
2185 $sql .= ", localtax1_type = '" . $this->db->escape($this->localtax1_type) . "'";
2186 $sql .= ', localtax2_tx = ' . price2num($this->localtax2_tx);
2187 $sql .= ", localtax2_type = '" . $this->db->escape($this->localtax2_type) . "'";
2188 if (empty($this->skip_update_total)) {
2189 $sql .= ', total_ht = ' . price2num($this->total_ht);
2190 $sql .= ', total_tva = ' . price2num($this->total_tva);
2191 $sql .= ', total_localtax1 = ' . price2num($this->total_localtax1);
2192 $sql .= ', total_localtax2 = ' . price2num($this->total_localtax2);
2193 $sql .= ', total_ttc = ' . price2num($this->total_ttc);
2194 }
2195 $sql .= ', product_type = ' . (int) $this->product_type;
2196 $sql .= ', date_start = ' . (int) $this->date_start;
2197 $sql .= ', date_end = ' . (int) $this->date_end;
2198 $sql .= ", info_bits = " . ((int) $this->info_bits);
2199 $sql .= ', special_code =' . (int) $this->special_code;
2200 $sql .= ', rang = ' . (int) $this->rang;
2201 $sql .= ', fk_unit = ' .($this->fk_unit ? "'".$this->db->escape($this->fk_unit)."'" : 'null');
2202 $sql .= ', fk_user_modif = ' . (int) $user->id;
2203 $sql .= ' WHERE rowid = ' . (int) $this->id;
2204
2205 $this->db->begin();
2206
2207 dol_syslog(get_class($this). '::updateline', LOG_DEBUG);
2208 $resql = $this->db->query($sql);
2209 if ($resql) {
2210 if (!$error) {
2211 $result = $this->insertExtraFields();
2212 if ($result < 0) {
2213 $error++;
2214 }
2215 }
2216
2217 if (!$error && !$notrigger) {
2218 // Call trigger
2219 $result = $this->call_trigger('LINESUPPLIERBILLREC_MODIFY', $user);
2220 if ($result < 0) {
2221 $error++;
2222 }
2223 // End call triggers
2224 }
2225
2226 if ($error) {
2227 $this->db->rollback();
2228 return -2;
2229 } else {
2230 $this->db->commit();
2231 return 1;
2232 }
2233 } else {
2234 $this->error = $this->db->lasterror();
2235 $this->db->rollback();
2236 return -2;
2237 }
2238 }
2239}
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Definition security.php:604
$object ref
Definition info.php:79
Superclass for invoices classes.
const TYPE_STANDARD
Standard invoice.
calculate_date_lim_reglement($cond_reglement=0)
Returns an invoice payment deadline based on the invoice settlement conditions and billing date.
const STATUS_DRAFT
Draft status.
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
update_price($exclspec=0, $roundingadjust='none', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage Dolibarr database access.
Class to manage suppliers invoices.
Class to manage supplier invoice lines of templates.
fetch($rowid)
Get line of template invoice.
update(User $user, $notrigger=0)
Update a line to supplier invoice template .
Class to manage invoice templates.
setModelPdf($model)
Update the model for documents.
fetch($rowid, $ref='', $ref_ext='')
Load object and lines.
strikeIfMaxNbGenReached($ret)
Format string to output with by striking the string if max number of generation was reached.
setFrequencyAndUnit($frequency, $unit)
Update frequency and unit.
getNextNumRef($soc, $mode='next')
Return next reference of invoice not already used (or last reference)
create($user, $facFournId, $notrigger=0)
Create a predefined supplier invoice.
setGeneratePdf($validate)
Update the auto generate documents.
getLinesArray()
Create an array of invoice lines.
initAsSpecimen($option='')
Initialise an instance with random values.
LibStatut($recur, $status, $mode=0, $alreadypaid=-1, $type=0)
Return label of a status.
updateline($rowid, $fk_product, $ref, $label, $desc, $pu_ht, $qty, $remise_percent, $txtva, $txlocaltax1=0, $txlocaltax2=0, $price_base_type='HT', $type=0, $date_start=0, $date_end=0, $info_bits=0, $special_code=0, $rang=-1, $fk_unit=null, $pu_ht_devise=0, $pu_ttc=0)
Update a line to supplier invoice template.
isMaxNbGenReached()
Return if maximum number of generation is reached.
setAutoValidate($validate)
Update the auto validate flag of invoice.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
getNextDate()
Return the next date of.
fetch_lines()
Get lines of template invoices into this->lines.
getLibStatut($mode=0, $alreadypaid=-1)
Return label of object status.
setNextDate($date, $increment_nb_gen_done=0)
Update the next date of execution.
setMaxPeriod($nb)
Update the maximum period.
createRecurringInvoices($restrictioninvoiceid=0, $forcevalidation=0)
Create all recurrents supplier invoices (for all entities if multicompany is used).
update(User $user, $notrigger=0)
Update fourn_invoice_rec.
addline($fk_product, $ref, $label, $desc, $pu_ht, $pu_ttc, $qty, $remise_percent, $txtva, $txlocaltax1=0, $txlocaltax2=0, $price_base_type='HT', $type=0, $date_start=0, $date_end=0, $info_bits=0, $special_code=0, $rang=-1, $fk_unit=null, $pu_ht_devise=0)
Add a line to recursive supplier invoice.
getNomUrl($withpicto=0, $option='', $max=0, $short=0, $moretitle='', $notooltip=0, $save_lastsearch_value=-1)
Return clicable name (with picto eventually)
Class to manage invoice lines.
Class to manage products or services.
Class to manage Dolibarr users.
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition date.lib.php:125
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
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...
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller='', $localtaxes_array='', $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.
Definition price.lib.php:86
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:121