dolibarr 19.0.4
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 = $this->db->jdate($objp->date_start);
768 $line->date_end = $this->db->jdate($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 $localtaxes_type = getLocalTaxesFromRate($txtva, 0, $this->thirdparty, $mysoc);
903
904 // Clean vat code
905 $reg = array();
906 $vat_src_code = '';
907 if (preg_match('/\‍((.*)\‍)/', $txtva, $reg)) {
908 $vat_src_code = $reg[1];
909 $txtva = preg_replace('/\s*\‍(.*\‍)/', '', $txtva); // Remove code into vatrate.
910 }
911
912 // Clean parameters
913 $fk_product = empty($fk_product) ? 0 : $fk_product;
914 $label = empty($label) ? '' : $label;
915 $remise_percent = empty($remise_percent) ? 0 : price2num($remise_percent);
916 $qty = price2num($qty);
917 $pu_ht = price2num($pu_ht);
918 $pu_ttc = price2num($pu_ttc);
919 if (!preg_match('/\‍((.*)\‍)/', $txtva)) {
920 $txtva = price2num($txtva); // $txtva can have format '5.0(XXX)' or '5'
921 }
922 $txlocaltax1 = price2num($txlocaltax1);
923 $txlocaltax2 = price2num($txlocaltax2);
924 $txtva = !empty($txtva) ? $txtva : 0;
925 $txlocaltax1 = !empty($txlocaltax1) ? $txlocaltax1 : 0;
926 $txlocaltax2 = !empty($txlocaltax2) ? $txlocaltax2 : 0;
927 $info_bits = !empty($info_bits) ? $info_bits : 0;
928 $info_bits = !empty($info_bits) ? $info_bits : 0;
929 $pu = $price_base_type == 'HT' ? $pu_ht : $pu_ttc;
930
931 // Calcul du total TTC et de la TVA pour la ligne a partir de qty, pu, remise_percent et txtva
932 // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
933 // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
934
935 $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);
936 $total_ht = $tabprice[0];
937 $total_tva = $tabprice[1];
938 $total_ttc = $tabprice[2];
939 $total_localtax1 = $tabprice[9];
940 $total_localtax2 = $tabprice[10];
941 $pu_ht = $tabprice[3];
942
943 // MultiCurrency
944 $multicurrency_total_ht = $tabprice[16];
945 $multicurrency_total_tva = $tabprice[17];
946 $multicurrency_total_ttc = $tabprice[18];
947 $pu_ht_devise = $tabprice[19];
948
949 $this->db->begin();
950 $product_type = $type;
951 if ($fk_product) {
952 $product = new Product($this->db);
953 $result = $product->fetch($fk_product);
954 if ($result < 0) {
955 return -1;
956 }
957 $product_type = $product->type;
958 if (empty($label)) {
959 $label = $product->label;
960 }
961 }
962
963 $sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'facture_fourn_det_rec (';
964 $sql .= 'fk_facture_fourn';
965 $sql .= ', fk_product';
966 $sql .= ', ref';
967 $sql .= ', label';
968 $sql .= ', description';
969 $sql .= ', pu_ht';
970 $sql .= ', pu_ttc';
971 $sql .= ', qty';
972 $sql .= ', remise_percent';
973 $sql .= ', fk_remise_except';
974 $sql .= ', vat_src_code';
975 $sql .= ', tva_tx';
976 $sql .= ', localtax1_tx';
977 $sql .= ', localtax1_type';
978 $sql .= ', localtax2_tx';
979 $sql .= ', localtax2_type';
980 $sql .= ', total_ht';
981 $sql .= ', total_tva';
982 $sql .= ', total_localtax1';
983 $sql .= ', total_localtax2';
984 $sql .= ', total_ttc';
985 $sql .= ', product_type';
986 $sql .= ', date_start';
987 $sql .= ', date_end';
988 $sql .= ', info_bits';
989 $sql .= ', special_code';
990 $sql .= ', rang';
991 $sql .= ', fk_unit';
992 $sql .= ', fk_user_author';
993 $sql .= ', fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
994 $sql .= ') VALUES (';
995 $sql .= ' ' . (int) $facid; // source supplier invoice id
996 $sql .= ', ' . (!empty($fk_product) ? "'" . $this->db->escape($fk_product) . "'" : 'null');
997 $sql .= ', ' . (!empty($ref) ? "'" . $this->db->escape($ref) . "'" : 'null');
998 $sql .= ', ' . (!empty($label) ? "'" . $this->db->escape($label) . "'" : 'null');
999 $sql .= ", '" . $this->db->escape($desc) . "'";
1000 $sql .= ', ' . price2num($pu_ht);
1001 $sql .= ', ' . price2num($pu_ttc);
1002 $sql .= ', ' . price2num($qty);
1003 $sql .= ', ' . price2num($remise_percent);
1004 $sql .= ', null';
1005 $sql .= ", '" . $this->db->escape($vat_src_code) . "'";
1006 $sql .= ', ' . price2num($txtva);
1007 $sql .= ', ' . price2num($txlocaltax1);
1008 $sql .= ", '" . $this->db->escape(isset($localtaxes_type[0]) ? $localtaxes_type[0] : '') . "'";
1009 $sql .= ', ' . price2num($txlocaltax2);
1010 $sql .= ", '" . $this->db->escape(isset($localtaxes_type[2]) ? $localtaxes_type[2] : '') . "'";
1011 $sql .= ', ' . price2num($total_ht);
1012 $sql .= ', ' . price2num($total_tva);
1013 $sql .= ', ' . price2num($total_localtax1);
1014 $sql .= ', ' . price2num($total_localtax2);
1015 $sql .= ', ' . price2num($total_ttc);
1016 $sql .= ', ' . (int) $product_type;
1017 $sql .= ', ' . ($date_start > 0 ? (int) $date_start : 'NULL');
1018 $sql .= ', ' . ($date_end > 0 ? (int) $date_end : 'NULL');
1019 $sql .= ', ' . (int) $info_bits;
1020 $sql .= ', ' . (int) $special_code;
1021 $sql .= ', ' . (int) $rang;
1022 $sql .= ', ' . ($fk_unit ? (int) $fk_unit : 'NULL');
1023 $sql .= ', ' . (int) $user->id;
1024 $sql .= ', ' . (int) $this->fk_multicurrency;
1025 $sql .= ", '" . $this->db->escape($this->multicurrency_code) . "'";
1026 $sql .= ', ' . price2num($pu_ht_devise, 'CU');
1027 $sql .= ', ' . price2num($multicurrency_total_ht, 'CT');
1028 $sql .= ', ' . price2num($multicurrency_total_tva, 'CT');
1029 $sql .= ', ' . price2num($multicurrency_total_ttc, 'CT');
1030 $sql .= ')';
1031
1032 dol_syslog(get_class($this). '::addline', LOG_DEBUG);
1033 if ($this->db->query($sql)) {
1034 $lineId = $this->db->last_insert_id(MAIN_DB_PREFIX. 'facture_fourn_det_rec');
1035 $this->update_price();
1036 $this->id = $facid;
1037 $this->db->commit();
1038 return $lineId;
1039 } else {
1040 $this->db->rollback();
1041 $this->error = $this->db->lasterror();
1042
1043 return -1;
1044 }
1045 }
1046
1074 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)
1075 {
1076 global $mysoc, $user;
1077
1078 $facid = $this->id;
1079
1080 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);
1081 include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
1082
1083 // Check parameters
1084 if ($type < 0) {
1085 return -1;
1086 }
1087
1088 // Clean parameters
1089 $fk_product = empty($fk_product) ? 0 : $fk_product;
1090 $label = empty($label) ? '' : $label;
1091 $remise_percent = empty($remise_percent) ? 0 : price2num($remise_percent);
1092 $qty = price2num($qty);
1093 $info_bits = empty($info_bits) ? 0 : $info_bits;
1094 $pu_ht = price2num($pu_ht);
1095 $pu_ttc = price2num($pu_ttc);
1096 $pu_ht_devise = price2num($pu_ht_devise);
1097
1098 if (!preg_match('/\‍((.*)\‍)/', $txtva)) {
1099 $txtva = price2num($txtva); // $txtva can have format '5.0(XXX)' or '5'
1100 }
1101
1102 $txlocaltax1 = empty($txlocaltax1) ? 0 : price2num($txlocaltax1);
1103 $txlocaltax2 = empty($txlocaltax2) ? 0 : price2num($txlocaltax2);
1104 $this->multicurrency_total_ht = empty($this->multicurrency_total_ht) ? 0 : $this->multicurrency_total_ht;
1105 $this->multicurrency_total_tva = empty($this->multicurrency_total_tva) ? 0 : $this->multicurrency_total_tva;
1106 $this->multicurrency_total_ttc = empty($this->multicurrency_total_ttc) ? 0 : $this->multicurrency_total_ttc;
1107
1108 $pu = $price_base_type == 'HT' ? $pu_ht : $pu_ttc;
1109
1110
1111 // Calculate total with, without tax and tax from qty, pu, remise_percent and txtva
1112 // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
1113 // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
1114
1115 $localtaxes_type = getLocalTaxesFromRate($txtva, 0, $this->thirdparty, $mysoc);
1116
1117 // Clean vat code
1118 $vat_src_code = '';
1119 $reg = array();
1120 if (preg_match('/\‍((.*)\‍)/', $txtva, $reg)) {
1121 $vat_src_code = $reg[1];
1122 $txtva = preg_replace('/\s*\‍(.*\‍)/', '', $txtva); // Remove code into vatrate.
1123 }
1124
1125 $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);
1126
1127 $total_ht = $tabprice[0];
1128 $total_tva = $tabprice[1];
1129 $total_ttc = $tabprice[2];
1130 $total_localtax1 = $tabprice[9];
1131 $total_localtax2 = $tabprice[10];
1132 $pu_ht = $tabprice[3];
1133 $pu_tva = $tabprice[4];
1134 $pu_ttc = $tabprice[5];
1135
1136 // MultiCurrency
1137 $multicurrency_total_ht = $tabprice[16];
1138 $multicurrency_total_tva = $tabprice[17];
1139 $multicurrency_total_ttc = $tabprice[18];
1140 $pu_ht_devise = $tabprice[19];
1141
1142 $product_type = $type;
1143 if ($fk_product) {
1144 $product = new Product($this->db);
1145 $result = $product->fetch($fk_product);
1146 $product_type = $product->type;
1147 }
1148
1149 $sql = 'UPDATE ' . MAIN_DB_PREFIX . 'facture_fourn_det_rec SET';
1150 $sql .= ' fk_facture_fourn = ' . ((int) $facid);
1151 $sql .= ', fk_product = ' . ($fk_product > 0 ? ((int) $fk_product) : 'null');
1152 $sql .= ", ref = '" . $this->db->escape($ref) . "'";
1153 $sql .= ", label = '" . $this->db->escape($label) . "'";
1154 $sql .= ", description = '" . $this->db->escape($desc) . "'";
1155 $sql .= ', pu_ht = ' . price2num($pu_ht);
1156 $sql .= ', qty = ' . price2num($qty);
1157 $sql .= ", remise_percent = '" . price2num($remise_percent) . "'";
1158 $sql .= ", vat_src_code = '" . $this->db->escape($vat_src_code) . "'";
1159 $sql .= ', tva_tx = ' . price2num($txtva);
1160 $sql .= ', localtax1_tx = ' . (float) $txlocaltax1;
1161 $sql .= ", localtax1_type = '" . $this->db->escape($localtaxes_type[0]) . "'";
1162 $sql .= ', localtax2_tx = ' . (float) $txlocaltax2;
1163 $sql .= ", localtax2_type = '" . $this->db->escape($localtaxes_type[2]) . "'";
1164 $sql .= ", total_ht = '" . price2num($total_ht) . "'";
1165 $sql .= ", total_tva = '" . price2num($total_tva) . "'";
1166 $sql .= ", total_localtax1 = '" . price2num($total_localtax1) . "'";
1167 $sql .= ", total_localtax2 = '" . price2num($total_localtax2) . "'";
1168 $sql .= ", total_ttc = '" . price2num($total_ttc) . "'";
1169 $sql .= ', product_type = ' . (int) $product_type;
1170 $sql .= ', date_start = ' . (empty($date_start) ? 'NULL' : (int) $date_start);
1171 $sql .= ', date_end = ' . (empty($date_end) ? 'NULL' : (int) $date_end);
1172 $sql .= ', info_bits = ' . (int) $info_bits;
1173 $sql .= ', special_code = ' . (int) $special_code;
1174 $sql .= ', rang = ' . (int) $rang;
1175 $sql .= ', fk_unit = ' . ($fk_unit ? "'" . $this->db->escape($fk_unit) . "'" : 'null');
1176 $sql .= ', fk_user_modif = ' . (int) $user;
1177 $sql .= ', multicurrency_subprice = '.price2num($pu_ht_devise);
1178 $sql .= ', multicurrency_total_ht = '.price2num($multicurrency_total_ht);
1179 $sql .= ', multicurrency_total_tva = '.price2num($multicurrency_total_tva);
1180 $sql .= ', multicurrency_total_ttc = '.price2num($multicurrency_total_ttc);
1181 $sql .= ' WHERE rowid = ' . (int) $rowid;
1182
1183 dol_syslog(get_class($this). '::updateline', LOG_DEBUG);
1184 if ($this->db->query($sql)) {
1185 $this->id = $facid;
1186 $this->update_price();
1187 return 1;
1188 } else {
1189 $this->error = $this->db->lasterror();
1190 return -1;
1191 }
1192 }
1193
1194
1202 public function getNextNumRef($soc, $mode = 'next')
1203 {
1204 // Not used for recurring invoices
1205 return '';
1206 }
1207
1213 public function getNextDate()
1214 {
1215 if (empty($this->date_when)) {
1216 return false;
1217 }
1218 return dol_time_plus_duree($this->date_when, $this->frequency, $this->unit_frequency);
1219 }
1220
1226 public function isMaxNbGenReached()
1227 {
1228 $ret = false;
1229 if ($this->nb_gen_max > 0 && ($this->nb_gen_done >= $this->nb_gen_max)) {
1230 $ret = true;
1231 }
1232 return $ret;
1233 }
1234
1241 public function strikeIfMaxNbGenReached($ret)
1242 {
1243 // Special case to strike the date
1244 return ($this->isMaxNbGenReached() ? '<strike>' : '').$ret.($this->isMaxNbGenReached() ? '</strike>' : '');
1245 }
1246
1257 public function createRecurringInvoices($restrictioninvoiceid = 0, $forcevalidation = 0)
1258 {
1259 global $conf, $langs, $db, $user, $hookmanager;
1260
1261 $error = 0;
1262 $nb_create = 0;
1263
1264 // Load translation files required by the page
1265 $langs->loadLangs(array('main', 'bills'));
1266
1267 $now = dol_now();
1268 $tmparray = dol_getdate($now);
1269 $today = dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year']); // Today is last second of current day
1270
1271 dol_syslog('createRecurringInvoices restrictioninvoiceid=' .$restrictioninvoiceid. ' forcevalidation=' .$forcevalidation);
1272
1273 $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'facture_fourn_rec';
1274 $sql .= ' WHERE frequency > 0'; // A recurring supplier invoice is an invoice with a frequency
1275 $sql .= " AND (date_when IS NULL OR date_when <= '".$this->db->idate($today)."')";
1276 $sql .= ' AND (nb_gen_done < nb_gen_max OR nb_gen_max = 0)';
1277 $sql .= ' AND suspended = 0';
1278 $sql .= ' AND entity = '. (int) $conf->entity; // MUST STAY = $conf->entity here
1279 if ($restrictioninvoiceid > 0) {
1280 $sql .= ' AND rowid = '. (int) $restrictioninvoiceid;
1281 }
1282 $sql .= $this->db->order('entity', 'ASC');
1283 //print $sql;exit;
1284 $parameters = array(
1285 'restrictioninvoiceid' => $restrictioninvoiceid,
1286 'forcevalidation' => $forcevalidation,
1287 );
1288 $reshook = $hookmanager->executeHooks('beforeCreationOfRecurringInvoices', $parameters, $sql); // note that $sql might be modified by hooks
1289
1290 $resql = $this->db->query($sql);
1291 if ($resql) {
1292 $i = 0;
1293 $num = $this->db->num_rows($resql);
1294
1295 if ($num) {
1296 $this->output .= $langs->trans('FoundXQualifiedRecurringInvoiceTemplate', $num)."\n";
1297 } else {
1298 $this->output .= $langs->trans('NoQualifiedRecurringInvoiceTemplateFound');
1299 }
1300
1301 $saventity = $conf->entity;
1302 $laststep="None";
1303
1304 while ($i < $num) { // Loop on each template invoice. If $num = 0, test is false at first pass.
1305 $line = $this->db->fetch_object($resql);
1306
1307 $this->db->begin();
1308
1309 $invoiceidgenerated = 0;
1310
1311 $new_fac_fourn = null;
1312 $facturerec = new FactureFournisseurRec($this->db);
1313 $laststep="Fetch {$line->rowid}";
1314 $facturerec->fetch($line->rowid);
1315
1316 if ($facturerec->id > 0) {
1317 // Set entity context
1318 $conf->entity = $facturerec->entity;
1319
1320 dol_syslog('createRecurringInvoices Process invoice template id=' .$facturerec->id. ', ref=' .$facturerec->ref. ', entity=' .$facturerec->entity);
1321
1322 $new_fac_fourn = new FactureFournisseur($this->db);
1323 $new_fac_fourn->fac_rec = $facturerec->id; // We will create $facture from this recurring invoice
1324 $new_fac_fourn->fk_fac_rec_source = $facturerec->id; // We will create $facture from this recurring invoice
1325
1326 $new_fac_fourn->type = self::TYPE_STANDARD;
1327 $new_fac_fourn->statut = self::STATUS_DRAFT; // deprecated
1328 $new_fac_fourn->status = self::STATUS_DRAFT;
1329 $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.
1330 $new_fac_fourn->socid = $facturerec->socid;
1331 $new_fac_fourn->lines = $facturerec->lines;
1332 $new_fac_fourn->ref_supplier = $facturerec->ref_supplier;
1333 $new_fac_fourn->model_pdf = $facturerec->model_pdf;
1334 $new_fac_fourn->fk_project = $facturerec->fk_project;
1335 $new_fac_fourn->label = $facturerec->label;
1336 $new_fac_fourn->libelle = $facturerec->label; // deprecated
1337
1338 $invoiceidgenerated = $new_fac_fourn->create($user);
1339 $laststep="Create invoiceidgenerated $invoiceidgenerated";
1340 if ($invoiceidgenerated <= 0) {
1341 $this->errors = $new_fac_fourn->errors;
1342 $this->error = $new_fac_fourn->error;
1343 $error++;
1344 }
1345 if (!$error && ($facturerec->auto_validate || $forcevalidation)) {
1346 $result = $new_fac_fourn->validate($user);
1347 $laststep = "Validate by user {$user->login}";
1348 if ($result <= 0) {
1349 $this->errors = $new_fac_fourn->errors;
1350 $this->error = $new_fac_fourn->error;
1351 $error++;
1352 }
1353 }
1354
1355 if (!$error && $facturerec->generate_pdf) {
1356 // We refresh the object in order to have all necessary data (like date_lim_reglement)
1357 $laststep = "Refresh ".$new_fac_fourn->id;
1358 $new_fac_fourn->fetch($new_fac_fourn->id);
1359 $laststep = "GenerateDocument ".$new_fac_fourn->id;
1360 $result = $new_fac_fourn->generateDocument($facturerec->model_pdf, $langs);
1361 if ($result < 0) {
1362 $this->errors = $new_fac_fourn->errors;
1363 $this->error = $new_fac_fourn->error;
1364 $error++;
1365 }
1366 }
1367 } else {
1368 $error++;
1369 $this->error = 'Failed to load invoice template with id=' .$line->rowid. ', entity=' .$conf->entity."\n";
1370 $this->errors[] = 'Failed to load invoice template with id=' .$line->rowid. ', entity=' .$conf->entity;
1371 dol_syslog('createRecurringInvoices Failed to load invoice template with id=' .$line->rowid. ', entity=' .$conf->entity);
1372 }
1373
1374 if (!$error && $invoiceidgenerated >= 0) {
1375 $facturerec->nb_gen_done++;
1376 $facturerec->date_last_gen = dol_now();
1377 $facturerec->date_when= $facturerec->getNextDate();
1378 $facturerec->update($user);
1379 $this->db->commit('createRecurringInvoices Process invoice template id=' .$facturerec->id. ', title=' .$facturerec->title);
1380 dol_syslog('createRecurringInvoices Process invoice template ' .$facturerec->title. ' is finished with a success generation');
1381 $nb_create++;
1382 $this->output .= $langs->trans('InvoiceGeneratedFromTemplate', $new_fac_fourn->ref, $facturerec->title)."\n";
1383 } else {
1384 $this->db->rollback('createRecurringInvoices Process invoice template error='.$error.' invoiceidgenerated='.$invoiceidgenerated.' LastStep='.$laststep.' id=' .$facturerec->id. ', title=' .$facturerec->title);
1385 }
1386
1387 $parameters = array(
1388 'cpt' => $i,
1389 'total' => $num,
1390 'errorCount' => $error,
1391 'invoiceidgenerated' => $invoiceidgenerated,
1392 'facturerec' => $facturerec, // it's an object which PHP passes by "reference", so modifiable by hooks.
1393 'this' => $this, // it's an object which PHP passes by "reference", so modifiable by hooks.
1394 );
1395 $reshook = $hookmanager->executeHooks('afterCreationOfRecurringInvoice', $parameters, $new_fac_fourn); // note: $facture can be modified by hooks (warning: $facture can be null)
1396
1397 $i++;
1398 }
1399
1400 $conf->entity = $saventity; // Restore entity context
1401 } else {
1402 dol_print_error($this->db);
1403 }
1404
1405 $this->output = trim($this->output);
1406
1407 return $error ? $error : 0;
1408 }
1409
1422 public function getNomUrl($withpicto = 0, $option = '', $max = 0, $short = 0, $moretitle = '', $notooltip = 0, $save_lastsearch_value = -1)
1423 {
1424 global $langs, $hookmanager;
1425
1426 $result = '';
1427
1428 $label = '<u>'.$langs->trans('RepeatableInvoice').'</u>';
1429 if (!empty($this->ref)) {
1430 $label .= '<br><b>'.$langs->trans('Ref').':</b> '.$this->ref;
1431 }
1432 if ($this->frequency > 0) {
1433 $label .= '<br><b>'.$langs->trans('Frequency').':</b> '.$langs->trans('FrequencyPer_'.$this->unit_frequency, $this->frequency);
1434 }
1435 if (!empty($this->date_last_gen)) {
1436 $label .= '<br><b>'.$langs->trans('DateLastGeneration').':</b> '.dol_print_date($this->date_last_gen, 'dayhour');
1437 }
1438 if ($this->frequency > 0) {
1439 if (!empty($this->date_when)) {
1440 $label .= '<br><b>'.$langs->trans('NextDateToExecution').':</b> ';
1441 $label .= (empty($this->suspended) ? '' : '<strike>').dol_print_date($this->date_when, 'day').(empty($this->suspended) ? '' : '</strike>'); // No hour for this property
1442 if (!empty($this->suspended)) {
1443 $label .= ' ('.$langs->trans('Disabled').')';
1444 }
1445 }
1446 }
1447
1448 $url = DOL_URL_ROOT.'/fourn/facture/card-rec.php?facid='.$this->id;
1449
1450 if ($short) {
1451 return $url;
1452 }
1453
1454 if ($option != 'nolink') {
1455 // Add param to save lastsearch_values or not
1456 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1457 if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER['PHP_SELF'])) {
1458 $add_save_lastsearch_values = 1;
1459 }
1460 if ($add_save_lastsearch_values) {
1461 $url .= '&save_lastsearch_values=1';
1462 }
1463 }
1464
1465 $linkstart = '<a href="'.$url.'" title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip">';
1466 $linkend = '</a>';
1467
1468 $result .= $linkstart;
1469 if ($withpicto) {
1470 $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);
1471 }
1472 if ($withpicto != 2) {
1473 $result .= $this->ref;
1474 }
1475 $result .= $linkend;
1476 global $action;
1477 $hookmanager->initHooks(array($this->element . 'dao'));
1478 $parameters = array('id'=>$this->id, 'getnomurl' => &$result);
1479 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1480 if ($reshook > 0) {
1481 $result = $hookmanager->resPrint;
1482 } else {
1483 $result .= $hookmanager->resPrint;
1484 }
1485 return $result;
1486 }
1487
1495 public function getLibStatut($mode = 0, $alreadypaid = -1)
1496 {
1497 return $this->LibStatut($this->frequency ? 1 : 0, $this->suspended, $mode, $alreadypaid, empty($this->type) ? 0 : $this->type);
1498 }
1499
1500 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1511 public function LibStatut($recur, $status, $mode = 0, $alreadypaid = -1, $type = 0)
1512 {
1513 // phpcs:enable
1514 global $langs;
1515 $langs->load('bills');
1516
1517 $labelStatus = $langs->transnoentitiesnoconv('Active');
1518 $statusType = 'status0';
1519
1520 //print "$recur,$status,$mode,$alreadypaid,$type";
1521 if ($mode == 0) {
1522 if ($recur) {
1523 if ($status == self::STATUS_SUSPENDED) {
1524 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1525 } else {
1526 $labelStatus = $langs->transnoentitiesnoconv('Active');
1527 }
1528 } else {
1529 if ($status == self::STATUS_SUSPENDED) {
1530 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1531 } else {
1532 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1533 }
1534 }
1535 } elseif ($mode == 1) {
1536 $prefix = 'Short';
1537 if ($recur) {
1538 if ($status == self::STATUS_SUSPENDED) {
1539 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1540 } else {
1541 $labelStatus = $langs->transnoentitiesnoconv('Active');
1542 }
1543 } else {
1544 if ($status == self::STATUS_SUSPENDED) {
1545 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1546 } else {
1547 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1548 }
1549 }
1550 } elseif ($mode == 2) {
1551 if ($recur) {
1552 if ($status == self::STATUS_SUSPENDED) {
1553 $statusType = 'status6';
1554 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1555 } else {
1556 $statusType = 'status4';
1557 $labelStatus = $langs->transnoentitiesnoconv('Active');
1558 }
1559 } else {
1560 if ($status == self::STATUS_SUSPENDED) {
1561 $statusType = 'status6';
1562 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1563 } else {
1564 $statusType = 'status0';
1565 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1566 }
1567 }
1568 } elseif ($mode == 3) {
1569 if ($recur) {
1570 $prefix = 'Short';
1571 if ($status == self::STATUS_SUSPENDED) {
1572 $statusType = 'status6';
1573 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1574 } else {
1575 $statusType = 'status4';
1576 $labelStatus = $langs->transnoentitiesnoconv('Active');
1577 }
1578 } else {
1579 if ($status == self::STATUS_SUSPENDED) {
1580 $statusType = 'status6';
1581 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1582 } else {
1583 $statusType = 'status0';
1584 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1585 }
1586 }
1587 } elseif ($mode == 4) {
1588 $prefix = '';
1589 if ($recur) {
1590 if ($status == self::STATUS_SUSPENDED) {
1591 $statusType = 'status6';
1592 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1593 } else {
1594 $statusType = 'status4';
1595 $labelStatus = $langs->transnoentitiesnoconv('Active');
1596 }
1597 } else {
1598 if ($status == self::STATUS_SUSPENDED) {
1599 $statusType = 'status6';
1600 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1601 } else {
1602 $statusType = 'status0';
1603 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1604 }
1605 }
1606 } elseif ($mode == 5 || $mode == 6) {
1607 $prefix = '';
1608 if ($mode == 5) {
1609 $prefix = 'Short';
1610 }
1611 if ($recur) {
1612 if ($status == self::STATUS_SUSPENDED) {
1613 $statusType = 'status6';
1614 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1615 } else {
1616 $statusType = 'status4';
1617 $labelStatus = $langs->transnoentitiesnoconv('Active');
1618 }
1619 } else {
1620 if ($status == self::STATUS_SUSPENDED) {
1621 $statusType = 'status6';
1622 $labelStatus = $langs->transnoentitiesnoconv('Disabled');
1623 } else {
1624 $statusType = 'status0';
1625 $labelStatus = $langs->transnoentitiesnoconv('Draft');
1626 }
1627 }
1628 }
1629
1630 $labelStatusShort = $labelStatus;
1631
1632 return dolGetStatus($labelStatus, $labelStatusShort, '', $statusType, $mode);
1633 }
1634
1643 public function initAsSpecimen($option = '')
1644 {
1645 global $user, $langs, $conf;
1646
1647 $now = dol_now();
1648 $arraynow = dol_getdate($now);
1649 $nownotime = dol_mktime(0, 0, 0, $arraynow['mon'], $arraynow['mday'], $arraynow['year']);
1650
1651 // Load array of products prodids
1652 $num_prods = 0;
1653 $prodids = array();
1654
1655 $sql = 'SELECT rowid';
1656 $sql .= ' FROM ' .MAIN_DB_PREFIX. 'product';
1657 $sql .= ' WHERE entity IN (' .getEntity('product'). ')';
1658 $sql .= $this->db->plimit(100);
1659
1660 $resql = $this->db->query($sql);
1661 if ($resql) {
1662 $num_prods = $this->db->num_rows($resql);
1663 $i = 0;
1664 while ($i < $num_prods) {
1665 $i++;
1666 $row = $this->db->fetch_row($resql);
1667 $prodids[$i] = $row[0];
1668 }
1669 }
1670
1671 // Initialize parameters
1672 $this->id = 0;
1673 $this->ref = 'SPECIMEN';
1674 $this->title = 'SPECIMEN';
1675 $this->specimen = 1;
1676 $this->socid = 1;
1677 $this->date = $nownotime;
1678 $this->date_lim_reglement = $nownotime + 3600 * 24 * 30;
1679 $this->cond_reglement_id = 1;
1680 $this->cond_reglement_code = 'RECEP';
1681 $this->date_lim_reglement = $this->calculate_date_lim_reglement();
1682 $this->mode_reglement_id = 0; // Not forced to show payment mode CHQ + VIR
1683 $this->mode_reglement_code = ''; // Not forced to show payment mode CHQ + VIR
1684 $this->note_public = 'This is a comment (public)';
1685 $this->note_private = 'This is a comment (private)';
1686 $this->note = 'This is a comment (private)';
1687 $this->fk_incoterms = 0;
1688 $this->location_incoterms = '';
1689
1690 if (empty($option) || $option != 'nolines') {
1691 // Lines
1692 $nbp = 5;
1693 $xnbp = 0;
1694 while ($xnbp < $nbp) {
1695 $line = new FactureLigne($this->db);
1696 $line->desc = $langs->trans('Description'). ' ' .$xnbp;
1697 $line->qty = 1;
1698 $line->subprice = 100;
1699 $line->tva_tx = 19.6;
1700 $line->localtax1_tx = 0;
1701 $line->localtax2_tx = 0;
1702 $line->remise_percent = 0;
1703 if ($xnbp == 1) { // Qty is negative (product line)
1704 $prodid = mt_rand(1, $num_prods);
1705 $line->fk_product = $prodids[$prodid];
1706 $line->qty = -1;
1707 $line->total_ht = -100;
1708 $line->total_ttc = -119.6;
1709 $line->total_tva = -19.6;
1710 } elseif ($xnbp == 2) { // UP is negative (free line)
1711 $line->subprice = -100;
1712 $line->total_ht = -100;
1713 $line->total_ttc = -119.6;
1714 $line->total_tva = -19.6;
1715 $line->remise_percent = 0;
1716 } elseif ($xnbp == 3) { // Discount is 50% (product line)
1717 $prodid = mt_rand(1, $num_prods);
1718 $line->fk_product = $prodids[$prodid];
1719 $line->total_ht = 50;
1720 $line->total_ttc = 59.8;
1721 $line->total_tva = 9.8;
1722 $line->remise_percent = 50;
1723 } else { // (product line)
1724 $prodid = mt_rand(1, $num_prods);
1725 $line->fk_product = $prodids[$prodid];
1726 $line->total_ht = 100;
1727 $line->total_ttc = 119.6;
1728 $line->total_tva = 19.6;
1729 $line->remise_percent = 00;
1730 }
1731
1732 $this->lines[$xnbp] = $line;
1733 $xnbp++;
1734
1735 $this->total_ht += $line->total_ht;
1736 $this->total_tva += $line->total_tva;
1737 $this->total_ttc += $line->total_ttc;
1738 }
1739 $this->revenuestamp = 0;
1740
1741 // Add a line "offered"
1742 $line = new FactureLigne($this->db);
1743 $line->desc = $langs->trans('Description'). ' (offered line)';
1744 $line->qty = 1;
1745 $line->subprice = 100;
1746 $line->tva_tx = 19.6;
1747 $line->localtax1_tx = 0;
1748 $line->localtax2_tx = 0;
1749 $line->remise_percent = 100;
1750 $line->total_ht = 0;
1751 $line->total_ttc = 0; // 90 * 1.196
1752 $line->total_tva = 0;
1753 $prodid = mt_rand(1, $num_prods);
1754 $line->fk_product = $prodids[$prodid];
1755
1756 $this->lines[$xnbp] = $line;
1757 $xnbp++;
1758 }
1759
1760 $this->usenewprice = 0;
1761 }
1762
1771 public static function replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
1772 {
1773 $tables = array(
1774 'facture_fourn_rec'
1775 );
1776
1777 return CommonObject::commonReplaceThirdparty($dbs, $origin_id, $dest_id, $tables);
1778 }
1779
1787 public function setFrequencyAndUnit($frequency, $unit)
1788 {
1789 if (!$this->table_element) {
1790 dol_syslog(get_class($this). '::setFrequencyAndUnit was called on objet with property table_element not defined', LOG_ERR);
1791 return -1;
1792 }
1793
1794 if (!empty($frequency) && empty($unit)) {
1795 dol_syslog(get_class($this). '::setFrequencyAndUnit was called on objet with params frequency defined but unit not defined', LOG_ERR);
1796 return -2;
1797 }
1798
1799 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1800 $sql .= " SET frequency = ".($frequency ? ((int) $frequency) : "NULL");
1801 if (!empty($unit)) {
1802 $sql .= ", unit_frequency = '".$this->db->escape($unit)."'";
1803 }
1804 $sql .= " WHERE rowid = ".((int) $this->id);
1805
1806 dol_syslog(get_class($this).'::setFrequencyAndUnit', LOG_DEBUG);
1807
1808 if ($this->db->query($sql)) {
1809 $this->frequency = $frequency;
1810 if (!empty($unit)) {
1811 $this->unit_frequency = $unit;
1812 }
1813 return 1;
1814 } else {
1815 $this->error = $this->db->lasterror();
1816 return -1;
1817 }
1818 }
1819
1827 public function setNextDate($date, $increment_nb_gen_done = 0)
1828 {
1829 if (!$this->table_element) {
1830 dol_syslog(get_class($this).'::setNextDate was called on objet with property table_element not defined', LOG_ERR);
1831 return -1;
1832 }
1833 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1834 $sql .= " SET date_when = " .($date ? "'".$this->db->idate($date)."'" : "NULL");
1835 if ($increment_nb_gen_done > 0) {
1836 $sql .= ", nb_gen_done = nb_gen_done + 1";
1837 }
1838 $sql .= " WHERE rowid = " . (int) $this->id;
1839
1840 dol_syslog(get_class($this).'::setNextDate', LOG_DEBUG);
1841
1842 if ($this->db->query($sql)) {
1843 $this->date_when = $date;
1844 if ($increment_nb_gen_done > 0) {
1845 $this->nb_gen_done++;
1846 }
1847 return 1;
1848 } else {
1849 $this->error = $this->db->lasterror();
1850 return -1;
1851 }
1852 }
1853
1860 public function setMaxPeriod($nb)
1861 {
1862 if (!$this->table_element) {
1863 dol_syslog(get_class($this).'::setMaxPeriod was called on objet with property table_element not defined', LOG_ERR);
1864 return -1;
1865 }
1866
1867 if (empty($nb)) {
1868 $nb = 0;
1869 }
1870
1871 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1872 $sql .= " SET nb_gen_max = ". (int) $nb;
1873 $sql .= " WHERE rowid = " . (int) $this->id;
1874
1875 dol_syslog(get_class($this).'::setMaxPeriod', LOG_DEBUG);
1876
1877 if ($this->db->query($sql)) {
1878 $this->nb_gen_max = $nb;
1879 return 1;
1880 } else {
1881 dol_print_error($this->db);
1882 return -1;
1883 }
1884 }
1885
1892 public function setAutoValidate($validate)
1893 {
1894 if (!$this->table_element) {
1895 dol_syslog(get_class($this).'::setAutoValidate was called on objet with property table_element not defined', LOG_ERR);
1896 return -1;
1897 }
1898
1899 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1900 $sql .= " SET auto_validate = ".((int) $validate);
1901 $sql .= " WHERE rowid = " . (int) $this->id;
1902
1903 dol_syslog(get_class($this).'::setAutoValidate', LOG_DEBUG);
1904
1905 if ($this->db->query($sql)) {
1906 $this->auto_validate = $validate;
1907 return 1;
1908 } else {
1909 dol_print_error($this->db);
1910 return -1;
1911 }
1912 }
1913
1920 public function setGeneratePdf($validate)
1921 {
1922 if (!$this->table_element) {
1923 dol_syslog(get_class($this).'::setGeneratePdf was called on objet with property table_element not defined', LOG_ERR);
1924 return -1;
1925 }
1926
1927 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1928 $sql .= " SET generate_pdf = ". (int) $validate;
1929 $sql .= " WHERE rowid = " . (int) $this->id;
1930
1931 dol_syslog(get_class($this).'::setGeneratePdf', LOG_DEBUG);
1932
1933 if ($this->db->query($sql)) {
1934 $this->generate_pdf = $validate;
1935 return 1;
1936 } else {
1937 dol_print_error($this->db);
1938 return -1;
1939 }
1940 }
1941
1948 public function setModelPdf($model)
1949 {
1950 if (!$this->table_element) {
1951 dol_syslog(get_class($this).'::setModelPdf was called on objet with property table_element not defined', LOG_ERR);
1952 return -1;
1953 }
1954
1955 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1956 $sql .= " SET modelpdf = '".$this->db->escape($model)."'";
1957 $sql .= " WHERE rowid = " . (int) $this->id;
1958
1959 dol_syslog(get_class($this).'::setModelPdf', LOG_DEBUG);
1960
1961 if ($this->db->query($sql)) {
1962 $this->model_pdf = $model;
1963 return 1;
1964 } else {
1965 dol_print_error($this->db);
1966 return -1;
1967 }
1968 }
1969}
1970
1971
1972
1978{
1982 public $element = 'invoice_supplier_det_rec';
1983
1987 public $table_element = 'facture_fourn_det_rec';
1988
1989 public $fk_facture_fourn;
1990 public $fk_parent;
1991 public $fk_product;
1992 public $ref_supplier;
1993 public $label;
1994 public $description;
1995 public $pu_ht;
1996 public $pu_ttc;
1997 public $qty;
1998 public $remise_percent;
1999 public $fk_remise_except;
2000 public $vat_src_code;
2001 public $tva_tx;
2002 public $localtax1_tx;
2003 public $localtax1_type;
2004 public $localtax2_tx;
2005 public $localtax2_type;
2006
2007 public $product_type;
2008 public $date_start;
2009 public $date_end;
2010 public $info_bits;
2011 public $special_code;
2012 public $rang;
2013
2014 public $fk_user_author;
2015 public $fk_user_modif;
2016
2017
2025 public function delete(User $user, $notrigger = 0)
2026 {
2027 $error = 0;
2028 $this->db->begin();
2029
2030 if (! $error) {
2031 if (! $notrigger) {
2032 // Call triggers
2033 $result = $this->call_trigger('LINESUPPLIERBILLREC_DELETE', $user);
2034 if ($result < 0) {
2035 $error++;
2036 } // Do also here what you must do to rollback action if trigger fail
2037 // End call triggers
2038 }
2039 }
2040
2041 if (! $error) {
2042 $result = $this->deleteExtraFields();
2043 if ($result < 0) {
2044 $error++;
2045 }
2046 }
2047
2048 if (! $error) {
2049 $sql = 'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element . ' WHERE rowid=' . (int) $this->id;
2050
2051 $res = $this->db->query($sql);
2052 if ($res === false) {
2053 $error++;
2054 $this->errors[] = $this->db->lasterror();
2055 }
2056 }
2057
2058 // Commit or rollback
2059 if ($error) {
2060 $this->db->rollback();
2061 return -1;
2062 } else {
2063 $this->db->commit();
2064 return 1;
2065 }
2066 }
2067
2068
2075 public function fetch($rowid)
2076 {
2077 $sql = 'SELECT l.rowid,';
2078 $sql .= ' l.fk_facture_fourn, l.fk_parent_line, l.fk_product,';
2079 $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,';
2080 $sql .= ' l.vat_src_code, l.tva_tx, l.localtax1_tx, l.localtax1_type, l.localtax2_tx, l.localtax2_type,';
2081 $sql .= ' l.total_ht, l.total_tva, l.total_localtax1, l.total_localtax2, l.total_ttc,';
2082 $sql .= ' l.product_type, l.date_start, l.date_end,';
2083 $sql .= ' l.info_bits, l.special_code, l.rang, l.fk_unit, l.import_key,';
2084 $sql .= ' l.fk_user_author, l.fk_user_modif, l.fk_multicurrency,';
2085 $sql .= ' l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
2086 $sql .= ' p.ref as product_ref, p.fk_product_type as fk_product_type, p.label as product_label, p.description as product_desc';
2087 $sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn_det_rec as l';
2088 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON l.fk_product = p.rowid';
2089 $sql .= ' WHERE l.rowid = '. (int) $rowid;
2090 $sql .= ' ORDER BY l.rang';
2091
2092 dol_syslog('FactureRec::fetch', LOG_DEBUG);
2093 $result = $this->db->query($sql);
2094 if ($result) {
2095 $objp = $this->db->fetch_object($result);
2096
2097 $this->id = $objp->rowid;
2098 $this->fk_facture_fourn = $objp->fk_facture_fourn;
2099 $this->fk_parent = $objp->fk_parent_line;
2100 $this->fk_product = $objp->fk_product;
2101 $this->ref_supplier = $objp->ref_supplier;
2102 $this->label = $objp->label;
2103 $this->description = $objp->description;
2104 $this->pu_ht = $objp->pu_ht;
2105 $this->pu_ttc = $objp->pu_ttc;
2106 $this->qty = $objp->qty;
2107 $this->remise_percent = $objp->remise_percent;
2108 $this->fk_remise_except = $objp->fk_remise_except;
2109 $this->vat_src_code = $objp->vat_src_code;
2110 $this->tva_tx = $objp->tva_tx;
2111 $this->localtax1_tx = $objp->localtax1_tx;
2112 $this->localtax1_type = $objp->localtax1_type;
2113 $this->localtax2_tx = $objp->localtax2_tx;
2114 $this->localtax2_type = $objp->localtax2_type;
2115 $this->total_ht = $objp->total_ht;
2116 $this->total_tva = $objp->total_tva;
2117 $this->total_localtax1 = $objp->total_localtax1;
2118 $this->total_localtax2 = $objp->total_localtax2;
2119 $this->total_ttc = $objp->total_ttc;
2120 $this->product_type = $objp->product_type;
2121 $this->date_start = $this->db->jdate($objp->date_start);
2122 $this->date_end = $this->db->jdate($objp->date_end);
2123 $this->info_bits = $objp->info_bits;
2124 $this->special_code = $objp->special_code;
2125 $this->rang = $objp->rang;
2126 $this->fk_unit = $objp->fk_unit;
2127 $this->import_key = $objp->import_key;
2128 $this->fk_user_author = $objp->fk_user_author;
2129 $this->fk_user_modif = $objp->fk_user_modif;
2130 $this->fk_multicurrency = $objp->fk_multicurrency;
2131 $this->multicurrency_code = $objp->multicurrency_code;
2132 $this->multicurrency_subprice = $objp->multicurrency_subprice;
2133 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
2134 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
2135 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2136
2137 $this->db->free($result);
2138 return 1;
2139 } else {
2140 $this->error = $this->db->lasterror();
2141 return -3;
2142 }
2143 }
2144
2145
2153 public function update(User $user, $notrigger = 0)
2154 {
2155 global $conf;
2156
2157 $error = 0;
2158
2159 include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
2160
2161 $sql = 'UPDATE ' . MAIN_DB_PREFIX . 'facture_fourn_det_rec SET';
2162 $sql .= ' fk_facture_fourn = ' . (int) $this->fk_facture_fourn;
2163 $sql .= ', fk_parent_line = ' . (int) $this->fk_parent;
2164 $sql .= ', fk_product = ' . (int) $this->fk_product;
2165 $sql .= ', ref = ' . (!empty($this->ref) ? "'" . $this->db->escape($this->ref) . "'" : 'NULL');
2166 $sql .= ", label = " . (!empty($this->label) ? "'" . $this->db->escape($this->label) . "'" : 'NULL');
2167 $sql .= ", description = '" . $this->db->escape($this->description) . "'";
2168 $sql .= ', pu_ht = ' . price2num($this->pu_ht);
2169 $sql .= ', pu_ttc = ' . price2num($this->pu_ttc);
2170 $sql .= ', qty = ' . price2num($this->qty);
2171 $sql .= ", remise_percent = '" . price2num($this->remise_percent) . "'";
2172 $sql .= ', fk_remise_except = ' . (int) $this->fk_remise_except;
2173 $sql .= ", vat_src_code = '" . $this->db->escape($this->vat_src_code) . "'";
2174 $sql .= ', tva_tx = ' . price2num($this->tva_tx);
2175 $sql .= ', localtax1_tx = ' . price2num($this->localtax1_tx);
2176 $sql .= ", localtax1_type = '" . $this->db->escape($this->localtax1_type) . "'";
2177 $sql .= ', localtax2_tx = ' . price2num($this->localtax2_tx);
2178 $sql .= ", localtax2_type = '" . $this->db->escape($this->localtax2_type) . "'";
2179 if (empty($this->skip_update_total)) {
2180 $sql .= ', total_ht = ' . price2num($this->total_ht);
2181 $sql .= ', total_tva = ' . price2num($this->total_tva);
2182 $sql .= ', total_localtax1 = ' . price2num($this->total_localtax1);
2183 $sql .= ', total_localtax2 = ' . price2num($this->total_localtax2);
2184 $sql .= ', total_ttc = ' . price2num($this->total_ttc);
2185 }
2186 $sql .= ', product_type = ' . (int) $this->product_type;
2187 $sql .= ', date_start = ' . (int) $this->date_start;
2188 $sql .= ', date_end = ' . (int) $this->date_end;
2189 $sql .= ", info_bits = " . ((int) $this->info_bits);
2190 $sql .= ', special_code =' . (int) $this->special_code;
2191 $sql .= ', rang = ' . (int) $this->rang;
2192 $sql .= ', fk_unit = ' .($this->fk_unit ? "'".$this->db->escape($this->fk_unit)."'" : 'null');
2193 $sql .= ', fk_user_modif = ' . (int) $user->id;
2194 $sql .= ' WHERE rowid = ' . (int) $this->id;
2195
2196 $this->db->begin();
2197
2198 dol_syslog(get_class($this). '::updateline', LOG_DEBUG);
2199 $resql = $this->db->query($sql);
2200 if ($resql) {
2201 if (!$error) {
2202 $result = $this->insertExtraFields();
2203 if ($result < 0) {
2204 $error++;
2205 }
2206 }
2207
2208 if (!$error && !$notrigger) {
2209 // Call trigger
2210 $result = $this->call_trigger('LINESUPPLIERBILLREC_MODIFY', $user);
2211 if ($result < 0) {
2212 $error++;
2213 }
2214 // End call triggers
2215 }
2216
2217 if ($error) {
2218 $this->db->rollback();
2219 return -2;
2220 } else {
2221 $this->db->commit();
2222 return 1;
2223 }
2224 } else {
2225 $this->error = $this->db->lasterror();
2226 $this->db->rollback();
2227 return -2;
2228 }
2229 }
2230}
$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