31 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
32 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
33 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.class.php';
34 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
42 const TRIGGER_PREFIX =
'SUPPLIERBILLREC';
46 public $element =
'invoice_supplier_rec';
51 public $table_element =
'facture_fourn_rec';
56 public $table_element_line =
'facture_fourn_det_rec';
61 public $fk_element =
'fk_facture_fourn';
66 public $picto =
'bill';
103 public $mode_reglement_id;
104 public $mode_reglement_code;
105 public $cond_reglement_code;
106 public $cond_reglement_doc;
107 public $cond_reglement_id;
109 public $date_lim_reglement;
111 public $fk_multicurrency;
112 public $multicurrency_code;
113 public $multicurrency_tx;
114 public $multicurrency_total_ht;
115 public $multicurrency_total_tva;
116 public $multicurrency_total_ttc;
118 public $usenewprice = 0;
120 public $unit_frequency;
122 public $date_last_gen;
125 public $auto_validate;
126 public $generate_pdf;
134 public $lines = array();
179 public $fields = array(
180 'rowid' =>array(
'type'=>
'integer',
'label'=>
'TechnicalID',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>10),
181 'titre' =>array(
'type'=>
'varchar(100)',
'label'=>
'Titre',
'enabled'=>1,
'showoncombobox' => 1,
'visible'=>-1,
'position'=>15),
182 'ref_supplier' =>array(
'type'=>
'varchar(180)',
'label'=>
'RefSupplier',
'enabled'=>1,
'showoncombobox' => 1,
'visible'=>-1,
'position'=>20),
183 'entity' =>array(
'type'=>
'integer',
'label'=>
'Entity',
'default'=>1,
'enabled'=>1,
'visible'=>-2,
'notnull'=>1,
'position'=>25,
'index'=>1),
184 'fk_soc' =>array(
'type'=>
'integer:Societe:societe/class/societe.class.php',
'label'=>
'ThirdParty',
'enabled'=>
'isModEnabled("societe")',
'visible'=>-1,
'notnull'=>1,
'position'=>30),
185 'datec' =>array(
'type'=>
'datetime',
'label'=>
'DateCreation',
'enabled'=>1,
'visible'=>-1,
'position'=>35),
186 'tms' =>array(
'type'=>
'timestamp',
'label'=>
'DateModification',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>40),
187 'suspended' =>array(
'type'=>
'integer',
'label'=>
'Suspended',
'enabled'=>1,
'visible'=>-1,
'position'=>225),
188 'libelle' =>array(
'type'=>
'varchar(100)',
'label'=>
'Libelle',
'enabled'=>1,
'showoncombobox' => 0,
'visible'=>-1,
'position'=>15),
190 'localtax1' =>array(
'type'=>
'double(24,8)',
'label'=>
'Localtax1',
'enabled'=>1,
'visible'=>-1,
'position'=>60,
'isameasure'=>1),
191 'localtax2' =>array(
'type'=>
'double(24,8)',
'label'=>
'Localtax2',
'enabled'=>1,
'visible'=>-1,
'position'=>65,
'isameasure'=>1),
192 'total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'Total',
'enabled'=>1,
'visible'=>-1,
'position'=>70,
'isameasure'=>1),
193 'total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'Tva',
'enabled'=>1,
'visible'=>-1,
'position'=>55,
'isameasure'=>1),
194 'total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'Total ttc',
'enabled'=>1,
'visible'=>-1,
'position'=>75,
'isameasure'=>1),
196 'fk_user_author' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'Fk user author',
'enabled'=>1,
'visible'=>-1,
'position'=>80),
197 'fk_user_modif' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserModif',
'enabled'=>1,
'visible'=>-2,
'notnull'=>-1,
'position'=>210),
198 '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),
199 'fk_account' =>array(
'type'=>
'integer',
'label'=>
'Fk account',
'enabled'=>
'isModEnabled("banque")',
'visible'=>-1,
'position'=>175),
200 'fk_cond_reglement' =>array(
'type'=>
'integer',
'label'=>
'Fk cond reglement',
'enabled'=>1,
'visible'=>-1,
'position'=>90),
201 'fk_mode_reglement' =>array(
'type'=>
'integer',
'label'=>
'Fk mode reglement',
'enabled'=>1,
'visible'=>-1,
'position'=>95),
202 'date_lim_reglement' =>array(
'type'=>
'date',
'label'=>
'Date lim reglement',
'enabled'=>1,
'visible'=>-1,
'position'=>100),
204 'note_private' =>array(
'type'=>
'html',
'label'=>
'NotePublic',
'enabled'=>1,
'visible'=>0,
'position'=>105),
205 'note_public' =>array(
'type'=>
'html',
'label'=>
'NotePrivate',
'enabled'=>1,
'visible'=>0,
'position'=>110),
206 'modelpdf' =>array(
'type'=>
'varchar(255)',
'label'=>
'Modelpdf',
'enabled'=>1,
'visible'=>-1,
'position'=>115),
208 'fk_multicurrency' =>array(
'type'=>
'integer',
'label'=>
'Fk multicurrency',
'enabled'=>1,
'visible'=>-1,
'position'=>180),
209 'multicurrency_code' =>array(
'type'=>
'varchar(255)',
'label'=>
'Multicurrency code',
'enabled'=>1,
'visible'=>-1,
'position'=>185),
210 'multicurrency_tx' =>array(
'type'=>
'double(24,8)',
'label'=>
'Multicurrency tx',
'enabled'=>1,
'visible'=>-1,
'position'=>190,
'isameasure'=>1),
211 'multicurrency_total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'Multicurrency total ht',
'enabled'=>1,
'visible'=>-1,
'position'=>195,
'isameasure'=>1),
212 'multicurrency_total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'Multicurrency total tva',
'enabled'=>1,
'visible'=>-1,
'position'=>200,
'isameasure'=>1),
213 'multicurrency_total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'Multicurrency total ttc',
'enabled'=>1,
'visible'=>-1,
'position'=>205,
'isameasure'=>1),
215 'usenewprice' =>array(
'type'=>
'integer',
'label'=>
'UseNewPrice',
'enabled'=>1,
'visible'=>0,
'position'=>155),
216 'frequency' =>array(
'type'=>
'integer',
'label'=>
'Frequency',
'enabled'=>1,
'visible'=>-1,
'position'=>150),
217 'unit_frequency' =>array(
'type'=>
'varchar(2)',
'label'=>
'Unit frequency',
'enabled'=>1,
'visible'=>-1,
'position'=>125),
219 'date_when' =>array(
'type'=>
'datetime',
'label'=>
'Date when',
'enabled'=>1,
'visible'=>-1,
'position'=>130),
220 'date_last_gen' =>array(
'type'=>
'datetime',
'label'=>
'Date last gen',
'enabled'=>1,
'visible'=>-1,
'position'=>135),
221 'nb_gen_done' =>array(
'type'=>
'integer',
'label'=>
'Nb gen done',
'enabled'=>1,
'visible'=>-1,
'position'=>140),
222 'nb_gen_max' =>array(
'type'=>
'integer',
'label'=>
'Nb gen max',
'enabled'=>1,
'visible'=>-1,
'position'=>145),
223 'revenuestamp' =>array(
'type'=>
'double(24,8)',
'label'=>
'RevenueStamp',
'enabled'=>1,
'visible'=>-1,
'position'=>160,
'isameasure'=>1),
224 'auto_validate' =>array(
'type'=>
'integer',
'label'=>
'Auto validate',
'enabled'=>1,
'visible'=>-1,
'position'=>165),
225 'generate_pdf' =>array(
'type'=>
'integer',
'label'=>
'Generate pdf',
'enabled'=>1,
'visible'=>-1,
'position'=>170),
230 const STATUS_NOTSUSPENDED = 0;
231 const STATUS_SUSPENDED = 1;
253 public function create($user, $facFournId, $notrigger = 0)
261 $this->titre = empty($this->titre) ?
'' : $this->titre;
263 $this->
ref = $this->$keyforref;
264 $this->ref_supplier = empty($this->ref_supplier) ?
'' : $this->ref_supplier;
265 $this->usenewprice = empty($this->usenewprice) ? 0 : $this->usenewprice;
266 $this->suspended = empty($this->suspended) ? 0 : $this->suspended;
268 if (empty($this->frequency)) {
269 $this->frequency = 0;
270 $this->date_when =
null;
272 $this->frequency = abs($this->frequency);
273 $this->nb_gen_done = 0;
274 $this->nb_gen_max = empty($this->nb_gen_max) ? 0 : $this->nb_gen_max;
275 $this->auto_validate = empty($this->auto_validate) ? 0 : $this->auto_validate;
276 $this->generate_pdf = empty($this->generate_pdf) ? 0 : $this->generate_pdf;
282 $result = $facfourn_src->fetch($facFournId);
284 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'facture_fourn_rec (';
286 $sql .=
', ref_supplier';
290 $sql .=
', suspended';
292 $sql .=
', total_ttc';
293 $sql .=
', fk_user_author';
294 $sql .=
', fk_projet';
295 $sql .=
', fk_account';
296 $sql .=
', fk_cond_reglement';
297 $sql .=
', fk_mode_reglement';
298 $sql .=
', date_lim_reglement';
299 $sql .=
', note_private';
300 $sql .=
', note_public';
301 $sql .=
', modelpdf';
302 $sql .=
', fk_multicurrency';
303 $sql .=
', multicurrency_code';
304 $sql .=
', multicurrency_tx';
305 $sql .=
', usenewprice';
306 $sql .=
', frequency';
307 $sql .=
', unit_frequency';
308 $sql .=
', date_when';
309 $sql .=
', date_last_gen';
310 $sql .=
', nb_gen_done';
311 $sql .=
', nb_gen_max';
312 $sql .=
', auto_validate';
313 $sql .=
', generate_pdf';
314 $sql .=
') VALUES (';
315 $sql .=
"'".$this->db->escape($this->titre).
"'";
316 $sql .=
", '".$this->db->escape($this->ref_supplier).
"'";
317 $sql .=
", ".((int) $conf->entity);
318 $sql .=
", ".((int) $facfourn_src->socid);
319 $sql .=
", '".$this->db->idate($now).
"'";
320 $sql .=
", ".((int) $this->suspended);
321 $sql .=
", '".$this->db->escape($this->libelle).
"'";
322 $sql .=
", " .(!empty($facfourn_src->total_ttc) ? (
float) $facfourn_src->total_ttc :
'0');
323 $sql .=
", " .((int) $user->id);
324 $sql .=
", " .(!empty($this->fk_project) ? ((int) $this->fk_project) :
'NULL');
325 $sql .=
", " .(!empty($facfourn_src->fk_account) ? ((int) $facfourn_src->fk_account) :
'NULL');
326 $sql .=
", " .($this->cond_reglement_id > 0 ? (int) $this->cond_reglement_id :
'NULL');
327 $sql .=
", " .($this->mode_reglement_id > 0 ? (int) $this->mode_reglement_id :
'NULL');
328 $sql .=
", ".($facfourn_src->date_echeance > 0 ?
"'".$this->db->idate($facfourn_src->date_echeance).
"'" :
'NULL');
329 $sql .=
", " .(!empty($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
'NULL');
330 $sql .=
", " .(!empty($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
'NULL');
331 $sql .=
", " .(!empty($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
'NULL');
332 $sql .=
", " . (int) $facfourn_src->fk_multicurrency;
333 $sql .=
", '".$this->db->escape($facfourn_src->multicurrency_code).
"'";
334 $sql .=
", " . (
float) $facfourn_src->multicurrency_tx;
335 $sql .=
", " . (
int) $this->usenewprice;
336 $sql .=
", " . (int) $this->frequency;
337 $sql .=
", '".$this->db->escape($this->unit_frequency).
"'";
338 $sql .=
", " .(!empty($this->date_when) ?
"'".$this->db->idate($this->date_when).
"'" :
'NULL');
339 $sql .=
", " .(!empty($this->date_last_gen) ?
"'".$this->db->idate($this->date_last_gen).
"'" :
'NULL');
340 $sql .=
", " . (int) $this->nb_gen_done;
341 $sql .=
", " . (int) $this->nb_gen_max;
342 $sql .=
", " . (int) $this->auto_validate;
343 $sql .=
", " . (int) $this->generate_pdf;
346 if ($this->db->query(
$sql)) {
347 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn_rec');
350 $this->fk_multicurrency = $facfourn_src->fk_multicurrency;
352 $this->multicurrency_code = $facfourn_src->multicurrency_code;
353 $this->multicurrency_tx = $facfourn_src->multicurrency_tx;
356 $num = count($facfourn_src->lines);
357 for ($i = 0; $i < $num; $i++) {
358 $tva_tx = $facfourn_src->lines[$i]->tva_tx;
359 if (!empty($facfourn_src->lines[$i]->vat_src_code) && !preg_match(
'/\(/', $tva_tx)) {
360 $tva_tx .=
' ('.$facfourn_src->lines[$i]->vat_src_code.
')';
363 $result_insert = $this->
addline(
364 $facfourn_src->lines[$i]->fk_product,
365 $facfourn_src->lines[$i]->ref_supplier,
366 $facfourn_src->lines[$i]->label,
367 $facfourn_src->lines[$i]->description,
368 $facfourn_src->lines[$i]->pu_ht,
369 $facfourn_src->lines[$i]->pu_ttc,
370 $facfourn_src->lines[$i]->qty,
371 $facfourn_src->lines[$i]->remise_percent,
373 $facfourn_src->lines[$i]->localtax1_tx,
374 $facfourn_src->lines[$i]->localtax2_tx,
376 $facfourn_src->lines[$i]->product_type,
377 $facfourn_src->lines[$i]->date_start,
378 $facfourn_src->lines[$i]->date_end,
379 $facfourn_src->lines[$i]->info_bits,
380 $facfourn_src->lines[$i]->special_code,
381 $facfourn_src->lines[$i]->rang,
382 $facfourn_src->lines[$i]->fk_unit
385 if ($result_insert < 0) {
390 $result2 = $objectline->fetch($result_insert);
393 if (method_exists($facfourn_src->lines[$i],
'fetch_optionals')) {
394 $facfourn_src->lines[$i]->fetch_optionals($facfourn_src->lines[$i]->id);
395 $objectline->array_options = $facfourn_src->lines[$i]->array_options;
398 $result = $objectline->insertExtraFields();
402 } elseif ($result2 < 0) {
403 $this->errors[] = $objectline->error;
409 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
410 $this->linked_objects = $this->linkedObjectsIds;
414 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
415 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
416 if (is_array($tmp_origin_id)) {
417 foreach ($tmp_origin_id as $origin_id) {
420 $this->error = $this->db->lasterror();
426 $origin_id = $tmp_origin_id;
429 $this->error = $this->db->lasterror();
443 if (!$error && !$notrigger) {
445 $result = $this->
call_trigger(
'SUPPLIERBILLREC_CREATE', $user);
447 $this->db->rollback();
454 $this->db->rollback();
461 $this->error = $this->db->lasterror();
462 $this->db->rollback();
466 $this->db->rollback();
485 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn_rec SET";
486 $sql .=
" titre = '" . (!empty($this->titre) ? $this->db->escape($this->titre) :
"").
"'," ;
487 $sql .=
" ref_supplier = '". (!empty($this->ref_supplier) ? $this->db->escape($this->ref_supplier) :
"").
"',";
488 $sql .=
" entity = ". (!empty($this->entity) ? ((int) $this->entity) : 1) .
',';
489 if ($this->fk_soc > 0)
$sql .=
" fk_soc = ". (int) $this->fk_soc.
',';
490 $sql .=
" suspended = ". (!empty($this->suspended) ? ((int) $this->suspended) : 0) .
',';
491 $sql .=
" libelle = ". (!empty($this->libelle) ?
"'".$this->db->escape($this->libelle).
"'" :
'NULL') .
",";
492 $sql .=
" vat_src_code = ". (!empty($this->vat_src_code) ?
"'".$this->db->escape($this->vat_src_code).
"'" :
'NULL') .
',';
493 $sql .=
" localtax1 = ". (!empty($this->localtax1) ? ((
float) $this->localtax1) : 0.00) .
',';
494 $sql .=
" localtax2 = ". (!empty($this->localtax2) ? ((
float) $this->localtax2) : 0.00) .
',';
495 $sql .=
" total_ht = ". (!empty($this->total_ht) ? ((
float) $this->total_ht) : 0.00) .
',';
496 $sql .=
" total_tva = ". (!empty($this->total_tva) ? ((
float) $this->total_tva) : 0.00) .
',';
497 $sql .=
" total_ttc = ". (!empty($this->total_ttc) ? ((
float) $this->total_ttc) : 0.00) .
',';
498 $sql .=
" fk_user_modif = ". ((int) $user->id) .
',';
499 $sql .=
" fk_projet = ". (!empty($this->fk_project) ? ((int) $this->fk_project) :
'NULL') .
',';
500 $sql .=
" fk_account = ". (!empty($this->fk_account) ? ((int) $this->fk_account) :
'NULL') .
',';
501 $sql .=
" fk_mode_reglement = ". (!empty($this->mode_reglement_id) ? ((int) $this->mode_reglement_id) :
'NULL') .
',';
502 $sql .=
" fk_cond_reglement = ". (!empty($this->cond_reglement_id) ? ((int) $this->cond_reglement_id) :
'NULL') .
',';
503 $sql .=
" date_lim_reglement = ". (!empty($this->date_lim_reglement) ?
"'".$this->db->idate($this->date_lim_reglement).
"'" :
'NULL') .
',';
504 $sql .=
" note_private = '". (!empty($this->note_private) ? $this->db->escape($this->note_private) :
'') .
"',";
505 $sql .=
" note_public = '". (!empty($this->note_public) ? $this->db->escape($this->note_public) :
'') .
"',";
506 $sql .=
" modelpdf = ". (!empty($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
'NULL') .
",";
507 $sql .=
" fk_multicurrency = ". (!empty($this->fk_multicurrency) ? ((int) $this->fk_multicurrency) :
'NULL') .
',';
508 $sql .=
" multicurrency_code = ". (!empty($this->multicurrency_code) ?
"'".$this->db->escape($this->multicurrency_code).
"'" :
'NULL') .
",";
509 $sql .=
" multicurrency_tx = ". (!empty($this->multicurrency_tx) ? ((
float) $this->multicurrency_tx) : 1) .
',';
510 $sql .=
" multicurrency_total_ht = ". (!empty($this->multicurrency_total_ht) ? ((
float) $this->multicurrency_total_ht) : 0.00) .
',';
511 $sql .=
" multicurrency_total_tva = ". (!empty($this->multicurrency_total_tva) ? ((
float) $this->multicurrency_total_tva) : 0.00) .
',';
512 $sql .=
" multicurrency_total_ttc = ". (!empty($this->multicurrency_total_ttc) ? ((
float) $this->multicurrency_total_ttc) : 0.00) .
',';
513 $sql .=
" usenewprice = ". (!empty($this->usenewprice) ? ((int) $this->usenewprice) : 0) .
',';
514 $sql .=
" frequency = ". (!empty($this->frequency) ? ((int) $this->frequency) : 0).
',';
515 $sql .=
" unit_frequency = '". (!empty($this->unit_frequency) ? $this->db->escape($this->unit_frequency) :
'').
"',";
516 $sql .=
" date_when = ". (!empty($this->date_when) ?
"'".$this->db->idate($this->date_when).
"'" :
'NULL') .
',';
517 $sql .=
" date_last_gen = ". (!empty($this->date_last_gen) ?
"'".$this->db->idate($this->date_last_gen).
"'" :
'NULL') .
',';
518 $sql .=
" nb_gen_done = ". (!empty($this->nb_gen_done) ? ((int) $this->nb_gen_done) : 0) .
',';
519 $sql .=
" nb_gen_max = ". (!empty($this->nb_gen_max) ? ((int) $this->nb_gen_max) : 0) .
',';
520 $sql .=
" auto_validate = ". (!empty($this->auto_validate) ? ((int) $this->auto_validate) : 0);
521 $sql .=
" WHERE rowid = ". (int) $this->
id;
523 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
524 $resql = $this->db->query(
$sql);
533 if (!$error && !$notrigger) {
535 $result = $this->
call_trigger(
'SUPPLIERBILLREC_MODIFY', $user);
537 $this->db->rollback();
545 $this->error = $this->db->lasterror();
546 $this->db->rollback();
559 public function fetch($rowid, $ref =
'', $ref_ext =
'')
561 $sql =
'SELECT f.rowid, f.titre, f.ref_supplier, f.entity, f.fk_soc';
562 $sql .=
', f.datec, f.tms, f.suspended';
563 $sql .=
', f.libelle as label';
564 $sql .=
', f.vat_src_code, f.localtax1, f.localtax2';
565 $sql .=
', f.total_tva, f.total_ht, f.total_ttc';
566 $sql .=
', f.fk_user_author, f.fk_user_modif';
567 $sql .=
', f.fk_projet as fk_project, f.fk_account';
568 $sql .=
', f.fk_mode_reglement, p.code as mode_reglement_code, p.libelle as mode_reglement_libelle';
569 $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';
570 $sql .=
', f.date_lim_reglement';
571 $sql .=
', f.note_private, f.note_public, f.modelpdf';
572 $sql .=
', f.fk_multicurrency, f.multicurrency_code, f.multicurrency_tx, f.multicurrency_total_ht, f.multicurrency_total_tva, f.multicurrency_total_ttc';
573 $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';
574 $sql .=
', f.generate_pdf';
575 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn_rec as f';
576 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as c ON f.fk_cond_reglement = c.rowid';
577 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as p ON f.fk_mode_reglement = p.id';
578 $sql .=
' WHERE f.entity IN ('.getEntity(
'invoice').
')';
580 $sql .=
' AND f.rowid='. (int) $rowid;
582 $sql .=
" AND f.titre='".$this->db->escape($ref).
"'";
584 $sql .=
' AND f.rowid = 0';
587 $result = $this->db->query(
$sql);
589 if ($this->db->num_rows($result)) {
590 $obj = $this->db->fetch_object($result);
594 $this->
id = $obj->rowid;
595 $this->titre = $obj->titre;
596 $this->
ref = $obj->$keyforref;
597 $this->ref_supplier = $obj->ref_supplier;
598 $this->entity = $obj->entity;
599 $this->socid = $obj->fk_soc;
600 $this->date_creation = $obj->datec;
601 $this->date_modification = $obj->tms;
602 $this->suspended = $obj->suspended;
603 $this->libelle = $obj->label;
604 $this->label = $obj->label;
605 $this->vat_src_code = $obj->vat_src_code;
606 $this->total_localtax1 = $obj->localtax1;
607 $this->total_localtax2 = $obj->localtax2;
608 $this->total_ht = $obj->total_ht;
609 $this->total_tva = $obj->total_tva;
610 $this->total_ttc = $obj->total_ttc;
611 $this->user_author = $obj->fk_user_author;
612 $this->user_modif = $obj->fk_user_modif;
613 $this->fk_project = $obj->fk_project;
614 $this->fk_account = $obj->fk_account;
615 $this->mode_reglement_id = $obj->fk_mode_reglement;
616 $this->mode_reglement_code = $obj->mode_reglement_code;
617 $this->mode_reglement = $obj->mode_reglement_libelle;
618 $this->cond_reglement_id = $obj->fk_cond_reglement;
619 $this->cond_reglement_code = $obj->cond_reglement_code;
620 $this->cond_reglement = $obj->cond_reglement_libelle;
621 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
622 $this->date_lim_reglement = $this->db->jdate($obj->date_lim_reglement);
623 $this->note_private = $obj->note_private;
624 $this->note_public = $obj->note_public;
625 $this->model_pdf = $obj->modelpdf;
628 $this->fk_multicurrency = $obj->fk_multicurrency;
629 $this->multicurrency_code = $obj->multicurrency_code;
630 $this->multicurrency_tx = $obj->multicurrency_tx;
631 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
632 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
633 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
635 $this->usenewprice = $obj->usenewprice;
636 $this->frequency = $obj->frequency;
637 $this->unit_frequency = $obj->unit_frequency;
638 $this->date_when = $this->db->jdate($obj->date_when);
639 $this->date_last_gen = $this->db->jdate($obj->date_last_gen);
640 $this->nb_gen_done = $obj->nb_gen_done;
641 $this->nb_gen_max = $obj->nb_gen_max;
642 $this->auto_validate = $obj->auto_validate;
643 $this->generate_pdf = $obj->generate_pdf;
646 if ($this->statut == self::STATUS_DRAFT) {
647 $this->brouillon = 1;
659 $this->error = $this->db->lasterror();
664 $this->error =
'Bill with id '.$rowid.
' or ref '.$ref.
' not found';
665 dol_syslog(
'Facture::Fetch Error '.$this->error, LOG_ERR);
669 $this->error = $this->db->error();
694 $this->lines = array();
705 $sql =
'SELECT l.rowid,';
706 $sql .=
' l.fk_facture_fourn, l.fk_parent_line, l.fk_product, l.ref, l.label, l.description,';
707 $sql .=
' l.pu_ht, l.pu_ttc, l.qty, l.remise_percent, l.fk_remise_except, l.vat_src_code, l.tva_tx,';
708 $sql .=
' l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type,';
709 $sql .=
' l.total_ht, l.total_tva, l.total_ttc, total_localtax1, total_localtax2,';
710 $sql .=
' l.product_type, l.date_start, l.date_end,';
711 $sql .=
' l.info_bits, l.special_code, l.rang,';
712 $sql .=
' l.fk_unit, l.import_key, l.fk_user_author, l.fk_user_modif,';
713 $sql .=
' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
714 $sql .=
' p.ref as product_ref, p.fk_product_type as fk_product_type, p.label as product_label, p.description as product_desc';
715 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn_det_rec as l';
716 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON l.fk_product = p.rowid';
717 $sql .=
' WHERE l.fk_facture_fourn = '. (int) $this->
id;
718 $sql .=
' ORDER BY l.rang';
720 dol_syslog(
'FactureFournisseurRec::fetch_lines', LOG_DEBUG);
722 $result = $this->db->query(
$sql);
724 $num = $this->db->num_rows($result);
727 $objp = $this->db->fetch_object($result);
731 $line->id = $objp->rowid;
732 $line->fk_facture_fourn = $objp->fk_facture_fourn;
733 $line->fk_parent = $objp->fk_parent_line;
734 $line->fk_product = $objp->fk_product;
735 $line->ref_supplier = $objp->ref;
736 $line->label = $objp->label;
737 $line->description = $objp->description;
738 $line->pu_ht = $objp->pu_ht;
739 $line->pu_ttc = $objp->pu_ttc;
740 $line->qty = $objp->qty;
741 $line->remise_percent = $objp->remise_percent;
742 $line->fk_remise_except = $objp->fk_remise_except;
743 $line->vat_src_code = $objp->vat_src_code;
744 $line->tva_tx = $objp->tva_tx;
745 $line->localtax1_tx = $objp->localtax1_tx;
746 $line->localtax1_type = $objp->localtax1_type;
747 $line->localtax2_tx = $objp->localtax2_tx;
748 $line->localtax2_type = $objp->localtax2_type;
749 $line->total_ht = $objp->total_ht;
750 $line->total_tva = $objp->total_tva;
751 $line->total_localtax1 = $objp->total_localtax1;
752 $line->total_localtax2 = $objp->total_localtax2;
753 $line->total_ttc = $objp->total_ttc;
754 $line->product_type = $objp->product_type;
755 $line->date_start = $objp->date_start;
756 $line->date_end = $objp->date_end;
757 $line->info_bits = $objp->info_bits ;
758 $line->special_code = $objp->special_code;
759 $line->rang = $objp->rang;
760 $line->fk_unit = $objp->fk_unit;
761 $line->import_key = $objp->import_key;
762 $line->fk_user_author = $objp->fk_user_author;
763 $line->fk_user_modif = $objp->fk_user_modif;
764 $line->fk_multicurrency = $objp->fk_multicurrency;
765 $line->multicurrency_code = $objp->multicurrency_code;
766 $line->multicurrency_subprice = $objp->multicurrency_subprice;
767 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
768 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
769 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
771 $line->fetch_optionals();
773 $this->lines[$i] = $line;
778 $this->db->free($result);
781 $this->error = $this->db->lasterror();
795 public function delete(
User $user, $notrigger = 0, $idwarehouse = -1)
799 dol_syslog(get_class($this).
"::delete rowid=".((
int) $rowid), LOG_DEBUG);
804 $main = MAIN_DB_PREFIX.
'facture_fourn_det_rec';
805 $ef = $main.
"_extrafields";
807 $sqlef =
"DELETE FROM ".$ef.
" WHERE fk_object IN (SELECT rowid FROM ".$main.
" WHERE fk_facture_fourn = ". (int) $rowid .
")";
808 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"facture_fourn_det_rec WHERE fk_facture_fourn = ". (int) $rowid;
810 if ($this->db->query($sqlef) && $this->db->query(
$sql)) {
811 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"facture_fourn_rec WHERE rowid = ". (int) $rowid;
813 if ($this->db->query(
$sql)) {
825 $this->error = $this->db->lasterror();
829 $this->error = $this->db->lasterror();
832 if (!$error && !$notrigger) {
834 $result = $this->
call_trigger(
'SUPPLIERBILLREC_DELETE', $user);
844 $this->db->rollback();
875 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)
877 global $mysoc, $user;
879 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
883 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);
890 if ($this->suspended == self::STATUS_NOTSUSPENDED) {
896 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
897 $vat_src_code = $reg[1];
898 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
902 $fk_product = empty($fk_product) ? 0 : $fk_product;
903 $label = empty($label) ?
'' : $label;
904 $remise_percent = empty($remise_percent) ? 0 :
price2num($remise_percent);
908 if (!preg_match(
'/\((.*)\)/', $txtva)) {
913 $txtva = !empty($txtva) ? $txtva : 0;
914 $txlocaltax1 = !empty($txlocaltax1) ? $txlocaltax1 : 0;
915 $txlocaltax2 = !empty($txlocaltax2) ? $txlocaltax2 : 0;
916 $info_bits = !empty($info_bits) ? $info_bits : 0;
917 $info_bits = !empty($info_bits) ? $info_bits : 0;
918 $pu = $price_base_type ==
'HT' ? $pu_ht : $pu_ttc;
924 $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);
925 $total_ht = $tabprice[0];
926 $total_tva = $tabprice[1];
927 $total_ttc = $tabprice[2];
928 $total_localtax1 = $tabprice[9];
929 $total_localtax2 = $tabprice[10];
930 $pu_ht = $tabprice[3];
933 $multicurrency_total_ht = $tabprice[16];
934 $multicurrency_total_tva = $tabprice[17];
935 $multicurrency_total_ttc = $tabprice[18];
936 $pu_ht_devise = $tabprice[19];
939 $product_type = $type;
941 $product =
new Product($this->db);
942 $result = $product->fetch($fk_product);
946 $product_type = $product->type;
948 $label = $product->label;
952 $sql =
'INSERT INTO ' . MAIN_DB_PREFIX .
'facture_fourn_det_rec (';
953 $sql .=
'fk_facture_fourn';
954 $sql .=
', fk_product';
957 $sql .=
', description';
961 $sql .=
', remise_percent';
962 $sql .=
', fk_remise_except';
963 $sql .=
', vat_src_code';
965 $sql .=
', localtax1_tx';
966 $sql .=
', localtax1_type';
967 $sql .=
', localtax2_tx';
968 $sql .=
', localtax2_type';
969 $sql .=
', total_ht';
970 $sql .=
', total_tva';
971 $sql .=
', total_localtax1';
972 $sql .=
', total_localtax2';
973 $sql .=
', total_ttc';
974 $sql .=
', product_type';
975 $sql .=
', date_start';
976 $sql .=
', date_end';
977 $sql .=
', info_bits';
978 $sql .=
', special_code';
981 $sql .=
', fk_user_author';
982 $sql .=
', fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
983 $sql .=
') VALUES (';
984 $sql .=
' ' . (int) $facid;
985 $sql .=
', ' . (!empty($fk_product) ?
"'" . $this->db->escape($fk_product) .
"'" :
'null');
986 $sql .=
', ' . (!empty($ref) ?
"'" . $this->db->escape($ref) .
"'" :
'null');
987 $sql .=
', ' . (!empty($label) ?
"'" . $this->db->escape($label) .
"'" :
'null');
988 $sql .=
", '" . $this->db->escape($desc) .
"'";
994 $sql .=
", '" . $this->db->escape($vat_src_code) .
"'";
997 $sql .=
", '" . $this->db->escape(isset($localtaxes_type[0]) ? $localtaxes_type[0] :
'') .
"'";
999 $sql .=
", '" . $this->db->escape(isset($localtaxes_type[2]) ? $localtaxes_type[2] :
'') .
"'";
1005 $sql .=
', ' . (int) $product_type;
1006 $sql .=
', ' . ($date_start > 0 ? (int) $date_start :
'NULL');
1007 $sql .=
', ' . ($date_end > 0 ? (int) $date_end :
'NULL');
1008 $sql .=
', ' . (int) $info_bits;
1009 $sql .=
', ' . (int) $special_code;
1010 $sql .=
', ' . (int) $rang;
1011 $sql .=
', ' . ($fk_unit ? (int) $fk_unit :
'NULL');
1012 $sql .=
', ' . (int) $user;
1013 $sql .=
', ' . (int) $this->fk_multicurrency;
1014 $sql .=
", '" . $this->db->escape($this->multicurrency_code) .
"'";
1021 dol_syslog(get_class($this).
'::addline', LOG_DEBUG);
1022 if ($this->db->query(
$sql)) {
1023 $lineId = $this->db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn_det_rec');
1026 $this->db->commit();
1029 $this->db->rollback();
1030 $this->error = $this->db->lasterror();
1063 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)
1065 global $mysoc, $user;
1069 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, fk_remise_except=$fk_remise_except, price_base_type=$price_base_type, pu_ttc=$pu_ttc, type=$type, fk_unit=$fk_unit, pu_ht_devise=$pu_ht_devise", LOG_DEBUG);
1070 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1077 if ($this->brouillon) {
1079 $fk_product = empty($fk_product) ? 0 : $fk_product;
1080 $label = empty($label) ?
'' : $label;
1081 $remise_percent = empty($remise_percent) ? 0 :
price2num($remise_percent);
1083 $info_bits = empty($info_bits) ? 0 : $info_bits;
1086 $pu_ht_devise =
price2num($pu_ht_devise);
1088 if (!preg_match(
'/\((.*)\)/', $txtva)) {
1092 $txlocaltax1 = empty($txlocaltax1) ? 0 :
price2num($txlocaltax1);
1093 $txlocaltax2 = empty($txlocaltax2) ? 0 :
price2num($txlocaltax2);
1094 $this->multicurrency_subprice = empty($this->multicurrency_subprice) ? 0 : $this->multicurrency_subprice;
1095 $this->multicurrency_total_ht = empty($this->multicurrency_total_ht) ? 0 : $this->multicurrency_total_ht;
1096 $this->multicurrency_total_tva = empty($this->multicurrency_total_tva) ? 0 : $this->multicurrency_total_tva;
1097 $this->multicurrency_total_ttc = empty($this->multicurrency_total_ttc) ? 0 : $this->multicurrency_total_ttc;
1099 $pu = $price_base_type ==
'HT' ? $pu_ht : $pu_ttc;
1111 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
1112 $vat_src_code = $reg[1];
1113 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
1116 $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);
1118 $total_ht = $tabprice[0];
1119 $total_tva = $tabprice[1];
1120 $total_ttc = $tabprice[2];
1121 $total_localtax1 = $tabprice[9];
1122 $total_localtax2 = $tabprice[10];
1123 $pu_ht = $tabprice[3];
1124 $pu_tva = $tabprice[4];
1125 $pu_ttc = $tabprice[5];
1128 $multicurrency_total_ht = $tabprice[16];
1129 $multicurrency_total_tva = $tabprice[17];
1130 $multicurrency_total_ttc = $tabprice[18];
1131 $pu_ht_devise = $tabprice[19];
1133 $product_type = $type;
1135 $product =
new Product($this->db);
1136 $result = $product->fetch($fk_product);
1137 $product_type = $product->type;
1140 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'facture_fourn_det_rec SET';
1141 $sql .=
' fk_facture_fourn = ' . ((int) $facid);
1142 $sql .=
', fk_product = ' . ($fk_product > 0 ? ((int) $fk_product) :
'null');
1143 $sql .=
", ref = '" . $this->db->escape($ref) .
"'";
1144 $sql .=
", label = '" . $this->db->escape($label) .
"'";
1145 $sql .=
", description = '" . $this->db->escape($desc) .
"'";
1148 $sql .=
", remise_percent = '" .
price2num($remise_percent) .
"'";
1149 $sql .=
", vat_src_code = '" . $this->db->escape($vat_src_code) .
"'";
1151 $sql .=
', localtax1_tx = ' . (
float) $txlocaltax1;
1152 $sql .=
", localtax1_type = '" . $this->db->escape($localtaxes_type[0]) .
"'";
1153 $sql .=
', localtax2_tx = ' . (
float) $txlocaltax2;
1154 $sql .=
", localtax2_type = '" . $this->db->escape($localtaxes_type[2]) .
"'";
1157 $sql .=
", total_localtax1 = '" .
price2num($total_localtax1) .
"'";
1158 $sql .=
", total_localtax2 = '" .
price2num($total_localtax2) .
"'";
1160 $sql .=
', product_type = ' . (int) $product_type;
1161 $sql .=
', date_start = ' . (empty($date_start) ?
'NULL' : (int) $date_start);
1162 $sql .=
', date_end = ' . (empty($date_end) ?
'NULL' : (int) $date_end);
1163 $sql .=
', info_bits = ' . (int) $info_bits;
1164 $sql .=
', special_code = ' . (int) $special_code;
1165 $sql .=
', rang = ' . (int) $rang;
1166 $sql .=
', fk_unit = ' . ($fk_unit ?
"'" . $this->db->escape($fk_unit) .
"'" :
'null');
1167 $sql .=
', fk_user_modif = ' . (int) $user;
1168 $sql .=
', multicurrency_subprice = '.price2num($pu_ht_devise);
1169 $sql .=
', multicurrency_total_ht = '.price2num($multicurrency_total_ht);
1170 $sql .=
', multicurrency_total_tva = '.price2num($multicurrency_total_tva);
1171 $sql .=
', multicurrency_total_ttc = '.price2num($multicurrency_total_ttc);
1172 $sql .=
' WHERE rowid = ' . (int) $rowid;
1174 dol_syslog(get_class($this).
'::updateline', LOG_DEBUG);
1175 if ($this->db->query(
$sql)) {
1180 $this->error = $this->db->lasterror();
1194 if (empty($this->date_when)) {
1208 if ($this->nb_gen_max > 0 && ($this->nb_gen_done >= $this->nb_gen_max)) {
1223 return ($this->
isMaxNbGenReached() ?
'<strike>' :
'').$ret.($this->isMaxNbGenReached() ?
'</strike>' :
'');
1238 global $conf, $langs, $db, $user, $hookmanager;
1244 $langs->loadLangs(array(
'main',
'bills'));
1248 $today =
dol_mktime(23, 59, 59, $tmparray[
'mon'], $tmparray[
'mday'], $tmparray[
'year']);
1250 dol_syslog(
'createRecurringInvoices restrictioninvoiceid=' .$restrictioninvoiceid.
' forcevalidation=' .$forcevalidation);
1252 $sql =
'SELECT rowid FROM '.MAIN_DB_PREFIX.
'facture_fourn_rec';
1253 $sql .=
' WHERE frequency > 0';
1254 $sql .=
" AND (date_when IS NULL OR date_when <= '".$this->db->idate($today).
"')";
1255 $sql .=
' AND (nb_gen_done < nb_gen_max OR nb_gen_max = 0)';
1256 $sql .=
' AND suspended = 0';
1257 $sql .=
' AND entity = '. (int) $conf->entity;
1258 if ($restrictioninvoiceid > 0) {
1259 $sql .=
' AND rowid = '. (int) $restrictioninvoiceid;
1261 $sql .= $this->db->order(
'entity',
'ASC');
1263 $parameters = array(
1264 'restrictioninvoiceid' => $restrictioninvoiceid,
1265 'forcevalidation' => $forcevalidation,
1267 $reshook = $hookmanager->executeHooks(
'beforeCreationOfRecurringInvoices', $parameters,
$sql);
1269 $resql = $this->db->query(
$sql);
1272 $num = $this->db->num_rows($resql);
1275 $this->output .= $langs->trans(
'FoundXQualifiedRecurringInvoiceTemplate', $num).
"\n";
1277 $this->output .= $langs->trans(
'NoQualifiedRecurringInvoiceTemplateFound');
1280 $saventity = $conf->entity;
1283 $line = $this->db->fetch_object($resql);
1287 $invoiceidgenerated = 0;
1289 $new_fac_fourn =
null;
1291 $facturerec->fetch($line->rowid);
1293 if ($facturerec->id > 0) {
1295 $conf->entity = $facturerec->entity;
1297 dol_syslog(
'createRecurringInvoices Process invoice template id=' .$facturerec->id.
', ref=' .$facturerec->ref.
', entity=' .$facturerec->entity);
1300 $new_fac_fourn->fac_rec = $facturerec->id;
1301 $new_fac_fourn->fk_fac_rec_source = $facturerec->id;
1304 $new_fac_fourn->brouillon = 1;
1307 $new_fac_fourn->date = empty($facturerec->date_when) ? $now : $facturerec->date_when;
1308 $new_fac_fourn->socid = $facturerec->socid;
1309 $new_fac_fourn->lines = $facturerec->lines;
1310 $new_fac_fourn->ref_supplier = $facturerec->ref_supplier;
1311 $new_fac_fourn->model_pdf = $facturerec->model_pdf;
1312 $new_fac_fourn->fk_project = $facturerec->fk_project;
1313 $new_fac_fourn->libelle = $facturerec->libelle;
1315 $invoiceidgenerated = $new_fac_fourn->create($user);
1316 if ($invoiceidgenerated <= 0) {
1317 $this->errors = $new_fac_fourn->errors;
1318 $this->error = $new_fac_fourn->error;
1321 if (!$error && ($facturerec->auto_validate || $forcevalidation)) {
1322 $result = $new_fac_fourn->validate($user);
1324 $this->errors = $new_fac_fourn->errors;
1325 $this->error = $new_fac_fourn->error;
1330 if (!$error && $facturerec->generate_pdf) {
1332 $new_fac_fourn->fetch($new_fac_fourn->id);
1333 $result = $new_fac_fourn->generateDocument($facturerec->model_pdf, $langs);
1335 $this->errors = $new_fac_fourn->errors;
1336 $this->error = $new_fac_fourn->error;
1342 $this->error =
'Failed to load invoice template with id=' .$line->rowid.
', entity=' .$conf->entity.
"\n";
1343 $this->errors[] =
'Failed to load invoice template with id=' .$line->rowid.
', entity=' .$conf->entity;
1344 dol_syslog(
'createRecurringInvoices Failed to load invoice template with id=' .$line->rowid.
', entity=' .$conf->entity);
1347 if (!$error && $invoiceidgenerated >= 0) {
1348 $facturerec->nb_gen_done++;
1349 $facturerec->date_last_gen =
dol_now();
1350 $facturerec->date_when= $facturerec->getNextDate();
1351 $facturerec->update($user);
1352 $this->db->commit(
'createRecurringInvoices Process invoice template id=' .$facturerec->id.
', title=' .$facturerec->titre);
1353 dol_syslog(
'createRecurringInvoices Process invoice template ' .$facturerec->titre.
' is finished with a success generation');
1355 $this->output .= $langs->trans(
'InvoiceGeneratedFromTemplate', $new_fac_fourn->ref, $facturerec->titre).
"\n";
1357 $this->db->rollback(
'createRecurringInvoices Process invoice template id=' .$facturerec->id.
', title=' .$facturerec->titre);
1360 $parameters = array(
1363 'errorCount' => $error,
1364 'invoiceidgenerated' => $invoiceidgenerated,
1365 'facturerec' => $facturerec,
1368 $reshook = $hookmanager->executeHooks(
'afterCreationOfRecurringInvoice', $parameters, $new_fac_fourn);
1373 $conf->entity = $saventity;
1378 $this->output = trim($this->output);
1380 return $error ? $error : 0;
1395 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $moretitle =
'', $notooltip =
'', $save_lastsearch_value = -1)
1397 global $langs, $hookmanager;
1401 $label =
'<u>'.$langs->trans(
'RepeatableInvoice').
'</u>';
1402 if (!empty($this->
ref)) {
1403 $label .=
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1405 if ($this->frequency > 0) {
1406 $label .=
'<br><b>'.$langs->trans(
'Frequency').
':</b> '.$langs->trans(
'FrequencyPer_'.$this->unit_frequency, $this->frequency);
1408 if (!empty($this->date_last_gen)) {
1409 $label .=
'<br><b>'.$langs->trans(
'DateLastGeneration').
':</b> '.
dol_print_date($this->date_last_gen,
'dayhour');
1411 if ($this->frequency > 0) {
1412 if (!empty($this->date_when)) {
1413 $label .=
'<br><b>'.$langs->trans(
'NextDateToExecution').
':</b> ';
1414 $label .= (empty($this->suspended) ?
'' :
'<strike>').
dol_print_date($this->date_when,
'day').(empty($this->suspended) ?
'' :
'</strike>');
1415 if (!empty($this->suspended)) {
1416 $label .=
' ('.$langs->trans(
'Disabled').
')';
1421 $url = DOL_URL_ROOT.
'/fourn/facture/card-rec.php?facid='.$this->id;
1427 if ($option !=
'nolink') {
1429 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1430 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
'PHP_SELF'])) {
1431 $add_save_lastsearch_values = 1;
1433 if ($add_save_lastsearch_values) {
1434 $url .=
'&save_lastsearch_values=1';
1438 $linkstart =
'<a href="'.$url.
'" title="'.
dol_escape_htmltag($label, 1).
'" class="classfortooltip">';
1441 $result .= $linkstart;
1443 $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);
1445 if ($withpicto != 2) {
1446 $result .= $this->ref;
1448 $result .= $linkend;
1450 $hookmanager->initHooks(array($this->element .
'dao'));
1451 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
1452 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1454 $result = $hookmanager->resPrint;
1456 $result .= $hookmanager->resPrint;
1470 return $this->
LibStatut($this->frequency ? 1 : 0, $this->suspended, $mode, $alreadypaid, empty($this->
type) ? 0 : $this->
type);
1484 public function LibStatut($recur, $status, $mode = 0, $alreadypaid = -1, $type = 0)
1488 $langs->load(
'bills');
1490 $labelStatus = $langs->transnoentitiesnoconv(
'Active');
1491 $statusType =
'status0';
1496 if ($status == self::STATUS_SUSPENDED) {
1497 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1499 $labelStatus = $langs->transnoentitiesnoconv(
'Active');
1502 if ($status == self::STATUS_SUSPENDED) {
1503 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1505 $labelStatus = $langs->transnoentitiesnoconv(
'Draft');
1508 } elseif ($mode == 1) {
1511 if ($status == self::STATUS_SUSPENDED) {
1512 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1514 $labelStatus = $langs->transnoentitiesnoconv(
'Active');
1517 if ($status == self::STATUS_SUSPENDED) {
1518 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1520 $labelStatus = $langs->transnoentitiesnoconv(
'Draft');
1523 } elseif ($mode == 2) {
1525 if ($status == self::STATUS_SUSPENDED) {
1526 $statusType =
'status6';
1527 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1529 $statusType =
'status4';
1530 $labelStatus = $langs->transnoentitiesnoconv(
'Active');
1533 if ($status == self::STATUS_SUSPENDED) {
1534 $statusType =
'status6';
1535 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1537 $statusType =
'status0';
1538 $labelStatus = $langs->transnoentitiesnoconv(
'Draft');
1541 } elseif ($mode == 3) {
1544 if ($status == self::STATUS_SUSPENDED) {
1545 $statusType =
'status6';
1546 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1548 $statusType =
'status4';
1549 $labelStatus = $langs->transnoentitiesnoconv(
'Active');
1552 if ($status == self::STATUS_SUSPENDED) {
1553 $statusType =
'status6';
1554 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1556 $statusType =
'status0';
1557 $labelStatus = $langs->transnoentitiesnoconv(
'Draft');
1560 } elseif ($mode == 4) {
1563 if ($status == self::STATUS_SUSPENDED) {
1564 $statusType =
'status6';
1565 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1567 $statusType =
'status4';
1568 $labelStatus = $langs->transnoentitiesnoconv(
'Active');
1571 if ($status == self::STATUS_SUSPENDED) {
1572 $statusType =
'status6';
1573 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1575 $statusType =
'status0';
1576 $labelStatus = $langs->transnoentitiesnoconv(
'Draft');
1579 } elseif ($mode == 5 || $mode == 6) {
1585 if ($status == self::STATUS_SUSPENDED) {
1586 $statusType =
'status6';
1587 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1589 $statusType =
'status4';
1590 $labelStatus = $langs->transnoentitiesnoconv(
'Active');
1593 if ($status == self::STATUS_SUSPENDED) {
1594 $statusType =
'status6';
1595 $labelStatus = $langs->transnoentitiesnoconv(
'Disabled');
1597 $statusType =
'status0';
1598 $labelStatus = $langs->transnoentitiesnoconv(
'Draft');
1603 $labelStatusShort = $labelStatus;
1605 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode);
1618 global $user, $langs, $conf;
1622 $nownotime =
dol_mktime(0, 0, 0, $arraynow[
'mon'], $arraynow[
'mday'], $arraynow[
'year']);
1628 $sql =
'SELECT rowid';
1629 $sql .=
' FROM ' .MAIN_DB_PREFIX.
'product';
1630 $sql .=
' WHERE entity IN (' .getEntity(
'product').
')';
1631 $sql .= $this->db->plimit(100);
1633 $resql = $this->db->query(
$sql);
1635 $num_prods = $this->db->num_rows($resql);
1637 while ($i < $num_prods) {
1639 $row = $this->db->fetch_row($resql);
1640 $prodids[$i] = $row[0];
1646 $this->
ref =
'SPECIMEN';
1647 $this->title =
'SPECIMEN';
1648 $this->specimen = 1;
1650 $this->date = $nownotime;
1651 $this->date_lim_reglement = $nownotime + 3600 * 24 * 30;
1652 $this->cond_reglement_id = 1;
1653 $this->cond_reglement_code =
'RECEP';
1655 $this->mode_reglement_id = 0;
1656 $this->mode_reglement_code =
'';
1657 $this->note_public =
'This is a comment (public)';
1658 $this->note_private =
'This is a comment (private)';
1659 $this->note =
'This is a comment (private)';
1660 $this->fk_incoterms = 0;
1661 $this->location_incoterms =
'';
1663 if (empty($option) || $option !=
'nolines') {
1667 while ($xnbp < $nbp) {
1669 $line->desc = $langs->trans(
'Description').
' ' .$xnbp;
1671 $line->subprice = 100;
1672 $line->tva_tx = 19.6;
1673 $line->localtax1_tx = 0;
1674 $line->localtax2_tx = 0;
1675 $line->remise_percent = 0;
1677 $prodid = mt_rand(1, $num_prods);
1678 $line->fk_product = $prodids[$prodid];
1680 $line->total_ht = -100;
1681 $line->total_ttc = -119.6;
1682 $line->total_tva = -19.6;
1683 } elseif ($xnbp == 2) {
1684 $line->subprice = -100;
1685 $line->total_ht = -100;
1686 $line->total_ttc = -119.6;
1687 $line->total_tva = -19.6;
1688 $line->remise_percent = 0;
1689 } elseif ($xnbp == 3) {
1690 $prodid = mt_rand(1, $num_prods);
1691 $line->fk_product = $prodids[$prodid];
1692 $line->total_ht = 50;
1693 $line->total_ttc = 59.8;
1694 $line->total_tva = 9.8;
1695 $line->remise_percent = 50;
1698 $prodid = mt_rand(1, $num_prods);
1699 $line->fk_product = $prodids[$prodid];
1700 $line->total_ht = 100;
1701 $line->total_ttc = 119.6;
1702 $line->total_tva = 19.6;
1703 $line->remise_percent = 00;
1706 $this->lines[$xnbp] = $line;
1709 $this->total_ht += $line->total_ht;
1710 $this->total_tva += $line->total_tva;
1711 $this->total_ttc += $line->total_ttc;
1713 $this->revenuestamp = 0;
1717 $line->desc = $langs->trans(
'Description').
' (offered line)';
1719 $line->subprice = 100;
1720 $line->tva_tx = 19.6;
1721 $line->localtax1_tx = 0;
1722 $line->localtax2_tx = 0;
1723 $line->remise_percent = 100;
1724 $line->total_ht = 0;
1725 $line->total_ttc = 0;
1726 $line->total_tva = 0;
1727 $prodid = mt_rand(1, $num_prods);
1728 $line->fk_product = $prodids[$prodid];
1730 $this->lines[$xnbp] = $line;
1734 $this->usenewprice = 0;
1763 if (!$this->table_element) {
1764 dol_syslog(get_class($this).
'::setFrequencyAndUnit was called on objet with property table_element not defined', LOG_ERR);
1768 if (!empty($frequency) && empty($unit)) {
1769 dol_syslog(get_class($this).
'::setFrequencyAndUnit was called on objet with params frequency defined but unit not defined', LOG_ERR);
1773 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1774 $sql .=
" SET frequency = ".($frequency ? ((int) $frequency) :
"NULL");
1775 if (!empty($unit)) {
1776 $sql .=
", unit_frequency = '".$this->db->escape($unit).
"'";
1778 $sql .=
" WHERE rowid = ".((int) $this->
id);
1780 dol_syslog(get_class($this).
'::setFrequencyAndUnit', LOG_DEBUG);
1782 if ($this->db->query(
$sql)) {
1783 $this->frequency = $frequency;
1784 if (!empty($unit)) {
1785 $this->unit_frequency = $unit;
1789 $this->error = $this->db->lasterror();
1803 if (!$this->table_element) {
1804 dol_syslog(get_class($this).
'::setNextDate was called on objet with property table_element not defined', LOG_ERR);
1807 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1808 $sql .=
" SET date_when = " .($date ?
"'".$this->db->idate($date).
"'" :
"NULL");
1809 if ($increment_nb_gen_done > 0) {
1810 $sql .=
", nb_gen_done = nb_gen_done + 1";
1812 $sql .=
" WHERE rowid = " . (int) $this->
id;
1814 dol_syslog(get_class($this).
'::setNextDate', LOG_DEBUG);
1816 if ($this->db->query(
$sql)) {
1817 $this->date_when = $date;
1818 if ($increment_nb_gen_done > 0) {
1819 $this->nb_gen_done++;
1823 $this->error = $this->db->lasterror();
1836 if (!$this->table_element) {
1837 dol_syslog(get_class($this).
'::setMaxPeriod was called on objet with property table_element not defined', LOG_ERR);
1845 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1846 $sql .=
" SET nb_gen_max = ". (int) $nb;
1847 $sql .=
" WHERE rowid = " . (int) $this->
id;
1849 dol_syslog(get_class($this).
'::setMaxPeriod', LOG_DEBUG);
1851 if ($this->db->query(
$sql)) {
1852 $this->nb_gen_max = $nb;
1868 if (!$this->table_element) {
1869 dol_syslog(get_class($this).
'::setAutoValidate was called on objet with property table_element not defined', LOG_ERR);
1873 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1874 $sql .=
" SET auto_validate = ".((int) $validate);
1875 $sql .=
" WHERE rowid = " . (int) $this->
id;
1877 dol_syslog(get_class($this).
'::setAutoValidate', LOG_DEBUG);
1879 if ($this->db->query(
$sql)) {
1880 $this->auto_validate = $validate;
1896 if (!$this->table_element) {
1897 dol_syslog(get_class($this).
'::setGeneratePdf was called on objet with property table_element not defined', LOG_ERR);
1901 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1902 $sql .=
" SET generate_pdf = ". (int) $validate;
1903 $sql .=
" WHERE rowid = " . (int) $this->
id;
1905 dol_syslog(get_class($this).
'::setGeneratePdf', LOG_DEBUG);
1907 if ($this->db->query(
$sql)) {
1908 $this->generate_pdf = $validate;
1924 if (!$this->table_element) {
1925 dol_syslog(get_class($this).
'::setModelPdf was called on objet with property table_element not defined', LOG_ERR);
1929 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
1930 $sql .=
" SET modelpdf = '".$this->db->escape($model).
"'";
1931 $sql .=
" WHERE rowid = " . (int) $this->
id;
1933 dol_syslog(get_class($this).
'::setModelPdf', LOG_DEBUG);
1935 if ($this->db->query(
$sql)) {
1936 $this->model_pdf = $model;
1956 public $element =
'invoice_supplier_det_rec';
1961 public $table_element =
'facture_fourn_det_rec';
1963 public $fk_facture_fourn;
1966 public $ref_supplier;
1968 public $description;
1972 public $remise_percent;
1973 public $fk_remise_except;
1974 public $vat_src_code;
1976 public $localtax1_tx;
1977 public $localtax1_type;
1978 public $localtax2_tx;
1979 public $localtax2_type;
1981 public $product_type;
1985 public $special_code;
1988 public $fk_user_author;
1989 public $fk_user_modif;
1990 public $fk_multicurrency;
1991 public $multicurrency_subprice;
2017 public function delete(
User $user, $notrigger =
false)
2025 $result = $this->
call_trigger(
'LINESUPPLIERBILLREC_DELETE', $user);
2041 $sql =
'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element .
' WHERE rowid=' . (int) $this->
id;
2043 $res = $this->db->query(
$sql);
2044 if ($res ===
false) {
2046 $this->errors[] = $this->db->lasterror();
2052 $this->db->rollback();
2055 $this->db->commit();
2069 $sql =
'SELECT l.rowid,';
2070 $sql .=
' l.fk_facture_fourn, l.fk_parent_line, l.fk_product,';
2071 $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,';
2072 $sql .=
' l.vat_src_code, l.tva_tx, l.localtax1_tx, l.localtax1_type, l.localtax2_tx, l.localtax2_type,';
2073 $sql .=
' l.total_ht, l.total_tva, l.total_localtax1, l.total_localtax2, l.total_ttc,';
2074 $sql .=
' l.product_type, l.date_start, l.date_end,';
2075 $sql .=
' l.info_bits, l.special_code, l.rang, l.fk_unit, l.import_key,';
2076 $sql .=
' l.fk_user_author, l.fk_user_modif, l.fk_multicurrency,';
2077 $sql .=
' l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
2078 $sql .=
' p.ref as product_ref, p.fk_product_type as fk_product_type, p.label as product_label, p.description as product_desc';
2079 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn_det_rec as l';
2080 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON l.fk_product = p.rowid';
2081 $sql .=
' WHERE l.rowid = '. (int) $rowid;
2082 $sql .=
' ORDER BY l.rang';
2085 $result = $this->db->query(
$sql);
2087 $objp = $this->db->fetch_object($result);
2089 $this->
id = $objp->rowid;
2090 $this->fk_facture_fourn = $objp->fk_facture_fourn;
2091 $this->fk_parent = $objp->fk_parent_line;
2092 $this->fk_product = $objp->fk_product;
2093 $this->ref_supplier = $objp->ref_supplier;
2094 $this->label = $objp->label;
2096 $this->pu_ht = $objp->pu_ht;
2097 $this->pu_ttc = $objp->pu_ttc;
2098 $this->qty = $objp->qty;
2099 $this->remise_percent = $objp->remise_percent;
2100 $this->fk_remise_except = $objp->fk_remise_except;
2101 $this->vat_src_code = $objp->vat_src_code;
2102 $this->tva_tx = $objp->tva_tx;
2103 $this->localtax1_tx = $objp->localtax1_tx;
2104 $this->localtax1_type = $objp->localtax1_type;
2105 $this->localtax2_tx = $objp->localtax2_tx;
2106 $this->localtax2_type = $objp->localtax2_type;
2107 $this->total_ht = $objp->total_ht;
2108 $this->total_tva = $objp->total_tva;
2109 $this->total_localtax1 = $objp->total_localtax1;
2110 $this->total_localtax2 = $objp->total_localtax2;
2111 $this->total_ttc = $objp->total_ttc;
2112 $this->product_type = $objp->product_type;
2113 $this->date_start = $objp->date_start;
2114 $this->date_end = $objp->date_end;
2115 $this->info_bits = $objp->info_bits;
2116 $this->special_code = $objp->special_code;
2117 $this->rang = $objp->rang;
2118 $this->fk_unit = $objp->fk_unit;
2119 $this->import_key = $objp->import_key;
2120 $this->fk_user_author = $objp->fk_user_author;
2121 $this->fk_user_modif = $objp->fk_user_modif;
2122 $this->fk_multicurrency = $objp->fk_multicurrency;
2123 $this->multicurrency_code = $objp->multicurrency_code;
2124 $this->multicurrency_subprice = $objp->multicurrency_subprice;
2125 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
2126 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
2127 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2129 $this->db->free($result);
2132 $this->error = $this->db->lasterror();
2151 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2153 $sql =
'UPDATE ' . MAIN_DB_PREFIX .
'facture_fourn_det_rec SET';
2154 $sql .=
' fk_facture_fourn = ' . (int) $this->fk_facture_fourn;
2155 $sql .=
', fk_parent_line = ' . (int) $this->fk_parent;
2156 $sql .=
', fk_product = ' . (int) $this->fk_product;
2157 $sql .=
', ref = ' . (!empty($this->
ref) ?
"'" . $this->db->escape($this->
ref) .
"'" :
'NULL');
2158 $sql .=
", label = " . (!empty($this->label) ?
"'" . $this->db->escape($this->label) .
"'" :
'NULL');
2159 $sql .=
", description = '" . $this->db->escape($this->
description) .
"'";
2163 $sql .=
", remise_percent = '" .
price2num($this->remise_percent) .
"'";
2164 $sql .=
', fk_remise_except = ' . (int) $this->fk_remise_except;
2165 $sql .=
", vat_src_code = '" . $this->db->escape($this->vat_src_code) .
"'";
2167 $sql .=
', localtax1_tx = ' .
price2num($this->localtax1_tx);
2168 $sql .=
", localtax1_type = '" . $this->db->escape($this->localtax1_type) .
"'";
2169 $sql .=
', localtax2_tx = ' .
price2num($this->localtax2_tx);
2170 $sql .=
", localtax2_type = '" . $this->db->escape($this->localtax2_type) .
"'";
2171 if (empty($this->skip_update_total)) {
2174 $sql .=
', total_localtax1 = ' .
price2num($this->total_localtax1);
2175 $sql .=
', total_localtax2 = ' .
price2num($this->total_localtax2);
2178 $sql .=
', product_type = ' . (int) $this->product_type;
2179 $sql .=
', date_start = ' . (int) $this->date_start;
2180 $sql .=
', date_end = ' . (int) $this->date_end;
2181 $sql .=
", info_bits = " . ((int) $this->info_bits);
2182 $sql .=
', special_code =' . (int) $this->special_code;
2183 $sql .=
', rang = ' . (int) $this->rang;
2184 $sql .=
', fk_unit = ' .($this->fk_unit ?
"'".$this->db->escape($this->fk_unit).
"'" :
'null');
2185 $sql .=
', fk_user_modif = ' . (int) $user;
2186 $sql .=
' WHERE rowid = ' . (int) $this->
id;
2190 dol_syslog(get_class($this).
'::updateline', LOG_DEBUG);
2191 $resql = $this->db->query(
$sql);
2200 if (!$error && !$notrigger) {
2202 $result = $this->
call_trigger(
'LINESUPPLIERBILLREC_MODIFY', $user);
2210 $this->db->rollback();
2213 $this->db->commit();
2217 $this->error = $this->db->lasterror();
2218 $this->db->rollback();