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;
241 public $vat_reverse_charge;
243 public $extraparams = array();
249 public $lines = array();
260 public $fk_multicurrency;
262 public $multicurrency_code;
263 public $multicurrency_tx;
264 public $multicurrency_total_ht;
265 public $multicurrency_total_tva;
266 public $multicurrency_total_ttc;
271 public $fk_facture_source;
276 public $fields = array(
277 'rowid' =>array(
'type'=>
'integer',
'label'=>
'TechnicalID',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>10),
278 'ref' =>array(
'type'=>
'varchar(255)',
'label'=>
'Ref',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'showoncombobox'=>1,
'position'=>15),
279 'ref_supplier' =>array(
'type'=>
'varchar(255)',
'label'=>
'RefSupplier',
'enabled'=>1,
'visible'=>-1,
'position'=>20),
280 'entity' =>array(
'type'=>
'integer',
'label'=>
'Entity',
'default'=>1,
'enabled'=>1,
'visible'=>-2,
'notnull'=>1,
'position'=>25,
'index'=>1),
281 'ref_ext' =>array(
'type'=>
'varchar(255)',
'label'=>
'RefExt',
'enabled'=>1,
'visible'=>0,
'position'=>30),
282 'type' =>array(
'type'=>
'smallint(6)',
'label'=>
'Type',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>35),
283 'fk_soc' =>array(
'type'=>
'integer:Societe:societe/class/societe.class.php',
'label'=>
'ThirdParty',
'enabled'=>
'isModEnabled("societe")',
'visible'=>-1,
'notnull'=>1,
'position'=>40),
284 'datec' =>array(
'type'=>
'datetime',
'label'=>
'DateCreation',
'enabled'=>1,
'visible'=>-1,
'position'=>45),
285 'datef' =>array(
'type'=>
'date',
'label'=>
'Date',
'enabled'=>1,
'visible'=>-1,
'position'=>50),
286 'tms' =>array(
'type'=>
'timestamp',
'label'=>
'DateModification',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>55),
287 'libelle' =>array(
'type'=>
'varchar(255)',
'label'=>
'Label',
'enabled'=>1,
'visible'=>-1,
'position'=>60),
288 'paye' =>array(
'type'=>
'smallint(6)',
'label'=>
'Paye',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>65),
289 'amount' =>array(
'type'=>
'double(24,8)',
'label'=>
'Amount',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>70),
290 'remise' =>array(
'type'=>
'double(24,8)',
'label'=>
'Discount',
'enabled'=>1,
'visible'=>-1,
'position'=>75),
291 'close_code' =>array(
'type'=>
'varchar(16)',
'label'=>
'CloseCode',
'enabled'=>1,
'visible'=>-1,
'position'=>80),
292 'close_note' =>array(
'type'=>
'varchar(128)',
'label'=>
'CloseNote',
'enabled'=>1,
'visible'=>-1,
'position'=>85),
293 'tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'Tva',
'enabled'=>1,
'visible'=>-1,
'position'=>90),
294 'localtax1' =>array(
'type'=>
'double(24,8)',
'label'=>
'Localtax1',
'enabled'=>1,
'visible'=>-1,
'position'=>95),
295 'localtax2' =>array(
'type'=>
'double(24,8)',
'label'=>
'Localtax2',
'enabled'=>1,
'visible'=>-1,
'position'=>100),
296 'total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'TotalHT',
'enabled'=>1,
'visible'=>-1,
'position'=>105),
297 'total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'TotalVAT',
'enabled'=>1,
'visible'=>-1,
'position'=>110),
298 'total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'TotalTTC',
'enabled'=>1,
'visible'=>-1,
'position'=>115),
299 'fk_user_author' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserAuthor',
'enabled'=>1,
'visible'=>-1,
'position'=>125),
300 'fk_user_modif' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserModif',
'enabled'=>1,
'visible'=>-2,
'notnull'=>-1,
'position'=>130),
301 'fk_user_valid' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserValidation',
'enabled'=>1,
'visible'=>-1,
'position'=>135),
302 'fk_facture_source' =>array(
'type'=>
'integer',
'label'=>
'Fk facture source',
'enabled'=>1,
'visible'=>-1,
'position'=>140),
303 'fk_projet' =>array(
'type'=>
'integer:Project:projet/class/project.class.php:1:fk_statut=1',
'label'=>
'Project',
'enabled'=>
"isModEnabled('project')",
'visible'=>-1,
'position'=>145),
304 'fk_account' =>array(
'type'=>
'integer',
'label'=>
'Account',
'enabled'=>
'isModEnabled("banque")',
'visible'=>-1,
'position'=>150),
305 'fk_cond_reglement' =>array(
'type'=>
'integer',
'label'=>
'PaymentTerm',
'enabled'=>1,
'visible'=>-1,
'position'=>155),
306 'fk_mode_reglement' =>array(
'type'=>
'integer',
'label'=>
'PaymentMode',
'enabled'=>1,
'visible'=>-1,
'position'=>160),
307 'date_lim_reglement' =>array(
'type'=>
'date',
'label'=>
'DateLimReglement',
'enabled'=>1,
'visible'=>-1,
'position'=>165),
308 'note_private' =>array(
'type'=>
'html',
'label'=>
'NotePrivate',
'enabled'=>1,
'visible'=>0,
'position'=>170),
309 'note_public' =>array(
'type'=>
'html',
'label'=>
'NotePublic',
'enabled'=>1,
'visible'=>0,
'position'=>175),
310 'model_pdf' =>array(
'type'=>
'varchar(255)',
'label'=>
'ModelPdf',
'enabled'=>1,
'visible'=>0,
'position'=>180),
311 'extraparams' =>array(
'type'=>
'varchar(255)',
'label'=>
'Extraparams',
'enabled'=>1,
'visible'=>-1,
'position'=>190),
312 'fk_incoterms' =>array(
'type'=>
'integer',
'label'=>
'IncotermCode',
'enabled'=>1,
'visible'=>-1,
'position'=>195),
313 'location_incoterms' =>array(
'type'=>
'varchar(255)',
'label'=>
'IncotermLocation',
'enabled'=>1,
'visible'=>-1,
'position'=>200),
314 'fk_multicurrency' =>array(
'type'=>
'integer',
'label'=>
'MulticurrencyId',
'enabled'=>1,
'visible'=>-1,
'position'=>205),
315 'multicurrency_code' =>array(
'type'=>
'varchar(255)',
'label'=>
'MulticurrencyCode',
'enabled'=>1,
'visible'=>-1,
'position'=>210),
316 'multicurrency_tx' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyRate',
'enabled'=>1,
'visible'=>-1,
'position'=>215),
317 'multicurrency_total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyTotalHT',
'enabled'=>1,
'visible'=>-1,
'position'=>220),
318 'multicurrency_total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyTotalVAT',
'enabled'=>1,
'visible'=>-1,
'position'=>225),
319 'multicurrency_total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyTotalTTC',
'enabled'=>1,
'visible'=>-1,
'position'=>230),
320 'date_pointoftax' =>array(
'type'=>
'date',
'label'=>
'Date pointoftax',
'enabled'=>1,
'visible'=>-1,
'position'=>235),
321 'date_valid' =>array(
'type'=>
'date',
'label'=>
'DateValidation',
'enabled'=>1,
'visible'=>-1,
'position'=>240),
322 'last_main_doc' =>array(
'type'=>
'varchar(255)',
'label'=>
'Last main doc',
'enabled'=>1,
'visible'=>-1,
'position'=>245),
323 'fk_statut' =>array(
'type'=>
'smallint(6)',
'label'=>
'Status',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>500),
324 'import_key' =>array(
'type'=>
'varchar(14)',
'label'=>
'ImportId',
'enabled'=>1,
'visible'=>-2,
'position'=>900),
376 const CLOSECODE_DISCOUNTVAT =
'discount_vat';
377 const CLOSECODE_BADCREDIT =
'badsupplier';
378 const CLOSECODE_ABANDONED =
'abandon';
379 const CLOSECODE_REPLACED =
'replaced';
399 global $langs, $conf, $hookmanager;
405 if (isset($this->ref_supplier)) {
406 $this->ref_supplier = trim($this->ref_supplier);
408 if (empty($this->
type)) {
411 if (empty($this->date)) {
416 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
421 if (empty($this->fk_multicurrency)) {
422 $this->multicurrency_code = $conf->currency;
423 $this->fk_multicurrency = 0;
424 $this->multicurrency_tx = 1;
430 if ($this->fac_rec > 0) {
431 $this->fk_fac_rec_source = $this->fac_rec;
433 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.facture-rec.class.php';
435 $result = $_facrec->fetch($this->fac_rec);
436 $result = $_facrec->fetchObjectLinked(
null,
'',
null,
'',
'OR', 1,
'sourcetype', 0);
439 if (!empty($_facrec->frequency)) {
440 $originaldatewhen = $_facrec->date_when;
441 $nextdatewhen =
dol_time_plus_duree($originaldatewhen, $_facrec->frequency, $_facrec->unit_frequency);
443 $this->socid = $_facrec->socid;
446 $this->entity = $_facrec->entity;
449 $this->fk_project =
GETPOST(
'projectid',
'int') > 0 ? ((int)
GETPOST(
'projectid',
'int')) : $_facrec->fk_projet;
450 $this->fk_projet = $this->fk_project;
451 $this->note_public =
GETPOST(
'note_public',
'restricthtml') ?
GETPOST(
'note_public',
'restricthtml') : $_facrec->note_public;
452 $this->note_private =
GETPOST(
'note_private',
'restricthtml') ?
GETPOST(
'note_private',
'restricthtml') : $_facrec->note_private;
453 $this->model_pdf =
GETPOST(
'model',
'alpha') ?
GETPOST(
'model',
'alpha') : $_facrec->model_pdf;
454 $this->cond_reglement_id =
GETPOST(
'cond_reglement_id',
'int') > 0 ? ((int)
GETPOST(
'cond_reglement_id',
'int')) : $_facrec->cond_reglement_id;
455 $this->mode_reglement_id =
GETPOST(
'mode_reglement_id',
'int') > 0 ? ((int)
GETPOST(
'mode_reglement_id',
'int')) : $_facrec->mode_reglement_id;
456 $this->fk_account =
GETPOST(
'fk_account') > 0 ? ((int)
GETPOST(
'fk_account')) : $_facrec->fk_account;
459 $this->total_ht = $_facrec->total_ht;
460 $this->total_ttc = $_facrec->total_ttc;
463 $this->fk_incoterms = $_facrec->fk_incoterms;
464 $this->location_incoterms = $_facrec->location_incoterms;
470 if (!empty(
GETPOST(
'ref_supplier'))) {
471 $this->ref_supplier = trim($this->ref_supplier);
473 $this->ref_supplier = trim($this->ref_supplier .
'_' . ($_facrec->nb_gen_done + 1));
475 $this->note_public = trim($this->note_public);
476 $this->note_private = trim($this->note_private);
477 $this->note_private =
dol_concatdesc($this->note_private, $langs->trans(
"GeneratedFromRecurringInvoice", $_facrec->titre));
479 $this->array_options = $_facrec->array_options;
481 if (! $this->mode_reglement_id) {
482 $this->mode_reglement_id = 0;
484 $this->brouillon = 1;
488 $this->linked_objects = $_facrec->linkedObjectsIds;
495 if ($_facrec->frequency > 0) {
496 dol_syslog(
"This is a recurring invoice so we set date_last_gen and next date_when");
497 if (empty($_facrec->date_when)) {
498 $_facrec->date_when = $now;
500 $next_date = $_facrec->getNextDate();
501 $result = $_facrec->setValueFrom(
'date_last_gen', $now,
'',
null,
'date',
'', $user,
'');
503 $result = $_facrec->setNextDate($next_date, 1);
507 $outputlangs = $langs;
510 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && empty($newlang) && isset($this->thirdparty->default_lang)) {
511 $newlang = $this->thirdparty->default_lang;
513 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && empty($newlang) && isset($this->default_lang)) {
514 $newlang = $this->default_lang;
516 if (!empty($newlang)) {
518 $outputlangs->setDefaultLang($newlang);
524 $substitutionarray[
'__INVOICE_MONTH__'] =
dol_print_date($this->date,
'%m');
527 $substitutionarray[
'__INVOICE_MONTH_TEXT__'] =
dol_print_date($this->date,
'%B');
530 $substitutionarray[
'__INVOICE_YEAR__'] =
dol_print_date($this->date,
'%Y');
533 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] =
dol_print_date($originaldatewhen,
'dayhour');
534 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] =
dol_print_date($nextdatewhen,
'dayhour');
535 $substitutionarray[
'__INVOICE_PREVIOUS_DATE_NEXT_INVOICE_AFTER_GEN__'] =
dol_print_date($previousdaynextdatewhen,
'dayhour');
536 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $_facrec->nb_gen_done;
537 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $_facrec->nb_gen_max;
546 if (!empty($forceduedate)) {
547 $this->date_echeance = $forceduedate;
550 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"facture_fourn (";
552 $sql .=
", ref_supplier";
560 $sql .=
", vat_reverse_charge";
561 $sql .=
", fk_projet";
562 $sql .=
", fk_cond_reglement";
563 $sql .=
", fk_mode_reglement";
564 $sql .=
", fk_account";
565 $sql .=
", note_private";
566 $sql .=
", note_public";
567 $sql .=
", fk_user_author";
568 $sql .=
", date_lim_reglement";
569 $sql .=
", fk_incoterms, location_incoterms";
570 $sql .=
", fk_multicurrency";
571 $sql .=
", multicurrency_code";
572 $sql .=
", multicurrency_tx";
573 $sql .=
", fk_facture_source";
574 $sql .=
", fk_fac_rec_source";
578 $sql .=
", '".$this->db->escape($this->ref_supplier).
"'";
579 $sql .=
", '".$this->db->escape($this->ref_ext).
"'";
580 $sql .=
", ".((int) $conf->entity);
581 $sql .=
", '".$this->db->escape($this->
type).
"'";
582 $sql .=
", '".$this->db->escape(isset($this->label) ? $this->label : (isset($this->libelle) ? $this->libelle :
'')).
"'";
583 $sql .=
", ".((int) $this->socid);
584 $sql .=
", '".$this->db->idate($now).
"'";
585 $sql .=
", '".$this->db->idate($this->date).
"'";
586 $sql .=
", ".($this->vat_reverse_charge !=
'' ? ((int) $this->db->escape($this->vat_reverse_charge)) : 0);
587 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
588 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
"null");
589 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
"null");
590 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
591 $sql .=
", '".$this->db->escape($this->note_private).
"'";
592 $sql .=
", '".$this->db->escape($this->note_public).
"'";
593 $sql .=
", ".((int) $user->id).
",";
594 $sql .= $this->date_echeance !=
'' ?
"'".$this->db->idate($this->date_echeance).
"'" :
"null";
595 $sql .=
", ".(int) $this->fk_incoterms;
596 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
597 $sql .=
", ".(int) $this->fk_multicurrency;
598 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
599 $sql .=
", ".(double) $this->multicurrency_tx;
600 $sql .=
", ".($this->fk_facture_source ? ((int) $this->fk_facture_source) :
"null");
601 $sql .=
", ".(isset($this->fk_fac_rec_source) ? $this->fk_fac_rec_source :
"NULL");
604 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
605 $resql = $this->db->query(
$sql);
607 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn');
610 $this->
ref =
'(PROV'.$this->id.
')';
611 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"facture_fourn SET ref='".$this->db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
613 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
614 $resql = $this->db->query(
$sql);
619 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
620 $this->linked_objects = $this->linkedObjectsIds;
624 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
625 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
626 if (is_array($tmp_origin_id)) {
627 foreach ($tmp_origin_id as $origin_id) {
636 $origin_id = $tmp_origin_id;
646 if (!$error && empty($this->fac_rec) && count($this->lines) && is_object($this->lines[0])) {
647 dol_syslog(
"There is ".count($this->lines).
" lines that are invoice lines objects");
648 foreach ($this->lines as $i => $val) {
649 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'facture_fourn_det (fk_facture_fourn, special_code, fk_remise_except)';
650 $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').
')';
652 $resql_insert = $this->db->query(
$sql);
654 $idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn_det');
659 $this->lines[$i]->subprice,
660 $this->lines[$i]->tva_tx.($this->lines[$i]->vat_src_code ?
' ('.$this->lines[$i]->vat_src_code.
')' :
''),
661 $this->lines[$i]->localtax1_tx,
662 $this->lines[$i]->localtax2_tx,
663 $this->lines[$i]->qty,
664 $this->lines[$i]->fk_product,
666 (!empty($this->lines[$i]->info_bits) ? $this->lines[$i]->info_bits :
''),
667 $this->lines[$i]->product_type,
668 $this->lines[$i]->remise_percent,
670 $this->lines[$i]->date_start,
671 $this->lines[$i]->date_end,
672 $this->lines[$i]->array_options,
673 $this->lines[$i]->fk_unit,
674 $this->lines[$i]->multicurrency_subprice,
675 $this->lines[$i]->ref_supplier
678 $this->error = $this->db->lasterror();
679 $this->db->rollback();
683 } elseif (!$error && empty($this->fac_rec)) {
684 dol_syslog(
"There is ".count($this->lines).
" lines that are array lines");
685 foreach ($this->lines as $i => $val) {
686 $line = $this->lines[$i];
690 if (!is_object($line)) {
691 $line = (object) $line;
694 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'facture_fourn_det (fk_facture_fourn, special_code, fk_remise_except)';
695 $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').
')';
697 $resql_insert = $this->db->query(
$sql);
699 $idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn_det');
711 (!empty($line->info_bits) ? $line->info_bits :
''),
713 $line->remise_percent,
717 $line->array_options,
719 $line->multicurrency_subprice,
723 $this->error = $this->db->lasterror();
724 $this->db->rollback();
733 if (! $error && $this->fac_rec > 0) {
734 foreach ($_facrec->lines as $i => $val) {
735 if ($_facrec->lines[$i]->fk_product) {
736 $prod =
new Product($this->db);
737 $res = $prod->fetch($_facrec->lines[$i]->fk_product);
748 $tva_tx = $_facrec->lines[$i]->tva_tx . ($_facrec->lines[$i]->vat_src_code ?
'(' . $_facrec->lines[$i]->vat_src_code .
')' :
'');
749 $tva_npr = $_facrec->lines[$i]->info_bits;
750 if (empty($tva_tx)) {
753 $localtax1_tx = $_facrec->lines[$i]->localtax1_tx;
754 $localtax2_tx = $_facrec->lines[$i]->localtax2_tx;
756 $fk_product_fournisseur_price = empty($_facrec->lines[$i]->fk_product_fournisseur_price) ? null : $_facrec->lines[$i]->fk_product_fournisseur_price;
757 $buyprice = empty($_facrec->lines[$i]->buyprice) ? 0 : $_facrec->lines[$i]->buyprice;
760 if (! $buyprice && $_facrec->lines[$i]->fk_product > 0) {
761 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.product.class.php';
763 $producttmp->fetch($_facrec->lines[$i]->fk_product);
768 if ($conf->global->MARGIN_TYPE ==
'costprice' && !empty($producttmp->cost_price)) {
769 $buyprice = $producttmp->cost_price;
770 } elseif (
isModEnabled(
'stock') && ($conf->global->MARGIN_TYPE ==
'costprice' || $conf->global->MARGIN_TYPE ==
'pmp') && !empty($producttmp->pmp)) {
771 $buyprice = $producttmp->pmp;
773 if ($producttmp->find_min_price_product_fournisseur($_facrec->lines[$i]->fk_product) > 0) {
774 if ($producttmp->product_fourn_price_id > 0) {
775 $buyprice =
price2num($producttmp->fourn_unitprice * (1 - $producttmp->fourn_remise_percent / 100) + $producttmp->fourn_remise,
'MU');
781 $result_insert = $this->
addline(
782 $_facrec->lines[$i]->description,
783 $_facrec->lines[$i]->pu_ht,
787 $_facrec->lines[$i]->qty,
788 $_facrec->lines[$i]->fk_product,
789 $_facrec->lines[$i]->remise_percent,
790 ($_facrec->lines[$i]->date_start == 1 && $this->date) ? $this->date :
'',
791 ($_facrec->lines[$i]->date_end == 1 && $previousdaynextdatewhen) ? $previousdaynextdatewhen :
'',
793 $_facrec->lines[$i]->info_bits,
796 $_facrec->lines[$i]->rang,
798 $_facrec->lines[$i]->array_options,
799 $_facrec->lines[$i]->fk_unit,
802 $_facrec->lines[$i]->ref_supplier,
803 $_facrec->lines[$i]->special_code,
807 if ($result_insert < 0) {
809 $this->error = $this->db->error();
829 $result = $this->
call_trigger(
'BILL_SUPPLIER_CREATE', $user);
840 $this->db->rollback();
844 $this->error = $langs->trans(
'FailedToUpdatePrice');
845 $this->db->rollback();
849 if ($this->db->errno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
850 $this->error = $langs->trans(
'ErrorRefAlreadyExists');
851 $this->db->rollback();
854 $this->error = $this->db->lasterror();
855 $this->db->rollback();
869 public function fetch($id =
'', $ref =
'', $ref_ext =
'')
871 if (empty($id) && empty($ref) && empty($ref_ext)) {
878 $sql .=
" t.ref_supplier,";
879 $sql .=
" t.ref_ext,";
880 $sql .=
" t.entity,";
882 $sql .=
" t.fk_soc,";
886 $sql .=
" t.libelle as label,";
888 $sql .=
" t.close_code,";
889 $sql .=
" t.close_note,";
891 $sql .=
" t.localtax1,";
892 $sql .=
" t.localtax2,";
893 $sql .=
" t.total_ht,";
894 $sql .=
" t.total_tva,";
895 $sql .=
" t.total_ttc,";
896 $sql .=
" t.fk_statut as status,";
897 $sql .=
" t.fk_user_author,";
898 $sql .=
" t.fk_user_valid,";
899 $sql .=
" t.fk_facture_source,";
900 $sql .=
" t.vat_reverse_charge,";
901 $sql .=
" t.fk_fac_rec_source,";
902 $sql .=
" t.fk_projet as fk_project,";
903 $sql .=
" t.fk_cond_reglement,";
904 $sql .=
" t.fk_account,";
905 $sql .=
" t.fk_mode_reglement,";
906 $sql .=
" t.date_lim_reglement,";
907 $sql .=
" t.note_private,";
908 $sql .=
" t.note_public,";
909 $sql .=
" t.model_pdf,";
910 $sql .=
" t.import_key,";
911 $sql .=
" t.extraparams,";
912 $sql .=
" cr.code as cond_reglement_code, cr.libelle as cond_reglement_label, cr.libelle_facture as cond_reglement_doc,";
913 $sql .=
" p.code as mode_reglement_code, p.libelle as mode_reglement_label,";
914 $sql .=
' s.nom as socnom, s.rowid as socid,';
915 $sql .=
' t.fk_incoterms, t.location_incoterms,';
916 $sql .=
" i.libelle as label_incoterms,";
917 $sql .=
' t.fk_transport_mode,';
918 $sql .=
' t.fk_multicurrency, t.multicurrency_code, t.multicurrency_tx, t.multicurrency_total_ht, t.multicurrency_total_tva, t.multicurrency_total_ttc';
919 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as t';
920 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON (t.fk_soc = s.rowid)";
921 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_payment_term as cr ON t.fk_cond_reglement = cr.rowid";
922 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as p ON t.fk_mode_reglement = p.id";
923 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON t.fk_incoterms = i.rowid';
925 $sql .=
" WHERE t.rowid = ".((int) $id);
927 $sql .=
' WHERE t.entity IN ('.getEntity(
'supplier_invoice').
')';
929 $sql .=
" AND t.ref = '".$this->db->escape($ref).
"'";
932 $sql .=
" AND t.ref_ext = '".$this->db->escape($ref_ext).
"'";
936 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
937 $resql = $this->db->query(
$sql);
939 if ($this->db->num_rows($resql)) {
940 $obj = $this->db->fetch_object($resql);
942 $this->
id = $obj->rowid;
943 $this->
ref = $obj->ref ? $obj->ref : $obj->rowid;
945 $this->ref_supplier = $obj->ref_supplier;
946 $this->ref_ext = $obj->ref_ext;
947 $this->entity = $obj->entity;
949 $this->fk_soc = $obj->fk_soc;
950 $this->datec = $this->db->jdate($obj->datec);
951 $this->date = $this->db->jdate($obj->datef);
952 $this->datep = $this->db->jdate($obj->datef);
953 $this->tms = $this->db->jdate($obj->tms);
954 $this->libelle = $obj->label;
955 $this->label = $obj->label;
956 $this->paye = $obj->paye;
957 $this->paid = $obj->paye;
958 $this->close_code = $obj->close_code;
959 $this->close_note = $obj->close_note;
960 $this->total_localtax1 = $obj->localtax1;
961 $this->total_localtax2 = $obj->localtax2;
962 $this->total_ht = $obj->total_ht;
963 $this->total_tva = $obj->total_tva;
964 $this->total_ttc = $obj->total_ttc;
965 $this->status = $obj->status;
966 $this->statut = $obj->status;
967 $this->fk_statut = $obj->status;
968 $this->fk_user_author = $obj->fk_user_author;
969 $this->author = $obj->fk_user_author;
970 $this->fk_user_valid = $obj->fk_user_valid;
971 $this->fk_facture_source = $obj->fk_facture_source;
972 $this->vat_reverse_charge = empty($obj->vat_reverse_charge) ?
'0' :
'1';
973 $this->fk_fac_rec_source = $obj->fk_fac_rec_source;
974 $this->fk_project = $obj->fk_project;
975 $this->cond_reglement_id = $obj->fk_cond_reglement;
976 $this->cond_reglement_code = $obj->cond_reglement_code;
977 $this->cond_reglement = $obj->cond_reglement_label;
978 $this->cond_reglement_label = $obj->cond_reglement_label;
979 $this->cond_reglement_doc = $obj->cond_reglement_doc;
980 $this->fk_account = $obj->fk_account;
981 $this->mode_reglement_id = $obj->fk_mode_reglement;
982 $this->mode_reglement_code = $obj->mode_reglement_code;
983 $this->mode_reglement = $obj->mode_reglement_label;
984 $this->date_echeance = $this->db->jdate($obj->date_lim_reglement);
985 $this->note = $obj->note_private;
986 $this->note_private = $obj->note_private;
987 $this->note_public = $obj->note_public;
988 $this->model_pdf = $obj->model_pdf;
989 $this->modelpdf = $obj->model_pdf;
990 $this->import_key = $obj->import_key;
993 $this->fk_incoterms = $obj->fk_incoterms;
994 $this->location_incoterms = $obj->location_incoterms;
995 $this->label_incoterms = $obj->label_incoterms;
996 $this->transport_mode_id = $obj->fk_transport_mode;
999 $this->fk_multicurrency = $obj->fk_multicurrency;
1000 $this->multicurrency_code = $obj->multicurrency_code;
1001 $this->multicurrency_tx = $obj->multicurrency_tx;
1002 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1003 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1004 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1006 $this->extraparams = (array) json_decode($obj->extraparams,
true);
1008 $this->socid = $obj->socid;
1009 $this->socnom = $obj->socnom;
1015 if ($this->statut == self::STATUS_DRAFT) {
1016 $this->brouillon = 1;
1021 $this->error = $this->db->lasterror();
1025 $this->error =
'Bill with id '.$id.
' not found';
1026 dol_syslog(get_class($this).
'::fetch '.$this->error);
1030 $this->db->free($resql);
1033 $this->error =
"Error ".$this->db->lasterror();
1048 $this->lines = array();
1050 $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';
1051 $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';
1052 $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';
1053 $sql .=
', p.rowid as product_id, p.ref as product_ref, p.label as label, p.description as product_desc';
1054 $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';
1055 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn_det as f';
1056 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON f.fk_product = p.rowid';
1057 $sql .=
' WHERE fk_facture_fourn='.((int) $this->
id);
1058 $sql .=
' ORDER BY f.rang, f.rowid';
1060 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
1062 $resql_rows = $this->db->query(
$sql);
1064 $num_rows = $this->db->num_rows($resql_rows);
1067 while ($i < $num_rows) {
1068 $obj = $this->db->fetch_object($resql_rows);
1072 $line->id = $obj->rowid;
1073 $line->rowid = $obj->rowid;
1074 $line->description = $obj->description;
1075 $line->date_start = $obj->date_start;
1076 $line->date_end = $obj->date_end;
1078 $line->product_ref = $obj->product_ref;
1079 $line->ref = $obj->product_ref;
1080 $line->ref_supplier = $obj->ref_supplier;
1081 $line->libelle = $obj->label;
1082 $line->label = $obj->label;
1083 $line->product_desc = $obj->product_desc;
1084 $line->subprice = $obj->pu_ht;
1085 $line->pu_ht = $obj->pu_ht;
1086 $line->pu_ttc = $obj->pu_ttc;
1088 $line->vat_src_code = $obj->vat_src_code;
1089 $line->tva_tx = $obj->tva_tx;
1090 $line->localtax1_tx = $obj->localtax1_tx;
1091 $line->localtax2_tx = $obj->localtax2_tx;
1092 $line->localtax1_type = $obj->localtax1_type;
1093 $line->localtax2_type = $obj->localtax2_type;
1094 $line->qty = $obj->qty;
1095 $line->remise_percent = $obj->remise_percent;
1096 $line->fk_remise_except = $obj->fk_remise_except;
1098 $line->total_ht = $obj->total_ht;
1099 $line->total_ttc = $obj->total_ttc;
1100 $line->total_tva = $obj->total_tva;
1101 $line->total_localtax1 = $obj->total_localtax1;
1102 $line->total_localtax2 = $obj->total_localtax2;
1103 $line->fk_facture_fourn = $obj->fk_facture_fourn;
1104 $line->fk_product = $obj->fk_product;
1105 $line->product_type = $obj->product_type;
1106 $line->product_label = $obj->label;
1107 $line->info_bits = $obj->info_bits;
1108 $line->fk_parent_line = $obj->fk_parent_line;
1109 $line->special_code = $obj->special_code;
1110 $line->rang = $obj->rang;
1111 $line->fk_unit = $obj->fk_unit;
1114 $line->code_ventilation = $obj->fk_code_ventilation;
1115 $line->fk_accounting_account = $obj->fk_code_ventilation;
1118 $line->fk_multicurrency = $obj->fk_multicurrency;
1119 $line->multicurrency_code = $obj->multicurrency_code;
1120 $line->multicurrency_subprice = $obj->multicurrency_subprice;
1121 $line->multicurrency_total_ht = $obj->multicurrency_total_ht;
1122 $line->multicurrency_total_tva = $obj->multicurrency_total_tva;
1123 $line->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1126 $line->fetch_optionals();
1128 $this->lines[$i] = $line;
1133 $this->db->free($resql_rows);
1136 $this->error = $this->db->error();
1149 public function update($user =
null, $notrigger = 0)
1151 global $conf, $langs;
1155 if (empty($this->
type)) {
1158 if (isset($this->
ref)) {
1159 $this->
ref = trim($this->
ref);
1161 if (isset($this->ref_supplier)) {
1162 $this->ref_supplier = trim($this->ref_supplier);
1164 if (isset($this->ref_ext)) {
1165 $this->ref_ext = trim($this->ref_ext);
1167 if (isset($this->entity)) {
1168 $this->entity = trim($this->entity);
1170 if (isset($this->
type)) {
1173 if (isset($this->fk_soc)) {
1174 $this->fk_soc = trim($this->fk_soc);
1176 if (isset($this->label)) {
1177 $this->label = trim($this->label);
1179 if (isset($this->libelle)) {
1180 $this->libelle = trim($this->libelle);
1182 if (isset($this->paye)) {
1183 $this->paye = trim($this->paye);
1185 if (isset($this->close_code)) {
1186 $this->close_code = trim($this->close_code);
1188 if (isset($this->close_note)) {
1189 $this->close_note = trim($this->close_note);
1191 if (isset($this->localtax1)) {
1192 $this->localtax1 = trim($this->localtax1);
1194 if (isset($this->localtax2)) {
1195 $this->localtax2 = trim($this->localtax2);
1197 if (empty($this->total_ht)) {
1198 $this->total_ht = 0;
1200 if (empty($this->total_tva)) {
1201 $this->total_tva = 0;
1205 if (isset($this->total_ttc)) {
1206 $this->total_ttc = trim($this->total_ttc);
1208 if (isset($this->statut)) {
1209 $this->statut = (int) $this->statut;
1211 if (isset($this->status)) {
1212 $this->status = (int) $this->status;
1214 if (isset($this->author)) {
1215 $this->author = trim($this->author);
1217 if (isset($this->fk_user_valid)) {
1218 $this->fk_user_valid = trim($this->fk_user_valid);
1220 if (isset($this->fk_facture_source)) {
1221 $this->fk_facture_source = trim($this->fk_facture_source);
1223 if (isset($this->fk_project)) {
1224 if (empty($this->fk_project)) $this->fk_project =
null;
1225 else $this->fk_project = intval($this->fk_project);
1227 if (isset($this->cond_reglement_id)) {
1228 $this->cond_reglement_id = trim($this->cond_reglement_id);
1230 if (isset($this->note_private)) {
1231 $this->note = trim($this->note_private);
1233 if (isset($this->note_public)) {
1234 $this->note_public = trim($this->note_public);
1236 if (isset($this->model_pdf)) {
1237 $this->model_pdf = trim($this->model_pdf);
1239 if (isset($this->import_key)) {
1240 $this->import_key = trim($this->import_key);
1248 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn SET";
1249 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
1250 $sql .=
" ref_supplier=".(isset($this->ref_supplier) ?
"'".$this->db->escape($this->ref_supplier).
"'" :
"null").
",";
1251 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
1252 $sql .=
" entity=".(isset($this->entity) ? ((int) $this->entity) :
"null").
",";
1253 $sql .=
" type=".(isset($this->
type) ? ((int) $this->
type) :
"null").
",";
1254 $sql .=
" fk_soc=".(isset($this->fk_soc) ? ((int) $this->fk_soc) :
"null").
",";
1255 $sql .=
" datec=".(dol_strlen($this->datec) != 0 ?
"'".$this->db->idate($this->datec).
"'" :
'null').
",";
1256 $sql .=
" datef=".(dol_strlen($this->date) != 0 ?
"'".$this->db->idate($this->date).
"'" :
'null').
",";
1258 $sql .=
" tms=".(dol_strlen($this->tms) != 0 ?
"'".$this->db->idate($this->tms).
"'" :
'null').
",";
1260 $sql .=
" libelle=".(isset($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
1261 $sql .=
" paye=".(isset($this->paye) ? ((int) $this->paye) :
"null").
",";
1262 $sql .=
" close_code=".(isset($this->close_code) ?
"'".$this->db->escape($this->close_code).
"'" :
"null").
",";
1263 $sql .=
" close_note=".(isset($this->close_note) ?
"'".$this->db->escape($this->close_note).
"'" :
"null").
",";
1264 $sql .=
" localtax1=".(isset($this->localtax1) ? ((
float) $this->localtax1) :
"null").
",";
1265 $sql .=
" localtax2=".(isset($this->localtax2) ? ((
float) $this->localtax2) :
"null").
",";
1266 $sql .=
" total_ht=".(isset($this->total_ht) ? ((
float) $this->total_ht) :
"null").
",";
1267 $sql .=
" total_tva=".(isset($this->total_tva) ? ((
float) $this->total_tva) :
"null").
",";
1268 $sql .=
" total_ttc=".(isset($this->total_ttc) ? ((
float) $this->total_ttc) :
"null").
",";
1269 $sql .=
" fk_statut=".(isset($this->status) ? ((int) $this->status) : (isset($this->statut) ? ((int) $this->statut) :
"null")).
",";
1270 $sql .=
" fk_user_author=".(isset($this->author) ? ((int) $this->author) :
"null").
",";
1271 $sql .=
" fk_user_valid=".(isset($this->fk_user_valid) ? ((int) $this->fk_user_valid) :
"null").
",";
1272 $sql .=
" fk_facture_source=".($this->fk_facture_source ? ((int) $this->fk_facture_source) :
"null").
",";
1273 $sql .=
" vat_reverse_charge = ".($this->vat_reverse_charge !=
'' ? ((int) $this->db->escape($this->vat_reverse_charge)) : 0).
",";
1274 $sql .=
" fk_projet=".(isset($this->fk_project) ? ((int) $this->fk_project) :
"null").
",";
1275 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? ((int) $this->cond_reglement_id) :
"null").
",";
1276 $sql .=
" date_lim_reglement=".(dol_strlen($this->date_echeance) != 0 ?
"'".$this->db->idate($this->date_echeance).
"'" :
'null').
",";
1277 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
1278 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
1279 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
1280 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null");
1281 $sql .=
" WHERE rowid=".((int) $this->
id);
1285 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
1286 $resql = $this->db->query(
$sql);
1291 if ($this->db->errno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1292 $this->errors[] = $langs->trans(
'ErrorRefAlreadyExists');
1294 $this->errors[] =
"Error ".$this->db->lasterror();
1308 $result = $this->
call_trigger(
'BILL_SUPPLIER_MODIFY', $user);
1318 foreach ($this->errors as $errmsg) {
1319 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1320 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1322 $this->db->rollback();
1325 $this->db->commit();
1340 global $conf, $langs;
1342 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1343 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
1348 $result =
$remise->fetch($idremise);
1351 if (
$remise->fk_invoice_supplier) {
1352 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
1353 $this->db->rollback();
1358 $facligne->fk_facture_fourn = $this->id;
1359 $facligne->fk_remise_except =
$remise->id;
1360 $facligne->desc =
$remise->description;
1361 $facligne->vat_src_code =
$remise->vat_src_code;
1362 $facligne->tva_tx =
$remise->tva_tx;
1363 $facligne->subprice = -
$remise->amount_ht;
1364 $facligne->fk_product = 0;
1365 $facligne->product_type = 0;
1367 $facligne->remise_percent = 0;
1368 $facligne->rang = -1;
1369 $facligne->info_bits = 2;
1371 if (!empty($conf->global->MAIN_ADD_LINE_AT_POSITION)) {
1372 $facligne->rang = 1;
1373 $linecount = count($this->lines);
1374 for ($ii = 1; $ii <= $linecount; $ii++) {
1380 if (
$remise->fk_invoice_supplier_source > 0) {
1382 $srcinvoice->fetch(
$remise->fk_invoice_supplier_source);
1383 $totalcostpriceofinvoice = 0;
1384 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
1386 $arraytmp = $formmargin->getMarginInfosArray($srcinvoice,
false);
1387 $facligne->pa_ht = $arraytmp[
'pa_total'];
1390 $facligne->total_ht = -
$remise->amount_ht;
1391 $facligne->total_tva = -
$remise->amount_tva;
1392 $facligne->total_ttc = -
$remise->amount_ttc;
1394 $facligne->multicurrency_subprice = -
$remise->multicurrency_subprice;
1395 $facligne->multicurrency_total_ht = -
$remise->multicurrency_total_ht;
1396 $facligne->multicurrency_total_tva = -
$remise->multicurrency_total_tva;
1397 $facligne->multicurrency_total_ttc = -
$remise->multicurrency_total_ttc;
1399 $lineid = $facligne->insert();
1404 $result =
$remise->link_to_invoice($lineid, 0);
1406 $this->error =
$remise->error;
1407 $this->db->rollback();
1411 $this->db->commit();
1414 $this->error = $facligne->error;
1415 $this->db->rollback();
1419 $this->error = $facligne->error;
1420 $this->db->rollback();
1424 $this->db->rollback();
1437 public function delete(
User $user, $notrigger = 0)
1439 global $langs, $conf;
1443 dol_syslog(
"FactureFournisseur::delete rowid=".$rowid, LOG_DEBUG);
1450 if (!$error && !$notrigger) {
1452 $result = $this->
call_trigger(
'BILL_SUPPLIER_DELETE', $user);
1454 $this->db->rollback();
1462 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'societe_remise_except';
1463 $sql .=
' WHERE fk_invoice_supplier_source = '.((int) $rowid);
1464 $sql .=
' AND fk_invoice_supplier_line IS NULL';
1465 $resql = $this->db->query(
$sql);
1469 $list_rowid_det = array();
1470 foreach ($this->lines as $key => $invoiceline) {
1471 $list_rowid_det[] = $invoiceline->rowid;
1475 if (count($list_rowid_det)) {
1476 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
1477 $sql .=
' SET fk_invoice_supplier = NULL, fk_invoice_supplier_line = NULL';
1478 $sql .=
' WHERE fk_invoice_supplier_line IN ('.$this->db->sanitize(join(
',', $list_rowid_det)).
')';
1480 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1481 if (!$this->db->query(
$sql)) {
1488 $main = MAIN_DB_PREFIX.
'facture_fourn_det';
1489 $ef = $main.
"_extrafields";
1490 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM ".$main.
" WHERE fk_facture_fourn = ".((int) $rowid).
")";
1491 $resqlef = $this->db->query($sqlef);
1492 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'facture_fourn_det WHERE fk_facture_fourn = '.((int) $rowid);
1493 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1494 $resql = $this->db->query(
$sql);
1495 if ($resqlef && $resql) {
1496 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'facture_fourn WHERE rowid = '.((int) $rowid);
1497 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1498 $resql2 = $this->db->query(
$sql);
1528 if ($conf->fournisseur->facture->dir_output) {
1529 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1532 $dir = $conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$ref;
1533 $file = $dir.
"/".$ref.
".pdf";
1534 if (file_exists($file)) {
1536 $this->error =
'ErrorFailToDeleteFile';
1540 if (file_exists($dir)) {
1544 $this->error =
'ErrorFailToDeleteDir';
1556 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
1561 dol_syslog(get_class($this).
"::delete $this->id by $user->id", LOG_DEBUG);
1562 $this->db->commit();
1565 $this->error = $this->db->lasterror();
1566 $this->db->rollback();
1583 public function set_paid($user, $close_code =
'', $close_note =
'')
1586 dol_syslog(get_class($this).
"::set_paid is deprecated, use setPaid instead", LOG_NOTICE);
1587 return $this->
setPaid($user, $close_code, $close_note);
1598 public function setPaid($user, $close_code =
'', $close_note =
'')
1602 if ($this->paye != 1) {
1607 dol_syslog(
"FactureFournisseur::set_paid", LOG_DEBUG);
1609 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn SET';
1610 $sql .=
' fk_statut = '.self::STATUS_CLOSED;
1615 $sql .=
", close_code='".$this->db->escape($close_code).
"'";
1618 $sql .=
", close_note='".$this->db->escape($close_note).
"'";
1620 $sql .=
', fk_user_closing = '.((int) $user->id);
1621 $sql .=
", date_closing = '".$this->db->idate($now).
"'";
1622 $sql .=
' WHERE rowid = '.((int) $this->
id);
1624 $resql = $this->db->query(
$sql);
1627 $result = $this->
call_trigger(
'BILL_SUPPLIER_PAYED', $user);
1634 $this->error = $this->db->error();
1639 $this->db->commit();
1642 $this->db->rollback();
1664 dol_syslog(get_class($this).
"::set_unpaid is deprecated, use setUnpaid instead", LOG_NOTICE);
1682 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn';
1683 $sql .=
' SET paye=0, fk_statut='.self::STATUS_VALIDATED.
', close_code=null, close_note=null,';
1684 $sql .=
' date_closing=null,';
1685 $sql .=
' fk_user_closing=null';
1686 $sql .=
' WHERE rowid = '.((int) $this->
id);
1688 dol_syslog(get_class($this).
"::set_unpaid", LOG_DEBUG);
1689 $resql = $this->db->query(
$sql);
1692 $result = $this->
call_trigger(
'BILL_SUPPLIER_UNPAYED', $user);
1699 $this->error = $this->db->error();
1704 $this->db->commit();
1707 $this->db->rollback();
1722 public function setCanceled($user, $close_code =
'', $close_note =
'')
1724 dol_syslog(get_class($this).
"::setCanceled rowid=".((
int) $this->
id), LOG_DEBUG);
1728 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn SET';
1729 $sql .=
' fk_statut='.self::STATUS_ABANDONED;
1731 $sql .=
", close_code='".$this->db->escape($close_code).
"'";
1734 $sql .=
", close_note='".$this->db->escape($close_note).
"'";
1736 $sql .=
" WHERE rowid = ".((int) $this->
id);
1738 $resql = $this->db->query(
$sql);
1742 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
1743 $sql .=
' SET fk_invoice_supplier = NULL';
1744 $sql .=
' WHERE fk_invoice_supplier = '.((int) $this->
id);
1746 $resql = $this->db->query(
$sql);
1749 $result = $this->
call_trigger(
'BILL_SUPPLIER_CANCEL', $user);
1751 $this->db->rollback();
1756 $this->db->commit();
1759 $this->error = $this->db->error().
" sql=".
$sql;
1760 $this->db->rollback();
1764 $this->error = $this->db->error().
" sql=".
$sql;
1765 $this->db->rollback();
1779 public function validate($user, $force_number =
'', $idwarehouse = 0, $notrigger = 0)
1781 global $conf, $langs;
1783 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1788 dol_syslog(get_class($this).
'::validate user='.$user->id.
', force_number='.$force_number.
', idwarehouse='.$idwarehouse);
1795 if ($this->statut > self::STATUS_DRAFT) {
1796 dol_syslog(get_class($this).
"::validate no draft status", LOG_WARNING);
1799 if (preg_match(
'/^'.preg_quote($langs->trans(
"CopyOf").
' ').
'/', $this->ref_supplier)) {
1800 $langs->load(
"errors");
1801 $this->error = $langs->trans(
"ErrorFieldFormat", $langs->transnoentities(
"RefSupplier")).
'. '.$langs->trans(
'RemoveString', $langs->transnoentitiesnoconv(
"CopyOf"));
1804 if (count($this->lines) <= 0) {
1805 $langs->load(
"errors");
1806 $this->error = $langs->trans(
"ErrorObjectMustHaveLinesToBeValidated", $this->
ref);
1813 if ($force_number) {
1814 $num = $force_number;
1815 } elseif (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1822 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn";
1823 $sql .=
" SET ref='".$this->db->escape($num).
"', fk_statut = 1, fk_user_valid = ".((int) $user->id).
", date_valid = '".$this->db->idate($now).
"'";
1824 $sql .=
" WHERE rowid = ".((int) $this->
id);
1826 dol_syslog(get_class($this).
"::validate", LOG_DEBUG);
1827 $resql = $this->db->query(
$sql);
1830 if (!$error &&
isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) {
1831 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1832 $langs->load(
"agenda");
1834 $cpt = count($this->lines);
1835 for ($i = 0; $i < $cpt; $i++) {
1836 if ($this->lines[$i]->fk_product > 0) {
1838 $mouvP->origin = &$this;
1839 $mouvP->setOrigin($this->element, $this->
id);
1841 $up_ht_disc = $this->lines[$i]->subprice;
1842 if (!empty($this->lines[$i]->remise_percent) && empty($conf->global->STOCK_EXCLUDE_DISCOUNT_FOR_PMP)) {
1843 $up_ht_disc =
price2num($up_ht_disc * (100 - $this->lines[$i]->remise_percent) / 100,
'MU');
1846 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans(
"InvoiceValidatedInDolibarr", $num));
1848 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans(
"InvoiceValidatedInDolibarr", $num));
1858 if (!$error && empty($notrigger)) {
1860 $result = $this->
call_trigger(
'BILL_SUPPLIER_VALIDATE', $user);
1868 $this->oldref = $this->ref;
1871 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1873 $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).
"'";
1874 $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;
1875 $resql = $this->db->query(
$sql);
1877 $error++; $this->error = $this->db->lasterror();
1883 $dirsource = $conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$oldref;
1884 $dirdest = $conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$newref;
1885 if (!$error && file_exists($dirsource)) {
1886 dol_syslog(get_class($this).
"::validate rename dir ".$dirsource.
" into ".$dirdest);
1888 if (@rename($dirsource, $dirdest)) {
1891 $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,
'/'));
1892 foreach ($listoffiles as $fileentry) {
1893 $dirsource = $fileentry[
'name'];
1894 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1895 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1896 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1897 @rename($dirsource, $dirdest);
1912 $this->db->commit();
1915 $this->db->rollback();
1919 $this->error = $this->db->error();
1920 $this->db->rollback();
1935 global $conf, $langs;
1939 if ($this->statut == self::STATUS_DRAFT) {
1940 dol_syslog(__METHOD__.
" already draft status", LOG_WARNING);
1948 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn";
1949 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1950 $sql .=
" WHERE rowid = ".((int) $this->
id);
1952 $result = $this->db->query(
$sql);
1955 $this->oldcopy = clone $this;
1959 if ($result >= 0 &&
isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) {
1960 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1961 $langs->load(
"agenda");
1963 $cpt = count($this->lines);
1964 for ($i = 0; $i < $cpt; $i++) {
1965 if ($this->lines[$i]->fk_product > 0) {
1967 $mouvP->origin = &$this;
1968 $mouvP->setOrigin($this->element, $this->
id);
1971 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"InvoiceBackToDraftInDolibarr", $this->ref));
1973 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"InvoiceBackToDraftInDolibarr", $this->ref));
1979 if (!$error && empty($notrigger)) {
1981 $result = $this->
call_trigger(
'BILL_SUPPLIER_UNVALIDATE', $user);
1988 $this->db->commit();
1991 $this->db->rollback();
1995 $this->error = $this->db->error();
1996 $this->db->rollback();
2035 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)
2037 global $langs, $mysoc, $conf;
2039 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);
2040 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2042 if ($this->statut == self::STATUS_DRAFT) {
2044 if (empty($remise_percent)) {
2045 $remise_percent = 0;
2050 if (empty($info_bits)) {
2056 if (empty($ventil)) {
2059 if (empty($txtva)) {
2062 if (empty($txlocaltax1)) {
2065 if (empty($txlocaltax2)) {
2069 $remise_percent =
price2num($remise_percent);
2072 if (!preg_match(
'/\((.*)\)/', $txtva)) {
2078 if ($date_start && $date_end && $date_start > $date_end) {
2079 $langs->load(
"errors");
2080 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
2086 if ($fk_product > 0) {
2087 if (!empty($conf->global->SUPPLIER_INVOICE_WITH_PREDEFINED_PRICES_ONLY)) {
2089 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
2091 if ($prod->fetch($fk_product) > 0) {
2092 $product_type = $prod->type;
2093 $label = $prod->label;
2094 $fk_prod_fourn_price = 0;
2098 $result = $prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', ($this->fk_soc ? $this->fk_soc : $this->socid));
2101 $pu = $prod->fourn_pu;
2103 $ref_supplier = $prod->ref_supplier;
2105 if ($remise_percent == 0 && $prod->remise_percent != 0) {
2106 $remise_percent = $prod->remise_percent;
2110 $langs->load(
"errors");
2111 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
2112 $this->db->rollback();
2113 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
2118 if ($result == -1) {
2119 $langs->load(
"errors");
2120 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
2121 $this->db->rollback();
2122 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
2126 $this->error = $prod->error;
2127 $this->db->rollback();
2128 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
2132 $this->error = $prod->error;
2133 $this->db->rollback();
2138 $product_type = $type;
2150 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
2151 $vat_src_code = $reg[1];
2152 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
2160 $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);
2161 $total_ht = $tabprice[0];
2162 $total_tva = $tabprice[1];
2163 $total_ttc = $tabprice[2];
2164 $total_localtax1 = $tabprice[9];
2165 $total_localtax2 = $tabprice[10];
2166 $pu_ht = $tabprice[3];
2169 $multicurrency_total_ht = $tabprice[16];
2170 $multicurrency_total_tva = $tabprice[17];
2171 $multicurrency_total_ttc = $tabprice[18];
2172 $pu_ht_devise = $tabprice[19];
2181 $rang = $rangmax + 1;
2187 $supplierinvoiceline->context = $this->context;
2189 $supplierinvoiceline->fk_facture_fourn = $this->id;
2191 $supplierinvoiceline->desc = $desc;
2192 $supplierinvoiceline->ref_supplier = $ref_supplier;
2194 $supplierinvoiceline->qty = ($this->
type == self::TYPE_CREDIT_NOTE ? abs($qty) : $qty);
2195 $supplierinvoiceline->subprice = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht) : $pu_ht);
2197 $supplierinvoiceline->vat_src_code = $vat_src_code;
2198 $supplierinvoiceline->tva_tx = $txtva;
2199 $supplierinvoiceline->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
2200 $supplierinvoiceline->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
2201 $supplierinvoiceline->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
2202 $supplierinvoiceline->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
2204 $supplierinvoiceline->total_ht = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_ht) : $total_ht);
2205 $supplierinvoiceline->total_tva = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_tva) : $total_tva);
2206 $supplierinvoiceline->total_localtax1 = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_localtax1) : $total_localtax1);
2207 $supplierinvoiceline->total_localtax2 = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_localtax2) : $total_localtax2);
2208 $supplierinvoiceline->total_ttc = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_ttc) : $total_ttc);
2210 $supplierinvoiceline->fk_product = $fk_product;
2211 $supplierinvoiceline->product_type = $type;
2212 $supplierinvoiceline->remise_percent = $remise_percent;
2213 $supplierinvoiceline->date_start = $date_start;
2214 $supplierinvoiceline->date_end = $date_end;
2215 $supplierinvoiceline->fk_code_ventilation = $ventil;
2216 $supplierinvoiceline->rang = $rang;
2217 $supplierinvoiceline->info_bits = $info_bits;
2218 $supplierinvoiceline->fk_remise_except = $fk_remise_except;
2220 $supplierinvoiceline->special_code = ((string) $special_code !=
'' ? $special_code : $this->special_code);
2221 $supplierinvoiceline->fk_parent_line = $fk_parent_line;
2222 $supplierinvoiceline->origin = $this->origin;
2223 $supplierinvoiceline->origin_id = $origin_id;
2224 $supplierinvoiceline->fk_unit = $fk_unit;
2227 $supplierinvoiceline->fk_multicurrency = $this->fk_multicurrency;
2228 $supplierinvoiceline->multicurrency_code = $this->multicurrency_code;
2229 $supplierinvoiceline->multicurrency_subprice = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht_devise) : $pu_ht_devise);
2231 $supplierinvoiceline->multicurrency_total_ht = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($multicurrency_total_ht) : $multicurrency_total_ht);
2232 $supplierinvoiceline->multicurrency_total_tva = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($multicurrency_total_tva) : $multicurrency_total_tva);
2233 $supplierinvoiceline->multicurrency_total_ttc = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($multicurrency_total_ttc) : $multicurrency_total_ttc);
2235 if (is_array($array_options) && count($array_options) > 0) {
2236 $supplierinvoiceline->array_options = $array_options;
2239 $result = $supplierinvoiceline->insert($notrigger);
2242 if (!empty($fk_parent_line)) {
2244 } elseif ($rang > 0 && $rang <= count($this->lines)) {
2245 $linecount = count($this->lines);
2246 for ($ii = $rang; $ii <= $linecount; $ii++) {
2252 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
2254 $this->db->commit();
2255 return $supplierinvoiceline->id;
2257 $this->error = $this->db->error();
2258 $this->db->rollback();
2262 $this->error = $supplierinvoiceline->error;
2263 $this->errors = $supplierinvoiceline->errors;
2264 $this->db->rollback();
2297 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)
2299 global $mysoc, $langs;
2301 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);
2302 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2306 $remise_percent =
price2num($remise_percent);
2315 if ($date_start && $date_end && $date_start > $date_end) {
2316 $langs->load(
"errors");
2317 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
2322 if (empty($vatrate)) {
2325 if (empty($txlocaltax1)) {
2328 if (empty($txlocaltax2)) {
2346 if (preg_match(
'/\((.*)\)/', $vatrate, $reg)) {
2347 $vat_src_code = $reg[1];
2348 $vatrate = preg_replace(
'/\s*\(.*\)/',
'', $vatrate);
2351 $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);
2352 $total_ht = $tabprice[0];
2353 $total_tva = $tabprice[1];
2354 $total_ttc = $tabprice[2];
2355 $pu_ht = $tabprice[3];
2356 $pu_tva = $tabprice[4];
2357 $pu_ttc = $tabprice[5];
2358 $total_localtax1 = $tabprice[9];
2359 $total_localtax2 = $tabprice[10];
2362 $multicurrency_total_ht = $tabprice[16];
2363 $multicurrency_total_tva = $tabprice[17];
2364 $multicurrency_total_ttc = $tabprice[18];
2365 $pu_ht_devise = $tabprice[19];
2367 if (empty($info_bits)) {
2374 $line->fetch_optionals();
2376 $staticline = clone $line;
2379 $product =
new Product($this->db);
2380 $result = $product->fetch($idproduct);
2381 $product_type = $product->type;
2383 $idproduct = $staticline->fk_product;
2384 $product_type = $type;
2387 $line->oldline = $staticline;
2388 $line->context = $this->context;
2390 $line->description = $desc;
2392 $line->qty = ($this->
type == self::TYPE_CREDIT_NOTE ? abs($qty) : $qty);
2393 $line->subprice = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht) : $pu_ht);
2394 $line->pu_ht = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht) : $pu_ht);
2395 $line->pu_ttc = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ttc) : $pu_ttc);
2397 $line->remise_percent = $remise_percent;
2398 $line->ref_supplier = $ref_supplier;
2400 $line->date_start = $date_start;
2401 $line->date_end = $date_end;
2403 $line->vat_src_code = $vat_src_code;
2404 $line->tva_tx = $vatrate;
2405 $line->localtax1_tx = $txlocaltax1;
2406 $line->localtax2_tx = $txlocaltax2;
2407 $line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
2408 $line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
2410 $line->total_ht = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ?-abs($total_ht) : $total_ht);
2411 $line->total_tva = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ?-abs($total_tva) : $total_tva);
2412 $line->total_localtax1 = $total_localtax1;
2413 $line->total_localtax2 = $total_localtax2;
2414 $line->total_ttc = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ?-abs($total_ttc) : $total_ttc);
2416 $line->fk_product = $idproduct;
2417 $line->product_type = $product_type;
2418 $line->info_bits = $info_bits;
2419 $line->fk_unit = $fk_unit;
2420 $line->rang = $rang;
2422 if (is_array($array_options) && count($array_options) > 0) {
2424 foreach ($array_options as $key => $value) {
2425 $line->array_options[$key] = $array_options[$key];
2430 $line->multicurrency_subprice = $pu_ht_devise;
2431 $line->multicurrency_total_ht = $multicurrency_total_ht;
2432 $line->multicurrency_total_tva = $multicurrency_total_tva;
2433 $line->multicurrency_total_ttc = $multicurrency_total_ttc;
2435 $res = $line->update($notrigger);
2438 $this->errors[] = $line->error;
2441 $res = $this->
update_price(
'1',
'auto', 0, $this->thirdparty);
2463 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
2464 $sql .=
' SET fk_invoice_supplier_line = NULL';
2465 $sql .=
' WHERE fk_invoice_supplier_line = '.((int) $rowid);
2467 dol_syslog(get_class($this).
"::deleteline", LOG_DEBUG);
2468 $result = $this->db->query(
$sql);
2470 $this->error = $this->db->error();
2471 $this->db->rollback();
2477 if ($line->fetch($rowid) < 1) {
2481 $res = $line->delete($notrigger);
2484 $this->errors[] = $line->error;
2485 $this->db->rollback();
2491 $this->db->commit();
2494 $this->db->rollback();
2495 $this->error = $this->db->lasterror();
2510 $sql =
'SELECT c.rowid, datec, tms as datem, ';
2511 $sql .=
' fk_user_author, fk_user_modif, fk_user_valid';
2512 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as c';
2513 $sql .=
' WHERE c.rowid = '.((int) $id);
2515 $result = $this->db->query(
$sql);
2517 if ($this->db->num_rows($result)) {
2518 $obj = $this->db->fetch_object($result);
2520 $this->
id = $obj->rowid;
2521 if ($obj->fk_user_author) {
2522 $cuser =
new User($this->db);
2523 $cuser->fetch($obj->fk_user_author);
2524 $this->user_creation = $cuser;
2526 if ($obj->fk_user_valid) {
2527 $vuser =
new User($this->db);
2528 $vuser->fetch($obj->fk_user_valid);
2529 $this->user_validation = $vuser;
2531 if ($obj->fk_user_modif) {
2532 $muser =
new User($this->db);
2533 $muser->fetch($obj->fk_user_modif);
2534 $this->user_modification = $muser;
2536 $this->date_creation = $this->db->jdate($obj->datec);
2537 $this->date_modification = $this->db->jdate($obj->datem);
2540 $this->db->free($result);
2562 $sql =
"SELECT f.rowid as rowid, f.ref, f.fk_statut,";
2563 $sql .=
" ff.rowid as rowidnext";
2564 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
2565 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON f.rowid = pf.fk_facturefourn";
2566 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture_fourn as ff ON f.rowid = ff.fk_facture_source";
2567 $sql .=
" WHERE (f.fk_statut = ".self::STATUS_VALIDATED.
" OR (f.fk_statut = ".self::STATUS_ABANDONED.
" AND f.close_code = '".self::CLOSECODE_ABANDONED.
"'))";
2568 $sql .=
" AND f.entity = ".$conf->entity;
2569 $sql .=
" AND f.paye = 0";
2570 $sql .=
" AND pf.fk_paiementfourn IS NULL";
2571 $sql .=
" AND ff.fk_statut IS NULL";
2573 $sql .=
" AND f.fk_soc = ".((int) $socid);
2575 $sql .=
" ORDER BY f.ref";
2577 dol_syslog(get_class($this).
"::list_replacable_supplier_invoices", LOG_DEBUG);
2578 $resql = $this->db->query(
$sql);
2580 while ($obj = $this->db->fetch_object($resql)) {
2581 $return[$obj->rowid] = array(
2582 'id' => $obj->rowid,
2584 'status' => $obj->fk_statut
2590 $this->error = $this->db->error();
2612 $sql =
"SELECT f.rowid as rowid, f.ref, f.fk_statut, f.type, f.paye, pf.fk_paiementfourn";
2613 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
2614 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON f.rowid = pf.fk_facturefourn";
2615 $sql .=
" WHERE f.entity = ".$conf->entity;
2616 $sql .=
" AND f.fk_statut in (".self::STATUS_VALIDATED.
",".self::STATUS_CLOSED.
")";
2617 $sql .=
" AND NOT EXISTS (SELECT rowid from ".MAIN_DB_PREFIX.
"facture_fourn as ff WHERE f.rowid = ff.fk_facture_source";
2618 $sql .=
" AND ff.type=".self::TYPE_REPLACEMENT.
")";
2619 $sql .=
" AND f.type != ".self::TYPE_CREDIT_NOTE;
2621 $sql .=
" AND f.fk_soc = ".((int) $socid);
2623 $sql .=
" ORDER BY f.ref";
2625 dol_syslog(get_class($this).
"::list_qualified_avoir_supplier_invoices", LOG_DEBUG);
2626 $resql = $this->db->query(
$sql);
2628 while ($obj = $this->db->fetch_object($resql)) {
2630 if ($obj->fk_statut == self::STATUS_VALIDATED) {
2633 if ($obj->fk_statut == self::STATUS_CLOSED) {
2637 $paymentornot = ($obj->fk_paiementfourn ? 1 : 0);
2638 $return[$obj->rowid] = array(
'ref'=>$obj->ref,
'status'=>$obj->fk_statut,
'type'=>$obj->type,
'paye'=>$obj->paye,
'paymentornot'=>$paymentornot);
2644 $this->error = $this->db->error();
2659 global $conf, $langs;
2661 $sql =
'SELECT ff.rowid, ff.date_lim_reglement as datefin, ff.fk_statut as status, ff.total_ht, ff.total_ttc';
2662 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as ff';
2663 if (empty($user->rights->societe->client->voir) && !$user->socid) {
2664 $sql .=
" JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON ff.fk_soc = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2666 $sql .=
' WHERE ff.paye = 0';
2667 $sql .=
' AND ff.fk_statut > 0';
2668 $sql .=
" AND ff.entity = ".$conf->entity;
2670 $sql .=
' AND ff.fk_soc = '.((int) $user->socid);
2673 $resql = $this->db->query(
$sql);
2675 $langs->load(
"bills");
2679 $response->warning_delay = $conf->facture->fournisseur->warning_delay / 60 / 60 / 24;
2680 $response->label = $langs->trans(
"SupplierBillsToPay");
2681 $response->labelShort = $langs->trans(
"StatusToPay");
2683 $response->url = DOL_URL_ROOT.
'/fourn/facture/list.php?search_status=1&mainmenu=billing&leftmenu=suppliers_bills';
2684 $response->img =
img_object($langs->trans(
"Bills"),
"bill");
2688 while ($obj = $this->db->fetch_object($resql)) {
2689 $facturestatic->date_echeance = $this->db->jdate($obj->datefin);
2690 $facturestatic->statut = $obj->status;
2691 $facturestatic->status = $obj->status;
2693 $response->nbtodo++;
2694 $response->total += $obj->total_ht;
2696 if ($facturestatic->hasDelay()) {
2697 $response->nbtodolate++;
2698 $response->url_late = DOL_URL_ROOT.
'/fourn/facture/list.php?search_option=late&mainmenu=billing&leftmenu=suppliers_bills';
2702 $this->db->free($resql);
2706 $this->error = $this->db->error();
2720 global $conf, $langs;
2722 $langs->load(
'bills');
2725 $moretitle = $params[
'moretitle'] ??
'';
2726 $picto = $this->picto;
2727 if ($this->
type == self::TYPE_REPLACEMENT) {
2730 if ($this->
type == self::TYPE_CREDIT_NOTE) {
2733 if ($this->
type == self::TYPE_DEPOSIT) {
2737 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierInvoice").
'</u>';
2738 if ($this->
type == self::TYPE_REPLACEMENT) {
2739 $datas[
'picto'] .=
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"InvoiceReplace").
'</u>';
2740 } elseif ($this->
type == self::TYPE_CREDIT_NOTE) {
2741 $datas[
'picto'] .=
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"CreditNote").
'</u>';
2742 } elseif ($this->
type == self::TYPE_DEPOSIT) {
2743 $datas[
'picto'] .=
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"Deposit").
'</u>';
2745 if (isset($this->status)) {
2747 if (isset($this->alreadypaid)) {
2748 $alreadypaid = $this->alreadypaid;
2751 $datas[
'picto'] .=
' '.$this->getLibStatut(5, $alreadypaid);
2754 $datas[
'picto'] .=
' - '.$moretitle;
2756 if (!empty($this->
ref)) {
2757 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2759 if (!empty($this->ref_supplier)) {
2760 $datas[
'refsupplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_supplier;
2762 if (!empty($this->label)) {
2763 $datas[
'label'] =
'<br><b>'.$langs->trans(
'Label').
':</b> '.$this->label;
2765 if (!empty($this->date)) {
2766 $datas[
'date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->date,
'day');
2768 if (!empty($this->date_echeance)) {
2769 $datas[
'date_echeance'] =
'<br><b>'.$langs->trans(
'DateDue').
':</b> '.
dol_print_date($this->date_echeance,
'day');
2771 if (!empty($this->total_ht)) {
2772 $datas[
'amountht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
2774 if (!empty($this->total_tva)) {
2775 $datas[
'totaltva'] =
'<br><b>'.$langs->trans(
'AmountVAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
2777 if (!empty($this->total_ttc)) {
2778 $datas[
'totalttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
2796 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $moretitle =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2798 global $langs, $conf, $user, $hookmanager;
2802 if ($option ==
'withdraw') {
2803 $url = DOL_URL_ROOT.
'/compta/facture/prelevement.php?facid='.$this->
id.
'&type=bank-transfer';
2804 } elseif ($option ==
'document') {
2805 $url = DOL_URL_ROOT.
'/fourn/facture/document.php?facid='.$this->id;
2807 $url = DOL_URL_ROOT.
'/fourn/facture/card.php?facid='.$this->id;
2814 if ($option !==
'nolink') {
2816 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2817 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2818 $add_save_lastsearch_values = 1;
2820 if ($add_save_lastsearch_values) {
2821 $url .=
'&save_lastsearch_values=1';
2825 $picto = $this->picto;
2826 if ($this->
type == self::TYPE_REPLACEMENT) {
2829 if ($this->
type == self::TYPE_CREDIT_NOTE) {
2832 if ($this->
type == self::TYPE_DEPOSIT) {
2837 'objecttype' => $this->element,
2838 'option' => $option,
2839 'moretitle' => $moretitle,
2841 $classfortooltip =
'classfortooltip';
2844 $classfortooltip =
'classforajaxtooltip';
2845 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2857 if (empty($notooltip)) {
2858 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2859 $label = $langs->trans(
"ShowSupplierInvoice");
2860 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2862 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
2863 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
2866 $linkstart =
'<a href="'.$url.
'"';
2867 $linkstart .= $linkclose.
'>';
2870 $result .= $linkstart;
2872 $result .=
img_object(($notooltip ?
'' : $label), $picto, ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') : $dataparams.
' class="'.(($withpicto != 2) ?
'paddingright ' :
'').$classfortooltip.
'"'), 0, 0, $notooltip ? 0 : 1);
2874 if ($withpicto != 2) {
2875 $result .= ($max ?
dol_trunc($ref, $max) : $ref);
2877 $result .= $linkend;
2879 if ($addlinktonotes) {
2880 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2883 $result .=
' <span class="note inline-block">';
2884 $result .=
'<a href="'.DOL_URL_ROOT.
'/fourn/facture/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2887 $result .=
'</span>';
2891 $hookmanager->initHooks(array($this->element .
'dao'));
2892 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
2893 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2895 $result = $hookmanager->resPrint;
2897 $result .= $hookmanager->resPrint;
2912 global $db, $langs, $conf;
2913 $langs->load(
"orders");
2916 if (empty($conf->global->INVOICE_SUPPLIER_ADDON_NUMBER)) {
2917 $conf->global->INVOICE_SUPPLIER_ADDON_NUMBER =
'mod_facture_fournisseur_cactus';
2922 $file = $conf->global->INVOICE_SUPPLIER_ADDON_NUMBER.
".php";
2923 $classname = $conf->global->INVOICE_SUPPLIER_ADDON_NUMBER;
2926 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2928 foreach ($dirmodels as $reldir) {
2929 $dir =
dol_buildpath($reldir.
"core/modules/supplier_invoice/");
2932 $mybool |= @include_once $dir.$file;
2935 if ($mybool ===
false) {
2940 $obj =
new $classname();
2942 $numref = $obj->getNumRef($soc, $this, $mode);
2944 if ($numref !=
"") {
2947 $this->error = $obj->error;
2963 global $langs, $conf;
2964 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
2972 $sql =
"SELECT rowid";
2973 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2974 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2975 $sql .= $this->db->plimit(100);
2977 $resql = $this->db->query(
$sql);
2979 $num_prods = $this->db->num_rows($resql);
2981 while ($i < $num_prods) {
2983 $row = $this->db->fetch_row($resql);
2984 $prodids[$i] = $row[0];
2990 $this->
ref =
'SPECIMEN';
2991 $this->ref_supplier =
'SUPPLIER_REF_SPECIMEN';
2992 $this->specimen = 1;
2995 $this->date_lim_reglement = $this->date + 3600 * 24 * 30;
2996 $this->cond_reglement_code =
'RECEP';
2997 $this->mode_reglement_code =
'CHQ';
2999 $this->note_public =
'This is a comment (public)';
3000 $this->note_private =
'This is a comment (private)';
3002 $this->multicurrency_tx = 1;
3003 $this->multicurrency_code = $conf->currency;
3006 if (empty($option) || $option !=
'nolines') {
3009 while ($xnbp < $nbp) {
3011 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
3013 $line->subprice = 100;
3016 $line->tva_tx = 19.6;
3017 $line->localtax1_tx = 0;
3018 $line->localtax2_tx = 0;
3020 $line->total_ht = 50;
3021 $line->total_ttc = 59.8;
3022 $line->total_tva = 9.8;
3023 $line->remise_percent = 50;
3025 $line->total_ht = 100;
3026 $line->total_ttc = 119.6;
3027 $line->total_tva = 19.6;
3028 $line->remise_percent = 0;
3031 if ($num_prods > 0) {
3032 $prodid = mt_rand(1, $num_prods);
3033 $line->fk_product = $prodids[$prodid];
3035 $line->product_type = 0;
3037 $this->lines[$xnbp] = $line;
3039 $this->total_ht += $line->total_ht;
3040 $this->total_tva += $line->total_tva;
3041 $this->total_ttc += $line->total_ttc;
3047 $this->amount_ht = $xnbp * 100;
3048 $this->total_ht = $xnbp * 100;
3049 $this->total_tva = $xnbp * 19.6;
3050 $this->total_ttc = $xnbp * 119.6;
3062 global $conf, $user;
3064 $this->nb = array();
3068 $sql =
"SELECT count(f.rowid) as nb";
3069 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
3070 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON f.fk_soc = s.rowid";
3071 if (empty($user->rights->societe->client->voir) && !$user->socid) {
3072 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
3073 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3076 $sql .=
" ".$clause.
" f.entity = ".$conf->entity;
3078 $resql = $this->db->query(
$sql);
3080 while ($obj = $this->db->fetch_object($resql)) {
3081 $this->nb[
"supplier_invoices"] = $obj->nb;
3083 $this->db->free($resql);
3087 $this->error = $this->db->error();
3102 global $conf, $langs;
3111 $object->fetch($fromid);
3116 $object->fetch_thirdparty();
3119 $object->ref_supplier = (empty($this->ref_supplier) ? $langs->trans(
"CopyOf").
' '.$object->ref_supplier : $this->ref_supplier);
3120 $object->author = $user->id;
3121 $object->user_valid = 0;
3122 $object->fk_facture_source = 0;
3123 $object->date_creation =
'';
3124 $object->date_validation =
'';
3125 $object->date = (empty($this->date) ?
dol_now() : $this->date);
3126 $object->ref_client =
'';
3127 $object->close_code =
'';
3128 $object->close_note =
'';
3130 $object->note_private =
'';
3131 $object->note_public =
'';
3134 $object->date_echeance = $object->calculate_date_lim_reglement();
3137 foreach ($object->lines as $i => $line) {
3138 if (isset($object->lines[$i]->info_bits) && ($object->lines[$i]->info_bits & 0x02) == 0x02) {
3139 unset($object->lines[$i]);
3144 $object->context[
'createfromclone'] =
'createfromclone';
3145 $result = $object->create($user);
3149 $this->error = $object->error;
3150 $this->errors = $object->errors;
3157 unset($object->context[
'createfromclone']);
3161 $this->db->commit();
3164 $this->db->rollback();
3180 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
3182 global $conf, $user, $langs;
3184 $langs->load(
"suppliers");
3185 $outputlangs->load(
"products");
3188 if (empty($modele)) {
3189 if (!empty($conf->global->INVOICE_SUPPLIER_ADDON_PDF)) {
3190 $modele = $conf->global->INVOICE_SUPPLIER_ADDON_PDF;
3196 if (empty($modele)) {
3199 $modelpath =
"core/modules/supplier_invoice/doc/";
3201 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
3213 return $user->rights->fournisseur->facture;
3261 if (!$this->date_echeance) {
3265 $status = isset($this->status) ? $this->status : $this->statut;
3267 return ($status == self::STATUS_VALIDATED) && ($this->date_echeance < ($now - $conf->facture->fournisseur->warning_delay));
3279 $sql =
"SELECT fk_invoice_supplier FROM ".MAIN_DB_PREFIX.
"societe_remise_except WHERE fk_invoice_supplier_source = ".((int) $this->
id);
3280 $resql = $this->db->query(
$sql);
3281 if (!empty($resql)) {
3282 $obj = $this->db->fetch_object($resql);
3283 if (!empty($obj->fk_invoice_supplier)) {
3301 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3303 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3304 $return .=
'<div class="info-box info-box-sm">';
3305 $return .=
'<span class="info-box-icon bg-infobox-action">';
3307 $return .=
'</span>';
3308 $return .=
'<div class="info-box-content">';
3309 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl(1) : $this->ref).
'</span>';
3310 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
3311 if (!empty($arraydata[
'thirdparty'])) {
3312 $return .=
'<br><span class="info-box-label">'.$arraydata[
'thirdparty'].
'</span>';
3314 if (property_exists($this,
'date')) {
3315 $return .=
'<br><span class="info-box-label">'.dol_print_date($this->date,
'day').
'</span>';
3317 if (property_exists($this,
'total_ht')) {
3318 $return .=
' <span class="info-box-label amount" title="'.dol_escape_htmltag($langs->trans(
"AmountHT")).
'">'.
price($this->total_ht);
3319 $return .=
' '.$langs->trans(
"HT");
3320 $return .=
'</span>';
3322 if (method_exists($this,
'getLibStatut')) {
3323 $alreadypaid = (empty($arraydata[
'alreadypaid']) ? 0 : $arraydata[
'alreadypaid']);
3324 $return .=
'<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3, $alreadypaid).
'</div>';
3326 $return .=
'</div>';
3327 $return .=
'</div>';
3328 $return .=
'</div>';
3340 if (!$this->table_element) {
3341 dol_syslog(get_class($this).
"::setVATReverseCharge was called on objet with property table_element not defined", LOG_ERR);
3345 dol_syslog(get_class($this).
'::setVATReverseCharge('.$vatreversecharge.
')');
3347 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3348 $sql .=
" SET vat_reverse_charge = ".((int) $vatreversecharge);
3349 $sql .=
" WHERE rowid=".((int) $this->
id);
3351 if ($this->db->query(
$sql)) {
3352 $this->vat_reverse_charge = ($vatreversecharge == 0) ? 0 : 1;
3355 dol_syslog(get_class($this).
'::setVATReverseCharge Error ', LOG_DEBUG);
3356 $this->error = $this->db->error();
3372 public $element =
'facture_fourn_det';
3377 public $table_element =
'facture_fourn_det';
3391 public $product_ref;
3398 public $ref_supplier;
3404 public $product_desc;
3431 public $fk_facture_fourn;
3444 public $description;
3449 public $skip_update_total;
3454 public $situation_percent;
3465 public $vat_src_code;
3477 public $localtax1_tx;
3483 public $localtax2_tx;
3495 public $remise_percent;
3525 public $total_localtax1;
3531 public $total_localtax2;
3542 public $product_type;
3548 public $product_label;
3562 public $fk_remise_except;
3567 public $fk_parent_line;
3569 public $special_code;
3580 public $localtax1_type;
3586 public $localtax2_type;
3592 public $fk_multicurrency;
3594 public $multicurrency_code;
3595 public $multicurrency_subprice;
3596 public $multicurrency_total_ht;
3597 public $multicurrency_total_tva;
3598 public $multicurrency_total_ttc;
3619 $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';
3620 $sql .=
', f.localtax1_type, f.localtax2_type, f.localtax1_tx, f.localtax2_tx, f.total_localtax1, f.total_localtax2, f.fk_remise_except';
3621 $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';
3622 $sql .=
', p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.description as product_desc';
3623 $sql .=
', f.multicurrency_subprice, f.multicurrency_total_ht, f.multicurrency_total_tva, multicurrency_total_ttc';
3624 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn_det as f';
3625 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON f.fk_product = p.rowid';
3626 $sql .=
' WHERE f.rowid = '.((int) $rowid);
3627 $sql .=
' ORDER BY f.rang, f.rowid';
3629 $query = $this->db->query(
$sql);
3632 $this->errors[] = $this->db->error();
3636 if (!$this->db->num_rows($query)) {
3640 $obj = $this->db->fetch_object($query);
3642 $this->
id = $obj->rowid;
3643 $this->
rowid = $obj->rowid;
3644 $this->fk_facture_fourn = $obj->fk_facture_fourn;
3646 $this->date_start = $obj->date_start;
3647 $this->date_end = $obj->date_end;
3648 $this->product_ref = $obj->product_ref;
3649 $this->ref_supplier = $obj->ref_supplier;
3650 $this->product_desc = $obj->product_desc;
3652 $this->subprice = $obj->pu_ht;
3653 $this->pu_ht = $obj->pu_ht;
3654 $this->pu_ttc = $obj->pu_ttc;
3655 $this->tva_tx = $obj->tva_tx;
3656 $this->localtax1_tx = $obj->localtax1_tx;
3657 $this->localtax2_tx = $obj->localtax2_tx;
3658 $this->localtax1_type = $obj->localtax1_type;
3659 $this->localtax2_type = $obj->localtax2_type;
3661 $this->qty = $obj->qty;
3662 $this->remise_percent = $obj->remise_percent;
3663 $this->fk_remise_except = $obj->fk_remise_except;
3665 $this->total_ht = $obj->total_ht;
3666 $this->total_tva = $obj->total_tva;
3667 $this->total_localtax1 = $obj->total_localtax1;
3668 $this->total_localtax2 = $obj->total_localtax2;
3669 $this->total_ttc = $obj->total_ttc;
3670 $this->fk_product = $obj->fk_product;
3671 $this->product_type = $obj->product_type;
3672 $this->product_label = $obj->product_label;
3673 $this->info_bits = $obj->info_bits;
3674 $this->tva_npr = ($obj->info_bits & 1 == 1) ? 1 : 0;
3675 $this->fk_parent_line = $obj->fk_parent_line;
3676 $this->special_code = $obj->special_code;
3677 $this->rang = $obj->rang;
3678 $this->fk_unit = $obj->fk_unit;
3680 $this->multicurrency_subprice = $obj->multicurrency_subprice;
3681 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
3682 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
3683 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
3696 public function delete($notrigger = 0)
3698 global $user, $conf;
3700 dol_syslog(get_class($this).
"::deleteline rowid=".((
int) $this->
id), LOG_DEBUG);
3707 if ($this->
call_trigger(
'LINEBILL_SUPPLIER_DELETE', $user) < 0) {
3719 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3725 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'facture_fourn_det ';
3726 $sql .=
" WHERE rowid = ".((int) $this->
id);
3727 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
3728 $resql = $this->db->query(
$sql);
3731 $this->error = $this->db->lasterror();
3736 $this->db->commit();
3739 $this->db->rollback();
3758 if (empty($this->qty)) {
3762 if ($this->product_type < 0) {
3767 if (empty($this->remise_percent)) {
3768 $this->remise_percent = 0;
3770 if (empty($this->tva_tx)) {
3773 if (empty($this->localtax1_tx)) {
3774 $this->localtax1_tx = 0;
3776 if (empty($this->localtax2_tx)) {
3777 $this->localtax2_tx = 0;
3780 if (empty($this->pa_ht)) {
3783 if (empty($this->multicurrency_subprice)) {
3784 $this->multicurrency_subprice = 0;
3786 if (empty($this->multicurrency_total_ht)) {
3787 $this->multicurrency_total_ht = 0;
3789 if (empty($this->multicurrency_total_tva)) {
3790 $this->multicurrency_total_tva = 0;
3792 if (empty($this->multicurrency_total_ttc)) {
3793 $this->multicurrency_total_ttc = 0;
3796 $fk_product = (int) $this->fk_product;
3797 $fk_unit = (int) $this->fk_unit;
3801 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn_det SET";
3803 $sql .=
", ref = '".$this->db->escape($this->ref_supplier ? $this->ref_supplier : $this->
ref).
"'";
3804 $sql .=
", date_start = ".($this->date_start !=
'' ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3805 $sql .=
", date_end = ".($this->date_end !=
'' ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3806 $sql .=
", pu_ht = ".price2num($this->pu_ht);
3807 $sql .=
", pu_ttc = ".price2num($this->pu_ttc);
3808 $sql .=
", qty = ".price2num($this->qty);
3809 $sql .=
", remise_percent = ".price2num($this->remise_percent);
3810 if ($this->fk_remise_except > 0)
$sql .=
", fk_remise_except=".((int) $this->fk_remise_except);
3811 else $sql .=
", fk_remise_except=null";
3812 $sql .=
", vat_src_code = '".$this->db->escape(empty($this->vat_src_code) ?
'' : $this->vat_src_code).
"'";
3813 $sql .=
", tva_tx = ".price2num($this->tva_tx);
3814 $sql .=
", localtax1_tx = ".price2num($this->localtax1_tx);
3815 $sql .=
", localtax2_tx = ".price2num($this->localtax2_tx);
3816 $sql .=
", localtax1_type = '".$this->db->escape($this->localtax1_type).
"'";
3817 $sql .=
", localtax2_type = '".$this->db->escape($this->localtax2_type).
"'";
3818 $sql .=
", total_ht = ".price2num($this->total_ht);
3819 $sql .=
", tva= ".price2num($this->total_tva);
3820 $sql .=
", total_localtax1= ".price2num($this->total_localtax1);
3821 $sql .=
", total_localtax2= ".price2num($this->total_localtax2);
3822 $sql .=
", total_ttc = ".price2num($this->total_ttc);
3823 $sql .=
", fk_product = ".($fk_product > 0 ? (int) $fk_product :
'null');
3824 $sql .=
", product_type = ".((int) $this->product_type);
3825 $sql .=
", info_bits = ".((int) $this->info_bits);
3826 $sql .=
", fk_unit = ".($fk_unit > 0 ? (int) $fk_unit :
'null');
3828 if (!empty($this->rang)) {
3829 $sql .=
", rang=".((int) $this->rang);
3833 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice);
3834 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
3835 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
3836 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
3838 $sql .=
" WHERE rowid = ".((int) $this->
id);
3840 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3841 $resql = $this->db->query(
$sql);
3844 $this->db->rollback();
3845 $this->error = $this->db->lasterror();
3849 $this->
rowid = $this->id;
3859 if (!$error && !$notrigger) {
3860 global $langs, $user;
3863 if ($this->
call_trigger(
'LINEBILL_SUPPLIER_MODIFY', $user) < 0) {
3864 $this->db->rollback();
3871 $this->db->rollback();
3875 $this->db->commit();
3887 global $user, $conf, $langs;
3891 dol_syslog(get_class($this).
"::insert rang=".$this->rang, LOG_DEBUG);
3894 $this->desc = trim($this->desc);
3895 if (empty($this->tva_tx)) {
3898 if (empty($this->localtax1_tx)) {
3899 $this->localtax1_tx = 0;
3901 if (empty($this->localtax2_tx)) {
3902 $this->localtax2_tx = 0;
3904 if (empty($this->localtax1_type)) {
3905 $this->localtax1_type =
'0';
3907 if (empty($this->localtax2_type)) {
3908 $this->localtax2_type =
'0';
3910 if (empty($this->total_tva)) {
3911 $this->total_tva = 0;
3913 if (empty($this->total_localtax1)) {
3914 $this->total_localtax1 = 0;
3916 if (empty($this->total_localtax2)) {
3917 $this->total_localtax2 = 0;
3919 if (empty($this->rang)) {
3922 if (empty($this->remise_percent)) {
3923 $this->remise_percent = 0;
3925 if (empty($this->info_bits)) {
3926 $this->info_bits = 0;
3928 if (empty($this->subprice)) {
3929 $this->subprice = 0;
3931 if (empty($this->special_code)) {
3932 $this->special_code = 0;
3934 if (empty($this->fk_parent_line)) {
3935 $this->fk_parent_line = 0;
3937 if (!isset($this->situation_percent) || $this->situation_percent > 100 || (
string) $this->situation_percent ==
'') {
3938 $this->situation_percent = 100;
3941 if (empty($this->pa_ht)) {
3944 if (empty($this->multicurrency_subprice)) {
3945 $this->multicurrency_subprice = 0;
3947 if (empty($this->multicurrency_total_ht)) {
3948 $this->multicurrency_total_ht = 0;
3950 if (empty($this->multicurrency_total_tva)) {
3951 $this->multicurrency_total_tva = 0;
3953 if (empty($this->multicurrency_total_ttc)) {
3954 $this->multicurrency_total_ttc = 0;
3959 if ($this->product_type < 0) {
3960 $this->error =
'ErrorProductTypeMustBe0orMore';
3963 if (!empty($this->fk_product) && $this->fk_product > 0) {
3967 $this->error =
'ErrorProductIdDoesNotExists';
3975 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
3976 $sql .=
' (fk_facture_fourn, fk_parent_line, label, description, ref, qty,';
3977 $sql .=
' vat_src_code, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3978 $sql .=
' fk_product, product_type, remise_percent, fk_remise_except, pu_ht, pu_ttc,';
3979 $sql .=
' date_start, date_end, fk_code_ventilation, rang, special_code,';
3980 $sql .=
' info_bits, total_ht, tva, total_ttc, total_localtax1, total_localtax2, fk_unit';
3981 $sql .=
', fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
3983 $sql .=
" VALUES (".$this->fk_facture_fourn.
",";
3984 $sql .=
" ".($this->fk_parent_line > 0 ?
"'".$this->db->escape($this->fk_parent_line).
"'" :
"null").
",";
3985 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3986 $sql .=
" '".$this->db->escape($this->desc ? $this->desc : $this->
description).
"',";
3987 $sql .=
" '".$this->db->escape($this->ref_supplier).
"',";
3988 $sql .=
" ".price2num($this->qty).
",";
3990 $sql .=
" ".(empty($this->vat_src_code) ?
"''" :
"'".$this->db->escape($this->vat_src_code).
"'").
",";
3991 $sql .=
" ".price2num($this->tva_tx).
",";
3992 $sql .=
" ".price2num($this->localtax1_tx).
",";
3993 $sql .=
" ".price2num($this->localtax2_tx).
",";
3994 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3995 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3996 $sql .=
' '.((!empty($this->fk_product) && $this->fk_product > 0) ? $this->fk_product :
"null").
',';
3997 $sql .=
" ".((int) $this->product_type).
",";
3998 $sql .=
" ".price2num($this->remise_percent).
",";
3999 $sql .=
' '.(!empty($this->fk_remise_except) ? ((int) $this->fk_remise_except) :
"null").
',';
4000 $sql .=
" ".price2num($this->subprice).
",";
4001 $sql .=
" ".(!empty($this->qty) ?
price2num($this->total_ttc / $this->qty) :
price2num($this->total_ttc)).
",";
4002 $sql .=
" ".(!empty($this->date_start) ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
4003 $sql .=
" ".(!empty($this->date_end) ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
4004 $sql .=
' '.(!empty($this->fk_code_ventilation) ? $this->fk_code_ventilation : 0).
',';
4005 $sql .=
' '.((int) $this->rang).
',';
4006 $sql .=
' '.((int) $this->special_code).
',';
4007 $sql .=
" ".((int) $this->info_bits).
",";
4008 $sql .=
" ".price2num($this->total_ht).
",";
4009 $sql .=
" ".price2num($this->total_tva).
",";
4010 $sql .=
" ".price2num($this->total_ttc).
",";
4011 $sql .=
" ".price2num($this->total_localtax1).
",";
4012 $sql .=
" ".price2num($this->total_localtax2);
4013 $sql .=
", ".(!$this->fk_unit ?
'NULL' : $this->fk_unit);
4014 $sql .=
", ".(int) $this->fk_multicurrency;
4015 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
4016 $sql .=
", ".price2num($this->multicurrency_subprice);
4017 $sql .=
", ".price2num($this->multicurrency_total_ht);
4018 $sql .=
", ".price2num($this->multicurrency_total_tva);
4019 $sql .=
", ".price2num($this->multicurrency_total_ttc);
4022 $resql = $this->db->query(
$sql);
4024 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
4025 $this->
rowid = $this->id;
4036 if ($this->fk_remise_except) {
4038 $result = $discount->fetch($this->fk_remise_except);
4043 if ($discount->fk_facture_line > 0) {
4044 if (empty($noerrorifdiscountalreadylinked)) {
4045 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed", $discount->id);
4046 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
4047 $this->db->rollback();
4051 $result = $discount->link_to_invoice($this->
rowid, 0);
4053 $this->error = $discount->error;
4054 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
4055 $this->db->rollback();
4060 $this->error = $langs->trans(
"ErrorADiscountThatHasBeenRemovedIsIncluded");
4061 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
4062 $this->db->rollback();
4066 $this->error = $discount->error;
4067 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
4068 $this->db->rollback();
4073 if (!$error && !$notrigger) {
4075 $result = $this->
call_trigger(
'LINEBILL_SUPPLIER_CREATE', $user);
4077 $this->db->rollback();
4083 $this->db->commit();
4086 $this->error = $this->db->error();
4087 $this->db->rollback();
4104 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn_det SET";
4105 $sql .=
" total_ht = ".price2num($this->total_ht);
4106 $sql .=
", tva= ".price2num($this->total_tva);
4107 $sql .=
", total_localtax1 = ".price2num($this->total_localtax1);
4108 $sql .=
", total_localtax2 = ".price2num($this->total_localtax2);
4109 $sql .=
", total_ttc = ".price2num($this->total_ttc);
4110 $sql .=
" WHERE rowid = ".((int) $this->
rowid);
4112 dol_syslog(
"FactureFournisseurLigne.class.php::update_total", LOG_DEBUG);
4114 $resql = $this->db->query(
$sql);
4116 $this->db->commit();
4119 $this->error = $this->db->error();
4120 $this->db->rollback();