dolibarr/htdocs/fourn/fournisseur.facture.class.php
2008-10-24 20:16:36 +00:00

770 lines
23 KiB
PHP
Raw Blame History

<?php
/* Copyright (C) 2002-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2005 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2004 Christophe Combelles <ccomb@free.fr>
* Copyright (C) 2005 Marc Barilley / Ocebo <marc@ocebo.com>
* Copyright (C) 2005-2007 Regis Houssin <regis@dolibarr.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
\file htdocs/fourn/fournisseur.facture.class.php
\ingroup fournisseur,facture
\brief Fichier de la classe des factures fournisseurs
\version $Id$
*/
include_once(DOL_DOCUMENT_ROOT."/facture.class.php");
/**
\class FactureFournisseur
\brief Classe permettant la gestion des factures fournisseurs
*/
class FactureFournisseur extends Facture
{
var $id;
var $db;
var $socid;
var $element='facture_fourn';
var $table_element='facture_fourn';
var $table_element_line='facture_fourn_det';
var $fk_element='fk_facture_fourn';
//! 0=draft,
//! 1=validated,
//! TODO Ce statut doit etre 2 et non 1 classee payee partiellement (close_code='discount_vat','badcustomer') ou completement (close_code=null),
//! TODO Ce statut doit etre 2 et non 1 classee abandonnee et aucun paiement n'a eu lieu (close_code='badcustomer','abandon' ou 'replaced')
var $statut;
//! 1 si facture payee COMPLETEMENT, 0 sinon (ce champ ne devrait plus servir car insuffisant)
var $paye;
var $author;
var $libelle;
var $date;
var $date_echeance;
var $ref;
var $amount;
var $remise;
var $tva;
var $total_ht;
var $total_tva;
var $total_ttc;
var $note;
var $propalid;
var $lignes;
var $fournisseur;
/**
* \brief Constructeur de la classe
* \param DB Database access handler
* \param socid Id societe ('' par defaut)
* \param facid Id facture ('' par defaut)
*/
function FactureFournisseur($DB, $socid='', $facid='')
{
$this->db = $DB ;
$this->table = 'facture_fourn';
$this->tabledetail = 'facture_fourn_det';
$this->id = $facid;
$this->socid = $socid;
$this->amount = 0;
$this->remise = 0;
$this->tva = 0;
$this->total_ht = 0;
$this->total_tva = 0;
$this->total_ttc = 0;
$this->propalid = 0;
$this->products = array();
$this->lignes = array();
}
/**
* \brief Creation de la facture en base
* \param user object utilisateur qui cree
* \return int id facture si ok, < 0 si erreur
*/
function create($user)
{
global $langs;
$socid = $this->socid;
$number = $this->ref;
$amount = $this->amount;
$remise = $this->remise;
$this->db->begin();
if (! $remise) $remise = 0 ;
$totalht = ($amount - $remise);
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn (facnumber, libelle, fk_soc, datec, datef, note, fk_user_author, date_lim_reglement) ';
$sql .= " VALUES ('".addslashes($number)."','".addslashes($this->libelle)."',";
$sql .= $this->socid.", ".$this->db->idate(mktime()).",'".$this->db->idate($this->date)."','".addslashes($this->note)."', ".$user->id.",'".$this->db->idate($this->date_echeance)."');";
$resql=$this->db->query($sql);
if ($resql)
{
$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture_fourn');
for ($i = 0 ; $i < sizeof($this->lignes) ; $i++)
{
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn_det (fk_facture_fourn)';
$sql .= ' VALUES ('.$this->id.');';
$resql_insert=$this->db->query($sql);
if ($resql_insert)
{
$idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture_fourn_det');
$this->updateline($idligne,
$this->lignes[$i]->description,
$this->lignes[$i]->pu_ht,
$this->lignes[$i]->tva_taux,
$this->lignes[$i]->qty);
}
}
// Update total price
if ($this->update_price() > 0)
{
$this->db->commit();
return $this->id;
}
else
{
$this->error=$langs->trans('FailedToUpdatePrice');
$this->db->rollback();
return -3;
}
}
else
{
if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
{
$this->error=$langs->trans('ErrorBillRefAlreadyExists');
$this->db->rollback();
return -1;
}
else
{
$this->error=$this->db->error();
$this->db->rollback();
return -2;
}
}
}
/**
* \brief Recup<75>re l'objet facture et ses lignes de factures
* \param rowid id de la facture a r<>cup<75>rer
* \return int >0 si ok, <0 si ko
*/
function fetch($rowid)
{
$sql = 'SELECT libelle, facnumber, amount, remise, '.$this->db->pdate(datef).'as df,';
$sql.= ' total_ht, total_tva, total_ttc, fk_user_author,';
$sql.= ' fk_statut, fk_projet as fk_project, paye, f.note, f.note_public,';
$sql.= ' '.$this->db->pdate('date_lim_reglement').'as de,';
$sql.= ' s.nom as socnom, s.rowid as socid';
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as f,'.MAIN_DB_PREFIX.'societe as s';
$sql.= ' WHERE f.rowid='.$rowid.' AND f.fk_soc = s.rowid';
dolibarr_syslog("FactureFourn::Fetch sql=".$sql, LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql)
{
$num=$this->db->num_rows($resql);
if ($num)
{
$obj = $this->db->fetch_object($resql);
$this->id = $rowid;
$this->ref = $this->id;
$this->ref_supplier = $obj->facnumber;
$this->datep = $obj->df;
$this->date_echeance = $obj->de;
$this->libelle = $obj->libelle;
$this->remise = $obj->remise;
$this->socid = $obj->socid;
$this->total_ht = $obj->total_ht;
$this->total_tva = $obj->total_tva;
$this->total_ttc = $obj->total_ttc;
$this->author = $obj->fk_user_author;
$this->statut = $obj->fk_statut;
$this->paye = $obj->paye;
$this->fk_project = $obj->fk_project;
$this->socnom = $obj->socnom;
$this->note = $obj->note;
$this->note_public = $obj->note_public;
$this->db->free($resql);
/*
* Lignes
*/
$result=$this->fetch_lines();
if ($result < 0)
{
$this->error=$this->db->error();
dolibarr_syslog('Facture::Fetch Error '.$this->error);
return -3;
}
return 1;
}
else
{
dolibarr_syslog('FactureFournisseur::Fetch rowid='.$rowid.' numrows=0 sql='.$sql);
$this->error='Bill with id '.$rowid.' not found sql='.$sql;
dolibarr_print_error($this->db);
return -2;
}
}
else
{
dolibarr_syslog('FactureFournisseur::Fetch rowid='.$rowid.' Erreur dans fetch de la facture fournisseur');
$this->error=$this->db->error();
dolibarr_print_error($this->db);
return -1;
}
}
/**
\brief Recup<75>re les lignes de factures dans this->lignes
\return int 1 si ok, < 0 si erreur
*/
function fetch_lines()
{
$sql = 'SELECT f.rowid, f.description, f.pu_ht, f.pu_ttc, f.qty, f.tva_taux, f.tva';
$sql.= ', f.total_ht, f.tva as total_tva, f.total_ttc, f.fk_product, f.product_type';
$sql.= ', p.ref, p.label as label, p.description as product_desc';
//$sql.= ', pf.ref_fourn';
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn_det as f';
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON f.fk_product = p.rowid';
//$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_fournisseur as pf ON f.fk_product = pf.fk_product';
$sql.= ' WHERE fk_facture_fourn='.$this->id;
dolibarr_syslog("FactureFourn::fetch_lines sql=".$sql, LOG_DEBUG);
$resql_rows = $this->db->query($sql);
if ($resql_rows)
{
$num_rows = $this->db->num_rows($resql_rows);
if ($num_rows)
{
$i = 0;
while ($i < $num_rows)
{
$obj = $this->db->fetch_object($resql_rows);
$this->lignes[$i]->rowid = $obj->rowid;
$this->lignes[$i]->description = $obj->description;
$this->lignes[$i]->ref = $obj->ref; // Reference interne du produit
//$this->lignes[$i]->ref_fourn = $obj->ref_fourn; // Reference fournisseur du produit
$this->lignes[$i]->libelle = $obj->label; // Label du produit
$this->lignes[$i]->product_desc = $obj->product_desc; // Description du produit
$this->lignes[$i]->pu_ht = $obj->pu_ht;
$this->lignes[$i]->pu_ttc = $obj->pu_ttc;
$this->lignes[$i]->tva_taux = $obj->tva_taux;
$this->lignes[$i]->qty = $obj->qty;
$this->lignes[$i]->tva = $obj->tva;
$this->lignes[$i]->total_ht = $obj->total_ht;
$this->lignes[$i]->total_tva = $obj->total_tva;
$this->lignes[$i]->total_ttc = $obj->total_ttc;
$this->lignes[$i]->fk_product = $obj->fk_product;
$this->lignes[$i]->product_type = $obj->product_type;
$i++;
}
}
$this->db->free($resql_rows);
return 1;
}
else
{
$this->error=$this->db->error();
dolibarr_syslog('FactureFournisseur::fetch_lines: Error '.$this->error,LOG_ERR);
return -3;
}
}
/**
* \brief Recup<75>re l'objet fournisseur li<6C> <20> la facture
*
*/
function fetch_fournisseur()
{
$fournisseur = new Fournisseur($this->db);
$fournisseur->fetch($this->socid);
$this->fournisseur = $fournisseur;
}
/**
* \brief Supprime la facture
* \param rowid id de la facture <20> supprimer
*/
function delete($rowid)
{
$this->db->begin();
$sql = 'DELETE FROM '.MAIN_DB_PREFIX.'facture_fourn_det WHERE fk_facture_fourn = '.$rowid.';';
dolibarr_syslog("FactureFournisseur sql=".$sql);
$resql = $this->db->query($sql);
if ($resql)
{
$sql = 'DELETE FROM '.MAIN_DB_PREFIX.'facture_fourn WHERE rowid = '.$rowid.' AND fk_statut = 0';
dolibarr_syslog("FactureFournisseur sql=".$sql);
$resql2 = $this->db->query($sql);
if ($resql2)
{
$this->db->commit();
return 1;
}
else
{
$this->db->rollback();
$this->error=$this->db->lasterror();
dolibarr_syslog("FactureFournisseur::delete ".$this->error);
}
}
else
{
$this->db->rollback();
$this->error=$this->db->lasterror();
dolibarr_syslog("FactureFournisseur::delete ".$this->error);
}
}
/**
* \brief Tag la facture comme pay<61>e compl<70>tement
* \param user Objet utilisateur qui modifie l'<27>tat
* \return int <0 si ko, >0 si ok
*/
function set_payed($user)
{
$sql = 'UPDATE '.MAIN_DB_PREFIX.'facture_fourn';
$sql.= ' SET paye = 1';
$sql.= ' WHERE rowid = '.$this->id;
$resql = $this->db->query($sql);
if (! $resql)
{
$this->error=$this->db->error();
dolibarr_print_error($this->db);
return -1;
}
return 1;
}
/**
* \brief Set invoice status as validate
* \param user Objet utilisateur qui valide la facture
* \return int <0 si ko, >0 si ok
*/
function set_valid($user)
{
global $conf,$langs;
$this->db->begin();
$sql = "UPDATE ".MAIN_DB_PREFIX."facture_fourn";
$sql.= " SET fk_statut = 1, fk_user_valid = ".$user->id;
$sql.= " WHERE rowid = ".$this->id;
dolibarr_syslog("FactureFournisseur::set_valid sql=".$sql, LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql)
{
$result=0;
// Si activé on décrémente le produit principal et ses composants à la validation de facture
if ($result >= 0 && $conf->stock->enabled && $conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)
{
require_once(DOL_DOCUMENT_ROOT."/product/stock/mouvementstock.class.php");
for ($i = 0 ; $i < sizeof($this->lignes) ; $i++)
{
if ($this->lignes[$i]->fk_product && $this->lignes[$i]->product_type == 0)
{
$mouvP = new MouvementStock($this->db);
// We increase stock for product
$entrepot_id = "1"; // TODO ajouter possibilité de choisir l'entrepot
$result=$mouvP->reception($user, $this->lignes[$i]->fk_product, $entrepot_id, $this->lignes[$i]->qty);
}
}
}
if ($result > 0)
{
// Appel des triggers
include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php");
$interface=new Interfaces($this->db);
$result=$interface->run_triggers('BILL_SUPPLIER_VALIDATE',$this,$user,$langs,$conf);
if ($result < 0) { $error++; $this->errors=$interface->errors; }
// Fin appel triggers
$this->db->commit();
return 1;
}
else
{
$this->db->rollback();
return -1;
}
}
else
{
$this->error=$this->db->error();
$this->db->rollback();
return -1;
}
}
/**
* \brief Ajoute une ligne de facture (associ<63> <20> aucun produit/service pr<70>d<EFBFBD>fini)
* \param desc Description de la ligne
* \param pu Prix unitaire (HT ou TTC selon price_base_type)
* \param txtva Taux de tva forc<72>, sinon -1
* \param qty Quantit<69>
* \param fk_product Id du produit/service pred<65>fini
* \param remise_percent Pourcentage de remise de la ligne
* \param date_start Date de debut de validit<69> du service
* \param date_end Date de fin de validit<69> du service
* \param ventil Code de ventilation comptable
* \param info_bits Bits de type de lignes
* \param price_base_type HT ou TTC
* \remarks Les parametres sont deja cens<6E> etre juste et avec valeurs finales a l'appel
* de cette methode. Aussi, pour le taux tva, il doit deja avoir ete d<>fini
* par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,taux_produit)
* et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue)
*/
function addline($desc, $pu, $txtva, $qty, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits='', $price_base_type='HT')
{
dolibarr_syslog("FactureFourn::Addline $desc,$pu,$qty,$txtva,$fk_product,$remise_percent,$date_start,$date_end,$ventil,$info_bits", LOG_DEBUG);
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
$this->db->begin();
// Nettoyage param<61>tres
if ($txtva == '') $txtva=0;
$txtva=price2num($txtva);
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn_det (fk_facture_fourn)';
$sql .= ' VALUES ('.$this->id.');';
dolibarr_syslog("Fournisseur.facture::addline sql=".$sql);
$resql = $this->db->query($sql);
if ($resql)
{
$idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture_fourn_det');
$result=$this->updateline($idligne, $desc, $pu, $txtva, $qty, $fk_product, $price_base_type);
if ($result > 0)
{
$this->db->commit();
return 1;
}
else
{
$this->error=$this->db->error();
dolibarr_syslog("Error sql=$sql, error=".$this->error);
$this->db->rollback();
return -1;
}
}
else
{
$this->error=$ligne->error;
$this->db->rollback();
return -2;
}
}
/**
* \brief Mets <20> jour une ligne de facture
* \param id Id de la ligne de facture
* \param label Description de la ligne
* \param pu Prix unitaire (HT ou TTC selon price_base_type)
* \param tauxtva Taux tva
* \param qty Quantit<69>
* \param idproduct Id produit
* \param price_base_type HT ou TTC
* \param info_bits Miscellanous informations of line
* \return int <0 si ko, >0 si ok
*/
function updateline($id, $label, $pu, $tauxtva, $qty=1, $idproduct=0, $price_base_type='HT', $info_bits=0)
{
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
$pu = price2num($pu);
$qty = price2num($qty);
// Validation
if (! is_numeric($pu) || ! is_numeric($qty)) return -1;
// Calcul du total TTC et de la TVA pour la ligne a partir de
// qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
$tabprice = calcul_price_total($qty, $pu, 0, $tauxtva, 0, $price_base_type, $info_bits);
$total_ht = $tabprice[0];
$total_tva = $tabprice[1];
$total_ttc = $tabprice[2];
$pu_ht = $tabprice[3];
$pu_tva = $tabprice[4];
$pu_ttc = $tabprice[5];
$product_type = 0;
if ($idproduct)
{
$product=new Product($this->db);
$result=$product->fetch($idproduct);
$product_type=$product->type;
}
$sql = 'UPDATE '.MAIN_DB_PREFIX.'facture_fourn_det ';
$sql.= 'SET ';
$sql.= 'description =\''.addslashes($label).'\'';
$sql.= ', pu_ht = ' .price2num($pu_ht);
$sql.= ', pu_ttc= ' .price2num($pu_ttc);
$sql.= ', qty =' .price2num($qty);
$sql.= ', tva_taux=' .price2num($tauxtva);
$sql.= ', total_ht=' .price2num($total_ht);
$sql.= ', tva=' .price2num($total_tva);
$sql.= ', total_ttc='.price2num($total_ttc);
if ($idproduct) $sql.= ', fk_product='.$idproduct;
else $sql.= ', fk_product=null';
$sql.= ', product_type='.$product_type;
$sql.= ' WHERE rowid = '.$id;
dolibarr_syslog("Fournisseur.facture::updateline sql=".$sql);
$resql=$this->db->query($sql);
if ($resql)
{
// Mise a jour prix total facture
return $this->update_price();
}
else
{
$this->error=$this->db->error();
dolibarr_syslog("Fournisseur.facture::updateline error=".$this->error);
return -1;
}
}
/**
* \brief Supprime une ligne facture de la base
* \param rowid id de la ligne de facture a supprimer
*/
function deleteline($rowid)
{
// Supprime ligne
$sql = 'DELETE FROM '.MAIN_DB_PREFIX.'facture_fourn_det ';
$sql .= ' WHERE rowid = '.$rowid.';';
$resql = $this->db->query($sql);
if (! $resql)
{
dolibarr_print_error($this->db);
}
// Mise a jour prix facture
$this->update_price();
return 1;
}
/**
* \brief Charge les informations d'ordre info dans l'objet facture
* \param id Id de la facture a charger
*/
function info($id)
{
$sql = 'SELECT c.rowid, '.$this->db->pdate('datec').' as datec';
$sql .= ', fk_user_author, fk_user_valid';
$sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as c';
$sql .= ' WHERE c.rowid = '.$id;
$result=$this->db->query($sql);
if ($result)
{
if ($this->db->num_rows($result))
{
$obj = $this->db->fetch_object($result);
$this->id = $obj->rowid;
if ($obj->fk_user_author)
{
$cuser = new User($this->db, $obj->fk_user_author);
$cuser->fetch();
$this->user_creation = $cuser;
}
if ($obj->fk_user_valid)
{
$vuser = new User($this->db, $obj->fk_user_valid);
$vuser->fetch();
$this->user_validation = $vuser;
}
$this->date_creation = $obj->datec;
//$this->date_validation = $obj->datev; \todo La date de validation n'est pas encore g<>r<EFBFBD>e
}
$this->db->free($result);
}
else
{
dolibarr_print_error($this->db);
}
}
/**
* \brief Charge indicateurs this->nbtodo et this->nbtodolate de tableau de bord
* \param user Objet user
* \return int <0 si ko, >0 si ok
*/
function load_board($user)
{
global $conf, $user;
$this->nbtodo=$this->nbtodolate=0;
$sql = 'SELECT ff.rowid,'.$this->db->pdate('ff.date_lim_reglement').' as datefin';
if (!$user->rights->societe->client->voir && !$user->societe_id) $sql .= ", sc.fk_soc, sc.fk_user";
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as ff';
if (!$user->rights->societe->client->voir && !$user->societe_id) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
$sql.= ' WHERE ff.paye=0 AND ff.fk_statut > 0';
if ($user->societe_id) $sql.=' AND ff.fk_soc = '.$user->societe_id;
if (!$user->rights->societe->client->voir && !$user->societe_id) $sql .= " AND ff.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id;
$resql=$this->db->query($sql);
if ($resql)
{
while ($obj=$this->db->fetch_object($resql))
{
$this->nbtodo++;
if ($obj->datefin < (time() - $conf->facture->fournisseur->warning_delay)) $this->nbtodolate++;
}
$this->db->free($resql);
return 1;
}
else
{
dolibarr_print_error($this->db);
$this->error=$this->db->error();
return -1;
}
}
/**
* \brief Renvoie nom clicable (avec eventuellement le picto)
* \param withpicto 0=Pas de picto, 1=Inclut le picto dans le lien, 2=Picto seul
* \param option Sur quoi pointe le lien
* \return string Chaine avec URL
*/
function getNomUrl($withpicto=0,$option='')
{
global $langs;
$result='';
$lien = '<a href="'.DOL_URL_ROOT.'/fourn/facture/fiche.php?facid='.$this->id.'">';
$lienfin='</a>';
if ($withpicto) $result.=($lien.img_object($langs->trans("ShowInvoice"),'bill').$lienfin.' ');
$result.=$lien.$this->ref.$lienfin;
return $result;
}
/**
* \brief Initialise la facture avec valeurs fictives al<61>atoire
* Sert <20> g<>n<EFBFBD>rer une facture pour l'aperu des mod<6F>les ou demo
*/
function initAsSpecimen()
{
global $user,$langs;
// Charge tableau des id de soci<63>t<EFBFBD> socids
$socids = array();
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe WHERE fournisseur=1 LIMIT 10";
$resql = $this->db->query($sql);
if ($resql)
{
$num_socs = $this->db->num_rows($resql);
$i = 0;
while ($i < $num_socs)
{
$i++;
$row = $this->db->fetch_row($resql);
$socids[$i] = $row[0];
}
}
// Charge tableau des produits prodids
$prodids = array();
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."product WHERE envente=1";
$resql = $this->db->query($sql);
if ($resql)
{
$num_prods = $this->db->num_rows($resql);
$i = 0;
while ($i < $num_prods)
{
$i++;
$row = $this->db->fetch_row($resql);
$prodids[$i] = $row[0];
}
}
// Initialise param<61>tres
$this->id=0;
$this->ref = 'SPECIMEN';
$this->specimen=1;
$socid = rand(1, $num_socs);
$this->socid = $socids[$socid];
$this->date = time();
$this->date_lim_reglement=$this->date+3600*24*30;
$this->cond_reglement_code = 'RECEP';
$this->mode_reglement_code = 'CHQ';
$this->note_public='SPECIMEN';
$nbp = 5;
$xnbp = 0;
while ($xnbp < $nbp)
{
$ligne=new FactureLigne($this->db);
$ligne->desc=$langs->trans("Description")." ".$xnbp;
$ligne->qty=1;
$ligne->subprice=100;
$ligne->price=100;
$ligne->tva_tx=19.6;
$prodid = rand(1, $num_prods);
$ligne->produit_id=$prodids[$prodid];
$this->lignes[$xnbp]=$ligne;
$xnbp++;
}
$this->amount_ht = $xnbp*100;
$this->total_ht = $xnbp*100;
$this->total_tva = $xnbp*19.6;
$this->total_ttc = $xnbp*119.6;
}
}
?>