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 = isset($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
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);
1520 if ($conf->fournisseur->facture->dir_output) {
1521 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1524 $dir = $conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$ref;
1525 $file = $dir.
"/".$ref.
".pdf";
1526 if (file_exists($file)) {
1528 $this->error =
'ErrorFailToDeleteFile';
1532 if (file_exists($dir)) {
1536 $this->error =
'ErrorFailToDeleteDir';
1548 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
1553 dol_syslog(get_class($this).
"::delete $this->id by $user->id", LOG_DEBUG);
1554 $this->db->commit();
1557 $this->error = $this->db->lasterror();
1558 $this->db->rollback();
1575 public function set_paid($user, $close_code =
'', $close_note =
'')
1578 dol_syslog(get_class($this).
"::set_paid is deprecated, use setPaid instead", LOG_NOTICE);
1579 return $this->
setPaid($user, $close_code, $close_note);
1590 public function setPaid($user, $close_code =
'', $close_note =
'')
1594 if ($this->paye != 1) {
1599 dol_syslog(
"FactureFournisseur::set_paid", LOG_DEBUG);
1601 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn SET';
1602 $sql .=
' fk_statut = '.self::STATUS_CLOSED;
1607 $sql .=
", close_code='".$this->db->escape($close_code).
"'";
1610 $sql .=
", close_note='".$this->db->escape($close_note).
"'";
1612 $sql .=
', fk_user_closing = '.((int) $user->id);
1613 $sql .=
", date_closing = '".$this->db->idate($now).
"'";
1614 $sql .=
' WHERE rowid = '.((int) $this->
id);
1616 $resql = $this->db->query(
$sql);
1619 $result = $this->
call_trigger(
'BILL_SUPPLIER_PAYED', $user);
1626 $this->error = $this->db->error();
1631 $this->db->commit();
1634 $this->db->rollback();
1656 dol_syslog(get_class($this).
"::set_unpaid is deprecated, use setUnpaid instead", LOG_NOTICE);
1674 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn';
1675 $sql .=
' SET paye=0, fk_statut='.self::STATUS_VALIDATED.
', close_code=null, close_note=null,';
1676 $sql .=
' date_closing=null,';
1677 $sql .=
' fk_user_closing=null';
1678 $sql .=
' WHERE rowid = '.((int) $this->
id);
1680 dol_syslog(get_class($this).
"::set_unpaid", LOG_DEBUG);
1681 $resql = $this->db->query(
$sql);
1684 $result = $this->
call_trigger(
'BILL_SUPPLIER_UNPAYED', $user);
1691 $this->error = $this->db->error();
1696 $this->db->commit();
1699 $this->db->rollback();
1714 public function setCanceled($user, $close_code =
'', $close_note =
'')
1716 dol_syslog(get_class($this).
"::setCanceled rowid=".((
int) $this->
id), LOG_DEBUG);
1720 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn SET';
1721 $sql .=
' fk_statut='.self::STATUS_ABANDONED;
1723 $sql .=
", close_code='".$this->db->escape($close_code).
"'";
1726 $sql .=
", close_note='".$this->db->escape($close_note).
"'";
1728 $sql .=
" WHERE rowid = ".((int) $this->
id);
1730 $resql = $this->db->query(
$sql);
1734 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
1735 $sql .=
' SET fk_invoice_supplier = NULL';
1736 $sql .=
' WHERE fk_invoice_supplier = '.((int) $this->
id);
1738 $resql = $this->db->query(
$sql);
1741 $result = $this->
call_trigger(
'BILL_SUPPLIER_CANCEL', $user);
1743 $this->db->rollback();
1748 $this->db->commit();
1751 $this->error = $this->db->error().
" sql=".
$sql;
1752 $this->db->rollback();
1756 $this->error = $this->db->error().
" sql=".
$sql;
1757 $this->db->rollback();
1771 public function validate($user, $force_number =
'', $idwarehouse = 0, $notrigger = 0)
1773 global $conf, $langs;
1775 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1780 dol_syslog(get_class($this).
'::validate user='.$user->id.
', force_number='.$force_number.
', idwarehouse='.$idwarehouse);
1787 if ($this->statut > self::STATUS_DRAFT) {
1788 dol_syslog(get_class($this).
"::validate no draft status", LOG_WARNING);
1791 if (preg_match(
'/^'.preg_quote($langs->trans(
"CopyOf").
' ').
'/', $this->ref_supplier)) {
1792 $langs->load(
"errors");
1793 $this->error = $langs->trans(
"ErrorFieldFormat", $langs->transnoentities(
"RefSupplier")).
'. '.$langs->trans(
'RemoveString', $langs->transnoentitiesnoconv(
"CopyOf"));
1796 if (count($this->lines) <= 0) {
1797 $langs->load(
"errors");
1798 $this->error = $langs->trans(
"ErrorObjectMustHaveLinesToBeValidated", $this->
ref);
1805 if ($force_number) {
1806 $num = $force_number;
1807 } elseif (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1814 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn";
1815 $sql .=
" SET ref='".$this->db->escape($num).
"', fk_statut = 1, fk_user_valid = ".((int) $user->id).
", date_valid = '".$this->db->idate($now).
"'";
1816 $sql .=
" WHERE rowid = ".((int) $this->
id);
1818 dol_syslog(get_class($this).
"::validate", LOG_DEBUG);
1819 $resql = $this->db->query(
$sql);
1822 if (!$error &&
isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) {
1823 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1824 $langs->load(
"agenda");
1826 $cpt = count($this->lines);
1827 for ($i = 0; $i < $cpt; $i++) {
1828 if ($this->lines[$i]->fk_product > 0) {
1830 $mouvP->origin = &$this;
1831 $mouvP->setOrigin($this->element, $this->
id);
1833 $up_ht_disc = $this->lines[$i]->subprice;
1834 if (!empty($this->lines[$i]->remise_percent) && empty($conf->global->STOCK_EXCLUDE_DISCOUNT_FOR_PMP)) {
1835 $up_ht_disc =
price2num($up_ht_disc * (100 - $this->lines[$i]->remise_percent) / 100,
'MU');
1838 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans(
"InvoiceValidatedInDolibarr", $num));
1840 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans(
"InvoiceValidatedInDolibarr", $num));
1850 if (!$error && empty($notrigger)) {
1852 $result = $this->
call_trigger(
'BILL_SUPPLIER_VALIDATE', $user);
1860 $this->oldref = $this->ref;
1863 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1865 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'fournisseur/facture/".
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$this->db->escape($this->newref).
"'";
1866 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'fournisseur/facture/".
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1867 $resql = $this->db->query(
$sql);
1869 $error++; $this->error = $this->db->lasterror();
1875 $dirsource = $conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$oldref;
1876 $dirdest = $conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$newref;
1877 if (!$error && file_exists($dirsource)) {
1878 dol_syslog(get_class($this).
"::validate rename dir ".$dirsource.
" into ".$dirdest);
1880 if (@rename($dirsource, $dirdest)) {
1883 $listoffiles =
dol_dir_list($conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1884 foreach ($listoffiles as $fileentry) {
1885 $dirsource = $fileentry[
'name'];
1886 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1887 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1888 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1889 @rename($dirsource, $dirdest);
1904 $this->db->commit();
1907 $this->db->rollback();
1911 $this->error = $this->db->error();
1912 $this->db->rollback();
1927 global $conf, $langs;
1931 if ($this->statut == self::STATUS_DRAFT) {
1932 dol_syslog(__METHOD__.
" already draft status", LOG_WARNING);
1940 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn";
1941 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1942 $sql .=
" WHERE rowid = ".((int) $this->
id);
1944 $result = $this->db->query(
$sql);
1947 $this->oldcopy = clone $this;
1951 if ($result >= 0 &&
isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)) {
1952 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1953 $langs->load(
"agenda");
1955 $cpt = count($this->lines);
1956 for ($i = 0; $i < $cpt; $i++) {
1957 if ($this->lines[$i]->fk_product > 0) {
1959 $mouvP->origin = &$this;
1960 $mouvP->setOrigin($this->element, $this->
id);
1963 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"InvoiceBackToDraftInDolibarr", $this->ref));
1965 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"InvoiceBackToDraftInDolibarr", $this->ref));
1971 if (!$error && empty($notrigger)) {
1973 $result = $this->
call_trigger(
'BILL_SUPPLIER_UNVALIDATE', $user);
1980 $this->db->commit();
1983 $this->db->rollback();
1987 $this->error = $this->db->error();
1988 $this->db->rollback();
2027 public function addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_product = 0, $remise_percent = 0, $date_start =
'', $date_end =
'', $ventil = 0, $info_bits =
'', $price_base_type =
'HT', $type = 0, $rang = -1, $notrigger =
false, $array_options = 0, $fk_unit =
null, $origin_id = 0, $pu_devise = 0, $ref_supplier =
'', $special_code =
'', $fk_parent_line = 0, $fk_remise_except = 0)
2029 global $langs, $mysoc, $conf;
2031 dol_syslog(get_class($this).
"::addline $desc,$pu,$qty,$txtva,$fk_product,$remise_percent,$date_start,$date_end,$ventil,$info_bits,$price_base_type,$type,$fk_unit,fk_remise_except=$fk_remise_except", LOG_DEBUG);
2032 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2034 if ($this->statut == self::STATUS_DRAFT) {
2036 if (empty($remise_percent)) {
2037 $remise_percent = 0;
2042 if (empty($info_bits)) {
2048 if (empty($ventil)) {
2051 if (empty($txtva)) {
2054 if (empty($txlocaltax1)) {
2057 if (empty($txlocaltax2)) {
2061 $remise_percent =
price2num($remise_percent);
2064 if (!preg_match(
'/\((.*)\)/', $txtva)) {
2070 if ($date_start && $date_end && $date_start > $date_end) {
2071 $langs->load(
"errors");
2072 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
2078 if ($fk_product > 0) {
2079 if (!empty($conf->global->SUPPLIER_INVOICE_WITH_PREDEFINED_PRICES_ONLY)) {
2081 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
2083 if ($prod->fetch($fk_product) > 0) {
2084 $product_type = $prod->type;
2085 $label = $prod->label;
2086 $fk_prod_fourn_price = 0;
2090 $result = $prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', ($this->fk_soc ? $this->fk_soc : $this->socid));
2093 $pu = $prod->fourn_pu;
2095 $ref_supplier = $prod->ref_supplier;
2097 if ($remise_percent == 0 && $prod->remise_percent != 0) {
2098 $remise_percent = $prod->remise_percent;
2102 $langs->load(
"errors");
2103 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
2104 $this->db->rollback();
2105 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
2110 if ($result == -1) {
2111 $langs->load(
"errors");
2112 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
2113 $this->db->rollback();
2114 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
2118 $this->error = $prod->error;
2119 $this->db->rollback();
2120 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
2124 $this->error = $prod->error;
2125 $this->db->rollback();
2130 $product_type = $type;
2142 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
2143 $vat_src_code = $reg[1];
2144 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
2152 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_devise);
2153 $total_ht = $tabprice[0];
2154 $total_tva = $tabprice[1];
2155 $total_ttc = $tabprice[2];
2156 $total_localtax1 = $tabprice[9];
2157 $total_localtax2 = $tabprice[10];
2158 $pu_ht = $tabprice[3];
2161 $multicurrency_total_ht = $tabprice[16];
2162 $multicurrency_total_tva = $tabprice[17];
2163 $multicurrency_total_ttc = $tabprice[18];
2164 $pu_ht_devise = $tabprice[19];
2173 $rang = $rangmax + 1;
2179 $supplierinvoiceline->context = $this->context;
2181 $supplierinvoiceline->fk_facture_fourn = $this->id;
2183 $supplierinvoiceline->desc = $desc;
2184 $supplierinvoiceline->ref_supplier = $ref_supplier;
2186 $supplierinvoiceline->qty = ($this->
type == self::TYPE_CREDIT_NOTE ? abs($qty) : $qty);
2187 $supplierinvoiceline->subprice = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht) : $pu_ht);
2189 $supplierinvoiceline->vat_src_code = $vat_src_code;
2190 $supplierinvoiceline->tva_tx = $txtva;
2191 $supplierinvoiceline->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
2192 $supplierinvoiceline->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
2193 $supplierinvoiceline->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
2194 $supplierinvoiceline->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
2196 $supplierinvoiceline->total_ht = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_ht) : $total_ht);
2197 $supplierinvoiceline->total_tva = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_tva) : $total_tva);
2198 $supplierinvoiceline->total_localtax1 = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_localtax1) : $total_localtax1);
2199 $supplierinvoiceline->total_localtax2 = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_localtax2) : $total_localtax2);
2200 $supplierinvoiceline->total_ttc = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($total_ttc) : $total_ttc);
2202 $supplierinvoiceline->fk_product = $fk_product;
2203 $supplierinvoiceline->product_type = $type;
2204 $supplierinvoiceline->remise_percent = $remise_percent;
2205 $supplierinvoiceline->date_start = $date_start;
2206 $supplierinvoiceline->date_end = $date_end;
2207 $supplierinvoiceline->fk_code_ventilation = $ventil;
2208 $supplierinvoiceline->rang = $rang;
2209 $supplierinvoiceline->info_bits = $info_bits;
2210 $supplierinvoiceline->fk_remise_except = $fk_remise_except;
2212 $supplierinvoiceline->special_code = ((string) $special_code !=
'' ? $special_code : $this->special_code);
2213 $supplierinvoiceline->fk_parent_line = $fk_parent_line;
2214 $supplierinvoiceline->origin = $this->origin;
2215 $supplierinvoiceline->origin_id = $origin_id;
2216 $supplierinvoiceline->fk_unit = $fk_unit;
2219 $supplierinvoiceline->fk_multicurrency = $this->fk_multicurrency;
2220 $supplierinvoiceline->multicurrency_code = $this->multicurrency_code;
2221 $supplierinvoiceline->multicurrency_subprice = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht_devise) : $pu_ht_devise);
2223 $supplierinvoiceline->multicurrency_total_ht = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($multicurrency_total_ht) : $multicurrency_total_ht);
2224 $supplierinvoiceline->multicurrency_total_tva = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($multicurrency_total_tva) : $multicurrency_total_tva);
2225 $supplierinvoiceline->multicurrency_total_ttc = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ? -abs($multicurrency_total_ttc) : $multicurrency_total_ttc);
2227 if (is_array($array_options) && count($array_options) > 0) {
2228 $supplierinvoiceline->array_options = $array_options;
2231 $result = $supplierinvoiceline->insert($notrigger);
2234 if (!empty($fk_parent_line)) {
2236 } elseif ($rang > 0 && $rang <= count($this->lines)) {
2237 $linecount = count($this->lines);
2238 for ($ii = $rang; $ii <= $linecount; $ii++) {
2244 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
2246 $this->db->commit();
2247 return $supplierinvoiceline->id;
2249 $this->error = $this->db->error();
2250 $this->db->rollback();
2254 $this->error = $supplierinvoiceline->error;
2255 $this->errors = $supplierinvoiceline->errors;
2256 $this->db->rollback();
2289 public function updateline($id, $desc, $pu, $vatrate, $txlocaltax1 = 0, $txlocaltax2 = 0, $qty = 1, $idproduct = 0, $price_base_type =
'HT', $info_bits = 0, $type = 0, $remise_percent = 0, $notrigger =
false, $date_start =
'', $date_end =
'', $array_options = 0, $fk_unit =
null, $pu_devise = 0, $ref_supplier =
'', $rang = 0)
2291 global $mysoc, $langs;
2293 dol_syslog(get_class($this).
"::updateline $id,$desc,$pu,$vatrate,$qty,$idproduct,$price_base_type,$info_bits,$type,$remise_percent,$notrigger,$date_start,$date_end,$fk_unit,$pu_devise,$ref_supplier", LOG_DEBUG);
2294 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2298 $remise_percent =
price2num($remise_percent);
2307 if ($date_start && $date_end && $date_start > $date_end) {
2308 $langs->load(
"errors");
2309 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
2314 if (empty($vatrate)) {
2317 if (empty($txlocaltax1)) {
2320 if (empty($txlocaltax2)) {
2338 if (preg_match(
'/\((.*)\)/', $vatrate, $reg)) {
2339 $vat_src_code = $reg[1];
2340 $vatrate = preg_replace(
'/\s*\(.*\)/',
'', $vatrate);
2343 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $vatrate, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_devise);
2344 $total_ht = $tabprice[0];
2345 $total_tva = $tabprice[1];
2346 $total_ttc = $tabprice[2];
2347 $pu_ht = $tabprice[3];
2348 $pu_tva = $tabprice[4];
2349 $pu_ttc = $tabprice[5];
2350 $total_localtax1 = $tabprice[9];
2351 $total_localtax2 = $tabprice[10];
2354 $multicurrency_total_ht = $tabprice[16];
2355 $multicurrency_total_tva = $tabprice[17];
2356 $multicurrency_total_ttc = $tabprice[18];
2357 $pu_ht_devise = $tabprice[19];
2359 if (empty($info_bits)) {
2366 $line->fetch_optionals();
2368 $staticline = clone $line;
2371 $product =
new Product($this->db);
2372 $result = $product->fetch($idproduct);
2373 $product_type = $product->type;
2375 $idproduct = $staticline->fk_product;
2376 $product_type = $type;
2379 $line->oldline = $staticline;
2380 $line->context = $this->context;
2382 $line->description = $desc;
2384 $line->qty = ($this->
type == self::TYPE_CREDIT_NOTE ? abs($qty) : $qty);
2385 $line->subprice = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht) : $pu_ht);
2386 $line->pu_ht = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ht) : $pu_ht);
2387 $line->pu_ttc = ($this->
type == self::TYPE_CREDIT_NOTE ? -abs($pu_ttc) : $pu_ttc);
2389 $line->remise_percent = $remise_percent;
2390 $line->ref_supplier = $ref_supplier;
2392 $line->date_start = $date_start;
2393 $line->date_end = $date_end;
2395 $line->vat_src_code = $vat_src_code;
2396 $line->tva_tx = $vatrate;
2397 $line->localtax1_tx = $txlocaltax1;
2398 $line->localtax2_tx = $txlocaltax2;
2399 $line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
2400 $line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
2402 $line->total_ht = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ?-abs($total_ht) : $total_ht);
2403 $line->total_tva = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ?-abs($total_tva) : $total_tva);
2404 $line->total_localtax1 = $total_localtax1;
2405 $line->total_localtax2 = $total_localtax2;
2406 $line->total_ttc = (($this->
type == self::TYPE_CREDIT_NOTE || $qty < 0) ?-abs($total_ttc) : $total_ttc);
2408 $line->fk_product = $idproduct;
2409 $line->product_type = $product_type;
2410 $line->info_bits = $info_bits;
2411 $line->fk_unit = $fk_unit;
2412 $line->rang = $rang;
2414 if (is_array($array_options) && count($array_options) > 0) {
2416 foreach ($array_options as $key => $value) {
2417 $line->array_options[$key] = $array_options[$key];
2422 $line->multicurrency_subprice = $pu_ht_devise;
2423 $line->multicurrency_total_ht = $multicurrency_total_ht;
2424 $line->multicurrency_total_tva = $multicurrency_total_tva;
2425 $line->multicurrency_total_ttc = $multicurrency_total_ttc;
2427 $res = $line->update($notrigger);
2430 $this->errors[] = $line->error;
2433 $res = $this->
update_price(
'1',
'auto', 0, $this->thirdparty);
2455 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
2456 $sql .=
' SET fk_invoice_supplier_line = NULL';
2457 $sql .=
' WHERE fk_invoice_supplier_line = '.((int) $rowid);
2459 dol_syslog(get_class($this).
"::deleteline", LOG_DEBUG);
2460 $result = $this->db->query(
$sql);
2462 $this->error = $this->db->error();
2463 $this->db->rollback();
2469 if ($line->fetch($rowid) < 1) {
2473 $res = $line->delete($notrigger);
2476 $this->errors[] = $line->error;
2477 $this->db->rollback();
2483 $this->db->commit();
2486 $this->db->rollback();
2487 $this->error = $this->db->lasterror();
2502 $sql =
'SELECT c.rowid, datec, tms as datem, ';
2503 $sql .=
' fk_user_author, fk_user_modif, fk_user_valid';
2504 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as c';
2505 $sql .=
' WHERE c.rowid = '.((int) $id);
2507 $result = $this->db->query(
$sql);
2509 if ($this->db->num_rows($result)) {
2510 $obj = $this->db->fetch_object($result);
2512 $this->
id = $obj->rowid;
2513 if ($obj->fk_user_author) {
2514 $cuser =
new User($this->db);
2515 $cuser->fetch($obj->fk_user_author);
2516 $this->user_creation = $cuser;
2518 if ($obj->fk_user_valid) {
2519 $vuser =
new User($this->db);
2520 $vuser->fetch($obj->fk_user_valid);
2521 $this->user_validation = $vuser;
2523 if ($obj->fk_user_modif) {
2524 $muser =
new User($this->db);
2525 $muser->fetch($obj->fk_user_modif);
2526 $this->user_modification = $muser;
2528 $this->date_creation = $this->db->jdate($obj->datec);
2529 $this->date_modification = $this->db->jdate($obj->datem);
2532 $this->db->free($result);
2554 $sql =
"SELECT f.rowid as rowid, f.ref, f.fk_statut,";
2555 $sql .=
" ff.rowid as rowidnext";
2556 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
2557 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON f.rowid = pf.fk_facturefourn";
2558 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture_fourn as ff ON f.rowid = ff.fk_facture_source";
2559 $sql .=
" WHERE (f.fk_statut = ".self::STATUS_VALIDATED.
" OR (f.fk_statut = ".self::STATUS_ABANDONED.
" AND f.close_code = '".self::CLOSECODE_ABANDONED.
"'))";
2560 $sql .=
" AND f.entity = ".$conf->entity;
2561 $sql .=
" AND f.paye = 0";
2562 $sql .=
" AND pf.fk_paiementfourn IS NULL";
2563 $sql .=
" AND ff.fk_statut IS NULL";
2565 $sql .=
" AND f.fk_soc = ".((int) $socid);
2567 $sql .=
" ORDER BY f.ref";
2569 dol_syslog(get_class($this).
"::list_replacable_supplier_invoices", LOG_DEBUG);
2570 $resql = $this->db->query(
$sql);
2572 while ($obj = $this->db->fetch_object($resql)) {
2573 $return[$obj->rowid] = array(
2574 'id' => $obj->rowid,
2576 'status' => $obj->fk_statut
2582 $this->error = $this->db->error();
2604 $sql =
"SELECT f.rowid as rowid, f.ref, f.fk_statut, f.type, f.paye, pf.fk_paiementfourn";
2605 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
2606 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON f.rowid = pf.fk_facturefourn";
2607 $sql .=
" WHERE f.entity = ".$conf->entity;
2608 $sql .=
" AND f.fk_statut in (".self::STATUS_VALIDATED.
",".self::STATUS_CLOSED.
")";
2609 $sql .=
" AND NOT EXISTS (SELECT rowid from ".MAIN_DB_PREFIX.
"facture_fourn as ff WHERE f.rowid = ff.fk_facture_source";
2610 $sql .=
" AND ff.type=".self::TYPE_REPLACEMENT.
")";
2611 $sql .=
" AND f.type != ".self::TYPE_CREDIT_NOTE;
2613 $sql .=
" AND f.fk_soc = ".((int) $socid);
2615 $sql .=
" ORDER BY f.ref";
2617 dol_syslog(get_class($this).
"::list_qualified_avoir_supplier_invoices", LOG_DEBUG);
2618 $resql = $this->db->query(
$sql);
2620 while ($obj = $this->db->fetch_object($resql)) {
2622 if ($obj->fk_statut == self::STATUS_VALIDATED) {
2625 if ($obj->fk_statut == self::STATUS_CLOSED) {
2629 $paymentornot = ($obj->fk_paiementfourn ? 1 : 0);
2630 $return[$obj->rowid] = array(
'ref'=>$obj->ref,
'status'=>$obj->fk_statut,
'type'=>$obj->type,
'paye'=>$obj->paye,
'paymentornot'=>$paymentornot);
2636 $this->error = $this->db->error();
2651 global $conf, $langs;
2653 $sql =
'SELECT ff.rowid, ff.date_lim_reglement as datefin, ff.fk_statut as status, ff.total_ht, ff.total_ttc';
2654 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as ff';
2655 if (!$user->hasRight(
"societe",
"client",
"voir") && !$user->socid) {
2656 $sql .=
" JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON ff.fk_soc = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2658 $sql .=
' WHERE ff.paye = 0';
2659 $sql .=
' AND ff.fk_statut > 0';
2660 $sql .=
" AND ff.entity = ".$conf->entity;
2662 $sql .=
' AND ff.fk_soc = '.((int) $user->socid);
2665 $resql = $this->db->query(
$sql);
2667 $langs->load(
"bills");
2671 $response->warning_delay = $conf->facture->fournisseur->warning_delay / 60 / 60 / 24;
2672 $response->label = $langs->trans(
"SupplierBillsToPay");
2673 $response->labelShort = $langs->trans(
"StatusToPay");
2675 $response->url = DOL_URL_ROOT.
'/fourn/facture/list.php?search_status=1&mainmenu=billing&leftmenu=suppliers_bills';
2676 $response->img =
img_object($langs->trans(
"Bills"),
"bill");
2680 while ($obj = $this->db->fetch_object($resql)) {
2681 $facturestatic->date_echeance = $this->db->jdate($obj->datefin);
2682 $facturestatic->statut = $obj->status;
2683 $facturestatic->status = $obj->status;
2685 $response->nbtodo++;
2686 $response->total += $obj->total_ht;
2688 if ($facturestatic->hasDelay()) {
2689 $response->nbtodolate++;
2690 $response->url_late = DOL_URL_ROOT.
'/fourn/facture/list.php?search_option=late&mainmenu=billing&leftmenu=suppliers_bills';
2694 $this->db->free($resql);
2698 $this->error = $this->db->error();
2712 global $conf, $langs;
2714 $langs->load(
'bills');
2717 $moretitle = $params[
'moretitle'] ??
'';
2718 $picto = $this->picto;
2719 if ($this->
type == self::TYPE_REPLACEMENT) {
2722 if ($this->
type == self::TYPE_CREDIT_NOTE) {
2725 if ($this->
type == self::TYPE_DEPOSIT) {
2729 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierInvoice").
'</u>';
2730 if ($this->
type == self::TYPE_REPLACEMENT) {
2731 $datas[
'picto'] .=
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"InvoiceReplace").
'</u>';
2732 } elseif ($this->
type == self::TYPE_CREDIT_NOTE) {
2733 $datas[
'picto'] .=
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"CreditNote").
'</u>';
2734 } elseif ($this->
type == self::TYPE_DEPOSIT) {
2735 $datas[
'picto'] .=
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"Deposit").
'</u>';
2737 if (isset($this->status)) {
2739 if (isset($this->alreadypaid)) {
2740 $alreadypaid = $this->alreadypaid;
2743 $datas[
'picto'] .=
' '.$this->getLibStatut(5, $alreadypaid);
2746 $datas[
'picto'] .=
' - '.$moretitle;
2748 if (!empty($this->
ref)) {
2749 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2751 if (!empty($this->ref_supplier)) {
2752 $datas[
'refsupplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_supplier;
2754 if (!empty($this->label)) {
2755 $datas[
'label'] =
'<br><b>'.$langs->trans(
'Label').
':</b> '.$this->label;
2757 if (!empty($this->date)) {
2758 $datas[
'date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->date,
'day');
2760 if (!empty($this->date_echeance)) {
2761 $datas[
'date_echeance'] =
'<br><b>'.$langs->trans(
'DateDue').
':</b> '.
dol_print_date($this->date_echeance,
'day');
2763 if (!empty($this->total_ht)) {
2764 $datas[
'amountht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
2766 if (!empty($this->total_tva)) {
2767 $datas[
'totaltva'] =
'<br><b>'.$langs->trans(
'AmountVAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
2769 if (!empty($this->total_ttc)) {
2770 $datas[
'totalttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
2788 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $moretitle =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2790 global $langs, $conf, $user, $hookmanager;
2794 if ($option ==
'withdraw') {
2795 $url = DOL_URL_ROOT.
'/compta/facture/prelevement.php?facid='.$this->
id.
'&type=bank-transfer';
2796 } elseif ($option ==
'document') {
2797 $url = DOL_URL_ROOT.
'/fourn/facture/document.php?facid='.$this->id;
2799 $url = DOL_URL_ROOT.
'/fourn/facture/card.php?facid='.$this->id;
2806 if ($option !==
'nolink') {
2808 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2809 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2810 $add_save_lastsearch_values = 1;
2812 if ($add_save_lastsearch_values) {
2813 $url .=
'&save_lastsearch_values=1';
2817 $picto = $this->picto;
2818 if ($this->
type == self::TYPE_REPLACEMENT) {
2821 if ($this->
type == self::TYPE_CREDIT_NOTE) {
2824 if ($this->
type == self::TYPE_DEPOSIT) {
2829 'objecttype' => $this->element,
2830 'option' => $option,
2831 'moretitle' => $moretitle,
2833 $classfortooltip =
'classfortooltip';
2836 $classfortooltip =
'classforajaxtooltip';
2837 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2849 if (empty($notooltip)) {
2850 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2851 $label = $langs->trans(
"ShowSupplierInvoice");
2852 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2854 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
2855 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
2858 $linkstart =
'<a href="'.$url.
'"';
2859 $linkstart .= $linkclose.
'>';
2862 $result .= $linkstart;
2864 $result .=
img_object(($notooltip ?
'' : $label), $picto, ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') : $dataparams.
' class="'.(($withpicto != 2) ?
'paddingright ' :
'').$classfortooltip.
'"'), 0, 0, $notooltip ? 0 : 1);
2866 if ($withpicto != 2) {
2867 $result .= ($max ?
dol_trunc($ref, $max) : $ref);
2869 $result .= $linkend;
2871 if ($addlinktonotes) {
2872 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2875 $result .=
' <span class="note inline-block">';
2876 $result .=
'<a href="'.DOL_URL_ROOT.
'/fourn/facture/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2879 $result .=
'</span>';
2883 $hookmanager->initHooks(array($this->element .
'dao'));
2884 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
2885 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2887 $result = $hookmanager->resPrint;
2889 $result .= $hookmanager->resPrint;
2904 global $db, $langs, $conf;
2905 $langs->load(
"orders");
2908 if (empty($conf->global->INVOICE_SUPPLIER_ADDON_NUMBER)) {
2909 $conf->global->INVOICE_SUPPLIER_ADDON_NUMBER =
'mod_facture_fournisseur_cactus';
2914 $file = $conf->global->INVOICE_SUPPLIER_ADDON_NUMBER.
".php";
2915 $classname = $conf->global->INVOICE_SUPPLIER_ADDON_NUMBER;
2918 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2920 foreach ($dirmodels as $reldir) {
2921 $dir =
dol_buildpath($reldir.
"core/modules/supplier_invoice/");
2924 $mybool |= @include_once $dir.$file;
2927 if ($mybool ===
false) {
2932 $obj =
new $classname();
2934 $numref = $obj->getNumRef($soc, $this, $mode);
2936 if ($numref !=
"") {
2939 $this->error = $obj->error;
2955 global $langs, $conf;
2956 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
2964 $sql =
"SELECT rowid";
2965 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2966 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2967 $sql .= $this->db->plimit(100);
2969 $resql = $this->db->query(
$sql);
2971 $num_prods = $this->db->num_rows($resql);
2973 while ($i < $num_prods) {
2975 $row = $this->db->fetch_row($resql);
2976 $prodids[$i] = $row[0];
2982 $this->
ref =
'SPECIMEN';
2983 $this->ref_supplier =
'SUPPLIER_REF_SPECIMEN';
2984 $this->specimen = 1;
2987 $this->date_lim_reglement = $this->date + 3600 * 24 * 30;
2988 $this->cond_reglement_code =
'RECEP';
2989 $this->mode_reglement_code =
'CHQ';
2991 $this->note_public =
'This is a comment (public)';
2992 $this->note_private =
'This is a comment (private)';
2994 $this->multicurrency_tx = 1;
2995 $this->multicurrency_code = $conf->currency;
2998 if (empty($option) || $option !=
'nolines') {
3001 while ($xnbp < $nbp) {
3003 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
3005 $line->subprice = 100;
3008 $line->tva_tx = 19.6;
3009 $line->localtax1_tx = 0;
3010 $line->localtax2_tx = 0;
3012 $line->total_ht = 50;
3013 $line->total_ttc = 59.8;
3014 $line->total_tva = 9.8;
3015 $line->remise_percent = 50;
3017 $line->total_ht = 100;
3018 $line->total_ttc = 119.6;
3019 $line->total_tva = 19.6;
3020 $line->remise_percent = 0;
3023 if ($num_prods > 0) {
3024 $prodid = mt_rand(1, $num_prods);
3025 $line->fk_product = $prodids[$prodid];
3027 $line->product_type = 0;
3029 $this->lines[$xnbp] = $line;
3031 $this->total_ht += $line->total_ht;
3032 $this->total_tva += $line->total_tva;
3033 $this->total_ttc += $line->total_ttc;
3039 $this->amount_ht = $xnbp * 100;
3040 $this->total_ht = $xnbp * 100;
3041 $this->total_tva = $xnbp * 19.6;
3042 $this->total_ttc = $xnbp * 119.6;
3054 global $conf, $user;
3056 $this->nb = array();
3060 $sql =
"SELECT count(f.rowid) as nb";
3061 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
3062 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON f.fk_soc = s.rowid";
3063 if (!$user->hasRight(
"societe",
"client",
"voir") && !$user->socid) {
3064 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
3065 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3068 $sql .=
" ".$clause.
" f.entity = ".$conf->entity;
3070 $resql = $this->db->query(
$sql);
3072 while ($obj = $this->db->fetch_object($resql)) {
3073 $this->nb[
"supplier_invoices"] = $obj->nb;
3075 $this->db->free($resql);
3079 $this->error = $this->db->error();
3094 global $conf, $langs;
3103 $object->fetch($fromid);
3108 $object->fetch_thirdparty();
3111 $object->ref_supplier = (empty($this->ref_supplier) ? $langs->trans(
"CopyOf").
' '.$object->ref_supplier : $this->ref_supplier);
3112 $object->author = $user->id;
3113 $object->user_valid = 0;
3114 $object->fk_facture_source = 0;
3115 $object->date_creation =
'';
3116 $object->date_validation =
'';
3117 $object->date = (empty($this->date) ?
dol_now() : $this->date);
3118 $object->ref_client =
'';
3119 $object->close_code =
'';
3120 $object->close_note =
'';
3122 $object->note_private =
'';
3123 $object->note_public =
'';
3126 $object->date_echeance = $object->calculate_date_lim_reglement();
3129 foreach ($object->lines as $i => $line) {
3130 if (isset($object->lines[$i]->info_bits) && ($object->lines[$i]->info_bits & 0x02) == 0x02) {
3131 unset($object->lines[$i]);
3136 $object->context[
'createfromclone'] =
'createfromclone';
3137 $result = $object->create($user);
3141 $this->error = $object->error;
3142 $this->errors = $object->errors;
3149 unset($object->context[
'createfromclone']);
3153 $this->db->commit();
3156 $this->db->rollback();
3172 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
3174 global $conf, $user, $langs;
3176 $langs->load(
"suppliers");
3177 $outputlangs->load(
"products");
3180 if (empty($modele)) {
3181 if (!empty($conf->global->INVOICE_SUPPLIER_ADDON_PDF)) {
3182 $modele = $conf->global->INVOICE_SUPPLIER_ADDON_PDF;
3188 if (empty($modele)) {
3191 $modelpath =
"core/modules/supplier_invoice/doc/";
3193 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
3205 return $user->hasRight(
"fournisseur",
"facture");
3253 if (!$this->date_echeance) {
3257 $status = isset($this->status) ? $this->status : $this->statut;
3259 return ($status == self::STATUS_VALIDATED) && ($this->date_echeance < ($now - $conf->facture->fournisseur->warning_delay));
3271 $sql =
"SELECT fk_invoice_supplier FROM ".MAIN_DB_PREFIX.
"societe_remise_except WHERE fk_invoice_supplier_source = ".((int) $this->
id);
3272 $resql = $this->db->query(
$sql);
3273 if (!empty($resql)) {
3274 $obj = $this->db->fetch_object($resql);
3275 if (!empty($obj->fk_invoice_supplier)) {
3293 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3295 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3296 $return .=
'<div class="info-box info-box-sm">';
3297 $return .=
'<span class="info-box-icon bg-infobox-action">';
3299 $return .=
'</span>';
3300 $return .=
'<div class="info-box-content">';
3301 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl(1) : $this->ref).
'</span>';
3302 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
3303 if (!empty($arraydata[
'thirdparty'])) {
3304 $return .=
'<br><span class="info-box-label">'.$arraydata[
'thirdparty'].
'</span>';
3306 if (property_exists($this,
'date')) {
3307 $return .=
'<br><span class="info-box-label">'.dol_print_date($this->date,
'day').
'</span>';
3309 if (property_exists($this,
'total_ht')) {
3310 $return .=
' <span class="info-box-label amount" title="'.dol_escape_htmltag($langs->trans(
"AmountHT")).
'">'.
price($this->total_ht);
3311 $return .=
' '.$langs->trans(
"HT");
3312 $return .=
'</span>';
3314 if (method_exists($this,
'getLibStatut')) {
3315 $alreadypaid = (empty($arraydata[
'alreadypaid']) ? 0 : $arraydata[
'alreadypaid']);
3316 $return .=
'<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3, $alreadypaid).
'</div>';
3318 $return .=
'</div>';
3319 $return .=
'</div>';
3320 $return .=
'</div>';
3332 if (!$this->table_element) {
3333 dol_syslog(get_class($this).
"::setVATReverseCharge was called on objet with property table_element not defined", LOG_ERR);
3337 dol_syslog(get_class($this).
'::setVATReverseCharge('.$vatreversecharge.
')');
3339 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3340 $sql .=
" SET vat_reverse_charge = ".((int) $vatreversecharge);
3341 $sql .=
" WHERE rowid=".((int) $this->
id);
3343 if ($this->db->query(
$sql)) {
3344 $this->vat_reverse_charge = ($vatreversecharge == 0) ? 0 : 1;
3347 dol_syslog(get_class($this).
'::setVATReverseCharge Error ', LOG_DEBUG);
3348 $this->error = $this->db->error();
3364 public $element =
'facture_fourn_det';
3369 public $table_element =
'facture_fourn_det';
3383 public $product_ref;
3390 public $ref_supplier;
3396 public $product_desc;
3423 public $fk_facture_fourn;
3436 public $description;
3441 public $skip_update_total;
3446 public $situation_percent;
3457 public $vat_src_code;
3469 public $localtax1_tx;
3475 public $localtax2_tx;
3487 public $remise_percent;
3517 public $total_localtax1;
3523 public $total_localtax2;
3534 public $product_type;
3540 public $product_label;
3554 public $fk_remise_except;
3559 public $fk_parent_line;
3561 public $special_code;
3572 public $localtax1_type;
3578 public $localtax2_type;
3584 public $fk_multicurrency;
3586 public $multicurrency_code;
3587 public $multicurrency_subprice;
3588 public $multicurrency_total_ht;
3589 public $multicurrency_total_tva;
3590 public $multicurrency_total_ttc;
3611 $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';
3612 $sql .=
', f.localtax1_type, f.localtax2_type, f.localtax1_tx, f.localtax2_tx, f.total_localtax1, f.total_localtax2, f.fk_remise_except';
3613 $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';
3614 $sql .=
', p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.description as product_desc';
3615 $sql .=
', f.multicurrency_subprice, f.multicurrency_total_ht, f.multicurrency_total_tva, multicurrency_total_ttc';
3616 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn_det as f';
3617 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON f.fk_product = p.rowid';
3618 $sql .=
' WHERE f.rowid = '.((int) $rowid);
3619 $sql .=
' ORDER BY f.rang, f.rowid';
3621 $query = $this->db->query(
$sql);
3624 $this->errors[] = $this->db->error();
3628 if (!$this->db->num_rows($query)) {
3632 $obj = $this->db->fetch_object($query);
3634 $this->
id = $obj->rowid;
3635 $this->
rowid = $obj->rowid;
3636 $this->fk_facture_fourn = $obj->fk_facture_fourn;
3638 $this->date_start = $obj->date_start;
3639 $this->date_end = $obj->date_end;
3640 $this->product_ref = $obj->product_ref;
3641 $this->ref_supplier = $obj->ref_supplier;
3642 $this->product_desc = $obj->product_desc;
3644 $this->subprice = $obj->pu_ht;
3645 $this->pu_ht = $obj->pu_ht;
3646 $this->pu_ttc = $obj->pu_ttc;
3647 $this->tva_tx = $obj->tva_tx;
3648 $this->localtax1_tx = $obj->localtax1_tx;
3649 $this->localtax2_tx = $obj->localtax2_tx;
3650 $this->localtax1_type = $obj->localtax1_type;
3651 $this->localtax2_type = $obj->localtax2_type;
3653 $this->qty = $obj->qty;
3654 $this->remise_percent = $obj->remise_percent;
3655 $this->fk_remise_except = $obj->fk_remise_except;
3657 $this->total_ht = $obj->total_ht;
3658 $this->total_tva = $obj->total_tva;
3659 $this->total_localtax1 = $obj->total_localtax1;
3660 $this->total_localtax2 = $obj->total_localtax2;
3661 $this->total_ttc = $obj->total_ttc;
3662 $this->fk_product = $obj->fk_product;
3663 $this->product_type = $obj->product_type;
3664 $this->product_label = $obj->product_label;
3665 $this->info_bits = $obj->info_bits;
3666 $this->tva_npr = ($obj->info_bits & 1 == 1) ? 1 : 0;
3667 $this->fk_parent_line = $obj->fk_parent_line;
3668 $this->special_code = $obj->special_code;
3669 $this->rang = $obj->rang;
3670 $this->fk_unit = $obj->fk_unit;
3672 $this->multicurrency_subprice = $obj->multicurrency_subprice;
3673 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
3674 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
3675 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
3688 public function delete($notrigger = 0)
3690 global $user, $conf;
3692 dol_syslog(get_class($this).
"::deleteline rowid=".((
int) $this->
id), LOG_DEBUG);
3699 if ($this->
call_trigger(
'LINEBILL_SUPPLIER_DELETE', $user) < 0) {
3711 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3717 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'facture_fourn_det ';
3718 $sql .=
" WHERE rowid = ".((int) $this->
id);
3719 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
3720 $resql = $this->db->query(
$sql);
3723 $this->error = $this->db->lasterror();
3728 $this->db->commit();
3731 $this->db->rollback();
3750 if (empty($this->qty)) {
3754 if ($this->product_type < 0) {
3759 if (empty($this->remise_percent)) {
3760 $this->remise_percent = 0;
3762 if (empty($this->tva_tx)) {
3765 if (empty($this->localtax1_tx)) {
3766 $this->localtax1_tx = 0;
3768 if (empty($this->localtax2_tx)) {
3769 $this->localtax2_tx = 0;
3772 if (empty($this->pa_ht)) {
3775 if (empty($this->multicurrency_subprice)) {
3776 $this->multicurrency_subprice = 0;
3778 if (empty($this->multicurrency_total_ht)) {
3779 $this->multicurrency_total_ht = 0;
3781 if (empty($this->multicurrency_total_tva)) {
3782 $this->multicurrency_total_tva = 0;
3784 if (empty($this->multicurrency_total_ttc)) {
3785 $this->multicurrency_total_ttc = 0;
3788 $fk_product = (int) $this->fk_product;
3789 $fk_unit = (int) $this->fk_unit;
3793 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn_det SET";
3795 $sql .=
", ref = '".$this->db->escape($this->ref_supplier ? $this->ref_supplier : $this->
ref).
"'";
3796 $sql .=
", date_start = ".($this->date_start !=
'' ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3797 $sql .=
", date_end = ".($this->date_end !=
'' ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3798 $sql .=
", pu_ht = ".price2num($this->pu_ht);
3799 $sql .=
", pu_ttc = ".price2num($this->pu_ttc);
3800 $sql .=
", qty = ".price2num($this->qty);
3801 $sql .=
", remise_percent = ".price2num($this->remise_percent);
3802 if ($this->fk_remise_except > 0)
$sql .=
", fk_remise_except=".((int) $this->fk_remise_except);
3803 else $sql .=
", fk_remise_except=null";
3804 $sql .=
", vat_src_code = '".$this->db->escape(empty($this->vat_src_code) ?
'' : $this->vat_src_code).
"'";
3805 $sql .=
", tva_tx = ".price2num($this->tva_tx);
3806 $sql .=
", localtax1_tx = ".price2num($this->localtax1_tx);
3807 $sql .=
", localtax2_tx = ".price2num($this->localtax2_tx);
3808 $sql .=
", localtax1_type = '".$this->db->escape($this->localtax1_type).
"'";
3809 $sql .=
", localtax2_type = '".$this->db->escape($this->localtax2_type).
"'";
3810 $sql .=
", total_ht = ".price2num($this->total_ht);
3811 $sql .=
", tva= ".price2num($this->total_tva);
3812 $sql .=
", total_localtax1= ".price2num($this->total_localtax1);
3813 $sql .=
", total_localtax2= ".price2num($this->total_localtax2);
3814 $sql .=
", total_ttc = ".price2num($this->total_ttc);
3815 $sql .=
", fk_product = ".($fk_product > 0 ? (int) $fk_product :
'null');
3816 $sql .=
", product_type = ".((int) $this->product_type);
3817 $sql .=
", info_bits = ".((int) $this->info_bits);
3818 $sql .=
", fk_unit = ".($fk_unit > 0 ? (int) $fk_unit :
'null');
3820 if (!empty($this->rang)) {
3821 $sql .=
", rang=".((int) $this->rang);
3825 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice);
3826 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
3827 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
3828 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
3830 $sql .=
" WHERE rowid = ".((int) $this->
id);
3832 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3833 $resql = $this->db->query(
$sql);
3836 $this->db->rollback();
3837 $this->error = $this->db->lasterror();
3841 $this->
rowid = $this->id;
3851 if (!$error && !$notrigger) {
3852 global $langs, $user;
3855 if ($this->
call_trigger(
'LINEBILL_SUPPLIER_MODIFY', $user) < 0) {
3856 $this->db->rollback();
3863 $this->db->rollback();
3867 $this->db->commit();
3879 global $user, $conf, $langs;
3883 dol_syslog(get_class($this).
"::insert rang=".$this->rang, LOG_DEBUG);
3886 $this->desc = trim($this->desc);
3887 if (empty($this->tva_tx)) {
3890 if (empty($this->localtax1_tx)) {
3891 $this->localtax1_tx = 0;
3893 if (empty($this->localtax2_tx)) {
3894 $this->localtax2_tx = 0;
3896 if (empty($this->localtax1_type)) {
3897 $this->localtax1_type =
'0';
3899 if (empty($this->localtax2_type)) {
3900 $this->localtax2_type =
'0';
3902 if (empty($this->total_tva)) {
3903 $this->total_tva = 0;
3905 if (empty($this->total_localtax1)) {
3906 $this->total_localtax1 = 0;
3908 if (empty($this->total_localtax2)) {
3909 $this->total_localtax2 = 0;
3911 if (empty($this->rang)) {
3914 if (empty($this->remise_percent)) {
3915 $this->remise_percent = 0;
3917 if (empty($this->info_bits)) {
3918 $this->info_bits = 0;
3920 if (empty($this->subprice)) {
3921 $this->subprice = 0;
3923 if (empty($this->special_code)) {
3924 $this->special_code = 0;
3926 if (empty($this->fk_parent_line)) {
3927 $this->fk_parent_line = 0;
3929 if (!isset($this->situation_percent) || $this->situation_percent > 100 || (
string) $this->situation_percent ==
'') {
3930 $this->situation_percent = 100;
3933 if (empty($this->pa_ht)) {
3936 if (empty($this->multicurrency_subprice)) {
3937 $this->multicurrency_subprice = 0;
3939 if (empty($this->multicurrency_total_ht)) {
3940 $this->multicurrency_total_ht = 0;
3942 if (empty($this->multicurrency_total_tva)) {
3943 $this->multicurrency_total_tva = 0;
3945 if (empty($this->multicurrency_total_ttc)) {
3946 $this->multicurrency_total_ttc = 0;
3951 if ($this->product_type < 0) {
3952 $this->error =
'ErrorProductTypeMustBe0orMore';
3955 if (!empty($this->fk_product) && $this->fk_product > 0) {
3959 $this->error =
'ErrorProductIdDoesNotExists';
3967 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
3968 $sql .=
' (fk_facture_fourn, fk_parent_line, label, description, ref, qty,';
3969 $sql .=
' vat_src_code, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3970 $sql .=
' fk_product, product_type, remise_percent, fk_remise_except, pu_ht, pu_ttc,';
3971 $sql .=
' date_start, date_end, fk_code_ventilation, rang, special_code,';
3972 $sql .=
' info_bits, total_ht, tva, total_ttc, total_localtax1, total_localtax2, fk_unit';
3973 $sql .=
', fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
3975 $sql .=
" VALUES (".$this->fk_facture_fourn.
",";
3976 $sql .=
" ".($this->fk_parent_line > 0 ?
"'".$this->db->escape($this->fk_parent_line).
"'" :
"null").
",";
3977 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3978 $sql .=
" '".$this->db->escape($this->desc ? $this->desc : $this->
description).
"',";
3979 $sql .=
" '".$this->db->escape($this->ref_supplier).
"',";
3980 $sql .=
" ".price2num($this->qty).
",";
3982 $sql .=
" ".(empty($this->vat_src_code) ?
"''" :
"'".$this->db->escape($this->vat_src_code).
"'").
",";
3983 $sql .=
" ".price2num($this->tva_tx).
",";
3984 $sql .=
" ".price2num($this->localtax1_tx).
",";
3985 $sql .=
" ".price2num($this->localtax2_tx).
",";
3986 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3987 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3988 $sql .=
' '.((!empty($this->fk_product) && $this->fk_product > 0) ? $this->fk_product :
"null").
',';
3989 $sql .=
" ".((int) $this->product_type).
",";
3990 $sql .=
" ".price2num($this->remise_percent).
",";
3991 $sql .=
' '.(!empty($this->fk_remise_except) ? ((int) $this->fk_remise_except) :
"null").
',';
3992 $sql .=
" ".price2num($this->subprice).
",";
3993 $sql .=
" ".(!empty($this->qty) ?
price2num($this->total_ttc / $this->qty) :
price2num($this->total_ttc)).
",";
3994 $sql .=
" ".(!empty($this->date_start) ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3995 $sql .=
" ".(!empty($this->date_end) ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3996 $sql .=
' '.(!empty($this->fk_code_ventilation) ? $this->fk_code_ventilation : 0).
',';
3997 $sql .=
' '.((int) $this->rang).
',';
3998 $sql .=
' '.((int) $this->special_code).
',';
3999 $sql .=
" ".((int) $this->info_bits).
",";
4000 $sql .=
" ".price2num($this->total_ht).
",";
4001 $sql .=
" ".price2num($this->total_tva).
",";
4002 $sql .=
" ".price2num($this->total_ttc).
",";
4003 $sql .=
" ".price2num($this->total_localtax1).
",";
4004 $sql .=
" ".price2num($this->total_localtax2);
4005 $sql .=
", ".(!$this->fk_unit ?
'NULL' : $this->fk_unit);
4006 $sql .=
", ".(int) $this->fk_multicurrency;
4007 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
4008 $sql .=
", ".price2num($this->multicurrency_subprice);
4009 $sql .=
", ".price2num($this->multicurrency_total_ht);
4010 $sql .=
", ".price2num($this->multicurrency_total_tva);
4011 $sql .=
", ".price2num($this->multicurrency_total_ttc);
4014 $resql = $this->db->query(
$sql);
4016 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
4017 $this->
rowid = $this->id;
4028 if ($this->fk_remise_except) {
4030 $result = $discount->fetch($this->fk_remise_except);
4035 if ($discount->fk_facture_line > 0) {
4036 if (empty($noerrorifdiscountalreadylinked)) {
4037 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed", $discount->id);
4038 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
4039 $this->db->rollback();
4043 $result = $discount->link_to_invoice($this->
rowid, 0);
4045 $this->error = $discount->error;
4046 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
4047 $this->db->rollback();
4052 $this->error = $langs->trans(
"ErrorADiscountThatHasBeenRemovedIsIncluded");
4053 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
4054 $this->db->rollback();
4058 $this->error = $discount->error;
4059 dol_syslog(get_class($this).
"::insert Error ".$this->error, LOG_ERR);
4060 $this->db->rollback();
4065 if (!$error && !$notrigger) {
4067 $result = $this->
call_trigger(
'LINEBILL_SUPPLIER_CREATE', $user);
4069 $this->db->rollback();
4075 $this->db->commit();
4078 $this->error = $this->db->error();
4079 $this->db->rollback();
4096 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn_det SET";
4097 $sql .=
" total_ht = ".price2num($this->total_ht);
4098 $sql .=
", tva= ".price2num($this->total_tva);
4099 $sql .=
", total_localtax1 = ".price2num($this->total_localtax1);
4100 $sql .=
", total_localtax2 = ".price2num($this->total_localtax2);
4101 $sql .=
", total_ttc = ".price2num($this->total_ttc);
4102 $sql .=
" WHERE rowid = ".((int) $this->
rowid);
4104 dol_syslog(
"FactureFournisseurLigne.class.php::update_total", LOG_DEBUG);
4106 $resql = $this->db->query(
$sql);
4108 $this->db->commit();
4111 $this->error = $this->db->error();
4112 $this->db->rollback();