38 include_once DOL_DOCUMENT_ROOT.
'/core/class/commoninvoice.class.php';
39 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
40 require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
41 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
44 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formaccounting.class.php';
45 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
56 public $element =
'invoice_supplier';
61 public $table_element =
'facture_fourn';
66 public $table_element_line =
'facture_fourn_det';
71 public $fk_element =
'fk_facture_fourn';
76 public $picto =
'supplier_invoice';
82 public $ismultientitymanaged = 1;
88 public $restrictiononfksoc = 1;
108 public $ref_supplier;
181 public $date_echeance;
206 public $total_localtax1;
207 public $total_localtax2;
216 public $note_private;
220 public $cond_reglement_id;
221 public $cond_reglement_code;
222 public $cond_reglement_label;
223 public $cond_reglement_doc;
230 public $mode_reglement_id;
231 public $mode_reglement_code;
236 public $transport_mode_id;
238 public $extraparams = array();
244 public $lines = array();
255 public $fk_multicurrency;
257 public $multicurrency_code;
258 public $multicurrency_tx;
259 public $multicurrency_total_ht;
260 public $multicurrency_total_tva;
261 public $multicurrency_total_ttc;
266 public $fk_facture_source;
271 public $fields = array(
272 'rowid' =>array(
'type'=>
'integer',
'label'=>
'TechnicalID',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>10),
273 'ref' =>array(
'type'=>
'varchar(255)',
'label'=>
'Ref',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'showoncombobox'=>1,
'position'=>15),
274 'ref_supplier' =>array(
'type'=>
'varchar(255)',
'label'=>
'RefSupplier',
'enabled'=>1,
'visible'=>-1,
'position'=>20),
275 'entity' =>array(
'type'=>
'integer',
'label'=>
'Entity',
'default'=>1,
'enabled'=>1,
'visible'=>-2,
'notnull'=>1,
'position'=>25,
'index'=>1),
276 'ref_ext' =>array(
'type'=>
'varchar(255)',
'label'=>
'RefExt',
'enabled'=>1,
'visible'=>0,
'position'=>30),
277 'type' =>array(
'type'=>
'smallint(6)',
'label'=>
'Type',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>35),
278 'fk_soc' =>array(
'type'=>
'integer:Societe:societe/class/societe.class.php',
'label'=>
'ThirdParty',
'enabled'=>
'$conf->societe->enabled',
'visible'=>-1,
'notnull'=>1,
'position'=>40),
279 'datec' =>array(
'type'=>
'datetime',
'label'=>
'DateCreation',
'enabled'=>1,
'visible'=>-1,
'position'=>45),
280 'datef' =>array(
'type'=>
'date',
'label'=>
'Date',
'enabled'=>1,
'visible'=>-1,
'position'=>50),
281 'tms' =>array(
'type'=>
'timestamp',
'label'=>
'DateModification',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>55),
282 'libelle' =>array(
'type'=>
'varchar(255)',
'label'=>
'Label',
'enabled'=>1,
'visible'=>-1,
'position'=>60),
283 'paye' =>array(
'type'=>
'smallint(6)',
'label'=>
'Paye',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>65),
284 'amount' =>array(
'type'=>
'double(24,8)',
'label'=>
'Amount',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>70),
285 'remise' =>array(
'type'=>
'double(24,8)',
'label'=>
'Discount',
'enabled'=>1,
'visible'=>-1,
'position'=>75),
286 'close_code' =>array(
'type'=>
'varchar(16)',
'label'=>
'CloseCode',
'enabled'=>1,
'visible'=>-1,
'position'=>80),
287 'close_note' =>array(
'type'=>
'varchar(128)',
'label'=>
'CloseNote',
'enabled'=>1,
'visible'=>-1,
'position'=>85),
288 'tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'Tva',
'enabled'=>1,
'visible'=>-1,
'position'=>90),
289 'localtax1' =>array(
'type'=>
'double(24,8)',
'label'=>
'Localtax1',
'enabled'=>1,
'visible'=>-1,
'position'=>95),
290 'localtax2' =>array(
'type'=>
'double(24,8)',
'label'=>
'Localtax2',
'enabled'=>1,
'visible'=>-1,
'position'=>100),
291 'total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'TotalHT',
'enabled'=>1,
'visible'=>-1,
'position'=>105),
292 'total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'TotalVAT',
'enabled'=>1,
'visible'=>-1,
'position'=>110),
293 'total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'TotalTTC',
'enabled'=>1,
'visible'=>-1,
'position'=>115),
294 'fk_user_author' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserAuthor',
'enabled'=>1,
'visible'=>-1,
'position'=>125),
295 'fk_user_modif' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserModif',
'enabled'=>1,
'visible'=>-2,
'notnull'=>-1,
'position'=>130),
296 'fk_user_valid' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserValidation',
'enabled'=>1,
'visible'=>-1,
'position'=>135),
297 'fk_facture_source' =>array(
'type'=>
'integer',
'label'=>
'Fk facture source',
'enabled'=>1,
'visible'=>-1,
'position'=>140),
298 'fk_projet' =>array(
'type'=>
'integer:Project:projet/class/project.class.php:1:fk_statut=1',
'label'=>
'Project',
'enabled'=>
"isModEnabled('project')",
'visible'=>-1,
'position'=>145),
299 'fk_account' =>array(
'type'=>
'integer',
'label'=>
'Account',
'enabled'=>
'$conf->banque->enabled',
'visible'=>-1,
'position'=>150),
300 'fk_cond_reglement' =>array(
'type'=>
'integer',
'label'=>
'PaymentTerm',
'enabled'=>1,
'visible'=>-1,
'position'=>155),
301 'fk_mode_reglement' =>array(
'type'=>
'integer',
'label'=>
'PaymentMode',
'enabled'=>1,
'visible'=>-1,
'position'=>160),
302 'date_lim_reglement' =>array(
'type'=>
'date',
'label'=>
'DateLimReglement',
'enabled'=>1,
'visible'=>-1,
'position'=>165),
303 'note_private' =>array(
'type'=>
'text',
'label'=>
'NotePrivate',
'enabled'=>1,
'visible'=>0,
'position'=>170),
304 'note_public' =>array(
'type'=>
'text',
'label'=>
'NotePublic',
'enabled'=>1,
'visible'=>0,
'position'=>175),
305 'model_pdf' =>array(
'type'=>
'varchar(255)',
'label'=>
'ModelPdf',
'enabled'=>1,
'visible'=>0,
'position'=>180),
306 'extraparams' =>array(
'type'=>
'varchar(255)',
'label'=>
'Extraparams',
'enabled'=>1,
'visible'=>-1,
'position'=>190),
307 'fk_incoterms' =>array(
'type'=>
'integer',
'label'=>
'IncotermCode',
'enabled'=>1,
'visible'=>-1,
'position'=>195),
308 'location_incoterms' =>array(
'type'=>
'varchar(255)',
'label'=>
'IncotermLocation',
'enabled'=>1,
'visible'=>-1,
'position'=>200),
309 'fk_multicurrency' =>array(
'type'=>
'integer',
'label'=>
'MulticurrencyId',
'enabled'=>1,
'visible'=>-1,
'position'=>205),
310 'multicurrency_code' =>array(
'type'=>
'varchar(255)',
'label'=>
'MulticurrencyCode',
'enabled'=>1,
'visible'=>-1,
'position'=>210),
311 'multicurrency_tx' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyRate',
'enabled'=>1,
'visible'=>-1,
'position'=>215),
312 'multicurrency_total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyTotalHT',
'enabled'=>1,
'visible'=>-1,
'position'=>220),
313 'multicurrency_total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyTotalVAT',
'enabled'=>1,
'visible'=>-1,
'position'=>225),
314 'multicurrency_total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyTotalTTC',
'enabled'=>1,
'visible'=>-1,
'position'=>230),
315 'date_pointoftax' =>array(
'type'=>
'date',
'label'=>
'Date pointoftax',
'enabled'=>1,
'visible'=>-1,
'position'=>235),
316 'date_valid' =>array(
'type'=>
'date',
'label'=>
'DateValidation',
'enabled'=>1,
'visible'=>-1,
'position'=>240),
317 'last_main_doc' =>array(
'type'=>
'varchar(255)',
'label'=>
'Last main doc',
'enabled'=>1,
'visible'=>-1,
'position'=>245),
318 'fk_statut' =>array(
'type'=>
'smallint(6)',
'label'=>
'Status',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>500),
319 'import_key' =>array(
'type'=>
'varchar(14)',
'label'=>
'ImportId',
'enabled'=>1,
'visible'=>-2,
'position'=>900),
371 const CLOSECODE_DISCOUNTVAT =
'discount_vat';
372 const CLOSECODE_BADCREDIT =
'badsupplier';
373 const CLOSECODE_ABANDONED =
'abandon';
374 const CLOSECODE_REPLACED =
'replaced';
394 global $langs, $conf, $hookmanager;
400 if (isset($this->ref_supplier)) {
401 $this->ref_supplier = trim($this->ref_supplier);
403 if (empty($this->
type)) {
406 if (empty($this->date)) {
411 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
416 if (empty($this->fk_multicurrency)) {
417 $this->multicurrency_code = $conf->currency;
418 $this->fk_multicurrency = 0;
419 $this->multicurrency_tx = 1;
425 if ($this->fac_rec > 0) {
426 $this->fk_fac_rec_source = $this->fac_rec;
428 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.facture-rec.class.php';
430 $result = $_facrec->fetch($this->fac_rec);
431 $result = $_facrec->fetchObjectLinked(
null,
'',
null,
'',
'OR', 1,
'sourcetype', 0);
434 if (!empty($_facrec->frequency)) {
435 $originaldatewhen = $_facrec->date_when;
436 $nextdatewhen =
dol_time_plus_duree($originaldatewhen, $_facrec->frequency, $_facrec->unit_frequency);
438 $this->socid = $_facrec->socid;
441 $this->entity = $_facrec->entity;
444 $this->fk_project =
GETPOST(
'projectid',
'int') > 0 ? ((int)
GETPOST(
'projectid',
'int')) : $_facrec->fk_projet;
445 $this->fk_projet = $this->fk_project;
446 $this->note_public =
GETPOST(
'note_public',
'restricthtml') ?
GETPOST(
'note_public',
'restricthtml') : $_facrec->note_public;
447 $this->note_private =
GETPOST(
'note_private',
'restricthtml') ?
GETPOST(
'note_private',
'restricthtml') : $_facrec->note_private;
448 $this->model_pdf =
GETPOST(
'model',
'alpha') ?
GETPOST(
'model',
'alpha') : $_facrec->model_pdf;
449 $this->cond_reglement_id =
GETPOST(
'cond_reglement_id',
'int') > 0 ? ((int)
GETPOST(
'cond_reglement_id',
'int')) : $_facrec->cond_reglement_id;
450 $this->mode_reglement_id =
GETPOST(
'mode_reglement_id',
'int') > 0 ? ((int)
GETPOST(
'mode_reglement_id',
'int')) : $_facrec->mode_reglement_id;
451 $this->fk_account =
GETPOST(
'fk_account') > 0 ? ((int)
GETPOST(
'fk_account')) : $_facrec->fk_account;
454 $this->total_ht = $_facrec->total_ht;
455 $this->total_ttc = $_facrec->total_ttc;
458 $this->fk_incoterms = $_facrec->fk_incoterms;
459 $this->location_incoterms = $_facrec->location_incoterms;
465 if (!empty(
GETPOST(
'ref_supplier'))) {
466 $this->ref_supplier = trim($this->ref_supplier);
468 $this->ref_supplier = trim($this->ref_supplier .
'_' . ($_facrec->nb_gen_done + 1));
470 $this->note_public = trim($this->note_public);
471 $this->note_private = trim($this->note_private);
472 $this->note_private =
dol_concatdesc($this->note_private, $langs->trans(
"GeneratedFromRecurringInvoice", $_facrec->titre));
474 $this->array_options = $_facrec->array_options;
476 if (! $this->mode_reglement_id) {
477 $this->mode_reglement_id = 0;
479 $this->brouillon = 1;
483 $this->linked_objects = $_facrec->linkedObjectsIds;
490 if ($_facrec->frequency > 0) {
491 dol_syslog(
"This is a recurring invoice so we set date_last_gen and next date_when");
492 if (empty($_facrec->date_when)) {
493 $_facrec->date_when = $now;
495 $next_date = $_facrec->getNextDate();
496 $result = $_facrec->setValueFrom(
'date_last_gen', $now,
'',
null,
'date',
'', $user,
'');
498 $result = $_facrec->setNextDate($next_date, 1);
502 $outputlangs = $langs;
505 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && empty($newlang) && isset($this->thirdparty->default_lang)) {
506 $newlang = $this->thirdparty->default_lang;
508 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && empty($newlang) && isset($this->default_lang)) {
509 $newlang = $this->default_lang;
511 if (!empty($newlang)) {
513 $outputlangs->setDefaultLang($newlang);
519 $substitutionarray[
'__INVOICE_MONTH__'] =
dol_print_date($this->date,
'%m');
522 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] =
dol_print_date($this->date,
'%B');
525 $substitutionarray[
'__INVOICE_YEAR__'] =
dol_print_date($this->date,
'%Y');
528 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] =
dol_print_date($originaldatewhen,
'dayhour');
529 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] =
dol_print_date($nextdatewhen,
'dayhour');
530 $substitutionarray[
'__INVOICE_PREVIOUS_DATE_NEXT_INVOICE_AFTER_GEN__'] =
dol_print_date($previousdaynextdatewhen,
'dayhour');
531 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $_facrec->nb_gen_done;
532 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $_facrec->nb_gen_max;
541 if (!empty($forceduedate)) {
542 $this->date_echeance = $forceduedate;
545 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"facture_fourn (";
547 $sql .=
", ref_supplier";
555 $sql .=
", fk_projet";
556 $sql .=
", fk_cond_reglement";
557 $sql .=
", fk_mode_reglement";
558 $sql .=
", fk_account";
559 $sql .=
", note_private";
560 $sql .=
", note_public";
561 $sql .=
", fk_user_author";
562 $sql .=
", date_lim_reglement";
563 $sql .=
", fk_incoterms, location_incoterms";
564 $sql .=
", fk_multicurrency";
565 $sql .=
", multicurrency_code";
566 $sql .=
", multicurrency_tx";
567 $sql .=
", fk_facture_source";
568 $sql .=
", fk_fac_rec_source";
572 $sql .=
", '".$this->db->escape($this->ref_supplier).
"'";
573 $sql .=
", '".$this->db->escape($this->ref_ext).
"'";
574 $sql .=
", ".((int) $conf->entity);
575 $sql .=
", '".$this->db->escape($this->
type).
"'";
576 $sql .=
", '".$this->db->escape(isset($this->label) ? $this->label : (isset($this->libelle) ? $this->libelle :
'')).
"'";
577 $sql .=
", ".((int) $this->socid);
578 $sql .=
", '".$this->db->idate($now).
"'";
579 $sql .=
", '".$this->db->idate($this->date).
"'";
580 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
581 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
"null");
582 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
"null");
583 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
584 $sql .=
", '".$this->db->escape($this->note_private).
"'";
585 $sql .=
", '".$this->db->escape($this->note_public).
"'";
586 $sql .=
", ".((int) $user->id).
",";
587 $sql .= $this->date_echeance !=
'' ?
"'".$this->db->idate($this->date_echeance).
"'" :
"null";
588 $sql .=
", ".(int) $this->fk_incoterms;
589 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
590 $sql .=
", ".(int) $this->fk_multicurrency;
591 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
592 $sql .=
", ".(double) $this->multicurrency_tx;
593 $sql .=
", ".($this->fk_facture_source ? ((int) $this->fk_facture_source) :
"null");
594 $sql .=
", ".(isset($this->fk_fac_rec_source) ? $this->fk_fac_rec_source :
"NULL");
597 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
600 $this->
id = $this->
db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn');
603 $this->
ref =
'(PROV'.$this->id.
')';
604 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"facture_fourn SET ref='".$this->
db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
606 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
612 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
613 $this->linked_objects = $this->linkedObjectsIds;
617 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
618 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
619 if (is_array($tmp_origin_id)) {
620 foreach ($tmp_origin_id as $origin_id) {
629 $origin_id = $tmp_origin_id;
639 if (!$error && empty($this->fac_rec) && count($this->lines) && is_object($this->lines[0])) {
640 dol_syslog(
"There is ".count($this->lines).
" lines that are invoice lines objects");
641 foreach ($this->lines as $i => $val) {
642 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'facture_fourn_det (fk_facture_fourn, special_code, fk_remise_except)';
643 $sql .=
" VALUES (".((int) $this->
id).
", ".((int) $this->lines[$i]->special_code).
", ".($this->lines[$i]->fk_remise_except > 0 ? ((int) $this->lines[$i]->fk_remise_except) :
'NULL').
')';
645 $resql_insert = $this->
db->query($sql);
647 $idligne = $this->
db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn_det');
652 $this->lines[$i]->pu_ht,
653 $this->lines[$i]->tva_tx.($this->lines[$i]->vat_src_code ?
' ('.$this->lines[$i]->vat_src_code.
')' :
''),
654 $this->lines[$i]->localtax1_tx,
655 $this->lines[$i]->localtax2_tx,
656 $this->lines[$i]->qty,
657 $this->lines[$i]->fk_product,
659 (!empty($this->lines[$i]->info_bits) ? $this->lines[$i]->info_bits :
''),
660 $this->lines[$i]->product_type,
661 $this->lines[$i]->remise_percent,
663 $this->lines[$i]->date_start,
664 $this->lines[$i]->date_end,
665 $this->lines[$i]->array_options,
666 $this->lines[$i]->fk_unit,
667 $this->lines[$i]->multicurrency_subprice,
668 $this->lines[$i]->ref_supplier
671 $this->error = $this->
db->lasterror();
672 $this->
db->rollback();
676 } elseif (!$error && empty($this->fac_rec)) {
677 dol_syslog(
"There is ".count($this->lines).
" lines that are array lines");
678 foreach ($this->lines as $i => $val) {
679 $line = $this->lines[$i];
683 if (!is_object($line)) {
684 $line = (object) $line;
687 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'facture_fourn_det (fk_facture_fourn, special_code, fk_remise_except)';
688 $sql .=
" VALUES (".((int) $this->
id).
", ".((int) $this->lines[$i]->special_code).
", ".($this->lines[$i]->fk_remise_except > 0 ? ((int) $this->lines[$i]->fk_remise_except) :
'NULL').
')';
690 $resql_insert = $this->
db->query($sql);
692 $idligne = $this->
db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn_det');
704 (!empty($line->info_bits) ? $line->info_bits :
''),
706 $line->remise_percent,
710 $line->array_options,
712 $line->multicurrency_subprice,
716 $this->error = $this->
db->lasterror();
717 $this->
db->rollback();
726 if (! $error && $this->fac_rec > 0) {
727 foreach ($_facrec->lines as $i => $val) {
728 if ($_facrec->lines[$i]->fk_product) {
730 $res = $prod->fetch($_facrec->lines[$i]->fk_product);
741 $tva_tx = $_facrec->lines[$i]->tva_tx . ($_facrec->lines[$i]->vat_src_code ?
'(' . $_facrec->lines[$i]->vat_src_code .
')' :
'');
742 $tva_npr = $_facrec->lines[$i]->info_bits;
743 if (empty($tva_tx)) {
746 $localtax1_tx = $_facrec->lines[$i]->localtax1_tx;
747 $localtax2_tx = $_facrec->lines[$i]->localtax2_tx;
749 $fk_product_fournisseur_price = empty($_facrec->lines[$i]->fk_product_fournisseur_price) ? null : $_facrec->lines[$i]->fk_product_fournisseur_price;
750 $buyprice = empty($_facrec->lines[$i]->buyprice) ? 0 : $_facrec->lines[$i]->buyprice;
753 if (! $buyprice && $_facrec->lines[$i]->fk_product > 0) {
754 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.product.class.php';
756 $producttmp->fetch($_facrec->lines[$i]->fk_product);
761 if ($conf->global->MARGIN_TYPE ==
'costprice' && !empty($producttmp->cost_price)) {
762 $buyprice = $producttmp->cost_price;
763 } elseif (
isModEnabled(
'stock') && ($conf->global->MARGIN_TYPE ==
'costprice' || $conf->global->MARGIN_TYPE ==
'pmp') && !empty($producttmp->pmp)) {
764 $buyprice = $producttmp->pmp;
766 if ($producttmp->find_min_price_product_fournisseur($_facrec->lines[$i]->fk_product) > 0) {
767 if ($producttmp->product_fourn_price_id > 0) {
768 $buyprice =
price2num($producttmp->fourn_unitprice * (1 - $producttmp->fourn_remise_percent / 100) + $producttmp->fourn_remise,
'MU');
774 $result_insert = $this->
addline(
775 $_facrec->lines[$i]->description,
776 $_facrec->lines[$i]->pu_ht,
780 $_facrec->lines[$i]->qty,
781 $_facrec->lines[$i]->fk_product,
782 $_facrec->lines[$i]->remise_percent,
783 ($_facrec->lines[$i]->date_start == 1 && $this->date) ? $this->date :
'',
784 ($_facrec->lines[$i]->date_end == 1 && $previousdaynextdatewhen) ? $previousdaynextdatewhen :
'',
786 $_facrec->lines[$i]->info_bits,
789 $_facrec->lines[$i]->rang,
791 $_facrec->lines[$i]->array_options,
792 $_facrec->lines[$i]->fk_unit,
795 $_facrec->lines[$i]->ref_supplier,
796 $_facrec->lines[$i]->special_code,
800 if ($result_insert < 0) {
802 $this->error = $this->
db->error();
822 $result = $this->
call_trigger(
'BILL_SUPPLIER_CREATE', $user);
833 $this->
db->rollback();
837 $this->error = $langs->trans(
'FailedToUpdatePrice');
838 $this->
db->rollback();
842 if ($this->
db->errno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
843 $this->error = $langs->trans(
'ErrorRefAlreadyExists');
844 $this->
db->rollback();
847 $this->error = $this->
db->lasterror();
848 $this->
db->rollback();
862 public function fetch($id =
'', $ref =
'', $ref_ext =
'')
864 if (empty($id) && empty($ref) && empty($ref_ext)) {
871 $sql .=
" t.ref_supplier,";
872 $sql .=
" t.ref_ext,";
873 $sql .=
" t.entity,";
875 $sql .=
" t.fk_soc,";
879 $sql .=
" t.libelle as label,";
881 $sql .=
" t.close_code,";
882 $sql .=
" t.close_note,";
884 $sql .=
" t.localtax1,";
885 $sql .=
" t.localtax2,";
886 $sql .=
" t.total_ht,";
887 $sql .=
" t.total_tva,";
888 $sql .=
" t.total_ttc,";
889 $sql .=
" t.fk_statut as status,";
890 $sql .=
" t.fk_user_author,";
891 $sql .=
" t.fk_user_valid,";
892 $sql .=
" t.fk_facture_source,";
893 $sql .=
" t.fk_fac_rec_source,";
894 $sql .=
" t.fk_projet as fk_project,";
895 $sql .=
" t.fk_cond_reglement,";
896 $sql .=
" t.fk_account,";
897 $sql .=
" t.fk_mode_reglement,";
898 $sql .=
" t.date_lim_reglement,";
899 $sql .=
" t.note_private,";
900 $sql .=
" t.note_public,";
901 $sql .=
" t.model_pdf,";
902 $sql .=
" t.import_key,";
903 $sql .=
" t.extraparams,";
904 $sql .=
" cr.code as cond_reglement_code, cr.libelle as cond_reglement_label, cr.libelle_facture as cond_reglement_doc,";
905 $sql .=
" p.code as mode_reglement_code, p.libelle as mode_reglement_label,";
906 $sql .=
' s.nom as socnom, s.rowid as socid,';
907 $sql .=
' t.fk_incoterms, t.location_incoterms,';
908 $sql .=
" i.libelle as label_incoterms,";
909 $sql .=
' t.fk_transport_mode,';
910 $sql .=
' t.fk_multicurrency, t.multicurrency_code, t.multicurrency_tx, t.multicurrency_total_ht, t.multicurrency_total_tva, t.multicurrency_total_ttc';
911 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as t';
912 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON (t.fk_soc = s.rowid)";
913 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_payment_term as cr ON t.fk_cond_reglement = cr.rowid";
914 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as p ON t.fk_mode_reglement = p.id";
915 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON t.fk_incoterms = i.rowid';
917 $sql .=
" WHERE t.rowid = ".((int) $id);
919 $sql .=
' WHERE t.entity IN ('.getEntity(
'supplier_invoice').
')';
921 $sql .=
" AND t.ref = '".$this->db->escape($ref).
"'";
924 $sql .=
" AND t.ref_ext = '".$this->db->escape($ref_ext).
"'";
928 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
932 $obj = $this->
db->fetch_object(
$resql);
934 $this->
id = $obj->rowid;
935 $this->
ref = $obj->ref ? $obj->ref : $obj->rowid;
937 $this->ref_supplier = $obj->ref_supplier;
938 $this->ref_ext = $obj->ref_ext;
939 $this->entity = $obj->entity;
941 $this->fk_soc = $obj->fk_soc;
942 $this->datec = $this->
db->jdate($obj->datec);
943 $this->date = $this->
db->jdate($obj->datef);
944 $this->datep = $this->
db->jdate($obj->datef);
945 $this->tms = $this->
db->jdate($obj->tms);
946 $this->libelle = $obj->label;
947 $this->label = $obj->label;
948 $this->paye = $obj->paye;
949 $this->paid = $obj->paye;
950 $this->close_code = $obj->close_code;
951 $this->close_note = $obj->close_note;
952 $this->total_localtax1 = $obj->localtax1;
953 $this->total_localtax2 = $obj->localtax2;
954 $this->total_ht = $obj->total_ht;
955 $this->total_tva = $obj->total_tva;
956 $this->total_ttc = $obj->total_ttc;
957 $this->status = $obj->status;
958 $this->statut = $obj->status;
959 $this->fk_statut = $obj->status;
960 $this->fk_user_author = $obj->fk_user_author;
961 $this->author = $obj->fk_user_author;
962 $this->fk_user_valid = $obj->fk_user_valid;
963 $this->fk_facture_source = $obj->fk_facture_source;
964 $this->fk_fac_rec_source = $obj->fk_fac_rec_source;
965 $this->fk_project = $obj->fk_project;
966 $this->cond_reglement_id = $obj->fk_cond_reglement;
967 $this->cond_reglement_code = $obj->cond_reglement_code;
968 $this->cond_reglement = $obj->cond_reglement_label;
969 $this->cond_reglement_label = $obj->cond_reglement_label;
970 $this->cond_reglement_doc = $obj->cond_reglement_doc;
971 $this->fk_account = $obj->fk_account;
972 $this->mode_reglement_id = $obj->fk_mode_reglement;
973 $this->mode_reglement_code = $obj->mode_reglement_code;
974 $this->mode_reglement = $obj->mode_reglement_label;
975 $this->date_echeance = $this->
db->jdate($obj->date_lim_reglement);
976 $this->note = $obj->note_private;
977 $this->note_private = $obj->note_private;
978 $this->note_public = $obj->note_public;
979 $this->model_pdf = $obj->model_pdf;
980 $this->modelpdf = $obj->model_pdf;
981 $this->import_key = $obj->import_key;
984 $this->fk_incoterms = $obj->fk_incoterms;
985 $this->location_incoterms = $obj->location_incoterms;
986 $this->label_incoterms = $obj->label_incoterms;
987 $this->transport_mode_id = $obj->fk_transport_mode;
990 $this->fk_multicurrency = $obj->fk_multicurrency;
991 $this->multicurrency_code = $obj->multicurrency_code;
992 $this->multicurrency_tx = $obj->multicurrency_tx;
993 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
994 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
995 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
997 $this->extraparams = (array) json_decode($obj->extraparams,
true);
999 $this->socid = $obj->socid;
1000 $this->socnom = $obj->socnom;
1006 if ($this->statut == self::STATUS_DRAFT) {
1007 $this->brouillon = 1;
1012 $this->error = $this->
db->lasterror();
1016 $this->error =
'Bill with id '.$id.
' not found';
1017 dol_syslog(get_class($this).
'::fetch '.$this->error);
1024 $this->error =
"Error ".$this->db->lasterror();
1039 $this->lines = array();
1041 $sql =
'SELECT f.rowid, f.ref as ref_supplier, f.description, f.date_start, f.date_end, f.pu_ht, f.pu_ttc, f.qty, f.remise_percent, f.vat_src_code, f.tva_tx';
1042 $sql .=
', f.localtax1_tx, f.localtax2_tx, f.localtax1_type, f.localtax2_type, f.total_localtax1, f.total_localtax2, f.fk_facture_fourn, f.fk_remise_except';
1043 $sql .=
', f.total_ht, f.tva as total_tva, f.total_ttc, f.fk_product, f.product_type, f.info_bits, f.rang, f.special_code, f.fk_parent_line, f.fk_unit';
1044 $sql .=
', p.rowid as product_id, p.ref as product_ref, p.label as label, p.description as product_desc';
1045 $sql .=
', f.fk_code_ventilation, f.fk_multicurrency, f.multicurrency_code, f.multicurrency_subprice, f.multicurrency_total_ht, f.multicurrency_total_tva, f.multicurrency_total_ttc';
1046 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn_det as f';
1047 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON f.fk_product = p.rowid';
1048 $sql .=
' WHERE fk_facture_fourn='.((int) $this->
id);
1049 $sql .=
' ORDER BY f.rang, f.rowid';
1051 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
1053 $resql_rows = $this->
db->query($sql);
1055 $num_rows = $this->
db->num_rows($resql_rows);
1058 while ($i < $num_rows) {
1059 $obj = $this->
db->fetch_object($resql_rows);
1063 $line->id = $obj->rowid;
1064 $line->rowid = $obj->rowid;
1065 $line->description = $obj->description;
1066 $line->date_start = $obj->date_start;
1067 $line->date_end = $obj->date_end;
1069 $line->product_ref = $obj->product_ref;
1070 $line->ref = $obj->product_ref;
1071 $line->ref_supplier = $obj->ref_supplier;
1072 $line->libelle = $obj->label;
1073 $line->label = $obj->label;
1074 $line->product_desc = $obj->product_desc;
1075 $line->subprice = $obj->pu_ht;
1076 $line->pu_ht = $obj->pu_ht;
1077 $line->pu_ttc = $obj->pu_ttc;
1079 $line->vat_src_code = $obj->vat_src_code;
1080 $line->tva_tx = $obj->tva_tx;
1081 $line->localtax1_tx = $obj->localtax1_tx;
1082 $line->localtax2_tx = $obj->localtax2_tx;
1083 $line->localtax1_type = $obj->localtax1_type;
1084 $line->localtax2_type = $obj->localtax2_type;
1085 $line->qty = $obj->qty;
1086 $line->remise_percent = $obj->remise_percent;
1087 $line->fk_remise_except = $obj->fk_remise_except;
1089 $line->total_ht = $obj->total_ht;
1090 $line->total_ttc = $obj->total_ttc;
1091 $line->total_tva = $obj->total_tva;
1092 $line->total_localtax1 = $obj->total_localtax1;
1093 $line->total_localtax2 = $obj->total_localtax2;
1094 $line->fk_facture_fourn = $obj->fk_facture_fourn;
1095 $line->fk_product = $obj->fk_product;
1096 $line->product_type = $obj->product_type;
1097 $line->product_label = $obj->label;
1098 $line->info_bits = $obj->info_bits;
1099 $line->fk_parent_line = $obj->fk_parent_line;
1100 $line->special_code = $obj->special_code;
1101 $line->rang = $obj->rang;
1102 $line->fk_unit = $obj->fk_unit;
1105 $line->code_ventilation = $obj->fk_code_ventilation;
1106 $line->fk_accounting_account = $obj->fk_code_ventilation;
1109 $line->fk_multicurrency = $obj->fk_multicurrency;
1110 $line->multicurrency_code = $obj->multicurrency_code;
1111 $line->multicurrency_subprice = $obj->multicurrency_subprice;
1112 $line->multicurrency_total_ht = $obj->multicurrency_total_ht;
1113 $line->multicurrency_total_tva = $obj->multicurrency_total_tva;
1114 $line->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1117 $line->fetch_optionals();
1119 $this->lines[$i] = $line;
1124 $this->
db->free($resql_rows);
1127 $this->error = $this->
db->error();
1140 public function update($user =
null, $notrigger = 0)
1142 global $conf, $langs;
1146 if (empty($this->
type)) {
1149 if (isset($this->
ref)) {
1150 $this->
ref = trim($this->
ref);
1152 if (isset($this->ref_supplier)) {
1153 $this->ref_supplier = trim($this->ref_supplier);
1155 if (isset($this->ref_ext)) {
1156 $this->ref_ext = trim($this->ref_ext);
1158 if (isset($this->entity)) {
1159 $this->entity = trim($this->entity);
1161 if (isset($this->
type)) {
1164 if (isset($this->fk_soc)) {
1165 $this->fk_soc = trim($this->fk_soc);
1167 if (isset($this->label)) {
1168 $this->label = trim($this->label);
1170 if (isset($this->libelle)) {
1171 $this->libelle = trim($this->libelle);
1173 if (isset($this->paye)) {
1174 $this->paye = trim($this->paye);
1176 if (isset($this->close_code)) {
1177 $this->close_code = trim($this->close_code);
1179 if (isset($this->close_note)) {
1180 $this->close_note = trim($this->close_note);
1182 if (isset($this->localtax1)) {
1183 $this->localtax1 = trim($this->localtax1);
1185 if (isset($this->localtax2)) {
1186 $this->localtax2 = trim($this->localtax2);
1188 if (empty($this->total_ht)) {
1189 $this->total_ht = 0;
1191 if (empty($this->total_tva)) {
1192 $this->total_tva = 0;
1196 if (isset($this->total_ttc)) {
1197 $this->total_ttc = trim($this->total_ttc);
1199 if (isset($this->statut)) {
1200 $this->statut = (int) $this->statut;
1202 if (isset($this->status)) {
1203 $this->status = (int) $this->status;
1205 if (isset($this->author)) {
1206 $this->author = trim($this->author);
1208 if (isset($this->fk_user_valid)) {
1209 $this->fk_user_valid = trim($this->fk_user_valid);
1211 if (isset($this->fk_facture_source)) {
1212 $this->fk_facture_source = trim($this->fk_facture_source);
1214 if (isset($this->fk_project)) {
1215 if (empty($this->fk_project)) $this->fk_project =
null;
1216 else $this->fk_project = intval($this->fk_project);
1218 if (isset($this->cond_reglement_id)) {
1219 $this->cond_reglement_id = trim($this->cond_reglement_id);
1221 if (isset($this->note_private)) {
1222 $this->note = trim($this->note_private);
1224 if (isset($this->note_public)) {
1225 $this->note_public = trim($this->note_public);
1227 if (isset($this->model_pdf)) {
1228 $this->model_pdf = trim($this->model_pdf);
1230 if (isset($this->import_key)) {
1231 $this->import_key = trim($this->import_key);
1239 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn SET";
1240 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
1241 $sql .=
" ref_supplier=".(isset($this->ref_supplier) ?
"'".$this->db->escape($this->ref_supplier).
"'" :
"null").
",";
1242 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
1243 $sql .=
" entity=".(isset($this->entity) ? ((int) $this->entity) :
"null").
",";
1244 $sql .=
" type=".(isset($this->
type) ? ((int) $this->
type) :
"null").
",";
1245 $sql .=
" fk_soc=".(isset($this->fk_soc) ? ((int) $this->fk_soc) :
"null").
",";
1246 $sql .=
" datec=".(dol_strlen($this->datec) != 0 ?
"'".$this->db->idate($this->datec).
"'" :
'null').
",";
1247 $sql .=
" datef=".(dol_strlen($this->date) != 0 ?
"'".$this->db->idate($this->date).
"'" :
'null').
",";
1249 $sql .=
" tms=".(dol_strlen($this->tms) != 0 ?
"'".$this->db->idate($this->tms).
"'" :
'null').
",";
1251 $sql .=
" libelle=".(isset($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
1252 $sql .=
" paye=".(isset($this->paye) ? ((int) $this->paye) :
"null").
",";
1253 $sql .=
" close_code=".(isset($this->close_code) ?
"'".$this->db->escape($this->close_code).
"'" :
"null").
",";
1254 $sql .=
" close_note=".(isset($this->close_note) ?
"'".$this->db->escape($this->close_note).
"'" :
"null").
",";
1255 $sql .=
" localtax1=".(isset($this->localtax1) ? ((
float) $this->localtax1) :
"null").
",";
1256 $sql .=
" localtax2=".(isset($this->localtax2) ? ((
float) $this->localtax2) :
"null").
",";
1257 $sql .=
" total_ht=".(isset($this->total_ht) ? ((
float) $this->total_ht) :
"null").
",";
1258 $sql .=
" total_tva=".(isset($this->total_tva) ? ((
float) $this->total_tva) :
"null").
",";
1259 $sql .=
" total_ttc=".(isset($this->total_ttc) ? ((
float) $this->total_ttc) :
"null").
",";
1260 $sql .=
" fk_statut=".(isset($this->status) ? ((int) $this->status) : (isset($this->statut) ? ((int) $this->statut) :
"null")).
",";
1261 $sql .=
" fk_user_author=".(isset($this->author) ? ((int) $this->author) :
"null").
",";
1262 $sql .=
" fk_user_valid=".(isset($this->fk_user_valid) ? ((int) $this->fk_user_valid) :
"null").
",";
1263 $sql .=
" fk_facture_source=".($this->fk_facture_source ? ((int) $this->fk_facture_source) :
"null").
",";
1264 $sql .=
" fk_projet=".(isset($this->fk_project) ? ((int) $this->fk_project) :
"null").
",";
1265 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? ((int) $this->cond_reglement_id) :
"null").
",";
1266 $sql .=
" date_lim_reglement=".(dol_strlen($this->date_echeance) != 0 ?
"'".$this->db->idate($this->date_echeance).
"'" :
'null').
",";
1267 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
1268 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
1269 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
1270 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null").
"";
1271 $sql .=
" WHERE rowid=".((int) $this->
id);
1275 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
1281 if ($this->
db->errno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1282 $this->errors[] = $langs->trans(
'ErrorRefAlreadyExists');
1284 $this->errors[] =
"Error ".$this->db->lasterror();
1298 $result = $this->
call_trigger(
'BILL_SUPPLIER_MODIFY', $user);
1308 foreach ($this->errors as $errmsg) {
1309 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1310 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1312 $this->
db->rollback();
1315 $this->
db->commit();
1330 global $conf, $langs;
1332 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1333 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
1338 $result =
$remise->fetch($idremise);
1341 if (
$remise->fk_invoice_supplier) {
1342 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
1343 $this->
db->rollback();
1348 $facligne->fk_facture_fourn = $this->id;
1349 $facligne->fk_remise_except =
$remise->id;
1350 $facligne->desc =
$remise->description;
1351 $facligne->vat_src_code =
$remise->vat_src_code;
1352 $facligne->tva_tx =
$remise->tva_tx;
1353 $facligne->subprice = -
$remise->amount_ht;
1354 $facligne->fk_product = 0;
1355 $facligne->product_type = 0;
1357 $facligne->remise_percent = 0;
1358 $facligne->rang = -1;
1359 $facligne->info_bits = 2;
1361 if (!empty($conf->global->MAIN_ADD_LINE_AT_POSITION)) {
1362 $facligne->rang = 1;
1363 $linecount = count($this->lines);
1364 for ($ii = 1; $ii <= $linecount; $ii++) {
1370 if (
$remise->fk_invoice_supplier_source > 0) {
1372 $srcinvoice->fetch(
$remise->fk_invoice_supplier_source);
1373 $totalcostpriceofinvoice = 0;
1374 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
1376 $arraytmp = $formmargin->getMarginInfosArray($srcinvoice,
false);
1377 $facligne->pa_ht = $arraytmp[
'pa_total'];
1380 $facligne->total_ht = -
$remise->amount_ht;
1381 $facligne->total_tva = -
$remise->amount_tva;
1382 $facligne->total_ttc = -
$remise->amount_ttc;
1384 $facligne->multicurrency_subprice = -
$remise->multicurrency_subprice;
1385 $facligne->multicurrency_total_ht = -
$remise->multicurrency_total_ht;
1386 $facligne->multicurrency_total_tva = -
$remise->multicurrency_total_tva;
1387 $facligne->multicurrency_total_ttc = -
$remise->multicurrency_total_ttc;
1389 $lineid = $facligne->insert();
1394 $result =
$remise->link_to_invoice($lineid, 0);
1396 $this->error =
$remise->error;
1397 $this->
db->rollback();
1401 $this->
db->commit();
1404 $this->error = $facligne->error;
1405 $this->
db->rollback();
1409 $this->error = $facligne->error;
1410 $this->
db->rollback();
1414 $this->
db->rollback();
1427 public function delete(
User $user, $notrigger = 0)
1429 global $langs, $conf;
1433 dol_syslog(
"FactureFournisseur::delete rowid=".$rowid, LOG_DEBUG);
1440 if (!$error && !$notrigger) {
1442 $result = $this->
call_trigger(
'BILL_SUPPLIER_DELETE', $user);
1444 $this->
db->rollback();
1452 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'societe_remise_except';
1453 $sql .=
' WHERE fk_invoice_supplier_source = '.((int) $rowid);
1454 $sql .=
' AND fk_invoice_supplier_line IS NULL';
1459 $list_rowid_det = array();
1460 foreach ($this->lines as $key => $invoiceline) {
1461 $list_rowid_det[] = $invoiceline->rowid;
1465 if (count($list_rowid_det)) {
1466 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
1467 $sql .=
' SET fk_invoice_supplier = NULL, fk_invoice_supplier_line = NULL';
1468 $sql .=
' WHERE fk_invoice_supplier_line IN ('.$this->db->sanitize(join(
',', $list_rowid_det)).
')';
1470 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1471 if (!$this->
db->query($sql)) {
1478 $main = MAIN_DB_PREFIX.
'facture_fourn_det';
1479 $ef = $main.
"_extrafields";
1480 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM ".$main.
" WHERE fk_facture_fourn = ".((int) $rowid).
")";
1481 $resqlef = $this->
db->query($sqlef);
1482 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'facture_fourn_det WHERE fk_facture_fourn = '.((int) $rowid);
1483 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1485 if ($resqlef &&
$resql) {
1486 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'facture_fourn WHERE rowid = '.((int) $rowid);
1487 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1488 $resql2 = $this->
db->query($sql);
1518 if ($conf->fournisseur->facture->dir_output) {
1519 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1522 $dir = $conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$ref;
1523 $file = $dir.
"/".$ref.
".pdf";
1524 if (file_exists($file)) {
1526 $this->error =
'ErrorFailToDeleteFile';
1530 if (file_exists($dir)) {
1534 $this->error =
'ErrorFailToDeleteDir';
1546 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
1551 dol_syslog(get_class($this).
"::delete $this->id by $user->id", LOG_DEBUG);
1552 $this->
db->commit();
1555 $this->error = $this->
db->lasterror();
1556 $this->
db->rollback();
1573 public function set_paid($user, $close_code =
'', $close_note =
'')
1576 dol_syslog(get_class($this).
"::set_paid is deprecated, use setPaid instead", LOG_NOTICE);
1577 return $this->
setPaid($user, $close_code, $close_note);
1588 public function setPaid($user, $close_code =
'', $close_note =
'')
1592 if ($this->paye != 1) {
1597 dol_syslog(
"FactureFournisseur::set_paid", LOG_DEBUG);
1599 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn SET';
1600 $sql .=
' fk_statut = '.self::STATUS_CLOSED;
1605 $sql .=
", close_code='".$this->db->escape($close_code).
"'";
1608 $sql .=
", close_note='".$this->db->escape($close_note).
"'";
1610 $sql .=
', fk_user_closing = '.((int) $user->id);
1611 $sql .=
", date_closing = '".$this->db->idate($now).
"'";
1612 $sql .=
' WHERE rowid = '.((int) $this->
id);
1617 $result = $this->
call_trigger(
'BILL_SUPPLIER_PAYED', $user);
1624 $this->error = $this->
db->error();
1629 $this->
db->commit();
1632 $this->
db->rollback();
1654 dol_syslog(get_class($this).
"::set_unpaid is deprecated, use setUnpaid instead", LOG_NOTICE);
1672 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn';
1673 $sql .=
' SET paye=0, fk_statut='.self::STATUS_VALIDATED.
', close_code=null, close_note=null,';
1674 $sql .=
' date_closing=null,';
1675 $sql .=
' fk_user_closing=null';
1676 $sql .=
' WHERE rowid = '.((int) $this->
id);
1678 dol_syslog(get_class($this).
"::set_unpaid", LOG_DEBUG);
1682 $result = $this->
call_trigger(
'BILL_SUPPLIER_UNPAYED', $user);
1689 $this->error = $this->
db->error();
1694 $this->
db->commit();
1697 $this->
db->rollback();
1712 public function setCanceled($user, $close_code =
'', $close_note =
'')
1714 dol_syslog(get_class($this).
"::setCanceled rowid=".((
int) $this->
id), LOG_DEBUG);
1718 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn SET';
1719 $sql .=
' fk_statut='.self::STATUS_ABANDONED;
1721 $sql .=
", close_code='".$this->db->escape($close_code).
"'";
1724 $sql .=
", close_note='".$this->db->escape($close_note).
"'";
1726 $sql .=
" WHERE rowid = ".((int) $this->
id);
1732 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
1733 $sql .=
' SET fk_invoice_supplier = NULL';
1734 $sql .=
' WHERE fk_invoice_supplier = '.((int) $this->
id);
1739 $result = $this->
call_trigger(
'BILL_SUPPLIER_CANCEL', $user);
1741 $this->
db->rollback();
1746 $this->
db->commit();
1749 $this->error = $this->
db->error().
" sql=".$sql;
1750 $this->
db->rollback();
1754 $this->error = $this->
db->error().
" sql=".$sql;
1755 $this->
db->rollback();
1769 public function validate($user, $force_number =
'', $idwarehouse = 0, $notrigger = 0)
1771 global $conf, $langs;
1773 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1778 dol_syslog(get_class($this).
'::validate user='.$user->id.
', force_number='.$force_number.
', idwarehouse='.$idwarehouse);
1785 if ($this->statut > self::STATUS_DRAFT) {
1786 dol_syslog(get_class($this).
"::validate no draft status", LOG_WARNING);
1789 if (preg_match(
'/^'.preg_quote($langs->trans(
"CopyOf").
' ').
'/', $this->ref_supplier)) {
1790 $langs->load(
"errors");
1791 $this->error = $langs->trans(
"ErrorFieldFormat", $langs->transnoentities(
"RefSupplier")).
'. '.$langs->trans(
'RemoveString', $langs->transnoentitiesnoconv(
"CopyOf"));
1794 if (count($this->lines) <= 0) {
1795 $langs->load(
"errors");
1796 $this->error = $langs->trans(
"ErrorObjectMustHaveLinesToBeValidated", $this->
ref);
1803 if ($force_number) {
1804 $num = $force_number;
1805 } elseif (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1812 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn";
1813 $sql .=
" SET ref='".$this->db->escape($num).
"', fk_statut = 1, fk_user_valid = ".((int) $user->id).
", date_valid = '".$this->
db->idate($now).
"'";
1814 $sql .=
" WHERE rowid = ".((int) $this->
id);
1816 dol_syslog(get_class($this).
"::validate", LOG_DEBUG);
1820 if (!$error &&
isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) {
1821 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1822 $langs->load(
"agenda");
1824 $cpt = count($this->lines);
1825 for ($i = 0; $i < $cpt; $i++) {
1826 if ($this->lines[$i]->fk_product > 0) {
1827 $this->line = $this->lines[$i];
1829 $mouvP->origin = &$this;
1830 $mouvP->setOrigin($this->element, $this->
id);
1832 $up_ht_disc = $this->lines[$i]->pu_ht;
1833 if (!empty($this->lines[$i]->remise_percent) && empty($conf->global->STOCK_EXCLUDE_DISCOUNT_FOR_PMP)) {
1834 $up_ht_disc =
price2num($up_ht_disc * (100 - $this->lines[$i]->remise_percent) / 100,
'MU');
1837 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans(
"InvoiceValidatedInDolibarr", $num));
1839 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans(
"InvoiceValidatedInDolibarr", $num));
1850 if (!$error && empty($notrigger)) {
1852 $result = $this->
call_trigger(
'BILL_SUPPLIER_VALIDATE', $user);
1860 $this->oldref = $this->ref;
1863 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1865 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->
db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'fournisseur/facture/".
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$this->db->escape($this->newref).
"'";
1866 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'fournisseur/facture/".
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1869 $error++; $this->error = $this->
db->lasterror();
1875 $dirsource = $conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$oldref;
1876 $dirdest = $conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$newref;
1877 if (!$error && file_exists($dirsource)) {
1878 dol_syslog(get_class($this).
"::validate rename dir ".$dirsource.
" into ".$dirdest);
1880 if (@rename($dirsource, $dirdest)) {
1883 $listoffiles =
dol_dir_list($conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1884 foreach ($listoffiles as $fileentry) {
1885 $dirsource = $fileentry[
'name'];
1886 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1887 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1888 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1889 @rename($dirsource, $dirdest);
1904 $this->
db->commit();
1907 $this->
db->rollback();
1911 $this->error = $this->
db->error();
1912 $this->
db->rollback();
1927 global $conf, $langs;
1931 if ($this->statut == self::STATUS_DRAFT) {
1932 dol_syslog(__METHOD__.
" already draft status", LOG_WARNING);
1940 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn";
1941 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1942 $sql .=
" WHERE rowid = ".((int) $this->
id);
1944 $result = $this->
db->query($sql);
1947 $this->oldcopy = clone $this;
1951 if ($result >= 0 &&
isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) {
1952 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1953 $langs->load(
"agenda");
1955 $cpt = count($this->lines);
1956 for ($i = 0; $i < $cpt; $i++) {
1957 if ($this->lines[$i]->fk_product > 0) {
1959 $mouvP->origin = &$this;
1960 $mouvP->setOrigin($this->element, $this->
id);
1963 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"InvoiceBackToDraftInDolibarr", $this->ref));
1965 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"InvoiceBackToDraftInDolibarr", $this->ref));
1971 if (!$error && empty($notrigger)) {
1973 $result = $this->
call_trigger(
'BILL_SUPPLIER_UNVALIDATE', $user);
1980 $this->
db->commit();
1983 $this->
db->rollback();
1987 $this->error = $this->
db->error();
1988 $this->
db->rollback();
2027 public function addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_product = 0, $remise_percent = 0, $date_start =
'', $date_end =
'', $ventil = 0, $info_bits =
'', $price_base_type =
'HT', $type = 0, $rang = -1, $notrigger =
false, $array_options = 0, $fk_unit =
null, $origin_id = 0, $pu_devise = 0, $ref_supplier =
'', $special_code =
'', $fk_parent_line = 0, $fk_remise_except = 0)
2029 global $langs, $mysoc, $conf;
2031 dol_syslog(get_class($this).
"::addline $desc,$pu,$qty,$txtva,$fk_product,$remise_percent,$date_start,$date_end,$ventil,$info_bits,$price_base_type,$type,$fk_unit,fk_remise_except=$fk_remise_except", LOG_DEBUG);
2032 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2034 if ($this->statut == self::STATUS_DRAFT) {
2036 if (empty($remise_percent)) {
2037 $remise_percent = 0;
2042 if (empty($info_bits)) {
2048 if (empty($ventil)) {
2051 if (empty($txtva)) {
2054 if (empty($txlocaltax1)) {
2057 if (empty($txlocaltax2)) {
2061 $remise_percent =
price2num($remise_percent);
2064 if (!preg_match(
'/\((.*)\)/', $txtva)) {
2070 if ($date_start && $date_end && $date_start > $date_end) {
2071 $langs->load(
"errors");
2072 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
2078 if ($fk_product > 0) {
2079 if (!empty($conf->global->SUPPLIER_INVOICE_WITH_PREDEFINED_PRICES_ONLY)) {
2081 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
2083 if ($prod->fetch($fk_product) > 0) {
2084 $product_type = $prod->type;
2085 $label = $prod->label;
2086 $fk_prod_fourn_price = 0;
2090 $result = $prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', ($this->fk_soc ? $this->fk_soc : $this->socid));
2093 $pu = $prod->fourn_pu;
2095 $ref_supplier = $prod->ref_supplier;
2097 if ($remise_percent == 0 && $prod->remise_percent != 0) {
2098 $remise_percent = $prod->remise_percent;
2102 $langs->load(
"errors");
2103 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
2104 $this->
db->rollback();
2105 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
2110 if ($result == -1) {
2111 $langs->load(
"errors");
2112 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
2113 $this->
db->rollback();
2114 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
2118 $this->error = $prod->error;
2119 $this->
db->rollback();
2120 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
2124 $this->error = $prod->error;
2125 $this->
db->rollback();
2130 $product_type = $type;
2142 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
2143 $vat_src_code = $reg[1];
2144 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
2152 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_devise);
2153 $total_ht = $tabprice[0];
2154 $total_tva = $tabprice[1];
2155 $total_ttc = $tabprice[2];
2156 $total_localtax1 = $tabprice[9];
2157 $total_localtax2 = $tabprice[10];
2158 $pu_ht = $tabprice[3];
2161 $multicurrency_total_ht = $tabprice[16];
2162 $multicurrency_total_tva = $tabprice[17];
2163 $multicurrency_total_ttc = $tabprice[18];
2164 $pu_ht_devise = $tabprice[19];
2173 $rang = $rangmax + 1;
2179 $this->line->context = $this->context;
2181 $this->line->fk_facture_fourn = $this->id;
2183 $this->line->desc = $desc;
2184 $this->line->ref_supplier = $ref_supplier;
2186 $this->line->qty = ($this->
type == self::TYPE_CREDIT_NOTE ? abs($qty) : $qty);
2187 $this->line->subprice = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht) : $pu_ht);
2189 $this->line->vat_src_code = $vat_src_code;
2190 $this->line->tva_tx = $txtva;
2191 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
2192 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
2193 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
2194 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
2196 $this->line->total_ht = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_ht) : $total_ht);
2197 $this->line->total_tva = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_tva) : $total_tva);
2198 $this->line->total_localtax1 = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_localtax1) : $total_localtax1);
2199 $this->line->total_localtax2 = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_localtax2) : $total_localtax2);
2200 $this->line->total_ttc = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_ttc) : $total_ttc);
2202 $this->line->fk_product = $fk_product;
2203 $this->line->product_type = $type;
2204 $this->line->remise_percent = $remise_percent;
2205 $this->line->date_start = $date_start;
2206 $this->line->date_end = $date_end;
2207 $this->line->fk_code_ventilation = $ventil;
2208 $this->line->rang = $rang;
2209 $this->line->info_bits = $info_bits;
2210 $this->line->fk_remise_except = $fk_remise_except;
2212 $this->line->special_code = ((string) $special_code !=
'' ? $special_code : $this->special_code);
2213 $this->line->fk_parent_line = $fk_parent_line;
2214 $this->line->origin = $this->origin;
2215 $this->line->origin_id = $origin_id;
2216 $this->line->fk_unit = $fk_unit;
2219 $this->line->fk_multicurrency = $this->fk_multicurrency;
2220 $this->line->multicurrency_code = $this->multicurrency_code;
2221 $this->line->multicurrency_subprice = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht_devise) : $pu_ht_devise);
2223 $this->line->multicurrency_total_ht = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($multicurrency_total_ht) : $multicurrency_total_ht);
2224 $this->line->multicurrency_total_tva = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($multicurrency_total_tva) : $multicurrency_total_tva);
2225 $this->line->multicurrency_total_ttc = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($multicurrency_total_ttc) : $multicurrency_total_ttc);
2227 if (is_array($array_options) && count($array_options) > 0) {
2228 $this->line->array_options = $array_options;
2231 $result = $this->line->insert($notrigger);
2234 if (!empty($fk_parent_line)) {
2236 } elseif ($rang > 0 && $rang <= count($this->lines)) {
2237 $linecount = count($this->lines);
2238 for ($ii = $rang; $ii <= $linecount; $ii++) {
2244 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
2246 $this->
db->commit();
2247 return $this->line->id;
2249 $this->error = $this->
db->error();
2250 $this->
db->rollback();
2254 $this->error = $this->line->error;
2255 $this->errors = $this->line->errors;
2256 $this->
db->rollback();
2289 public function updateline($id, $desc, $pu, $vatrate, $txlocaltax1 = 0, $txlocaltax2 = 0, $qty = 1, $idproduct = 0, $price_base_type =
'HT', $info_bits = 0, $type = 0, $remise_percent = 0, $notrigger =
false, $date_start =
'', $date_end =
'', $array_options = 0, $fk_unit =
null, $pu_devise = 0, $ref_supplier =
'', $rang = 0)
2291 global $mysoc, $langs;
2293 dol_syslog(get_class($this).
"::updateline $id,$desc,$pu,$vatrate,$qty,$idproduct,$price_base_type,$info_bits,$type,$remise_percent,$notrigger,$date_start,$date_end,$fk_unit,$pu_devise,$ref_supplier", LOG_DEBUG);
2294 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2298 $remise_percent =
price2num($remise_percent);
2307 if ($date_start && $date_end && $date_start > $date_end) {
2308 $langs->load(
"errors");
2309 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
2314 if (empty($vatrate)) {
2317 if (empty($txlocaltax1)) {
2320 if (empty($txlocaltax2)) {
2338 if (preg_match(
'/\((.*)\)/', $vatrate, $reg)) {
2339 $vat_src_code = $reg[1];
2340 $vatrate = preg_replace(
'/\s*\(.*\)/',
'', $vatrate);
2343 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $vatrate, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_devise);
2344 $total_ht = $tabprice[0];
2345 $total_tva = $tabprice[1];
2346 $total_ttc = $tabprice[2];
2347 $pu_ht = $tabprice[3];
2348 $pu_tva = $tabprice[4];
2349 $pu_ttc = $tabprice[5];
2350 $total_localtax1 = $tabprice[9];
2351 $total_localtax2 = $tabprice[10];
2354 $multicurrency_total_ht = $tabprice[16];
2355 $multicurrency_total_tva = $tabprice[17];
2356 $multicurrency_total_ttc = $tabprice[18];
2357 $pu_ht_devise = $tabprice[19];
2359 if (empty($info_bits)) {
2366 $line->fetch_optionals();
2368 $staticline = clone $line;
2372 $result = $product->fetch($idproduct);
2373 $product_type = $product->type;
2375 $idproduct = $staticline->fk_product;
2376 $product_type = $type;
2379 $line->oldline = $staticline;
2380 $line->context = $this->context;
2382 $line->description = $desc;
2384 $line->qty = ($this->
type == self::TYPE_CREDIT_NOTE ? abs($qty) : $qty);
2385 $line->subprice = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht) : $pu_ht);
2386 $line->pu_ht = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht) : $pu_ht);
2387 $line->pu_ttc = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ttc) : $pu_ttc);
2389 $line->remise_percent = $remise_percent;
2390 $line->ref_supplier = $ref_supplier;
2392 $line->date_start = $date_start;
2393 $line->date_end = $date_end;
2395 $line->vat_src_code = $vat_src_code;
2396 $line->tva_tx = $vatrate;
2397 $line->localtax1_tx = $txlocaltax1;
2398 $line->localtax2_tx = $txlocaltax2;
2399 $line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
2400 $line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
2402 $line->total_ht = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ?-abs($total_ht) : $total_ht);
2403 $line->total_tva = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ?-abs($total_tva) : $total_tva);
2404 $line->total_localtax1 = $total_localtax1;
2405 $line->total_localtax2 = $total_localtax2;
2406 $line->total_ttc = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ?-abs($total_ttc) : $total_ttc);
2408 $line->fk_product = $idproduct;
2409 $line->product_type = $product_type;
2410 $line->info_bits = $info_bits;
2411 $line->fk_unit = $fk_unit;
2412 $line->rang = $rang;
2414 if (is_array($array_options) && count($array_options) > 0) {
2416 foreach ($array_options as $key => $value) {
2417 $line->array_options[$key] = $array_options[$key];
2422 $line->multicurrency_subprice = $pu_ht_devise;
2423 $line->multicurrency_total_ht = $multicurrency_total_ht;
2424 $line->multicurrency_total_tva = $multicurrency_total_tva;
2425 $line->multicurrency_total_ttc = $multicurrency_total_ttc;
2427 $res = $line->update($notrigger);
2430 $this->errors[] = $line->error;
2433 $res = $this->
update_price(
'1',
'auto', 0, $this->thirdparty);
2455 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
2456 $sql .=
' SET fk_invoice_supplier_line = NULL';
2457 $sql .=
' WHERE fk_invoice_supplier_line = '.((int) $rowid);
2459 dol_syslog(get_class($this).
"::deleteline", LOG_DEBUG);
2460 $result = $this->
db->query($sql);
2462 $this->error = $this->
db->error();
2463 $this->
db->rollback();
2469 if ($line->fetch($rowid) < 1) {
2473 $res = $line->delete($notrigger);
2476 $this->errors[] = $line->error;
2477 $this->
db->rollback();
2483 $this->
db->commit();
2486 $this->
db->rollback();
2487 $this->error = $this->
db->lasterror();
2502 $sql =
'SELECT c.rowid, datec, tms as datem, ';
2503 $sql .=
' fk_user_author, fk_user_modif, fk_user_valid';
2504 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as c';
2505 $sql .=
' WHERE c.rowid = '.((int) $id);
2507 $result = $this->
db->query($sql);
2509 if ($this->
db->num_rows($result)) {
2510 $obj = $this->
db->fetch_object($result);
2512 $this->
id = $obj->rowid;
2513 if ($obj->fk_user_author) {
2514 $cuser =
new User($this->
db);
2515 $cuser->fetch($obj->fk_user_author);
2516 $this->user_creation = $cuser;
2518 if ($obj->fk_user_valid) {
2519 $vuser =
new User($this->
db);
2520 $vuser->fetch($obj->fk_user_valid);
2521 $this->user_validation = $vuser;
2523 if ($obj->fk_user_modif) {
2524 $muser =
new User($this->
db);
2525 $muser->fetch($obj->fk_user_modif);
2526 $this->user_modification = $muser;
2528 $this->date_creation = $this->
db->jdate($obj->datec);
2529 $this->date_modification = $this->
db->jdate($obj->datem);
2532 $this->
db->free($result);
2554 $sql =
"SELECT f.rowid as rowid, f.ref, f.fk_statut,";
2555 $sql .=
" ff.rowid as rowidnext";
2556 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
2557 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON f.rowid = pf.fk_facturefourn";
2558 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture_fourn as ff ON f.rowid = ff.fk_facture_source";
2559 $sql .=
" WHERE (f.fk_statut = ".self::STATUS_VALIDATED.
" OR (f.fk_statut = ".self::STATUS_ABANDONED.
" AND f.close_code = '".self::CLOSECODE_ABANDONED.
"'))";
2560 $sql .=
" AND f.entity = ".$conf->entity;
2561 $sql .=
" AND f.paye = 0";
2562 $sql .=
" AND pf.fk_paiementfourn IS NULL";
2563 $sql .=
" AND ff.fk_statut IS NULL";
2565 $sql .=
" AND f.fk_soc = ".((int) $socid);
2567 $sql .=
" ORDER BY f.ref";
2569 dol_syslog(get_class($this).
"::list_replacable_supplier_invoices", LOG_DEBUG);
2572 while ($obj = $this->
db->fetch_object(
$resql)) {
2573 $return[$obj->rowid] = array(
2574 'id' => $obj->rowid,
2576 'status' => $obj->fk_statut
2582 $this->error = $this->
db->error();
2604 $sql =
"SELECT f.rowid as rowid, f.ref, f.fk_statut, f.type, f.paye, pf.fk_paiementfourn";
2605 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
2606 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON f.rowid = pf.fk_facturefourn";
2607 $sql .=
" WHERE f.entity = ".$conf->entity;
2608 $sql .=
" AND f.fk_statut in (".self::STATUS_VALIDATED.
",".self::STATUS_CLOSED.
")";
2609 $sql .=
" AND NOT EXISTS (SELECT rowid from ".MAIN_DB_PREFIX.
"facture_fourn as ff WHERE f.rowid = ff.fk_facture_source";
2610 $sql .=
" AND ff.type=".self::TYPE_REPLACEMENT.
")";
2611 $sql .=
" AND f.type != ".self::TYPE_CREDIT_NOTE;
2613 $sql .=
" AND f.fk_soc = ".((int) $socid);
2615 $sql .=
" ORDER BY f.ref";
2617 dol_syslog(get_class($this).
"::list_qualified_avoir_supplier_invoices", LOG_DEBUG);
2620 while ($obj = $this->
db->fetch_object(
$resql)) {
2622 if ($obj->fk_statut == self::STATUS_VALIDATED) {
2625 if ($obj->fk_statut == self::STATUS_CLOSED) {
2629 $paymentornot = ($obj->fk_paiementfourn ? 1 : 0);
2630 $return[$obj->rowid] = array(
'ref'=>$obj->ref,
'status'=>$obj->fk_statut,
'type'=>$obj->type,
'paye'=>$obj->paye,
'paymentornot'=>$paymentornot);
2636 $this->error = $this->
db->error();
2651 global $conf, $langs;
2653 $sql =
'SELECT ff.rowid, ff.date_lim_reglement as datefin, ff.fk_statut as status, ff.total_ht, ff.total_ttc';
2654 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as ff';
2655 if (empty($user->rights->societe->client->voir) && !$user->socid) {
2656 $sql .=
" JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON ff.fk_soc = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2658 $sql .=
' WHERE ff.paye = 0';
2659 $sql .=
' AND ff.fk_statut > 0';
2660 $sql .=
" AND ff.entity = ".$conf->entity;
2662 $sql .=
' AND ff.fk_soc = '.((int) $user->socid);
2667 $langs->load(
"bills");
2671 $response->warning_delay = $conf->facture->fournisseur->warning_delay / 60 / 60 / 24;
2672 $response->label = $langs->trans(
"SupplierBillsToPay");
2673 $response->labelShort = $langs->trans(
"StatusToPay");
2675 $response->url = DOL_URL_ROOT.
'/fourn/facture/list.php?search_status=1&mainmenu=billing&leftmenu=suppliers_bills';
2676 $response->img =
img_object($langs->trans(
"Bills"),
"bill");
2680 while ($obj = $this->
db->fetch_object(
$resql)) {
2681 $facturestatic->date_echeance = $this->
db->jdate($obj->datefin);
2682 $facturestatic->statut = $obj->status;
2683 $facturestatic->status = $obj->status;
2685 $response->nbtodo++;
2686 $response->total += $obj->total_ht;
2688 if ($facturestatic->hasDelay()) {
2689 $response->nbtodolate++;
2690 $response->url_late = DOL_URL_ROOT.
'/fourn/facture/list.php?search_option=late&mainmenu=billing&leftmenu=suppliers_bills';
2698 $this->error = $this->
db->error();
2717 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $moretitle =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2719 global $langs, $conf, $user, $hookmanager;
2723 if ($option ==
'withdraw') {
2724 $url = DOL_URL_ROOT.
'/compta/facture/prelevement.php?facid='.$this->
id.
'&type=bank-transfer';
2725 } elseif ($option ==
'document') {
2726 $url = DOL_URL_ROOT.
'/fourn/facture/document.php?facid='.$this->id;
2728 $url = DOL_URL_ROOT.
'/fourn/facture/card.php?facid='.$this->id;
2735 if ($option !==
'nolink') {
2737 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2738 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2739 $add_save_lastsearch_values = 1;
2741 if ($add_save_lastsearch_values) {
2742 $url .=
'&save_lastsearch_values=1';
2746 $picto = $this->picto;
2747 if ($this->
type == self::TYPE_REPLACEMENT) {
2750 if ($this->
type == self::TYPE_CREDIT_NOTE) {
2753 if ($this->
type == self::TYPE_DEPOSIT) {
2757 $label =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierInvoice").
'</u>';
2758 if ($this->
type == self::TYPE_REPLACEMENT) {
2759 $label =
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"InvoiceReplace").
'</u>';
2760 } elseif ($this->
type == self::TYPE_CREDIT_NOTE) {
2761 $label =
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"CreditNote").
'</u>';
2762 } elseif ($this->
type == self::TYPE_DEPOSIT) {
2763 $label =
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"Deposit").
'</u>';
2765 if (isset($this->status)) {
2767 if (isset($this->alreadypaid)) {
2768 $alreadypaid = $this->alreadypaid;
2771 $label .=
' '.$this->getLibStatut(5, $alreadypaid);
2773 if (!empty($this->
ref)) {
2774 $label .=
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2776 if (!empty($this->ref_supplier)) {
2777 $label .=
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_supplier;
2779 if (!empty($this->label)) {
2780 $label .=
'<br><b>'.$langs->trans(
'Label').
':</b> '.$this->label;
2782 if (!empty($this->date)) {
2783 $label .=
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->date,
'day');
2785 if (!empty($this->date_echeance)) {
2786 $label .=
'<br><b>'.$langs->trans(
'DateDue').
':</b> '.
dol_print_date($this->date_echeance,
'day');
2788 if (!empty($this->total_ht)) {
2789 $label .=
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
2791 if (!empty($this->total_tva)) {
2792 $label .=
'<br><b>'.$langs->trans(
'AmountVAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
2794 if (!empty($this->total_ttc)) {
2795 $label .=
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
2798 $label .=
' - '.$moretitle;
2807 if (empty($notooltip)) {
2808 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2809 $label = $langs->trans(
"ShowSupplierInvoice");
2810 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2812 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
2813 $linkclose .=
' class="classfortooltip"';
2816 $linkstart =
'<a href="'.$url.
'"';
2817 $linkstart .= $linkclose.
'>';
2820 $result .= $linkstart;
2822 $result .=
img_object(($notooltip ?
'' : $label), $picto, ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
2824 if ($withpicto != 2) {
2825 $result .= ($max ?
dol_trunc($ref, $max) : $ref);
2827 $result .= $linkend;
2829 if ($addlinktonotes) {
2830 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2833 $result .=
' <span class="note inline-block">';
2834 $result .=
'<a href="'.DOL_URL_ROOT.
'/fourn/facture/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2837 $result .=
'</span>';
2841 $hookmanager->initHooks(array($this->element .
'dao'));
2842 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
2843 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2845 $result = $hookmanager->resPrint;
2847 $result .= $hookmanager->resPrint;
2862 global $db, $langs, $conf;
2863 $langs->load(
"orders");
2866 if (empty($conf->global->INVOICE_SUPPLIER_ADDON_NUMBER)) {
2867 $conf->global->INVOICE_SUPPLIER_ADDON_NUMBER =
'mod_facture_fournisseur_cactus';
2872 $file = $conf->global->INVOICE_SUPPLIER_ADDON_NUMBER.
".php";
2873 $classname = $conf->global->INVOICE_SUPPLIER_ADDON_NUMBER;
2876 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2878 foreach ($dirmodels as $reldir) {
2879 $dir =
dol_buildpath($reldir.
"core/modules/supplier_invoice/");
2882 $mybool |= @include_once $dir.$file;
2885 if ($mybool ===
false) {
2890 $obj =
new $classname();
2892 $numref = $obj->getNumRef($soc, $this, $mode);
2894 if ($numref !=
"") {
2897 $this->error = $obj->error;
2913 global $langs, $conf;
2914 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
2922 $sql =
"SELECT rowid";
2923 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2924 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2925 $sql .= $this->
db->plimit(100);
2929 $num_prods = $this->
db->num_rows(
$resql);
2931 while ($i < $num_prods) {
2933 $row = $this->
db->fetch_row(
$resql);
2934 $prodids[$i] = $row[0];
2940 $this->
ref =
'SPECIMEN';
2941 $this->ref_supplier =
'SUPPLIER_REF_SPECIMEN';
2942 $this->specimen = 1;
2945 $this->date_lim_reglement = $this->date + 3600 * 24 * 30;
2946 $this->cond_reglement_code =
'RECEP';
2947 $this->mode_reglement_code =
'CHQ';
2949 $this->note_public =
'This is a comment (public)';
2950 $this->note_private =
'This is a comment (private)';
2952 $this->multicurrency_tx = 1;
2953 $this->multicurrency_code = $conf->currency;
2956 if (empty($option) || $option !=
'nolines') {
2959 while ($xnbp < $nbp) {
2961 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2963 $line->subprice = 100;
2966 $line->tva_tx = 19.6;
2967 $line->localtax1_tx = 0;
2968 $line->localtax2_tx = 0;
2970 $line->total_ht = 50;
2971 $line->total_ttc = 59.8;
2972 $line->total_tva = 9.8;
2973 $line->remise_percent = 50;
2975 $line->total_ht = 100;
2976 $line->total_ttc = 119.6;
2977 $line->total_tva = 19.6;
2978 $line->remise_percent = 0;
2981 if ($num_prods > 0) {
2982 $prodid = mt_rand(1, $num_prods);
2983 $line->fk_product = $prodids[$prodid];
2985 $line->product_type = 0;
2987 $this->lines[$xnbp] = $line;
2989 $this->total_ht += $line->total_ht;
2990 $this->total_tva += $line->total_tva;
2991 $this->total_ttc += $line->total_ttc;
2997 $this->amount_ht = $xnbp * 100;
2998 $this->total_ht = $xnbp * 100;
2999 $this->total_tva = $xnbp * 19.6;
3000 $this->total_ttc = $xnbp * 119.6;
3012 global $conf, $user;
3014 $this->nb = array();
3018 $sql =
"SELECT count(f.rowid) as nb";
3019 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
3020 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON f.fk_soc = s.rowid";
3021 if (empty($user->rights->societe->client->voir) && !$user->socid) {
3022 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
3023 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3026 $sql .=
" ".$clause.
" f.entity = ".$conf->entity;
3030 while ($obj = $this->
db->fetch_object(
$resql)) {
3031 $this->nb[
"supplier_invoices"] = $obj->nb;
3037 $this->error = $this->
db->error();
3052 global $conf, $langs;
3061 $object->fetch($fromid);
3066 $object->fetch_thirdparty();
3069 $object->ref_supplier = (empty($this->ref_supplier) ? $langs->trans(
"CopyOf").
' '.$object->ref_supplier : $this->ref_supplier);
3070 $object->author = $user->id;
3071 $object->user_valid = 0;
3072 $object->fk_facture_source = 0;
3073 $object->date_creation =
'';
3074 $object->date_validation =
'';
3075 $object->date = (empty($this->date) ?
dol_now() : $this->date);
3076 $object->ref_client =
'';
3077 $object->close_code =
'';
3078 $object->close_note =
'';
3080 $object->note_private =
'';
3081 $object->note_public =
'';
3084 $object->date_echeance = $object->calculate_date_lim_reglement();
3087 foreach ($object->lines as $i => $line) {
3088 if (isset($object->lines[$i]->info_bits) && ($object->lines[$i]->info_bits & 0x02) == 0x02) {
3089 unset($object->lines[$i]);
3094 $object->context[
'createfromclone'] =
'createfromclone';
3095 $result = $object->create($user);
3099 $this->error = $object->error;
3100 $this->errors = $object->errors;
3107 unset($object->context[
'createfromclone']);
3111 $this->
db->commit();
3114 $this->
db->rollback();
3130 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
3132 global $conf, $user, $langs;
3134 $langs->load(
"suppliers");
3135 $outputlangs->load(
"products");
3138 if (empty($modele)) {
3139 if (!empty($conf->global->INVOICE_SUPPLIER_ADDON_PDF)) {
3140 $modele = $conf->global->INVOICE_SUPPLIER_ADDON_PDF;
3146 if (empty($modele)) {
3149 $modelpath =
"core/modules/supplier_invoice/doc/";
3151 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
3163 return $user->rights->fournisseur->facture;
3211 if (!$this->date_echeance) {
3215 $status = isset($this->status) ? $this->status : $this->statut;
3217 return ($status == self::STATUS_VALIDATED) && ($this->date_echeance < ($now - $conf->facture->fournisseur->warning_delay));
3229 $sql =
"SELECT fk_invoice_supplier FROM ".MAIN_DB_PREFIX.
"societe_remise_except WHERE fk_invoice_supplier_source = ".((int) $this->
id);
3232 $obj = $this->
db->fetch_object(
$resql);
3233 if (!empty($obj->fk_invoice_supplier)) {
3252 public $element =
'facture_fourn_det';
3257 public $table_element =
'facture_fourn_det';
3271 public $product_ref;
3278 public $ref_supplier;
3284 public $product_desc;
3311 public $fk_facture_fourn;
3324 public $description;
3329 public $skip_update_total;
3334 public $situation_percent;
3345 public $vat_src_code;
3357 public $localtax1_tx;
3363 public $localtax2_tx;
3375 public $remise_percent;
3399 public $total_localtax1;
3405 public $total_localtax2;
3416 public $product_type;
3422 public $product_label;
3436 public $fk_remise_except;
3441 public $fk_parent_line;
3443 public $special_code;
3454 public $localtax1_type;
3460 public $localtax2_type;
3466 public $fk_multicurrency;
3468 public $multicurrency_code;
3469 public $multicurrency_subprice;
3470 public $multicurrency_total_ht;
3471 public $multicurrency_total_tva;
3472 public $multicurrency_total_ttc;
3493 $sql =
'SELECT f.rowid, f.ref as ref_supplier, f.description, f.date_start, f.date_end, f.pu_ht, f.pu_ttc, f.qty, f.remise_percent, f.tva_tx';
3494 $sql .=
', f.localtax1_type, f.localtax2_type, f.localtax1_tx, f.localtax2_tx, f.total_localtax1, f.total_localtax2, f.fk_remise_except';
3495 $sql .=
', f.total_ht, f.tva as total_tva, f.total_ttc, f.fk_facture_fourn, f.fk_product, f.product_type, f.info_bits, f.rang, f.special_code, f.fk_parent_line, f.fk_unit';
3496 $sql .=
', p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.description as product_desc';
3497 $sql .=
', f.multicurrency_subprice, f.multicurrency_total_ht, f.multicurrency_total_tva, multicurrency_total_ttc';
3498 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn_det as f';
3499 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON f.fk_product = p.rowid';
3500 $sql .=
' WHERE f.rowid = '.((int) $rowid);
3501 $sql .=
' ORDER BY f.rang, f.rowid';
3503 $query = $this->
db->query($sql);
3506 $this->errors[] = $this->
db->error();
3510 if (!$this->
db->num_rows($query)) {
3514 $obj = $this->
db->fetch_object($query);
3516 $this->
id = $obj->rowid;
3517 $this->
rowid = $obj->rowid;
3518 $this->fk_facture_fourn = $obj->fk_facture_fourn;
3520 $this->date_start = $obj->date_start;
3521 $this->date_end = $obj->date_end;
3522 $this->product_ref = $obj->product_ref;
3523 $this->ref_supplier = $obj->ref_supplier;
3524 $this->product_desc = $obj->product_desc;
3526 $this->subprice = $obj->pu_ht;
3527 $this->pu_ht = $obj->pu_ht;
3528 $this->pu_ttc = $obj->pu_ttc;
3529 $this->tva_tx = $obj->tva_tx;
3530 $this->localtax1_tx = $obj->localtax1_tx;
3531 $this->localtax2_tx = $obj->localtax2_tx;
3532 $this->localtax1_type = $obj->localtax1_type;
3533 $this->localtax2_type = $obj->localtax2_type;
3535 $this->qty = $obj->qty;
3536 $this->remise_percent = $obj->remise_percent;
3537 $this->fk_remise_except = $obj->fk_remise_except;
3539 $this->total_ht = $obj->total_ht;
3540 $this->total_tva = $obj->total_tva;
3541 $this->total_localtax1 = $obj->total_localtax1;
3542 $this->total_localtax2 = $obj->total_localtax2;
3543 $this->total_ttc = $obj->total_ttc;
3544 $this->fk_product = $obj->fk_product;
3545 $this->product_type = $obj->product_type;
3546 $this->product_label = $obj->product_label;
3547 $this->info_bits = $obj->info_bits;
3548 $this->tva_npr = ($obj->info_bits & 1 == 1) ? 1 : 0;
3549 $this->fk_parent_line = $obj->fk_parent_line;
3550 $this->special_code = $obj->special_code;
3551 $this->rang = $obj->rang;
3552 $this->fk_unit = $obj->fk_unit;
3554 $this->multicurrency_subprice = $obj->multicurrency_subprice;
3555 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
3556 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
3557 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
3570 public function delete($notrigger = 0)
3572 global $user, $conf;
3574 dol_syslog(get_class($this).
"::deleteline rowid=".((
int) $this->
id), LOG_DEBUG);
3581 if ($this->
call_trigger(
'LINEBILL_SUPPLIER_DELETE', $user) < 0) {
3593 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3599 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'facture_fourn_det ';
3600 $sql .=
" WHERE rowid = ".((int) $this->
id);
3601 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
3605 $this->error = $this->
db->lasterror();
3610 $this->
db->commit();
3613 $this->
db->rollback();
3632 if (empty($this->qty)) {
3636 if ($this->product_type < 0) {
3641 if (empty($this->remise_percent)) {
3642 $this->remise_percent = 0;
3644 if (empty($this->tva_tx)) {
3647 if (empty($this->localtax1_tx)) {
3648 $this->localtax1_tx = 0;
3650 if (empty($this->localtax2_tx)) {
3651 $this->localtax2_tx = 0;
3654 if (empty($this->pa_ht)) {
3657 if (empty($this->multicurrency_subprice)) {
3658 $this->multicurrency_subprice = 0;
3660 if (empty($this->multicurrency_total_ht)) {
3661 $this->multicurrency_total_ht = 0;
3663 if (empty($this->multicurrency_total_tva)) {
3664 $this->multicurrency_total_tva = 0;
3666 if (empty($this->multicurrency_total_ttc)) {
3667 $this->multicurrency_total_ttc = 0;
3670 $fk_product = (int) $this->fk_product;
3671 $fk_unit = (int) $this->fk_unit;
3675 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn_det SET";
3676 $sql .=
" description = '".$this->db->escape($this->
description).
"'";
3677 $sql .=
", ref = '".$this->db->escape($this->ref_supplier ? $this->ref_supplier : $this->
ref).
"'";
3678 $sql .=
", date_start = ".($this->date_start !=
'' ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3679 $sql .=
", date_end = ".($this->date_end !=
'' ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3680 $sql .=
", pu_ht = ".price2num($this->pu_ht);
3681 $sql .=
", pu_ttc = ".price2num($this->pu_ttc);
3682 $sql .=
", qty = ".price2num($this->qty);
3683 $sql .=
", remise_percent = ".price2num($this->remise_percent);
3684 if ($this->fk_remise_except > 0) $sql .=
", fk_remise_except=".((int) $this->fk_remise_except);
3685 else $sql .=
", fk_remise_except=null";
3686 $sql .=
", vat_src_code = '".$this->db->escape(empty($this->vat_src_code) ?
'' : $this->vat_src_code).
"'";
3687 $sql .=
", tva_tx = ".price2num($this->tva_tx);
3688 $sql .=
", localtax1_tx = ".price2num($this->localtax1_tx);
3689 $sql .=
", localtax2_tx = ".price2num($this->localtax2_tx);
3690 $sql .=
", localtax1_type = '".$this->db->escape($this->localtax1_type).
"'";
3691 $sql .=
", localtax2_type = '".$this->db->escape($this->localtax2_type).
"'";
3692 $sql .=
", total_ht = ".price2num($this->total_ht);
3693 $sql .=
", tva= ".price2num($this->total_tva);
3694 $sql .=
", total_localtax1= ".price2num($this->total_localtax1);
3695 $sql .=
", total_localtax2= ".price2num($this->total_localtax2);
3696 $sql .=
", total_ttc = ".price2num($this->total_ttc);
3697 $sql .=
", fk_product = ".($fk_product > 0 ? (int) $fk_product :
'null');
3698 $sql .=
", product_type = ".((int) $this->product_type);
3699 $sql .=
", info_bits = ".((int) $this->info_bits);
3700 $sql .=
", fk_unit = ".($fk_unit > 0 ? (int) $fk_unit :
'null');
3702 if (!empty($this->rang)) {
3703 $sql .=
", rang=".((int) $this->rang);
3707 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice).
"";
3708 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht).
"";
3709 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva).
"";
3710 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc).
"";
3712 $sql .=
" WHERE rowid = ".((int) $this->
id);
3714 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3718 $this->
db->rollback();
3719 $this->error = $this->
db->lasterror();
3723 $this->
rowid = $this->id;
3733 if (!$error && !$notrigger) {
3734 global $langs, $user;
3737 if ($this->
call_trigger(
'LINEBILL_SUPPLIER_MODIFY', $user) < 0) {
3738 $this->
db->rollback();
3745 $this->
db->rollback();
3749 $this->
db->commit();
3761 global $user, $conf, $langs;
3765 dol_syslog(get_class($this).
"::insert rang=".$this->rang, LOG_DEBUG);
3768 $this->desc = trim($this->desc);
3769 if (empty($this->tva_tx)) {
3772 if (empty($this->localtax1_tx)) {
3773 $this->localtax1_tx = 0;
3775 if (empty($this->localtax2_tx)) {
3776 $this->localtax2_tx = 0;
3778 if (empty($this->localtax1_type)) {
3779 $this->localtax1_type =
'0';
3781 if (empty($this->localtax2_type)) {
3782 $this->localtax2_type =
'0';
3784 if (empty($this->total_tva)) {
3785 $this->total_tva = 0;
3787 if (empty($this->total_localtax1)) {
3788 $this->total_localtax1 = 0;
3790 if (empty($this->total_localtax2)) {
3791 $this->total_localtax2 = 0;
3793 if (empty($this->rang)) {
3796 if (empty($this->remise_percent)) {
3797 $this->remise_percent = 0;
3799 if (empty($this->info_bits)) {
3800 $this->info_bits = 0;
3802 if (empty($this->subprice)) {
3803 $this->subprice = 0;
3805 if (empty($this->special_code)) {
3806 $this->special_code = 0;
3808 if (empty($this->fk_parent_line)) {
3809 $this->fk_parent_line = 0;
3811 if (!isset($this->situation_percent) || $this->situation_percent > 100 || (
string) $this->situation_percent ==
'') {
3812 $this->situation_percent = 100;
3815 if (empty($this->pa_ht)) {
3818 if (empty($this->multicurrency_subprice)) {
3819 $this->multicurrency_subprice = 0;
3821 if (empty($this->multicurrency_total_ht)) {
3822 $this->multicurrency_total_ht = 0;
3824 if (empty($this->multicurrency_total_tva)) {
3825 $this->multicurrency_total_tva = 0;
3827 if (empty($this->multicurrency_total_ttc)) {
3828 $this->multicurrency_total_ttc = 0;
3833 if ($this->product_type < 0) {
3834 $this->error =
'ErrorProductTypeMustBe0orMore';
3837 if (!empty($this->fk_product) && $this->fk_product > 0) {
3841 $this->error =
'ErrorProductIdDoesNotExists';
3849 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
3850 $sql .=
' (fk_facture_fourn, fk_parent_line, label, description, ref, qty,';
3851 $sql .=
' vat_src_code, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3852 $sql .=
' fk_product, product_type, remise_percent, fk_remise_except, pu_ht, pu_ttc,';
3853 $sql .=
' date_start, date_end, fk_code_ventilation, rang, special_code,';
3854 $sql .=
' info_bits, total_ht, tva, total_ttc, total_localtax1, total_localtax2, fk_unit';
3855 $sql .=
', fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
3857 $sql .=
" VALUES (".$this->fk_facture_fourn.
",";
3858 $sql .=
" ".($this->fk_parent_line > 0 ?
"'".$this->db->escape($this->fk_parent_line).
"'" :
"null").
",";
3859 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3860 $sql .=
" '".$this->db->escape($this->desc ? $this->desc : $this->
description).
"',";
3861 $sql .=
" '".$this->db->escape($this->ref_supplier).
"',";
3862 $sql .=
" ".price2num($this->qty).
",";
3864 $sql .=
" ".(empty($this->vat_src_code) ?
"''" :
"'".$this->db->escape($this->vat_src_code).
"'").
",";
3865 $sql .=
" ".price2num($this->tva_tx).
",";
3866 $sql .=
" ".price2num($this->localtax1_tx).
",";
3867 $sql .=
" ".price2num($this->localtax2_tx).
",";
3868 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3869 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3870 $sql .=
' '.((!empty($this->fk_product) && $this->fk_product > 0) ? $this->fk_product :
"null").
',';
3871 $sql .=
" ".((int) $this->product_type).
",";
3872 $sql .=
" ".price2num($this->remise_percent).
",";
3873 $sql .=
' '.(!empty($this->fk_remise_except) ? ((int) $this->fk_remise_except) :
"null").
',';
3874 $sql .=
" ".price2num($this->subprice).
",";
3875 $sql .=
" ".(!empty($this->qty) ?
price2num($this->total_ttc / $this->qty) :
price2num($this->total_ttc)).
",";
3876 $sql .=
" ".(!empty($this->date_start) ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3877 $sql .=
" ".(!empty($this->date_end) ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3878 $sql .=
' '.(!empty($this->fk_code_ventilation) ? $this->fk_code_ventilation : 0).
',';
3879 $sql .=
' '.((int) $this->rang).
',';
3880 $sql .=
' '.((int) $this->special_code).
',';
3881 $sql .=
" ".((int) $this->info_bits).
",";
3882 $sql .=
" ".price2num($this->total_ht).
",";
3883 $sql .=
" ".price2num($this->total_tva).
",";
3884 $sql .=
" ".price2num($this->total_ttc).
",";
3885 $sql .=
" ".price2num($this->total_localtax1).
",";
3886 $sql .=
" ".price2num($this->total_localtax2);
3887 $sql .=
", ".(!$this->fk_unit ?
'NULL' : $this->fk_unit);
3888 $sql .=
", ".(int) $this->fk_multicurrency;
3889 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3890 $sql .=
", ".price2num($this->multicurrency_subprice);
3891 $sql .=
", ".price2num($this->multicurrency_total_ht);
3892 $sql .=
", ".price2num($this->multicurrency_total_tva);
3893 $sql .=
", ".price2num($this->multicurrency_total_ttc);
3898 $this->
id = $this->
db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
3899 $this->
rowid = $this->id;
3910 if ($this->fk_remise_except) {
3912 $result = $discount->fetch($this->fk_remise_except);
3917 if ($discount->fk_facture_line > 0) {
3918 if (empty($noerrorifdiscountalreadylinked)) {
3919 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed", $discount->id);
3920 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
3921 $this->
db->rollback();
3925 $result = $discount->link_to_invoice($this->
rowid, 0);
3927 $this->error = $discount->error;
3928 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
3929 $this->
db->rollback();
3934 $this->error = $langs->trans(
"ErrorADiscountThatHasBeenRemovedIsIncluded");
3935 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
3936 $this->
db->rollback();
3940 $this->error = $discount->error;
3941 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
3942 $this->
db->rollback();
3947 if (!$error && !$notrigger) {
3949 $result = $this->
call_trigger(
'LINEBILL_SUPPLIER_CREATE', $user);
3951 $this->
db->rollback();
3957 $this->
db->commit();
3960 $this->error = $this->
db->error();
3961 $this->
db->rollback();
3978 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn_det SET";
3979 $sql .=
" total_ht = ".price2num($this->total_ht);
3980 $sql .=
", tva= ".price2num($this->total_tva);
3981 $sql .=
", total_localtax1 = ".price2num($this->total_localtax1);
3982 $sql .=
", total_localtax2 = ".price2num($this->total_localtax2);
3983 $sql .=
", total_ttc = ".price2num($this->total_ttc);
3984 $sql .=
" WHERE rowid = ".((int) $this->
rowid);
3986 dol_syslog(
"FactureFournisseurLigne.class.php::update_total", LOG_DEBUG);
3990 $this->
db->commit();
3993 $this->error = $this->
db->error();
3994 $this->
db->rollback();