41require_once DOL_DOCUMENT_ROOT.
'/core/class/commoninvoice.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.ligne.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
45require_once DOL_DOCUMENT_ROOT.
'/subtotals/class/commonsubtotal.class.php';
48 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formaccounting.class.php';
49 require_once DOL_DOCUMENT_ROOT.
'/accountancy/class/accountingaccount.class.php';
62 public $element =
'invoice_supplier';
67 public $table_element =
'facture_fourn';
72 public $table_element_line =
'facture_fourn_det';
77 public $class_element_line =
'SupplierInvoiceLine';
81 public $fk_element =
'fk_facture_fourn';
86 public $picto =
'supplier_invoice';
92 public $restrictiononfksoc = 1;
112 public $ref_supplier;
172 public $fk_user_valid;
186 public $date_echeance;
191 public $date_pointoftax;
221 public $total_localtax1;
223 public $total_localtax2;
234 public $note_private;
248 public $transport_mode_id;
253 public $vat_reverse_charge;
258 public $extraparams = array();
263 public $lines = array();
275 public $fk_facture_source;
280 public $fk_fac_rec_source;
282 public $fields = array(
283 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 10),
284 'ref' => array(
'type' =>
'varchar(255)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'showoncombobox' => 1,
'position' => 15),
285 'ref_supplier' => array(
'type' =>
'varchar(255)',
'label' =>
'RefSupplier',
'enabled' => 1,
'visible' => -1,
'position' => 20),
286 'entity' => array(
'type' =>
'integer',
'label' =>
'Entity',
'default' =>
'1',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'position' => 25,
'index' => 1),
287 'ref_ext' => array(
'type' =>
'varchar(255)',
'label' =>
'RefExt',
'enabled' => 1,
'visible' => 0,
'position' => 30),
288 'type' => array(
'type' =>
'smallint(6)',
'label' =>
'Type',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 35),
289 'subtype' => array(
'type' =>
'smallint(6)',
'label' =>
'InvoiceSubtype',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 36),
290 'fk_soc' => array(
'type' =>
'integer:Societe:societe/class/societe.class.php',
'label' =>
'ThirdParty',
'enabled' =>
'isModEnabled("societe")',
'visible' => -1,
'notnull' => 1,
'position' => 40),
291 'datec' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -1,
'position' => 45),
292 'datef' => array(
'type' =>
'date',
'label' =>
'Date',
'enabled' => 1,
'visible' => -1,
'position' => 50),
293 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 55),
294 'libelle' => array(
'type' =>
'varchar(255)',
'label' =>
'Label',
'enabled' => 1,
'visible' => -1,
'position' => 60),
295 'paye' => array(
'type' =>
'smallint(6)',
'label' =>
'Paye',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 65),
296 'amount' => array(
'type' =>
'double(24,8)',
'label' =>
'Amount',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 70),
297 'remise' => array(
'type' =>
'double(24,8)',
'label' =>
'Discount',
'enabled' => 1,
'visible' => -1,
'position' => 75),
298 'close_code' => array(
'type' =>
'varchar(16)',
'label' =>
'CloseCode',
'enabled' => 1,
'visible' => -1,
'position' => 80),
299 'close_note' => array(
'type' =>
'varchar(128)',
'label' =>
'CloseNote',
'enabled' => 1,
'visible' => -1,
'position' => 85),
300 'tva' => array(
'type' =>
'double(24,8)',
'label' =>
'Tva',
'enabled' => 1,
'visible' => -1,
'position' => 90),
301 'localtax1' => array(
'type' =>
'double(24,8)',
'label' =>
'Localtax1',
'enabled' => 1,
'visible' => -1,
'position' => 95),
302 'localtax2' => array(
'type' =>
'double(24,8)',
'label' =>
'Localtax2',
'enabled' => 1,
'visible' => -1,
'position' => 100),
303 'total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalHT',
'enabled' => 1,
'visible' => -1,
'position' => 105),
304 'total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalVAT',
'enabled' => 1,
'visible' => -1,
'position' => 110),
305 'total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalTTC',
'enabled' => 1,
'visible' => -1,
'position' => 115),
306 'fk_user_author' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserAuthor',
'enabled' => 1,
'visible' => -1,
'position' => 125),
307 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'visible' => -2,
'notnull' => -1,
'position' => 130),
308 'fk_user_valid' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserValidation',
'enabled' => 1,
'visible' => -1,
'position' => 135),
309 'fk_facture_source' => array(
'type' =>
'integer',
'label' =>
'Fk facture source',
'enabled' => 1,
'visible' => -1,
'position' => 140),
310 'fk_projet' => array(
'type' =>
'integer:Project:projet/class/project.class.php:1:fk_statut=1',
'label' =>
'Project',
'enabled' =>
"isModEnabled('project')",
'visible' => -1,
'position' => 145),
311 'fk_account' => array(
'type' =>
'integer',
'label' =>
'Account',
'enabled' =>
'isModEnabled("bank")',
'visible' => -1,
'position' => 150),
312 'fk_cond_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentTerm',
'enabled' => 1,
'visible' => -1,
'position' => 155),
313 'fk_mode_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentMode',
'enabled' => 1,
'visible' => -1,
'position' => 160),
314 'date_lim_reglement' => array(
'type' =>
'date',
'label' =>
'DateLimReglement',
'enabled' => 1,
'visible' => -1,
'position' => 165),
315 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'visible' => 0,
'position' => 170),
316 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => 0,
'position' => 175),
317 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'ModelPdf',
'enabled' => 1,
'visible' => 0,
'position' => 180),
318 'extraparams' => array(
'type' =>
'varchar(255)',
'label' =>
'Extraparams',
'enabled' => 1,
'visible' => -1,
'position' => 190),
319 'fk_incoterms' => array(
'type' =>
'integer',
'label' =>
'IncotermCode',
'enabled' => 1,
'visible' => -1,
'position' => 195),
320 'location_incoterms' => array(
'type' =>
'varchar(255)',
'label' =>
'IncotermLocation',
'enabled' => 1,
'visible' => -1,
'position' => 200),
321 'fk_multicurrency' => array(
'type' =>
'integer',
'label' =>
'MulticurrencyId',
'enabled' => 1,
'visible' => -1,
'position' => 205),
322 'multicurrency_code' => array(
'type' =>
'varchar(255)',
'label' =>
'MulticurrencyCode',
'enabled' => 1,
'visible' => -1,
'position' => 210),
323 'multicurrency_tx' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyRate',
'enabled' => 1,
'visible' => -1,
'position' => 215),
324 'multicurrency_total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyTotalHT',
'enabled' => 1,
'visible' => -1,
'position' => 220),
325 'multicurrency_total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyTotalVAT',
'enabled' => 1,
'visible' => -1,
'position' => 225),
326 'multicurrency_total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyTotalTTC',
'enabled' => 1,
'visible' => -1,
'position' => 230),
327 'date_pointoftax' => array(
'type' =>
'date',
'label' =>
'DatePointOfTax',
'enabled' =>
'getDolGlobalString("INVOICE_POINTOFTAX_DATE")',
'visible' => -1,
'position' => 235),
328 'date_valid' => array(
'type' =>
'date',
'label' =>
'DateValidation',
'enabled' => 1,
'visible' => -1,
'position' => 240),
329 'last_main_doc' => array(
'type' =>
'varchar(255)',
'label' =>
'Last main doc',
'enabled' => 1,
'visible' => -1,
'position' => 245),
330 'fk_statut' => array(
'type' =>
'smallint(6)',
'label' =>
'Status',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 500),
331 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -2,
'position' => 900),
383 const CLOSECODE_DISCOUNTVAT =
'discount_vat';
384 const CLOSECODE_BADCREDIT =
'badsupplier';
385 const CLOSECODE_ABANDONED =
'abandon';
386 const CLOSECODE_REPLACED =
'replaced';
398 $this->ismultientitymanaged = 1;
409 global $langs,
$conf, $hookmanager;
415 if (isset($this->ref_supplier)) {
416 $this->ref_supplier = trim($this->ref_supplier);
418 if (empty($this->
type)) {
421 if (empty($this->
date)) {
426 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
431 if (empty($this->fk_multicurrency)) {
432 $this->multicurrency_code =
$conf->currency;
433 $this->fk_multicurrency = 0;
434 $this->multicurrency_tx = 1;
441 $originaldatewhen = 0;
443 $previousdaynextdatewhen = 0;
447 if ($this->fac_rec > 0) {
448 $this->fk_fac_rec_source = $this->fac_rec;
450 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.facture-rec.class.php';
452 $result = $_facrec->fetch($this->fac_rec);
453 $result = $_facrec->fetchObjectLinked(
null,
'',
null,
'',
'OR', 1,
'sourcetype', 0);
456 if (!empty($_facrec->frequency)) {
457 $originaldatewhen = $_facrec->date_when;
458 $nextdatewhen =
dol_time_plus_duree($originaldatewhen, $_facrec->frequency, $_facrec->unit_frequency);
460 $this->socid = $_facrec->socid;
463 $this->entity = $_facrec->entity;
468 $this->fk_project =
GETPOSTINT(
'projectid') > 0 ? (
GETPOSTINT(
'projectid')) : $_facrec->fk_project;
469 $this->note_public =
GETPOST(
'note_public',
'restricthtml') ?
GETPOST(
'note_public',
'restricthtml') : $_facrec->note_public;
470 $this->note_private =
GETPOST(
'note_private',
'restricthtml') ?
GETPOST(
'note_private',
'restricthtml') : $_facrec->note_private;
471 $this->model_pdf =
GETPOST(
'model',
'alpha') ?
GETPOST(
'model',
'alpha') : $_facrec->model_pdf;
472 $this->cond_reglement_id =
GETPOSTINT(
'cond_reglement_id') > 0 ? (
GETPOSTINT(
'cond_reglement_id')) : $_facrec->cond_reglement_id;
473 $this->mode_reglement_id =
GETPOSTINT(
'mode_reglement_id') > 0 ? (
GETPOSTINT(
'mode_reglement_id')) : $_facrec->mode_reglement_id;
474 $this->fk_account =
GETPOST(
'fk_account') > 0 ? ((int)
GETPOST(
'fk_account')) : $_facrec->fk_account;
477 $this->total_ht = $_facrec->total_ht;
478 $this->total_ttc = $_facrec->total_ttc;
481 $this->fk_incoterms = $_facrec->fk_incoterms;
482 $this->location_incoterms = $_facrec->location_incoterms;
488 $this->note_public = trim((
string) $this->note_public);
489 $this->note_private = trim((
string) $this->note_private);
490 $this->note_private =
dol_concatdesc($this->note_private, $langs->trans(
"GeneratedFromRecurringInvoice", $_facrec->title));
492 $this->array_options = $_facrec->array_options;
494 if (! $this->mode_reglement_id) {
495 $this->mode_reglement_id = 0;
500 $this->linked_objects = $_facrec->linkedObjectsIds;
507 if ($_facrec->frequency > 0) {
508 $this->ref_supplier = trim($this->ref_supplier .
'_' . ($_facrec->nb_gen_done + 1));
509 dol_syslog(
"This is a recurring invoice so we set date_last_gen and next date_when");
510 if (empty($_facrec->date_when)) {
511 $_facrec->date_when = $now;
513 $next_date = $_facrec->getNextDate();
514 $result = $_facrec->setValueFrom(
'date_last_gen', $now,
'', 0,
'date',
'', $user,
'');
516 $result = $_facrec->setNextDate($next_date, 1);
520 $outputlangs = $langs;
523 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && empty($newlang) && isset($this->thirdparty->default_lang)) {
524 $newlang = $this->thirdparty->default_lang;
526 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && empty($newlang) && property_exists($this,
'default_lang') && isset($this->default_lang)) {
527 $newlang = $this->default_lang;
529 if (!empty($newlang)) {
531 $outputlangs->setDefaultLang($newlang);
533 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0,
null, $this);
543 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_BEFORE_GEN__'] = $originaldatewhen ?
dol_print_date($originaldatewhen,
'dayhour') :
'';
544 $substitutionarray[
'__INVOICE_DATE_NEXT_INVOICE_AFTER_GEN__'] = $nextdatewhen ?
dol_print_date($nextdatewhen,
'dayhour') :
'';
545 $substitutionarray[
'__INVOICE_PREVIOUS_DATE_NEXT_INVOICE_AFTER_GEN__'] = $previousdaynextdatewhen ?
dol_print_date($previousdaynextdatewhen,
'dayhour') :
'';
546 $substitutionarray[
'__INVOICE_COUNTER_CURRENT__'] = $_facrec->nb_gen_done;
547 $substitutionarray[
'__INVOICE_COUNTER_MAX__'] = $_facrec->nb_gen_max;
556 if (!empty($forceduedate)) {
557 $this->date_echeance = $forceduedate;
560 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"facture_fourn (";
562 $sql .=
", ref_supplier";
571 $sql .=
", date_pointoftax";
572 $sql .=
", vat_reverse_charge";
573 $sql .=
", fk_projet";
574 $sql .=
", fk_cond_reglement";
575 $sql .=
", fk_mode_reglement";
576 $sql .=
", fk_account";
577 $sql .=
", note_private";
578 $sql .=
", note_public";
579 $sql .=
", fk_user_author";
580 $sql .=
", date_lim_reglement";
581 $sql .=
", fk_incoterms, location_incoterms";
582 $sql .=
", fk_multicurrency";
583 $sql .=
", multicurrency_code";
584 $sql .=
", multicurrency_tx";
585 $sql .=
", fk_facture_source";
586 $sql .=
", fk_fac_rec_source";
590 $sql .=
", '".$this->db->escape($this->ref_supplier).
"'";
591 $sql .=
", '".$this->db->escape($this->ref_ext).
"'";
592 $sql .=
", ".((int) $this->entity);
593 $sql .=
", '".$this->db->escape((
string) $this->type).
"'";
594 $sql .=
", ".(isset($this->subtype) ? (int) $this->subtype :
"null");
595 $sql .=
", '".$this->db->escape(isset($this->label) ? $this->label : (isset($this->libelle) ? $this->libelle :
'')).
"'";
596 $sql .=
", ".((int) $this->socid);
597 $sql .=
", '".$this->db->idate($now).
"'";
598 $sql .=
", '".$this->db->idate($this->
date).
"'";
599 $sql .=
", ".(empty($this->date_pointoftax) ?
"null" :
"'".$this->db->idate($this->date_pointoftax).
"'");
600 $sql .=
", ".($this->vat_reverse_charge !=
'' ? ((int) $this->vat_reverse_charge) : 0);
601 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
602 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
"null");
603 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
"null");
604 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
605 $sql .=
", '".$this->db->escape($this->note_private).
"'";
606 $sql .=
", '".$this->db->escape($this->note_public).
"'";
607 $sql .=
", ".((int) $user->id).
",";
608 $sql .= $this->date_echeance !=
'' ?
"'".$this->db->idate($this->date_echeance).
"'" :
"null";
609 $sql .=
", ".(int) $this->fk_incoterms;
610 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
611 $sql .=
", ".(int) $this->fk_multicurrency;
612 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
613 $sql .=
", ".(float) $this->multicurrency_tx;
614 $sql .=
", ".($this->fk_facture_source ? ((int) $this->fk_facture_source) :
"null");
615 $sql .=
", ".(isset($this->fk_fac_rec_source) ? ((int) $this->fk_fac_rec_source) :
"NULL");
618 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
619 $resql = $this->db->query($sql);
621 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn');
624 $this->
ref =
'(PROV'.$this->id.
')';
625 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"facture_fourn SET ref='".$this->db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
627 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
628 $resql = $this->db->query($sql);
633 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
634 $this->linked_objects = $this->linkedObjectsIds;
638 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
639 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
640 if (is_array($tmp_origin_id)) {
641 foreach ($tmp_origin_id as $origin_id) {
649 $origin_id = $tmp_origin_id;
659 if (!$error && empty($this->fac_rec) && count($this->lines) && is_object($this->lines[0])) {
660 dol_syslog(
"There is ".count($this->lines).
" lines that are invoice lines objects");
661 foreach ($this->lines as $i => $val) {
662 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'facture_fourn_det (fk_facture_fourn, special_code, fk_remise_except)';
663 $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').
')';
665 $resql_insert = $this->db->query($sql);
667 $idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn_det');
671 $this->lines[$i]->desc ? $this->lines[$i]->desc : $this->lines[$i]->description,
672 $this->lines[$i]->subprice,
673 $this->lines[$i]->tva_tx.($this->lines[$i]->vat_src_code ?
' ('.$this->lines[$i]->vat_src_code.
')' :
''),
674 $this->lines[$i]->localtax1_tx,
675 $this->lines[$i]->localtax2_tx,
676 $this->lines[$i]->qty,
677 $this->lines[$i]->fk_product,
679 (!empty($this->lines[$i]->info_bits) ? $this->lines[$i]->info_bits :
''),
680 $this->lines[$i]->product_type,
681 $this->lines[$i]->remise_percent,
683 $this->lines[$i]->date_start,
684 $this->lines[$i]->date_end,
685 $this->lines[$i]->array_options,
686 $this->lines[$i]->fk_unit,
687 $this->lines[$i]->multicurrency_subprice,
688 $this->lines[$i]->ref_supplier
691 $this->error = $this->db->lasterror();
692 $this->db->rollback();
696 } elseif (!$error && empty($this->fac_rec)) {
697 dol_syslog(
"There is ".count($this->lines).
" lines that are array lines");
698 foreach ($this->lines as $i => $val) {
699 $line = $this->lines[$i];
703 if (!is_object($line)) {
704 $line = (object) $line;
707 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'facture_fourn_det (fk_facture_fourn, special_code, fk_remise_except)';
708 $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').
')';
710 $resql_insert = $this->db->query($sql);
712 $idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.
'facture_fourn_det');
716 $line->desc ? $line->desc : $line->description,
724 (!empty($line->info_bits) ? $line->info_bits :
''),
726 $line->remise_percent,
730 $line->array_options,
732 $line->multicurrency_subprice,
736 $this->error = $this->db->lasterror();
737 $this->db->rollback();
747 foreach ($_facrec->lines as $i => $val) {
748 $product_type = $_facrec->lines[$i]->product_type;
749 if ($_facrec->lines[$i]->fk_product) {
751 $res =
$prod->fetch($_facrec->lines[$i]->fk_product);
762 $tva_tx = $_facrec->lines[$i]->tva_tx . ($_facrec->lines[$i]->vat_src_code ?
'(' . $_facrec->lines[$i]->vat_src_code .
')' :
'');
763 $tva_npr = $_facrec->lines[$i]->info_bits;
764 if (empty($tva_tx)) {
767 $localtax1_tx = $_facrec->lines[$i]->localtax1_tx;
768 $localtax2_tx = $_facrec->lines[$i]->localtax2_tx;
772 $buyprice = empty($_facrec->lines[$i]->buyprice) ? 0 : $_facrec->lines[$i]->buyprice;
775 if (! $buyprice && $_facrec->lines[$i]->fk_product > 0) {
776 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.product.class.php';
778 $producttmp->fetch($_facrec->lines[$i]->fk_product);
783 if (
getDolGlobalString(
'MARGIN_TYPE') ==
'costprice' && !empty($producttmp->cost_price)) {
784 $buyprice = $producttmp->cost_price;
786 $buyprice = $producttmp->pmp;
788 if ($producttmp->find_min_price_product_fournisseur($_facrec->lines[$i]->fk_product) > 0) {
789 if ($producttmp->product_fourn_price_id > 0) {
790 $buyprice =
price2num($producttmp->fourn_unitprice * (1 - $producttmp->fourn_remise_percent / 100) + $producttmp->fourn_remise,
'MU');
796 $result_insert = $this->
addline(
797 $_facrec->lines[$i]->desc ? $_facrec->lines[$i]->desc : $_facrec->lines[$i]->description,
798 $_facrec->lines[$i]->pu_ht,
802 $_facrec->lines[$i]->qty,
803 $_facrec->lines[$i]->fk_product,
804 $_facrec->lines[$i]->remise_percent,
805 ($_facrec->lines[$i]->date_start == 1 && $this->date) ? $this->
date :
'',
806 ($_facrec->lines[$i]->date_end == 1 && $previousdaynextdatewhen) ? $previousdaynextdatewhen :
'',
808 $_facrec->lines[$i]->info_bits,
811 $_facrec->lines[$i]->rang,
813 $_facrec->lines[$i]->array_options,
814 $_facrec->lines[$i]->fk_unit,
817 $_facrec->lines[$i]->ref_supplier,
818 $_facrec->lines[$i]->special_code,
822 if ($result_insert < 0) {
824 $this->error = $this->db->error();
844 $result = $this->call_trigger(
'BILL_SUPPLIER_CREATE', $user);
855 $this->db->rollback();
859 $this->error = $langs->trans(
'FailedToUpdatePrice');
860 $this->db->rollback();
864 if ($this->db->errno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
865 $this->error = $langs->trans(
'ErrorRefAlreadyExists');
866 $this->db->rollback();
869 $this->error = $this->db->lasterror();
870 $this->db->rollback();
884 public function fetch($id = 0, $ref =
'', $ref_ext =
'')
886 if (empty($id) && empty($ref) && empty($ref_ext)) {
893 $sql .=
" t.ref_supplier,";
894 $sql .=
" t.ref_ext,";
895 $sql .=
" t.entity,";
897 $sql .=
" t.subtype,";
898 $sql .=
" t.fk_soc,";
901 $sql .=
" t.date_pointoftax,";
902 $sql .=
" t.tms as datem,";
903 $sql .=
" t.libelle as label,";
904 $sql .=
" t.paye as paid,";
905 $sql .=
" t.close_code,";
906 $sql .=
" t.close_note,";
908 $sql .=
" t.localtax1,";
909 $sql .=
" t.localtax2,";
910 $sql .=
" t.total_ht,";
911 $sql .=
" t.total_tva,";
912 $sql .=
" t.total_ttc,";
913 $sql .=
" t.fk_statut as status,";
914 $sql .=
" t.fk_user_author,";
915 $sql .=
" t.fk_user_valid,";
916 $sql .=
" t.fk_facture_source,";
917 $sql .=
" t.vat_reverse_charge,";
918 $sql .=
" t.fk_fac_rec_source,";
919 $sql .=
" t.fk_projet as fk_project,";
920 $sql .=
" t.fk_cond_reglement,";
921 $sql .=
" t.fk_account,";
922 $sql .=
" t.fk_mode_reglement,";
923 $sql .=
" t.date_lim_reglement,";
924 $sql .=
" t.note_private,";
925 $sql .=
" t.note_public,";
926 $sql .=
" t.model_pdf,";
927 $sql .=
" t.last_main_doc,";
928 $sql .=
" t.import_key,";
929 $sql .=
" t.extraparams,";
930 $sql .=
" cr.code as cond_reglement_code, cr.libelle as cond_reglement_label, cr.libelle_facture as cond_reglement_doc,";
931 $sql .=
" p.code as mode_reglement_code, p.libelle as mode_reglement_label,";
932 $sql .=
' s.nom as socnom, s.rowid as socid,';
933 $sql .=
' t.fk_incoterms, t.location_incoterms,';
934 $sql .=
" i.libelle as label_incoterms,";
935 $sql .=
' t.fk_transport_mode,';
936 $sql .=
' t.fk_multicurrency, t.multicurrency_code, t.multicurrency_tx, t.multicurrency_total_ht, t.multicurrency_total_tva, t.multicurrency_total_ttc';
937 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as t';
938 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON (t.fk_soc = s.rowid)";
939 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_payment_term as cr ON t.fk_cond_reglement = cr.rowid";
940 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_paiement as p ON t.fk_mode_reglement = p.id";
941 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON t.fk_incoterms = i.rowid';
943 $sql .=
" WHERE t.rowid = ".((int) $id);
945 $sql .=
' WHERE t.entity IN ('.getEntity(
'supplier_invoice').
')';
947 $sql .=
" AND t.ref = '".$this->db->escape($ref).
"'";
950 $sql .=
" AND t.ref_ext = '".$this->db->escape($ref_ext).
"'";
954 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
955 $resql = $this->db->query($sql);
957 if ($this->db->num_rows($resql)) {
958 $obj = $this->db->fetch_object($resql);
960 $this->
id = $obj->rowid;
961 $this->
ref = $obj->ref ? $obj->ref : $obj->rowid;
963 $this->ref_supplier = $obj->ref_supplier;
964 $this->ref_ext = $obj->ref_ext;
965 $this->entity = $obj->entity;
967 $this->subtype = $obj->subtype;
968 $this->socid = $obj->fk_soc;
969 $this->
date = $this->db->jdate($obj->datef);
970 $this->date_pointoftax = $this->db->jdate($obj->date_pointoftax);
971 $this->date_creation = $this->db->jdate($obj->datec);
972 $this->datec = $this->db->jdate($obj->datec);
973 $this->date_modification = $this->db->jdate($obj->datem);
974 $this->tms = $this->db->jdate($obj->datem);
975 $this->libelle = $obj->label;
976 $this->label = $obj->label;
977 $this->paye = $obj->paid;
978 $this->paid = $obj->paid;
979 $this->close_code = $obj->close_code;
980 $this->close_note = $obj->close_note;
981 $this->total_localtax1 = $obj->localtax1;
982 $this->total_localtax2 = $obj->localtax2;
983 $this->total_ht = $obj->total_ht;
984 $this->total_tva = $obj->total_tva;
985 $this->total_ttc = $obj->total_ttc;
986 $this->
status = $obj->status;
987 $this->statut = $obj->status;
988 $this->fk_statut = $obj->status;
989 $this->user_creation_id = $obj->fk_user_author;
990 $this->author = $obj->fk_user_author;
991 $this->user_validation_id = $obj->fk_user_valid;
992 $this->fk_user_valid = $obj->fk_user_valid;
993 $this->fk_facture_source = $obj->fk_facture_source;
994 $this->vat_reverse_charge = empty($obj->vat_reverse_charge) ? 0 : 1;
995 $this->fk_fac_rec_source = $obj->fk_fac_rec_source;
996 $this->fk_project = $obj->fk_project;
997 $this->cond_reglement_id = $obj->fk_cond_reglement;
998 $this->cond_reglement_code = $obj->cond_reglement_code;
999 $this->cond_reglement = $obj->cond_reglement_label;
1000 $this->cond_reglement_label = $obj->cond_reglement_label;
1001 $this->cond_reglement_doc = $obj->cond_reglement_doc;
1002 $this->fk_account = $obj->fk_account;
1003 $this->mode_reglement_id = $obj->fk_mode_reglement;
1004 $this->mode_reglement_code = $obj->mode_reglement_code;
1005 $this->mode_reglement = $obj->mode_reglement_label;
1006 $this->date_echeance = $this->db->jdate($obj->date_lim_reglement);
1007 $this->note = $obj->note_private;
1008 $this->note_private = $obj->note_private;
1009 $this->note_public = $obj->note_public;
1010 $this->model_pdf = $obj->model_pdf;
1011 $this->last_main_doc = $obj->last_main_doc;
1012 $this->import_key = $obj->import_key;
1015 $this->fk_incoterms = $obj->fk_incoterms;
1016 $this->location_incoterms = $obj->location_incoterms;
1017 $this->label_incoterms = $obj->label_incoterms;
1018 $this->transport_mode_id = $obj->fk_transport_mode;
1021 $this->fk_multicurrency = $obj->fk_multicurrency;
1022 $this->multicurrency_code = $obj->multicurrency_code;
1023 $this->multicurrency_tx = $obj->multicurrency_tx;
1024 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1025 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1026 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1028 $this->extraparams = isset($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
1030 $this->socid = $obj->socid;
1032 $this->thirdparty =
null;
1040 $this->error = $this->db->lasterror();
1044 $this->error =
'Bill with id '.$id.
' not found';
1045 dol_syslog(get_class($this).
'::fetch '.$this->error);
1049 $this->db->free($resql);
1052 $this->error =
"Error ".$this->db->lasterror();
1067 $this->lines = array();
1069 $sql =
'SELECT f.rowid, f.ref as ref_supplier, f.description as line_desc, f.date_start, f.date_end, f.pu_ht, f.pu_ttc, f.qty, f.remise_percent, f.vat_src_code, f.tva_tx';
1070 $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';
1071 $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, f.extraparams';
1072 $sql .=
', p.rowid as product_id, p.ref as product_ref, p.label as label, p.barcode as product_barcode, p.description as product_desc';
1073 $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';
1074 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn_det as f';
1075 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON f.fk_product = p.rowid';
1076 $sql .=
' WHERE fk_facture_fourn='.((int) $this->
id);
1077 $sql .=
' ORDER BY f.rang, f.rowid';
1079 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
1081 $resql_rows = $this->db->query($sql);
1083 $num_rows = $this->db->num_rows($resql_rows);
1086 while ($i < $num_rows) {
1087 $obj = $this->db->fetch_object($resql_rows);
1091 $line->id = $obj->rowid;
1092 $line->rowid = $obj->rowid;
1094 $line->description = $obj->line_desc;
1095 $line->desc = $obj->line_desc;
1096 $line->date_start = $this->db->jdate($obj->date_start);
1097 $line->date_end = $this->db->jdate($obj->date_end);
1099 $line->product_ref = $obj->product_ref;
1100 $line->ref = $obj->product_ref;
1101 $line->ref_supplier = $obj->ref_supplier;
1102 $line->libelle = $obj->label;
1103 $line->label = $obj->label;
1104 $line->product_barcode = $obj->product_barcode;
1105 $line->product_desc = $obj->product_desc;
1106 $line->subprice = $obj->pu_ht;
1107 $line->pu_ht = $obj->pu_ht;
1108 $line->subprice_ttc = $obj->pu_ttc;
1109 $line->pu_ttc = $obj->pu_ttc;
1110 $line->vat_src_code = $obj->vat_src_code;
1111 $line->tva_tx = $obj->tva_tx;
1112 $line->localtax1_tx = $obj->localtax1_tx;
1113 $line->localtax2_tx = $obj->localtax2_tx;
1114 $line->localtax1_type = $obj->localtax1_type;
1115 $line->localtax2_type = $obj->localtax2_type;
1116 $line->qty = $obj->qty;
1117 $line->remise_percent = $obj->remise_percent;
1118 $line->fk_remise_except = $obj->fk_remise_except;
1120 $line->total_ht = $obj->total_ht;
1121 $line->total_ttc = $obj->total_ttc;
1122 $line->total_tva = $obj->total_tva;
1123 $line->total_localtax1 = $obj->total_localtax1;
1124 $line->total_localtax2 = $obj->total_localtax2;
1125 $line->fk_facture_fourn = $obj->fk_facture_fourn;
1126 $line->fk_product = $obj->fk_product;
1127 $line->product_type = $obj->product_type;
1128 $line->product_label = $obj->label;
1129 $line->info_bits = $obj->info_bits;
1130 $line->fk_parent_line = $obj->fk_parent_line;
1131 $line->special_code = $obj->special_code;
1132 $line->rang = $obj->rang;
1133 $line->fk_unit = $obj->fk_unit;
1135 $line->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
1138 $line->fk_code_ventilation = $obj->fk_code_ventilation;
1141 $line->fk_multicurrency = $obj->fk_multicurrency;
1142 $line->multicurrency_code = $obj->multicurrency_code;
1143 $line->multicurrency_subprice = $obj->multicurrency_subprice;
1144 $line->multicurrency_total_ht = $obj->multicurrency_total_ht;
1145 $line->multicurrency_total_tva = $obj->multicurrency_total_tva;
1146 $line->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1149 $line->fetch_optionals();
1151 $this->lines[$i] = $line;
1156 $this->db->free($resql_rows);
1159 $this->error = $this->db->error();
1160 dol_syslog(get_class($this).
"::fetch_lines - No lines:{$this->error} Error:{$this->error}", LOG_DEBUG);
1173 public function update($user =
null, $notrigger = 0)
1179 if (empty($this->
type)) {
1182 if (isset($this->
ref)) {
1183 $this->
ref = trim($this->
ref);
1185 if (isset($this->ref_supplier)) {
1186 $this->ref_supplier = trim($this->ref_supplier);
1188 if (isset($this->ref_ext)) {
1189 $this->ref_ext = trim($this->ref_ext);
1191 if (isset($this->entity)) {
1192 $this->entity = (int) $this->entity;
1194 if (isset($this->
type)) {
1197 if (isset($this->subtype)) {
1198 $this->subtype = (int) $this->subtype;
1200 if (isset($this->socid)) {
1201 $this->socid = (int) $this->socid;
1203 if (isset($this->label)) {
1204 $this->label = trim($this->label);
1206 if (isset($this->paid)) {
1207 $this->paid = (int) (
bool) $this->paid;
1208 $this->paye = $this->paid;
1209 } elseif (isset($this->paye)) {
1210 $this->paid = (int) (
bool) $this->paye;
1211 $this->paye = $this->paid;
1213 if (isset($this->close_code)) {
1214 $this->close_code = trim($this->close_code);
1216 if (isset($this->close_note)) {
1217 $this->close_note = trim($this->close_note);
1219 if (empty($this->total_ht)) {
1220 $this->total_ht = 0;
1222 if (empty($this->total_tva)) {
1223 $this->total_tva = 0;
1225 if (empty($this->total_localtax1)) {
1226 $this->total_localtax1 = 0;
1228 if (empty($this->total_localtax2)) {
1229 $this->total_localtax2 = 0;
1231 if (isset($this->total_ttc)) {
1232 $this->total_ttc = (float) $this->total_ttc;
1234 if (isset($this->
status)) {
1236 $this->statut = $this->status;
1237 } elseif (isset($this->statut)) {
1238 $this->
status = (int) $this->statut;
1239 $this->statut = $this->status;
1241 if (isset($this->author)) {
1242 $this->author = (int) $this->author;
1244 if (isset($this->fk_user_valid)) {
1245 $this->fk_user_valid = (int) $this->fk_user_valid;
1247 if (isset($this->fk_facture_source)) {
1248 $this->fk_facture_source = (int) $this->fk_facture_source;
1250 if (isset($this->fk_project)) {
1251 if (empty($this->fk_project)) {
1252 $this->fk_project = 0;
1254 $this->fk_project = (int) $this->fk_project;
1257 if (isset($this->mode_reglement_id)) {
1258 $this->mode_reglement_id = (int) $this->mode_reglement_id;
1260 if (isset($this->cond_reglement_id)) {
1261 $this->cond_reglement_id = (int) $this->cond_reglement_id;
1263 if (isset($this->note_private)) {
1264 $this->note_private = trim($this->note_private);
1265 $this->note = $this->note_private;
1267 if (isset($this->note_public)) {
1268 $this->note_public = trim($this->note_public);
1270 if (isset($this->model_pdf)) {
1271 $this->model_pdf = trim($this->model_pdf);
1273 if (isset($this->import_key)) {
1274 $this->import_key = trim($this->import_key);
1282 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn SET";
1283 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
1284 $sql .=
" ref_supplier=".(isset($this->ref_supplier) ?
"'".$this->db->escape($this->ref_supplier).
"'" :
"null").
",";
1285 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
1286 $sql .=
" entity=".(isset($this->entity) ? ((int) $this->entity) :
"null").
",";
1287 $sql .=
" type=".(isset($this->
type) ? ((int) $this->
type) :
"null").
",";
1288 $sql .=
" subtype=".(isset($this->subtype) ? (int) $this->subtype :
"null").
",";
1289 $sql .=
" fk_soc=".(isset($this->socid) ? ((int) $this->socid) :
"null").
",";
1290 $sql .=
" datec=".(dol_strlen((
string) $this->datec) != 0 ?
"'".$this->db->idate($this->datec).
"'" :
'null').
",";
1291 $sql .=
" datef=".(dol_strlen((
string) $this->date) != 0 ?
"'".$this->db->idate($this->date).
"'" :
'null').
",";
1292 $sql .=
" date_pointoftax=".(dol_strlen((
string) $this->date_pointoftax) != 0 ?
"'".$this->db->idate($this->date_pointoftax).
"'" :
'null').
",";
1293 if (
dol_strlen((
string) $this->date_modification) != 0) {
1294 $sql .=
" tms=".(dol_strlen((
string) $this->date_modification) != 0 ?
"'".$this->db->idate($this->date_modification).
"'" :
'null').
",";
1295 } elseif (
dol_strlen((
string) $this->tms) != 0) {
1296 $sql .=
" tms=".(dol_strlen((
string) $this->tms) != 0 ?
"'".$this->db->idate($this->tms).
"'" :
'null').
",";
1298 $sql .=
" libelle=".(isset($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
1299 $sql .=
" paye=".(isset($this->paid) ? ((int) $this->paid) :
"0").
",";
1300 $sql .=
" close_code=".(isset($this->close_code) ?
"'".$this->db->escape($this->close_code).
"'" :
"null").
",";
1301 $sql .=
" close_note=".(isset($this->close_note) ?
"'".$this->db->escape($this->close_note).
"'" :
"null").
",";
1302 $sql .=
" localtax1=".(isset($this->total_localtax1) ? ((float) $this->total_localtax1) :
"null").
",";
1303 $sql .=
" localtax2=".(isset($this->total_localtax2) ? ((float) $this->total_localtax2) :
"null").
",";
1304 $sql .=
" total_ht=".(isset($this->total_ht) ? ((float) $this->total_ht) :
"null").
",";
1305 $sql .=
" total_tva=".(isset($this->total_tva) ? ((float) $this->total_tva) :
"null").
",";
1306 $sql .=
" total_ttc=".(isset($this->total_ttc) ? ((float) $this->total_ttc) :
"null").
",";
1307 $sql .=
" fk_statut=".(isset($this->
status) ? ((int) $this->
status) : (isset($this->statut) ? ((int) $this->statut) :
"null")).
",";
1308 $sql .=
" fk_user_author=".(isset($this->author) ? ((int) $this->author) :
"null").
",";
1309 $sql .=
" fk_user_valid=".(isset($this->fk_user_valid) ? ((int) $this->fk_user_valid) :
"null").
",";
1310 $sql .=
" fk_facture_source=".($this->fk_facture_source ? ((int) $this->fk_facture_source) :
"null").
",";
1311 $sql .=
" vat_reverse_charge = ".($this->vat_reverse_charge !=
'' ? ((int) $this->vat_reverse_charge) : 0).
",";
1312 $sql .=
" fk_projet=".(!empty($this->fk_project) ? ((int) $this->fk_project) :
"null").
",";
1313 $sql .=
" fk_mode_reglement=".(isset($this->mode_reglement_id) ? ((int) $this->mode_reglement_id) :
"null").
",";
1314 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? ((int) $this->cond_reglement_id) :
"null").
",";
1315 $sql .=
" date_lim_reglement=".(dol_strlen((
string) $this->date_echeance) != 0 ?
"'".$this->db->idate($this->date_echeance).
"'" :
'null').
",";
1316 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
1317 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
1318 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
1319 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null");
1320 $sql .=
" WHERE rowid=".((int) $this->
id);
1324 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
1325 $resql = $this->db->query($sql);
1330 if ($this->db->errno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1331 $this->errors[] = $langs->trans(
'ErrorRefAlreadyExists');
1333 $this->errors[] =
"Error ".$this->db->lasterror();
1344 if (!$error && !$notrigger) {
1346 $result = $this->call_trigger(
'BILL_SUPPLIER_MODIFY', $user);
1355 foreach ($this->errors as $errmsg) {
1356 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1357 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1359 $this->db->rollback();
1362 $this->db->commit();
1377 global
$conf, $langs;
1379 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1380 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
1385 $result = $remise->fetch($idremise);
1388 if ($remise->fk_invoice_supplier) {
1389 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
1390 $this->db->rollback();
1395 $facligne->fk_facture_fourn = $this->id;
1396 $facligne->fk_remise_except = $remise->id;
1397 $facligne->desc = $remise->description;
1398 $facligne->vat_src_code = $remise->vat_src_code;
1399 $facligne->tva_tx = $remise->tva_tx;
1400 $facligne->localtax1_tx = $remise->localtax1_tx;
1401 $facligne->localtax1_type = $remise->localtax1_type;
1402 $facligne->localtax2_tx = $remise->localtax1_tx;
1403 $facligne->localtax2_type = $remise->localtax1_type;
1404 $facligne->subprice = -(float) $remise->amount_ht;
1405 $facligne->fk_product = 0;
1406 $facligne->product_type = 0;
1408 $facligne->remise_percent = 0;
1409 $facligne->rang = -1;
1410 $facligne->info_bits = 2;
1413 $facligne->rang = 1;
1414 $linecount = count($this->lines);
1415 for ($ii = 1; $ii <= $linecount; $ii++) {
1421 if ($remise->fk_invoice_supplier_source > 0) {
1423 $srcinvoice->fetch($remise->fk_invoice_supplier_source);
1424 $totalcostpriceofinvoice = 0;
1425 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmargin.class.php';
1427 $arraytmp = $formmargin->getMarginInfosArray($srcinvoice,
false);
1428 $facligne->pa_ht = $arraytmp[
'pa_total'];
1431 $facligne->total_ht = -(float) $remise->amount_ht;
1432 $facligne->total_tva = -(float) $remise->amount_tva;
1433 $facligne->total_ttc = -(float) $remise->amount_ttc;
1434 $facligne->total_localtax1 = -(float) $remise->total_localtax1;
1435 $facligne->total_localtax2 = -(float) $remise->total_localtax2;
1437 $facligne->multicurrency_subprice = -$remise->multicurrency_subprice;
1438 $facligne->multicurrency_total_ht = -$remise->multicurrency_total_ht;
1439 $facligne->multicurrency_total_tva = -$remise->multicurrency_total_tva;
1440 $facligne->multicurrency_total_ttc = -$remise->multicurrency_total_ttc;
1442 $lineid = $facligne->insert();
1447 $result = $remise->link_to_invoice($lineid, 0);
1449 $this->error = $remise->error;
1450 $this->db->rollback();
1454 $this->db->commit();
1457 $this->error = $facligne->error;
1458 $this->db->rollback();
1462 $this->error = $facligne->error;
1463 $this->db->rollback();
1467 $this->db->rollback();
1480 public function delete(
User $user, $notrigger = 0)
1486 dol_syslog(
"FactureFournisseur::delete rowid=".$rowid, LOG_DEBUG);
1491 dol_syslog(get_class($this).
"::delete refused, invoice is not erasable (code ".$result.
")", LOG_WARNING);
1500 $result = $this->call_trigger(
'BILL_SUPPLIER_DELETE', $user);
1502 $this->db->rollback();
1509 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"categorie_supplier_invoice";
1510 $sql .=
" WHERE fk_supplier_invoice = ".((int) $this->
id);
1512 $result = $this->db->query($sql);
1515 $this->error = $this->db->lasterror();
1516 $this->errors[] = $this->error;
1521 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'societe_remise_except';
1522 $sql .=
' WHERE fk_invoice_supplier_source = '.((int) $rowid);
1523 $sql .=
' AND fk_invoice_supplier_line IS NULL';
1524 $resql = $this->db->query($sql);
1528 $list_rowid_det = array();
1529 foreach ($this->lines as $key => $invoiceline) {
1530 $list_rowid_det[] = $invoiceline->id;
1534 if (count($list_rowid_det)) {
1535 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
1536 $sql .=
' SET fk_invoice_supplier = NULL, fk_invoice_supplier_line = NULL';
1537 $sql .=
' WHERE fk_invoice_supplier_line IN ('.$this->db->sanitize(implode(
',', $list_rowid_det)).
')';
1539 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1540 if (!$this->db->query($sql)) {
1547 $sql_main_table = MAIN_DB_PREFIX.
'facture_fourn_det';
1548 $sql_ef_table = $sql_main_table.
"_extrafields";
1549 $sqlef =
"DELETE FROM $sql_ef_table WHERE fk_object IN (SELECT rowid FROM ".$sql_main_table.
" WHERE fk_facture_fourn = ".((int) $rowid).
")";
1550 $resqlef = $this->db->query($sqlef);
1551 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'facture_fourn_det WHERE fk_facture_fourn = '.((int) $rowid);
1552 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1553 $resql = $this->db->query($sql);
1554 if ($resqlef && $resql) {
1555 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'facture_fourn WHERE rowid = '.((int) $rowid);
1556 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1557 $resql2 = $this->db->query($sql);
1581 if ($conf->fournisseur->facture->dir_output && !empty($ref)) {
1582 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1584 $dir =
$conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$ref;
1585 $file = $dir.
"/".$ref.
".pdf";
1586 if (file_exists($file)) {
1588 $this->error =
'ErrorFailToDeleteFile';
1592 if (file_exists($dir)) {
1596 $this->error =
'ErrorFailToDeleteDir';
1608 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
1613 dol_syslog(get_class($this).
"::delete $this->id by $user->id", LOG_DEBUG);
1614 $this->db->commit();
1617 $this->error = $this->db->lasterror();
1618 $this->db->rollback();
1635 public function set_paid($user, $close_code =
'', $close_note =
'')
1638 dol_syslog(get_class($this).
"::set_paid is deprecated, use setPaid instead", LOG_NOTICE);
1639 return $this->
setPaid($user, $close_code, $close_note);
1650 public function setPaid($user, $close_code =
'', $close_note =
'')
1654 if ($this->paid != 1) {
1659 dol_syslog(
"FactureFournisseur::setPaid", LOG_DEBUG);
1661 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn SET';
1662 $sql .=
' fk_statut = '.self::STATUS_CLOSED;
1667 $sql .=
", close_code='".$this->db->escape($close_code).
"'";
1670 $sql .=
", close_note='".$this->db->escape($close_note).
"'";
1672 $sql .=
', fk_user_closing = '.((int) $user->id);
1673 $sql .=
", date_closing = '".$this->db->idate($now).
"'";
1674 $sql .=
' WHERE rowid = '.((int) $this->
id);
1676 $resql = $this->db->query($sql);
1679 $result = $this->call_trigger(
'BILL_SUPPLIER_PAYED', $user);
1686 $this->error = $this->db->error();
1691 $this->db->commit();
1694 $this->db->rollback();
1716 dol_syslog(get_class($this).
"::set_unpaid is deprecated, use setUnpaid instead", LOG_NOTICE);
1734 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn';
1735 $sql .=
' SET paye=0, fk_statut='.self::STATUS_VALIDATED.
', close_code=null, close_note=null,';
1736 $sql .=
' date_closing=null,';
1737 $sql .=
' fk_user_closing=null';
1738 $sql .=
' WHERE rowid = '.((int) $this->
id);
1740 dol_syslog(get_class($this).
"::set_unpaid", LOG_DEBUG);
1741 $resql = $this->db->query($sql);
1744 $result = $this->call_trigger(
'BILL_SUPPLIER_UNPAYED', $user);
1751 $this->error = $this->db->error();
1756 $this->db->commit();
1759 $this->db->rollback();
1774 public function setCanceled($user, $close_code =
'', $close_note =
'')
1776 dol_syslog(get_class($this).
"::setCanceled rowid=".((
int) $this->
id), LOG_DEBUG);
1780 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'facture_fourn SET';
1781 $sql .=
' fk_statut='.self::STATUS_ABANDONED;
1783 $sql .=
", close_code='".$this->db->escape($close_code).
"'";
1786 $sql .=
", close_note='".$this->db->escape($close_note).
"'";
1788 $sql .=
" WHERE rowid = ".((int) $this->
id);
1790 $resql = $this->db->query($sql);
1794 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
1795 $sql .=
' SET fk_invoice_supplier = NULL';
1796 $sql .=
' WHERE fk_invoice_supplier = '.((int) $this->
id);
1798 $resql = $this->db->query($sql);
1801 $result = $this->call_trigger(
'BILL_SUPPLIER_CANCEL', $user);
1803 $this->db->rollback();
1808 $this->db->commit();
1811 $this->error = $this->db->error().
" sql=".$sql;
1812 $this->db->rollback();
1816 $this->error = $this->db->error().
" sql=".$sql;
1817 $this->db->rollback();
1831 public function validate($user, $force_number =
'', $idwarehouse = 0, $notrigger = 0)
1835 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1840 dol_syslog(get_class($this).
'::validate user='.$user->id.
', force_number='.$force_number.
', idwarehouse='.$idwarehouse);
1847 if ($this->
status > self::STATUS_DRAFT) {
1848 dol_syslog(get_class($this).
"::validate no draft status", LOG_WARNING);
1851 if (preg_match(
'/^'.preg_quote($langs->trans(
"CopyOf").
' ',
'/').
'/', $this->ref_supplier)) {
1852 $langs->load(
"errors");
1853 $this->error = $langs->trans(
"ErrorFieldFormat", $langs->transnoentities(
"RefSupplier")).
'. '.$langs->trans(
'RemoveString', $langs->transnoentitiesnoconv(
"CopyOf"));
1856 if (count($this->lines) <= 0) {
1857 $langs->load(
"errors");
1858 $this->error = $langs->trans(
"ErrorObjectMustHaveLinesToBeValidated", $this->
ref);
1863 if (!empty($this->thirdparty) && is_object($this->thirdparty)) {
1864 $array_to_check = array(
'IDPROF1',
'IDPROF2',
'IDPROF3',
'IDPROF4',
'IDPROF5',
'IDPROF6',
'EMAIL',
'ACCOUNTANCY_CODE_SUPPLIER');
1865 foreach ($array_to_check as $key) {
1866 $keymin = strtolower($key);
1867 if ($keymin ==
'accountancy_code_supplier') {
1868 $keymin =
'code_compta_fournisseur';
1870 if (!property_exists($this->thirdparty, $keymin)) {
1873 $vallabel = $this->thirdparty->$keymin;
1875 $i = (int) preg_replace(
'/[^0-9]/',
'', $key);
1877 if ($this->thirdparty->isACompany()) {
1879 if (
$mysoc->country_id > 0 && $this->thirdparty->country_id ==
$mysoc->country_id) {
1880 $idprof_mandatory =
'SOCIETE_'.$key.
'_INVOICE_MANDATORY';
1882 $langs->load(
"errors");
1883 $this->error = $langs->trans(
'ErrorProdIdIsMandatory', $langs->transcountry(
'ProfId'.$i, $this->thirdparty->country_code)).
' ('.$langs->trans(
"ForbiddenBySetupRules").
') ['.$langs->trans(
'Company').
' : '.$this->thirdparty->name.
']';
1884 dol_syslog(__METHOD__.
' '.$this->error, LOG_ERR);
1890 if ($key ==
'EMAIL') {
1893 $langs->load(
"errors");
1894 $this->error = $langs->trans(
"ErrorBadEMail", $this->thirdparty->email).
' ('.$langs->trans(
"ForbiddenBySetupRules").
') ['.$langs->trans(
'Company').
' : '.$this->thirdparty->name.
']';
1895 dol_syslog(__METHOD__.
' '.$this->error, LOG_ERR);
1898 } elseif ($key ==
'ACCOUNTANCY_CODE_SUPPLIER') {
1900 if (
getDolGlobalString(
'SOCIETE_ACCOUNTANCY_CODE_SUPPLIER_INVOICE_MANDATORY') && empty($this->thirdparty->code_compta_fournisseur)) {
1901 $langs->load(
"errors");
1902 $this->error = $langs->trans(
"ErrorAccountancyCodeSupplierIsMandatory", $this->thirdparty->name).
' ('.$langs->trans(
"ForbiddenBySetupRules").
')';
1903 dol_syslog(__METHOD__.
' '.$this->error, LOG_ERR);
1914 if ($force_number) {
1915 $num = $force_number;
1916 } elseif (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1923 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn";
1924 $sql .=
" SET ref='".$this->db->escape($num).
"', fk_statut = 1, fk_user_valid = ".((int) $user->id).
", date_valid = '".$this->db->idate($now).
"'";
1925 $sql .=
" WHERE rowid = ".((int) $this->
id);
1927 dol_syslog(get_class($this).
"::validate", LOG_DEBUG);
1928 $resql = $this->db->query($sql);
1932 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
1933 $langs->load(
"agenda");
1935 $cpt = count($this->lines);
1936 for ($i = 0; $i < $cpt; $i++) {
1937 if ($this->lines[$i]->fk_product > 0) {
1939 $mouvP->origin = &$this;
1940 $mouvP->setOrigin($this->element, $this->
id);
1942 $up_ht_disc = $this->lines[$i]->subprice;
1943 if (!empty($this->lines[$i]->remise_percent) && !
getDolGlobalString(
'STOCK_EXCLUDE_DISCOUNT_FOR_PMP')) {
1944 $up_ht_disc =
price2num($up_ht_disc * (100 - $this->lines[$i]->remise_percent) / 100,
'MU');
1947 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans(
"InvoiceValidatedInDolibarr", $num));
1949 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans(
"InvoiceValidatedInDolibarr", $num));
1960 if (empty($notrigger)) {
1962 $result = $this->call_trigger(
'BILL_SUPPLIER_VALIDATE', $user);
1970 $this->oldref = $this->ref;
1973 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1975 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'fournisseur/facture/".$this->db->escape(
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier')).$this->db->escape($this->newref).
"'";
1976 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'fournisseur/facture/".$this->db->escape(
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier')).$this->db->escape($this->
ref).
"' and entity = ".((int)
$conf->entity);
1977 $resql = $this->db->query($sql);
1980 $this->error = $this->db->lasterror();
1982 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'fournisseur/facture/".$this->db->escape(
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier')).$this->db->escape($this->newref).
"'";
1983 $sql .=
" WHERE filepath = 'fournisseur/facture/".$this->db->escape(
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier')).$this->db->escape($this->
ref).
"' and entity = ".((int)
$conf->entity);
1984 $resql = $this->db->query($sql);
1987 $this->error = $this->db->lasterror();
1992 $dirsource =
$conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$oldref;
1993 $dirdest =
$conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$this->newref;
1994 if (!$error && file_exists($dirsource)) {
1995 dol_syslog(get_class($this).
"::validate rename dir ".$dirsource.
" into ".$dirdest);
1997 if (@rename($dirsource, $dirdest)) {
2000 $listoffiles =
dol_dir_list(
$conf->fournisseur->facture->dir_output.
'/'.
get_exdir($this->
id, 2, 0, 0, $this,
'invoice_supplier').$this->newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
2001 foreach ($listoffiles as $fileentry) {
2002 $dirsource = $fileentry[
'name'];
2003 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $this->newref, $dirsource);
2004 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
2005 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
2006 @rename($dirsource, $dirdest);
2015 $this->
ref = $this->newref;
2022 $this->db->commit();
2025 $this->db->rollback();
2029 $this->error = $this->db->error();
2030 $this->db->rollback();
2043 public function setDraft($user, $idwarehouse = -1, $notrigger = 0)
2046 global
$conf, $langs;
2050 if ($this->
status == self::STATUS_DRAFT) {
2051 dol_syslog(__METHOD__.
" already draft status", LOG_WARNING);
2059 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"facture_fourn";
2060 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
2061 $sql .=
" WHERE rowid = ".((int) $this->
id);
2063 $result = $this->db->query($sql);
2065 $this->oldcopy = clone $this;
2069 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
2070 $langs->load(
"agenda");
2072 $cpt = count($this->lines);
2073 for ($i = 0; $i < $cpt; $i++) {
2074 if ($this->lines[$i]->fk_product > 0) {
2076 $mouvP->origin = &$this;
2077 $mouvP->setOrigin($this->element, $this->
id);
2080 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"InvoiceBackToDraftInDolibarr", $this->ref));
2082 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"InvoiceBackToDraftInDolibarr", $this->ref));
2088 if (empty($notrigger)) {
2090 $result = $this->call_trigger(
'BILL_SUPPLIER_UNVALIDATE', $user);
2097 $this->db->commit();
2100 $this->db->rollback();
2104 $this->error = $this->db->error();
2105 $this->db->rollback();
2145 public function addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_product = 0, $remise_percent = 0,
$date_start = 0, $date_end = 0, $fk_code_ventilation = 0, $info_bits = 0, $price_base_type =
'HT', $type = 0, $rang = -1, $notrigger = 0, $array_options = [], $fk_unit =
null, $origin_id = 0, $pu_devise = 0, $ref_supplier =
'', $special_code = 0, $fk_parent_line = 0, $fk_remise_except = 0, $origin_type =
'')
2149 dol_syslog(get_class($this).
"::addline $desc,$pu,$qty,$txtva,$fk_product,$remise_percent,$date_start,$date_end,$fk_code_ventilation,$info_bits,$price_base_type,$type,$fk_unit,fk_remise_except=$fk_remise_except", LOG_DEBUG);
2150 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2152 if ($this->
status == self::STATUS_DRAFT) {
2154 if (empty($remise_percent)) {
2155 $remise_percent = 0;
2160 if (empty($info_bits)) {
2166 if (empty($fk_code_ventilation)) {
2167 $fk_code_ventilation = 0;
2169 if (empty($txtva)) {
2172 if (empty($txlocaltax1)) {
2175 if (empty($txlocaltax2)) {
2179 $remise_percent =
price2num($remise_percent);
2182 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
2189 $langs->load(
"errors");
2190 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
2196 if ($fk_product > 0) {
2197 if (
getDolGlobalInt(
'SUPPLIER_INVOICE_WITH_PREDEFINED_PRICES_ONLY') == 1) {
2199 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
2201 if (
$prod->fetch($fk_product) > 0) {
2202 $product_type =
$prod->type;
2203 $label =
$prod->label;
2204 $fk_prod_fourn_price = 0;
2208 $result =
$prod->get_buyprice($fk_prod_fourn_price, (
float) $qty, $fk_product,
'none', ($this->fk_soc ? $this->fk_soc : $this->socid));
2211 $pu =
$prod->fourn_pu;
2213 $ref_supplier =
$prod->ref_supplier;
2215 if ($remise_percent == 0 &&
$prod->remise_percent != 0) {
2216 $remise_percent =
$prod->remise_percent;
2220 $langs->load(
"errors");
2221 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
2222 $this->db->rollback();
2223 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
2228 if ($result == -1) {
2229 $langs->load(
"errors");
2230 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
2231 $this->db->rollback();
2232 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
2236 $this->error =
$prod->error;
2237 $this->db->rollback();
2238 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
2242 $this->error =
$prod->error;
2243 $this->db->rollback();
2248 $product_type = $type;
2260 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
2261 $vat_src_code = $reg[1];
2262 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
2269 $tabprice =
calcul_price_total((
float) $qty, $pu, (
float) $remise_percent, $txtva, (
float) $txlocaltax1, (
float) $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_devise);
2270 $total_ht = $tabprice[0];
2271 $total_tva = $tabprice[1];
2272 $total_ttc = $tabprice[2];
2273 $total_localtax1 = $tabprice[9];
2274 $total_localtax2 = $tabprice[10];
2275 $pu_ht = $tabprice[3];
2278 $multicurrency_total_ht = $tabprice[16];
2279 $multicurrency_total_tva = $tabprice[17];
2280 $multicurrency_total_ttc = $tabprice[18];
2281 $pu_ht_devise = $tabprice[19];
2290 $rang = $rangmax + 1;
2295 $apply_abs_price_on_credit_note =
false;
2297 $apply_abs_price_on_credit_note =
true;
2303 $supplierinvoiceline->context = $this->context;
2305 $supplierinvoiceline->fk_facture_fourn = $this->id;
2307 $supplierinvoiceline->desc = $desc;
2308 $supplierinvoiceline->ref_supplier = $ref_supplier;
2310 $supplierinvoiceline->qty = ($this->
type == self::TYPE_CREDIT_NOTE ? abs((
float) $qty) : (float) $qty);
2311 $supplierinvoiceline->subprice = ($apply_abs_price_on_credit_note ? -abs((
float) $pu_ht) : (float) $pu_ht);
2313 $supplierinvoiceline->vat_src_code = $vat_src_code;
2314 $supplierinvoiceline->tva_tx = $txtva;
2315 $supplierinvoiceline->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
2316 $supplierinvoiceline->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
2317 $supplierinvoiceline->localtax1_type = empty($localtaxes_type[0]) ? 0 : $localtaxes_type[0];
2318 $supplierinvoiceline->localtax2_type = empty($localtaxes_type[2]) ? 0 : $localtaxes_type[2];
2320 $supplierinvoiceline->total_ht = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $total_ht) : (float) $total_ht);
2321 $supplierinvoiceline->total_tva = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $total_tva) : (float) $total_tva);
2322 $supplierinvoiceline->total_localtax1 = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $total_localtax1) : (float) $total_localtax1);
2323 $supplierinvoiceline->total_localtax2 = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $total_localtax2) : (float) $total_localtax2);
2324 $supplierinvoiceline->total_ttc = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $total_ttc) : (float) $total_ttc);
2326 $supplierinvoiceline->fk_product = $fk_product;
2327 $supplierinvoiceline->product_type = $type;
2328 $supplierinvoiceline->remise_percent = $remise_percent;
2330 $supplierinvoiceline->date_end = $date_end;
2331 $supplierinvoiceline->fk_code_ventilation = $fk_code_ventilation;
2332 $supplierinvoiceline->rang = $rang;
2333 $supplierinvoiceline->info_bits = $info_bits;
2334 $supplierinvoiceline->fk_remise_except = $fk_remise_except;
2337 $supplierinvoiceline->special_code = (int) $special_code;
2338 $supplierinvoiceline->fk_parent_line = $fk_parent_line;
2339 $supplierinvoiceline->origin = $this->origin;
2340 $supplierinvoiceline->origin_type = $origin_type;
2341 $supplierinvoiceline->origin_id = $origin_id;
2342 $supplierinvoiceline->fk_unit = $fk_unit;
2345 $supplierinvoiceline->fk_multicurrency = $this->fk_multicurrency;
2346 $supplierinvoiceline->multicurrency_code = $this->multicurrency_code;
2347 $supplierinvoiceline->multicurrency_subprice = ($apply_abs_price_on_credit_note ? -abs((
float) $pu_ht_devise) : (float) $pu_ht_devise);
2349 $supplierinvoiceline->multicurrency_total_ht = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $multicurrency_total_ht) : (float) $multicurrency_total_ht);
2350 $supplierinvoiceline->multicurrency_total_tva = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $multicurrency_total_tva) : (float) $multicurrency_total_tva);
2351 $supplierinvoiceline->multicurrency_total_ttc = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $multicurrency_total_ttc) : (float) $multicurrency_total_ttc);
2353 if (is_array($array_options) && count($array_options) > 0) {
2354 $supplierinvoiceline->array_options = $array_options;
2357 $result = $supplierinvoiceline->insert($notrigger);
2360 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
2363 if (!isset($this->context[
'createfromclone'])) {
2364 if (!empty($fk_parent_line)) {
2367 } elseif ($rang > 0 && $rang <= count($this->lines)) {
2369 $linecount = count($this->lines);
2370 for ($ii = $rang; $ii <= $linecount; $ii++) {
2375 $this->lines[] = $supplierinvoiceline;
2378 $this->db->commit();
2379 return $supplierinvoiceline->id;
2381 $this->error = $this->db->error();
2382 $this->db->rollback();
2386 $this->error = $supplierinvoiceline->error;
2387 $this->errors = $supplierinvoiceline->errors;
2388 $this->db->rollback();
2421 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 = 0,
$date_start =
'', $date_end =
'', $array_options = [], $fk_unit =
null, $pu_devise = 0, $ref_supplier =
'', $rang = 0)
2425 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);
2426 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2430 $remise_percent = (float)
price2num($remise_percent);
2440 $langs->load(
"errors");
2441 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
2446 if (empty($vatrate)) {
2449 if (empty($txlocaltax1)) {
2452 if (empty($txlocaltax2)) {
2456 $txlocaltax1 = (float)
price2num($txlocaltax1);
2457 $txlocaltax2 = (float)
price2num($txlocaltax2);
2469 if (preg_match(
'/\((.*)\)/', (
string) $vatrate, $reg)) {
2470 $vat_src_code = $reg[1];
2471 $vatrate = preg_replace(
'/\s*\(.*\)/',
'', (
string) $vatrate);
2474 $tabprice =
calcul_price_total((
float) $qty, (
float) $pu, $remise_percent, $vatrate, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, (
float) $pu_devise);
2475 $total_ht = $tabprice[0];
2476 $total_tva = $tabprice[1];
2477 $total_ttc = $tabprice[2];
2478 $pu_ht = $tabprice[3];
2479 $pu_tva = $tabprice[4];
2480 $pu_ttc = $tabprice[5];
2481 $total_localtax1 = $tabprice[9];
2482 $total_localtax2 = $tabprice[10];
2485 $multicurrency_total_ht = $tabprice[16];
2486 $multicurrency_total_tva = $tabprice[17];
2487 $multicurrency_total_ttc = $tabprice[18];
2488 $pu_ht_devise = $tabprice[19];
2490 if (empty($info_bits)) {
2497 $line->fetch_optionals();
2499 $staticline = clone $line;
2502 $product =
new Product($this->db);
2503 $result = $product->fetch($idproduct);
2504 $product_type = $product->type;
2506 $idproduct = $staticline->fk_product;
2507 $product_type = $type;
2510 $line->oldline = $staticline;
2511 $line->context = $this->context;
2515 $apply_abs_price_on_credit_note =
false;
2517 $apply_abs_price_on_credit_note =
true;
2520 $line->description = $desc;
2521 $line->desc = $desc;
2523 $line->qty = ($this->
type == self::TYPE_CREDIT_NOTE ? abs((
float) $qty) : (float) $qty);
2525 $line->subprice = ($apply_abs_price_on_credit_note ? -abs((
float) $pu_ht) : (float) $pu_ht);
2526 $line->pu_ht = $line->subprice;
2527 $line->subprice_ttc = ($apply_abs_price_on_credit_note ? -abs((
float) $pu_ttc) : (float) $pu_ttc);
2528 $line->pu_ttc = $line->subprice_ttc;
2530 $line->remise_percent = $remise_percent;
2531 $line->ref_supplier = $ref_supplier;
2534 $line->date_end = $date_end;
2536 $line->vat_src_code = $vat_src_code;
2537 $line->tva_tx = $vatrate;
2538 $line->localtax1_tx = $txlocaltax1;
2539 $line->localtax2_tx = $txlocaltax2;
2540 $line->localtax1_type = empty($localtaxes_type[0]) ? 0 : $localtaxes_type[0];
2541 $line->localtax2_type = empty($localtaxes_type[2]) ? 0 : $localtaxes_type[2];
2543 $line->total_ht = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $total_ht) : (float) $total_ht);
2544 $line->total_tva = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $total_tva) : (float) $total_tva);
2545 $line->total_localtax1 = (float) $total_localtax1;
2546 $line->total_localtax2 = (float) $total_localtax2;
2547 $line->total_ttc = (($apply_abs_price_on_credit_note || $qty < 0) ? -abs((
float) $total_ttc) : (float) $total_ttc);
2549 $line->fk_product = $idproduct;
2550 $line->product_type = $product_type;
2551 $line->info_bits = $info_bits;
2552 $line->fk_unit = $fk_unit;
2553 $line->rang = $rang;
2555 if (is_array($array_options) && count($array_options) > 0) {
2557 foreach ($array_options as $key => $value) {
2558 $line->array_options[$key] = $array_options[$key];
2563 $line->multicurrency_subprice = (float) $pu_ht_devise;
2564 $line->multicurrency_total_ht = (float) $multicurrency_total_ht;
2565 $line->multicurrency_total_tva = (float) $multicurrency_total_tva;
2566 $line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
2568 $res = $line->update($notrigger);
2574 $res = $this->
update_price(1,
'auto', 0, $this->thirdparty);
2596 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'societe_remise_except';
2597 $sql .=
' SET fk_invoice_supplier_line = NULL';
2598 $sql .=
' WHERE fk_invoice_supplier_line = '.((int) $rowid);
2600 dol_syslog(get_class($this).
"::deleteline", LOG_DEBUG);
2601 $result = $this->db->query($sql);
2603 $this->error = $this->db->error();
2604 $this->db->rollback();
2610 if ($line->fetch($rowid) < 1) {
2614 $res = $line->delete($notrigger);
2617 $this->errors[] = $line->error;
2618 $this->db->rollback();
2624 $this->db->commit();
2627 $this->db->rollback();
2628 $this->error = $this->db->lasterror();
2643 $sql =
'SELECT c.rowid, datec, tms as datem, ';
2644 $sql .=
' fk_user_author, fk_user_modif, fk_user_valid';
2645 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as c';
2646 $sql .=
' WHERE c.rowid = '.((int) $id);
2648 $result = $this->db->query($sql);
2650 if ($this->db->num_rows($result)) {
2651 $obj = $this->db->fetch_object($result);
2653 $this->
id = $obj->rowid;
2655 $this->user_creation_id = $obj->fk_user_author;
2656 $this->user_validation_id = $obj->fk_user_valid;
2657 $this->user_modification_id = $obj->fk_user_modif;
2658 $this->date_creation = $this->db->jdate($obj->datec);
2659 $this->date_modification = $this->db->jdate($obj->datem);
2662 $this->db->free($result);
2684 $sql =
"SELECT f.rowid as rowid, f.ref, f.fk_statut,";
2685 $sql .=
" ff.rowid as rowidnext";
2686 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
2687 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON f.rowid = pf.fk_facturefourn";
2688 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"facture_fourn as ff ON f.rowid = ff.fk_facture_source";
2689 $sql .=
" WHERE (f.fk_statut = ".self::STATUS_VALIDATED.
" OR (f.fk_statut = ".self::STATUS_ABANDONED.
" AND f.close_code = '".self::CLOSECODE_ABANDONED.
"'))";
2690 $sql .=
" AND f.entity = ".((int)
$conf->entity);
2691 $sql .=
" AND f.paye = 0";
2692 $sql .=
" AND pf.fk_paiementfourn IS NULL";
2693 $sql .=
" AND ff.fk_statut IS NULL";
2695 $sql .=
" AND f.fk_soc = ".((int) $socid);
2697 $sql .=
" ORDER BY f.ref";
2699 dol_syslog(get_class($this).
"::list_replacable_supplier_invoices", LOG_DEBUG);
2700 $resql = $this->db->query($sql);
2702 while ($obj = $this->db->fetch_object($resql)) {
2703 $return[$obj->rowid] = array(
2704 'id' => $obj->rowid,
2706 'status' => $obj->fk_statut
2712 $this->error = $this->db->error();
2733 $sql =
"SELECT f.rowid as rowid, f.ref, f.fk_statut, f.type, f.subtype, f.paye as paid, pf.fk_paiementfourn";
2734 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
2735 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON f.rowid = pf.fk_facturefourn";
2736 $sql .=
" WHERE f.entity = ".((int)
$conf->entity);
2737 $sql .=
" AND f.fk_statut in (".self::STATUS_VALIDATED.
",".self::STATUS_CLOSED.
")";
2738 $sql .=
" AND NOT EXISTS (SELECT rowid from ".MAIN_DB_PREFIX.
"facture_fourn as ff WHERE f.rowid = ff.fk_facture_source";
2739 $sql .=
" AND ff.type=".self::TYPE_REPLACEMENT.
")";
2740 $sql .=
" AND f.type != ".self::TYPE_CREDIT_NOTE;
2742 $sql .=
" AND f.fk_soc = ".((int) $socid);
2744 $sql .=
" ORDER BY f.ref";
2746 dol_syslog(get_class($this).
"::list_qualified_avoir_supplier_invoices", LOG_DEBUG);
2747 $resql = $this->db->query($sql);
2749 while ($obj = $this->db->fetch_object($resql)) {
2751 if ($obj->fk_statut == self::STATUS_VALIDATED) {
2754 if ($obj->fk_statut == self::STATUS_CLOSED) {
2758 $paymentornot = ($obj->fk_paiementfourn ? 1 : 0);
2759 $return[$obj->rowid] = array(
'ref' => (
string) $obj->ref,
'status' => (
int) $obj->fk_statut,
'type' => (
int) $obj->type,
'paid' => (
int) $obj->paid,
'paye' => (
int) $obj->paid,
'paymentornot' => (
int) $paymentornot);
2765 $this->error = $this->db->error();
2780 global
$conf, $langs;
2782 $sql =
'SELECT ff.rowid, ff.date_lim_reglement as datefin, ff.fk_statut as status, ff.total_ht, ff.total_ttc';
2783 $sql .=
' FROM '.MAIN_DB_PREFIX.
'facture_fourn as ff';
2784 if (empty($user->socid) && !$user->hasRight(
"societe",
"client",
"voir")) {
2785 $sql .=
" JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON ff.fk_soc = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2787 $sql .=
' WHERE ff.paye = 0';
2788 $sql .=
" AND ff.fk_statut IN (".self::STATUS_VALIDATED.
")";
2789 $sql .=
" AND ff.entity = ".((int)
$conf->entity);
2791 $sql .=
' AND ff.fk_soc = '.((int) $user->socid);
2794 $resql = $this->db->query($sql);
2796 $langs->load(
"bills");
2800 $response->warning_delay =
$conf->facture->fournisseur->warning_delay / 60 / 60 / 24;
2801 $response->label = $langs->trans(
"SupplierBillsToPay");
2802 $response->labelShort = $langs->trans(
"StatusToPay");
2804 $response->url = DOL_URL_ROOT.
'/fourn/facture/list.php?search_status=1&mainmenu=billing&leftmenu=suppliers_bills';
2805 $response->img =
img_object($langs->trans(
"Bills"),
"bill");
2809 while ($obj = $this->db->fetch_object($resql)) {
2810 $facturestatic->date_echeance = $this->db->jdate($obj->datefin);
2811 $facturestatic->statut = $obj->status;
2812 $facturestatic->status = $obj->status;
2814 $response->nbtodo++;
2815 $response->total += (float) $obj->total_ht;
2817 if ($facturestatic->hasDelay()) {
2818 $response->nbtodolate++;
2819 $response->url_late = DOL_URL_ROOT.
'/fourn/facture/list.php?search_option=late&mainmenu=billing&leftmenu=suppliers_bills';
2823 $this->db->free($resql);
2827 $this->error = $this->db->error();
2843 $langs->load(
'bills');
2846 $moretitle = $params[
'moretitle'] ??
'';
2848 $picto = $this->picto;
2849 if ($this->
type == self::TYPE_REPLACEMENT) {
2852 if ($this->
type == self::TYPE_CREDIT_NOTE) {
2855 if ($this->
type == self::TYPE_DEPOSIT) {
2859 $datas[
'picto'] =
img_picto(
'', $picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierInvoice").
'</u>';
2860 if ($this->
type == self::TYPE_REPLACEMENT) {
2861 $datas[
'picto'] .=
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"InvoiceReplacement").
'</u>';
2862 } elseif ($this->
type == self::TYPE_CREDIT_NOTE) {
2863 $datas[
'picto'] .=
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"CreditNote").
'</u>';
2864 } elseif ($this->
type == self::TYPE_DEPOSIT) {
2865 $datas[
'picto'] .=
'<u class="paddingrightonly">'.$langs->transnoentitiesnoconv(
"Deposit").
'</u>';
2867 if (isset($this->
status)) {
2869 if (isset($this->totalpaid)) {
2870 $alreadypaid = $this->totalpaid;
2873 $datas[
'picto'] .=
' '.$this->getLibStatut(5, $alreadypaid);
2876 $datas[
'picto'] .=
' - '.$moretitle;
2878 if (!empty($this->
ref)) {
2879 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2881 if (!empty($this->ref_supplier)) {
2882 $datas[
'refsupplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_supplier;
2884 if (!empty($this->label)) {
2885 $datas[
'label'] =
'<br><b>'.$langs->trans(
'Label').
':</b> '.$this->label;
2887 if (!empty($this->
date)) {
2888 $datas[
'date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->
date,
'day');
2890 if (!empty($this->date_echeance)) {
2891 $datas[
'date_echeance'] =
'<br><b>'.$langs->trans(
'DateDue').
':</b> '.
dol_print_date($this->date_echeance,
'day');
2893 if (!empty($this->total_ht)) {
2894 $datas[
'amountht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1,
$conf->currency);
2896 if (!empty($this->total_tva)) {
2897 $datas[
'totaltva'] =
'<br><b>'.$langs->trans(
'AmountVAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1,
$conf->currency);
2899 if (!empty($this->total_localtax1) && $this->total_localtax1 != 0) {
2901 $datas[
'amountlt1'] =
'<br><b>'.$langs->transcountry(
'AmountLT1',
$mysoc->country_code).
':</b> '.
price($this->total_localtax1, 0, $langs, 0, -1, -1,
$conf->currency);
2903 if (!empty($this->total_localtax2) && $this->total_localtax2 != 0) {
2904 $datas[
'amountlt2'] =
'<br><b>'.$langs->transcountry(
'AmountLT2',
$mysoc->country_code).
':</b> '.
price($this->total_localtax2, 0, $langs, 0, -1, -1,
$conf->currency);
2906 if (!empty($this->revenuestamp)) {
2907 $datas[
'amountrevenustamp'] =
'<br><b>'.$langs->trans(
'RevenueStamp').
':</b> '.
price($this->revenuestamp, 0, $langs, 0, -1, -1,
$conf->currency);
2909 if (!empty($this->total_ttc)) {
2910 $datas[
'totalttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1,
$conf->currency);
2928 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $moretitle =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2930 global $langs, $user, $hookmanager;
2934 if ($option ==
'withdraw') {
2935 $url = DOL_URL_ROOT.
'/compta/facture/prelevement.php?facid='.$this->
id.
'&type=bank-transfer';
2936 } elseif ($option ==
'document') {
2937 $url = DOL_URL_ROOT.
'/fourn/facture/document.php?facid='.$this->id;
2939 $url = DOL_URL_ROOT.
'/fourn/facture/card.php?facid='.$this->id;
2946 if ($option !==
'nolink') {
2948 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2949 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2950 $add_save_lastsearch_values = 1;
2952 if ($add_save_lastsearch_values) {
2953 $url .=
'&save_lastsearch_values=1';
2957 $picto = $this->picto;
2958 if ($this->
type == self::TYPE_REPLACEMENT) {
2961 if ($this->
type == self::TYPE_CREDIT_NOTE) {
2964 if ($this->
type == self::TYPE_DEPOSIT) {
2970 'objecttype' => $this->element,
2971 'option' => $option,
2972 'moretitle' => $moretitle,
2974 $classfortooltip =
'classfortooltip';
2977 $classfortooltip =
'classforajaxtooltip';
2978 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2990 if (empty($notooltip)) {
2992 $label = $langs->trans(
"ShowSupplierInvoice");
2993 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
2995 $linkclose .= ($label ?
' title="'.dolPrintHTMLForAttribute($label).
'"' :
' title="tocomplete"');
2996 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
2999 $linkstart =
'<a href="'.$url.
'"';
3000 $linkstart .= $linkclose.
'>';
3003 $result .= $linkstart;
3005 $result .=
img_object(($notooltip ?
'' : $label), ($picto ? $picto :
'generic'), ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'"'), 0, 0, $notooltip ? 0 : 1);
3007 if ($withpicto != 2) {
3008 $result .= ($max ?
dol_trunc($ref, $max) : $ref);
3010 $result .= $linkend;
3012 if ($addlinktonotes) {
3013 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
3016 $result .=
' <span class="note inline-block">';
3017 $result .=
'<a href="'.DOL_URL_ROOT.
'/fourn/facture/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
3020 $result .=
'</span>';
3024 $hookmanager->initHooks(array($this->element .
'dao'));
3025 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
3026 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
3028 $result = $hookmanager->resPrint;
3030 $result .= $hookmanager->resPrint;
3047 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
3048 return parent::setCategoriesCommon($categories, Categorie::TYPE_SUPPLIER_INVOICE);
3061 global $db, $langs,
$conf;
3062 $langs->load(
"orders");
3066 $conf->global->INVOICE_SUPPLIER_ADDON_NUMBER =
'mod_facture_fournisseur_cactus';
3075 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
3077 foreach ($dirmodels as $reldir) {
3078 $dir =
dol_buildpath($reldir.
"core/modules/supplier_invoice/");
3081 $mybool = ((bool) @include_once $dir.$file) || $mybool;
3089 $obj =
new $classname();
3090 '@phan-var-force ModeleNumRefSuppliersInvoices $obj';
3092 $numref = $obj->getNextValue($soc, $this, $mode);
3094 if ($numref !=
"") {
3097 $this->error = $obj->error;
3113 global $langs,
$conf;
3114 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
3122 $sql =
"SELECT rowid";
3123 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
3124 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
3125 $sql .= $this->db->plimit(100);
3127 $resql = $this->db->query($sql);
3129 $num_prods = $this->db->num_rows($resql);
3131 while ($i < $num_prods) {
3133 $row = $this->db->fetch_row($resql);
3134 $prodids[$i] = $row[0];
3140 $this->
ref =
'SPECIMEN';
3141 $this->ref_supplier =
'SUPPLIER_REF_SPECIMEN';
3142 $this->specimen = 1;
3145 $this->date_lim_reglement = $this->
date + 3600 * 24 * 30;
3146 $this->cond_reglement_code =
'RECEP';
3147 $this->mode_reglement_code =
'CHQ';
3149 $this->note_public =
'This is a comment (public)';
3150 $this->note_private =
'This is a comment (private)';
3152 $this->multicurrency_tx = 1;
3153 $this->multicurrency_code =
$conf->currency;
3156 if (empty($option) || $option !=
'nolines') {
3159 while ($xnbp < $nbp) {
3161 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
3163 $line->subprice = 100;
3165 $line->tva_tx = 19.6;
3166 $line->localtax1_tx = 0;
3167 $line->localtax2_tx = 0;
3169 $line->total_ht = 50;
3170 $line->total_ttc = 59.8;
3171 $line->total_tva = 9.8;
3172 $line->remise_percent = 50;
3174 $line->total_ht = 100;
3175 $line->total_ttc = 119.6;
3176 $line->total_tva = 19.6;
3177 $line->remise_percent = 0;
3180 if ($num_prods > 0) {
3181 $prodid = mt_rand(1, $num_prods);
3182 $line->fk_product = $prodids[$prodid];
3184 $line->product_type = 0;
3186 $this->lines[$xnbp] = $line;
3188 $this->total_ht += $line->total_ht;
3189 $this->total_tva += $line->total_tva;
3190 $this->total_ttc += $line->total_ttc;
3196 $this->total_ht = $xnbp * 100;
3197 $this->total_tva = $xnbp * 19.6;
3198 $this->total_ttc = $xnbp * 119.6;
3210 global
$conf, $user;
3212 $this->nb = array();
3216 $sql =
"SELECT count(f.rowid) as nb";
3217 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
3218 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON f.fk_soc = s.rowid";
3219 if (empty($user->socid) && !$user->hasRight(
"societe",
"client",
"voir")) {
3220 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
3221 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3224 $sql .=
" ".$clause.
" f.entity = ".((int)
$conf->entity);
3226 $resql = $this->db->query($sql);
3228 while ($obj = $this->db->fetch_object($resql)) {
3229 $this->nb[
"supplier_invoices"] = $obj->nb;
3231 $this->db->free($resql);
3235 $this->error = $this->db->error();
3250 global
$conf, $langs, $hookmanager;
3269 $object->ref_supplier = (empty($this->ref_supplier) ? $langs->trans(
"CopyOf").
' '.
$object->ref_supplier : $this->ref_supplier);
3271 $object->user_validation_id = 0;
3272 $object->fk_facture_source = 0;
3274 $object->date_validation =
'';
3276 $object->ref_client =
'';
3284 $object->date_echeance =
$object->calculate_date_lim_reglement();
3287 foreach (
$object->lines as $i => $line) {
3288 if (isset(
$object->lines[$i]->info_bits) && (
$object->lines[$i]->info_bits & 0x02) == 0x02) {
3294 $object->context[
'createfromclone'] =
'createfromclone';
3295 $result =
$object->create($user);
3299 $this->error =
$object->error;
3300 $this->errors =
$object->errors;
3306 if (is_object($hookmanager)) {
3307 $parameters = array(
'objFrom' => $objFrom);
3309 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
3317 unset(
$object->context[
'createfromclone']);
3321 $this->db->commit();
3324 $this->db->rollback();
3340 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
3344 $langs->load(
"suppliers");
3345 $outputlangs->load(
"products");
3348 if (empty($modele)) {
3354 } elseif ($modele ==
'auto') {
3355 $modele =
'canelle';
3358 if (empty($modele)) {
3361 $modelpath =
"core/modules/supplier_invoice/doc/";
3363 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
3375 return $user->hasRight(
"fournisseur",
"facture");
3423 if (!$this->date_echeance) {
3427 $status = isset($this->
status) ? $this->
status : $this->statut;
3429 return ($status == self::STATUS_VALIDATED) && ($this->date_echeance < ($now -
$conf->facture->fournisseur->warning_delay));
3441 $sql =
"SELECT fk_invoice_supplier FROM ".MAIN_DB_PREFIX.
"societe_remise_except WHERE fk_invoice_supplier_source = ".((int) $this->
id);
3442 $resql = $this->db->query($sql);
3443 if (!empty($resql)) {
3444 $obj = $this->db->fetch_object($resql);
3445 if (!empty($obj->fk_invoice_supplier)) {
3463 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3465 $picto = $this->picto;
3466 if ($this->
type == self::TYPE_REPLACEMENT) {
3469 if ($this->
type == self::TYPE_CREDIT_NOTE) {
3472 if ($this->
type == self::TYPE_DEPOSIT) {
3476 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3477 $return .=
'<div class="info-box info-box-sm">';
3478 $return .=
'<span class="info-box-icon bg-infobox-action">';
3480 $return .=
'</span>';
3481 $return .=
'<div class="info-box-content">';
3482 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">' . $this->
getNomUrl(1) .
'</span>';
3483 if ($selected >= 0) {
3484 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
3486 if (!empty($arraydata[
'thirdparty'])) {
3487 $return .=
'<br><span class="info-box-label">'.$arraydata[
'thirdparty'].
'</span>';
3489 if (!empty($this->
date)) {
3490 $return .=
'<br><span class="info-box-label">'.dol_print_date($this->
date,
'day').
'</span>';
3492 if (!empty($this->total_ht)) {
3493 $return .=
' <span class="info-box-label amount" title="'.dol_escape_htmltag($langs->trans(
"AmountHT")).
'">'.
price($this->total_ht);
3494 $return .=
' '.$langs->trans(
"HT");
3495 $return .=
'</span>';
3497 $alreadypaid = (empty($arraydata[
'alreadypaid']) ? 0 : $arraydata[
'alreadypaid']);
3498 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3, $alreadypaid).
'</div>';
3500 $return .=
'</div>';
3501 $return .=
'</div>';
3502 $return .=
'</div>';
3515 if (!$this->table_element) {
3516 dol_syslog(get_class($this).
"::setVATReverseCharge was called on object with property table_element not defined", LOG_ERR);
3520 dol_syslog(get_class($this).
'::setVATReverseCharge('.$vatreversecharge.
')');
3522 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3523 $sql .=
" SET vat_reverse_charge = ".((int) $vatreversecharge);
3524 $sql .=
" WHERE rowid=".((int) $this->
id);
3526 if ($this->db->query($sql)) {
3527 $this->vat_reverse_charge = ($vatreversecharge == 0) ? 0 : 1;
3530 dol_syslog(get_class($this).
'::setVATReverseCharge Error ', LOG_DEBUG);
3531 $this->error = $this->db->error();
3549 global
$conf, $langs, $user;
3556 $errorsMsg = array();
3558 $langs->load(
'bills');
3561 $this->output .= $langs->trans(
'ModuleNotEnabled', $langs->transnoentitiesnoconv(
'Suppliers'));
3564 if (!in_array($datetouse, array(
'duedate',
'invoicedate'))) {
3565 $this->output .=
'Bad value for parameter datetouse. Must be "duedate" or "invoicedate"';
3569 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3570 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
3571 require_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
3572 $formmail =
new FormMail($this->db);
3582 $sql =
"SELECT rowid as id FROM ".MAIN_DB_PREFIX.
"facture_fourn as f";
3583 if (!empty($paymentmode) && $paymentmode !=
'all') {
3584 $sql .=
", ".MAIN_DB_PREFIX.
"c_paiement as cp";
3586 $sql .=
" WHERE f.paye = 0";
3587 $sql .=
" AND f.fk_statut = ".self::STATUS_VALIDATED;
3588 if ($datetouse ==
'invoicedate') {
3589 $sql .=
" AND f.datef = '".$this->db->idate($tmpidate,
'gmt').
"'";
3591 $sql .=
" AND f.date_lim_reglement = '".$this->db->idate($tmpidate,
'gmt').
"'";
3593 $sql .=
" AND f.entity IN (".getEntity(
'supplier_invoice', 0).
")";
3594 if (!empty($paymentmode) && $paymentmode !=
'all') {
3595 $sql .=
" AND f.fk_mode_reglement = cp.id AND cp.code = '".$this->db->escape($paymentmode).
"'";
3598 if ($datetouse ==
'invoicedate') {
3599 $sql .= $this->db->order(
"datef",
"ASC");
3601 $sql .= $this->db->order(
"date_lim_reglement",
"ASC");
3604 $resql = $this->db->query($sql);
3607 if ($datetouse ==
'invoicedate') {
3608 $this->output .= $langs->transnoentitiesnoconv(
"SearchValidatedSupplierInvoicesWithDate", $stmpidate);
3610 $this->output .= $langs->transnoentitiesnoconv(
"SearchUnpaidSupplierInvoicesWithDueDate", $stmpidate);
3612 if (!empty($paymentmode) && $paymentmode !=
'all') {
3613 $this->output .=
' ('.$langs->transnoentitiesnoconv(
"PaymentMode").
' '.$paymentmode.
')';
3615 $this->output .=
'<br>';
3618 while ($obj = $this->db->fetch_object($resql)) {
3621 $res = $tmpinvoice->fetch($obj->id);
3623 $tmpinvoice->fetch_thirdparty();
3626 if ($tmpinvoice->thirdparty->default_lang) {
3627 $outputlangs->setDefaultLang($tmpinvoice->thirdparty->default_lang);
3628 $outputlangs->loadLangs(array(
"main",
"suppliers"));
3630 $outputlangs = $langs;
3635 $templateLabel =
'';
3636 if (empty($template) || $template ==
'EmailTemplateCode') {
3637 $templateLabel =
'(SendingReminderEmailOnUnpaidSupplierInvoice)';
3639 if (is_numeric($template)) {
3640 $templateId = $template;
3642 $templateLabel = $template;
3646 $arraymessage = $formmail->getEMailTemplate($this->db,
'invoice_supplier_send', $user, $outputlangs, $templateId, 1, $templateLabel);
3647 if (is_numeric($arraymessage) && $arraymessage <= 0) {
3648 $langs->load(
"errors");
3649 $this->output .= $langs->trans(
'ErrorFailedToFindEmailTemplate', $template);
3657 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0,
null, $tmpinvoice);
3662 $sendTopic =
make_substitutions(empty($arraymessage->topic) ? $outputlangs->transnoentitiesnoconv(
'InformationMessage') : $arraymessage->topic, $substitutionarray, $outputlangs, 1);
3665 $content = $outputlangs->transnoentitiesnoconv($arraymessage->content);
3671 if ($forcerecipient) {
3672 $to = array($forcerecipient);
3674 $res = $tmpinvoice->fetch_thirdparty();
3675 $recipient = $tmpinvoice->thirdparty;
3677 $tmparraycontact = $tmpinvoice->liste_contact(-1,
'internal', 0,
'SALESREPFOLL');
3678 if (is_array($tmparraycontact) && count($tmparraycontact) > 0) {
3679 foreach ($tmparraycontact as $data_email) {
3680 if (!empty($data_email[
'email'])) {
3681 $to[] = $data_email[
'email'];
3685 if (empty($to) && !empty($recipient->email)) {
3686 $to[] = $recipient->email;
3689 $errormesg =
"Failed to send remind to thirdparty id=".$tmpinvoice->socid.
". No email defined for supplier invoice or customer.";
3693 $errormesg =
"Failed to load recipient with thirdparty id=".$tmpinvoice->socid;
3700 if (!empty($arraymessage->email_from)) {
3701 $email_from = (
string) $arraymessage->email_from;
3703 if (empty($email_from)) {
3704 $errormesg =
"Failed to get sender into global setup MAIN_MAIL_EMAIL_FROM";
3708 if (!$error && !empty($to)) {
3711 $to = implode(
',', $to);
3712 if (!empty($arraymessage->email_to)) {
3713 $to = $to.
','.$arraymessage->email_to;
3719 $trackid =
'inv'.$tmpinvoice->id;
3720 $sendcontext =
'standard';
3723 if (!empty($arraymessage->email_tocc)) {
3724 $email_tocc = (
string) $arraymessage->email_tocc;
3728 if (!empty($arraymessage->email_tobcc)) {
3729 $email_tobcc = (
string) $arraymessage->email_tobcc;
3733 $cMailFile =
new CMailFile($sendTopic, $to, $email_from, $sendContent, array(), array(), array(), $email_tocc, $email_tobcc, 0, 1, $errors_to,
'', $trackid,
'', $sendcontext,
'');
3736 if ($cMailFile->sendfile()) {
3740 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
3745 $actioncomm->type_code =
'AC_OTH_AUTO';
3746 $actioncomm->socid = $tmpinvoice->thirdparty->id;
3747 $actioncomm->contact_id = 0;
3749 $actioncomm->code =
'AC_EMAIL';
3750 $actioncomm->label =
'sendEmailsRemindersOnInvoiceDueDateOK (nbdays='.$nbdays.
' paymentmode='.$paymentmode.
' template='.$template.
' datetouse='.$datetouse.
' forcerecipient='.$forcerecipient.
')';
3751 $actioncomm->note_private = $sendContent;
3752 $actioncomm->fk_project = $tmpinvoice->fk_project;
3753 $actioncomm->datep =
dol_now();
3754 $actioncomm->datef = $actioncomm->datep;
3755 $actioncomm->percentage = -1;
3756 $actioncomm->authorid = $user->id;
3757 $actioncomm->userownerid = $user->id;
3759 $actioncomm->email_msgid = $cMailFile->msgid;
3760 $actioncomm->email_subject = $sendTopic;
3761 $actioncomm->email_from = $email_from;
3762 $actioncomm->email_sender =
'';
3763 $actioncomm->email_to = $to;
3767 $actioncomm->errors_to = $errors_to;
3769 $actioncomm->elementtype =
'invoice_supplier';
3770 $actioncomm->elementid = $tmpinvoice->id;
3771 $actioncomm->fk_element = $tmpinvoice->id;
3775 $actioncomm->create($user);
3777 $errormesg = $cMailFile->error.
' : '.$to;
3781 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
3786 $actioncomm->type_code =
'AC_OTH_AUTO';
3787 $actioncomm->socid = $tmpinvoice->thirdparty->id;
3788 $actioncomm->contact_id = 0;
3790 $actioncomm->code =
'AC_EMAIL';
3791 $actioncomm->label =
'sendEmailsRemindersOnInvoiceDueDateKO';
3792 $actioncomm->note_private = $errormesg;
3793 $actioncomm->fk_project = $tmpinvoice->fk_project;
3794 $actioncomm->datep =
dol_now();
3795 $actioncomm->datef = $actioncomm->datep;
3796 $actioncomm->percentage = -1;
3797 $actioncomm->authorid = $user->id;
3798 $actioncomm->userownerid = $user->id;
3800 $actioncomm->email_msgid = $cMailFile->msgid;
3801 $actioncomm->email_from = $email_from;
3802 $actioncomm->email_sender =
'';
3803 $actioncomm->email_to = $to;
3807 $actioncomm->errors_to = $errors_to;
3811 $actioncomm->create($user);
3814 $this->db->commit();
3818 $errorsMsg[] = $errormesg;
3821 $errorsMsg[] =
'Failed to fetch record invoice with ID = '.$obj->id;
3831 $this->output .=
'Nb of emails sent : '.$nbMailSend;
3833 dol_syslog(__METHOD__.
" end - ".$this->output, LOG_INFO);
3837 $this->error =
'Nb of emails sent : '.$nbMailSend.
', '.(empty($errorsMsg) ? $error : implode(
', ', $errorsMsg));
3839 dol_syslog(__METHOD__.
" end - ".$this->error, LOG_INFO);
if(! $sortfield) if(! $sortorder) $object
Class to manage agenda events (actions)
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
Superclass for invoice classes.
calculate_date_lim_reglement($cond_reglement=0)
Returns an invoice payment deadline based on the invoice settlement conditions and billing date.
is_erasable()
Return if an invoice can be deleted Rule is: If invoice is draft and has a temporary ref -> yes (1) I...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
Save a new position (field rang) for details lines.
deleteEcmFiles($mode=0)
Delete related files of object in database.
update_price($exclspec=0, $roundingadjust='auto', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
setErrorsFromObject($object)
setErrorsFromObject
updateRangOfLine($rowid, $rang)
Update position of line (rang)
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
static commonReplaceProduct(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
Class to manage absolute discounts.
Class to manage Dolibarr database access.
Class to manage suppliers invoices.
const TYPE_DEPOSIT
Deposit invoice.
create($user)
Create supplier invoice into database.
list_qualified_avoir_supplier_invoices($socid=0)
Return list of qualifying invoices for correction by credit note Invoices that respect the following ...
list_replacable_supplier_invoices($socid=0)
Return list of replaceable invoices Status valid or abandoned for other reason + not paid + no paymen...
deleteLine($rowid, $notrigger=0)
Delete a detail line from database.
set_unpaid($user)
Tag the invoice as not fully paid + trigger call BILL_UNPAYED Function used when a direct debit payme...
setCanceled($user, $close_code='', $close_note='')
Tag invoice as canceled, with no payment on it (example for replacement invoice or payment never rece...
fetch($id=0, $ref='', $ref_ext='')
Load object in memory from database.
setCategories($categories)
Sets object to given categories.
info($id)
Loads the info order information into the invoice object.
const TYPE_CREDIT_NOTE
Credit note invoice.
isCreditNoteUsed()
Is credit note used.
getKanbanView($option='', $arraydata=null)
Return clickable link of object (with eventually picto)
load_board($user)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
getNomUrl($withpicto=0, $option='', $max=0, $short=0, $moretitle='', $notooltip=0, $save_lastsearch_value=-1, $addlinktonotes=0)
Return clickable name (with optional picto)
getTooltipContentArray($params)
getTooltipContentArray
setPaid($user, $close_code='', $close_note='')
Tag invoice as a paid invoice.
update($user=null, $notrigger=0)
Update database.
addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_product=0, $remise_percent=0, $date_start=0, $date_end=0, $fk_code_ventilation=0, $info_bits=0, $price_base_type='HT', $type=0, $rang=-1, $notrigger=0, $array_options=[], $fk_unit=null, $origin_id=0, $pu_devise=0, $ref_supplier='', $special_code=0, $fk_parent_line=0, $fk_remise_except=0, $origin_type='')
Adds an invoice line (associated with no predefined product/service) The parameters are already suppo...
__construct($db)
Constructor.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
const TYPE_REPLACEMENT
Replacement invoice.
setUnpaid($user)
Tag the invoice as not fully paid + trigger call BILL_UNPAYED Function used when a direct debit payme...
const STATUS_VALIDATED
Validated (need to be paid)
setDraft($user, $idwarehouse=-1, $notrigger=0)
Set draft status.
getNextNumRef($soc, $mode='next')
Return next reference of supplier invoice not already used (or last reference) according to numbering...
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=0, $date_start='', $date_end='', $array_options=[], $fk_unit=null, $pu_devise=0, $ref_supplier='', $rang=0)
Update a line detail in the database.
sendEmailsRemindersOnSupplierInvoiceDueDate($nbdays=0, $paymentmode='all', $template='', $datetouse='duedate', $forcerecipient='')
Send reminders by emails for supplier invoices validated that are due.
insert_discount($idremise)
Add a discount line into an invoice (as an invoice line) using an existing absolute discount (Consume...
initAsSpecimen($option='')
Initialise an instance with random values.
const TYPE_STANDARD
Standard invoice.
validate($user, $force_number='', $idwarehouse=0, $notrigger=0)
Tag invoice as validated + call trigger BILL_VALIDATE.
set_paid($user, $close_code='', $close_note='')
Tag invoice as a paid invoice.
createFromClone(User $user, $fromid, $invertdetail=0)
Load an object from its id and create a new one in database.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template model.
getRights()
Returns the rights used for this class.
const STATUS_ABANDONED
Classified abandoned and no payment done.
hasDelay()
Is the payment of the supplier invoice having a delay?
static replaceProduct(DoliDB $db, $origin_id, $dest_id)
Function used to replace a product id with another one.
loadStateBoard()
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
fetch_lines()
Load this->lines.
const STATUS_CLOSED
Classified paid.
setVATReverseCharge($vatreversecharge)
Change the option VAT reverse charge.
Class to manage invoice templates.
Class to manage stock movements.
static getIdAndTxFromCode($dbs, $code, $date_document=0)
Get id and rate of currency from code.
static getIdFromCode($dbs, $code)
Get id of currency from code.
Class to manage predefined suppliers products.
Class to manage products or services.
Class to manage line invoices.
Class to manage translations.
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
dol_get_first_hour($date, $gm='tzserver')
Return GMT time for first hour of a given GMT date (it removes hours, min and second part)
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0, $level=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
$date_start
Variables from include:
dol_now($mode='gmt')
Return date for now.
setEntity($currentobject)
Set entity id to use when to create an object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '...' if string larger than length.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $notused, $price_base_type, $info_bits, $type, $seller=null, $localtaxes_array=[], $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.
print $langs trans('Date')." left Ref Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right Paid right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...