diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php
index 316d37a7271..5f07a5e3747 100644
--- a/htdocs/comm/propal.php
+++ b/htdocs/comm/propal.php
@@ -1174,6 +1174,8 @@ if ($_GET['propalid'] > 0)
}
print '
'.$objp->tva_tx.'% ';
print ''.price($objp->subprice)." \n";
+
+ // Qty
print '';
if (($objp->info_bits & 2) != 2)
{
diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php
index d050c6d737d..1e43a81ed20 100644
--- a/htdocs/compta/facture.php
+++ b/htdocs/compta/facture.php
@@ -545,18 +545,25 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer)
$desc=($prop->lignes[$i]->desc?$prop->lignes[$i]->desc:$prop->lignes[$i]->libelle);
$result = $facture->addline(
- $facid,
- $desc,
- $prop->lignes[$i]->subprice,
- $prop->lignes[$i]->qty,
- $prop->lignes[$i]->tva_tx,
- $prop->lignes[$i]->fk_product,
- $prop->lignes[$i]->remise_percent,
- '',
- '',
- 0,
- $prop->lignes[$i]->info_bits,
- $prop->lignes[$i]->fk_remise_except);
+ $facid,
+ $desc,
+ $prop->lignes[$i]->subprice,
+ $prop->lignes[$i]->qty,
+ $prop->lignes[$i]->tva_tx,
+ $prop->lignes[$i]->fk_product,
+ $prop->lignes[$i]->remise_percent,
+ '',
+ '',
+ 0,
+ $prop->lignes[$i]->info_bits,
+ $prop->lignes[$i]->fk_remise_except
+ );
+
+ if ($result < 0)
+ {
+ $error++;
+ break;
+ }
}
}
else
@@ -589,18 +596,25 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer)
$desc=($lines[$i]->desc ? $lines[$i]->desc : $lines[$i]->libelle);
$result = $facture->addline(
- $facid,
- $desc,
- $lines[$i]->subprice,
- $lines[$i]->qty,
- $lines[$i]->tva_tx,
- $lines[$i]->fk_product,
- $lines[$i]->remise_percent,
- '',
- '',
- 0,
- $lines[$i]->info_bits,
- $lines[$i]->fk_remise_except);
+ $facid,
+ $desc,
+ $lines[$i]->subprice,
+ $lines[$i]->qty,
+ $lines[$i]->tva_tx,
+ $lines[$i]->fk_product,
+ $lines[$i]->remise_percent,
+ '',
+ '',
+ 0,
+ $lines[$i]->info_bits,
+ $lines[$i]->fk_remise_except
+ );
+
+ if ($result < 0)
+ {
+ $error++;
+ break;
+ }
}
}
else
@@ -640,18 +654,25 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer)
if ($contrat->lignes[$i]->date_fin_reel) $date_end=$contrat->lignes[$i]->date_fin_reel;
$result = $facture->addline(
- $facid,
- $desc,
- $lines[$i]->subprice,
- $lines[$i]->qty,
- $lines[$i]->tva_tx,
- $lines[$i]->fk_product,
- $lines[$i]->remise_percent,
- $date_start,
- $date_end,
- 0,
- $lines[$i]->info_bits,
- $lines[$i]->fk_remise_except);
+ $facid,
+ $desc,
+ $lines[$i]->subprice,
+ $lines[$i]->qty,
+ $lines[$i]->tva_tx,
+ $lines[$i]->fk_product,
+ $lines[$i]->remise_percent,
+ $date_start,
+ $date_end,
+ 0,
+ $lines[$i]->info_bits,
+ $lines[$i]->fk_remise_except
+ );
+
+ if ($result < 0)
+ {
+ $error++;
+ break;
+ }
}
}
else
@@ -679,6 +700,9 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer)
{
$db->rollback();
$_GET["action"]='create';
+ $_GET["propalid"]=$_POST["propalid"];
+ $_GET["commandeid"]=$_POST["commandeid"];
+ $_GET["contratid"]=$_POST["contratid"];
if (! $mesg) $mesg=''.$facture->error.'
';
}
}
@@ -1315,48 +1339,6 @@ if ($_GET['action'] == 'create')
$html->select_types_paiements($mode_reglement_id,'mode_reglement_id');
print ' ';
- // Réductions relatives (Remises-Ristournes-Rabbais)
-/* Une réduction doit s'appliquer obligatoirement sur des lignes de factures
- et non globalement
- print ''.$langs->trans("CustomerRelativeDiscount").' ';
- print '';
- if (! $_GET['propalid'] && ! $_GET['commandeid'] && ! $_GET['contratid']) print ' ';
- print ' %';
- print ' '.img_info().' ';
- $relative_discount=$soc->remise_client;
- if ($relative_discount)
- {
- print $langs->trans("CompanyHasRelativeDiscount",$relative_discount);
- }
- else
- {
- print $langs->trans("CompanyHasNoRelativeDiscount");
- }
- print ' ';
-*/
-
- // Réductions absolues (Remises-Ristournes-Rabbais)
-/* Les remises absolues doivent s'appliquer par ajout de lignes spécialisées
- print ''.$langs->trans("CustomerAbsoluteDiscount").' ';
- print '';
- if (! $_GET['propalid'] && ! $_GET['commandeid'] && ! $_GET['contratid']) print ' ';
- print ' '.$langs->trans("Currency".$conf->monnaie);
- print ' '.img_info().' ';
- if ($absolute_discount)
- {
- print $langs->trans("CompanyHasAbsoluteDiscount",$absolute_discount,$langs->trans("Currency".$conf->monnaie));
- }
- else
- {
- print $langs->trans("CompanyHasNoAbsoluteDiscount");
- }
- print ' ';
-*/
-
// Projet
if ($conf->projet->enabled)
{
diff --git a/htdocs/compta/propal.php b/htdocs/compta/propal.php
index b08c0182ebe..7ac34e0ccc2 100644
--- a/htdocs/compta/propal.php
+++ b/htdocs/compta/propal.php
@@ -407,7 +407,16 @@ if ($_GET["propalid"] > 0)
}
print ''.$objp->tva_tx.'% ';
print ''.price($objp->subprice)." \n";
- print ''.$objp->qty.' ';
+
+ // Qty
+ print '';
+ if (($objp->info_bits & 2) != 2)
+ {
+ print $objp->qty;
+ }
+ else print ' ';
+ print ' ';
+
if ($objp->remise_percent > 0)
{
print ''.$objp->remise_percent."% \n";
diff --git a/htdocs/discount.class.php b/htdocs/discount.class.php
index 8a14a58c1c0..294f1dfa2d3 100644
--- a/htdocs/discount.class.php
+++ b/htdocs/discount.class.php
@@ -183,13 +183,13 @@ class DiscountAbsolute
/**
- * \brief Link the discount to a particular invoice
- * \param rowid Invoice id
+ * \brief Link the discount to a particular invoice line
+ * \param rowid Invoice line id
* \return int <0 ko, >0 ok
*/
function link_to_invoice($rowid)
{
- dolibarr_syslog("Discount.class::link_to_invoice link discount ".$this->id." to invoice rowid=".$rowid);
+ dolibarr_syslog("DiscountAbsolute::link_to_invoice link discount ".$this->id." to invoice line rowid=".$rowid);
$sql ="UPDATE ".MAIN_DB_PREFIX."societe_remise_except";
$sql.=" SET fk_facture = ".$rowid;
@@ -202,7 +202,7 @@ class DiscountAbsolute
else
{
$this->error=$this->db->error();
- dolibarr_syslog("Discount.class::link_to_invoice ".$this->error." sql=".$sql);
+ dolibarr_syslog("DiscountAbsolute::link_to_invoice ".$this->error." sql=".$sql);
return -1;
}
}
diff --git a/htdocs/facture.class.php b/htdocs/facture.class.php
index 4226c058d81..9744fcbd432 100644
--- a/htdocs/facture.class.php
+++ b/htdocs/facture.class.php
@@ -122,189 +122,198 @@ class Facture extends CommonObject
$this->remise_exceptionnelle = 0;
}
- /**
- \brief Création de la facture en base
- \param user Object utilisateur qui crée
- \return int <0 si ko, >0 si ok
- */
- function create($user)
- {
- global $langs,$conf,$mysoc;
+ /**
+ \brief Création de la facture en base
+ \param user Object utilisateur qui crée
+ \return int <0 si ko, >0 si ok
+ */
+ function create($user)
+ {
+ global $langs,$conf,$mysoc;
- // Nettoyage paramètres
- if (! $this->type) $this->type = 0;
- $this->ref_client=trim($this->ref_client);
- $this->note=trim($this->note);
- $this->note_public=trim($this->note_public);
- if (! $this->remise) $this->remise = 0;
- if (! $this->mode_reglement_id) $this->mode_reglement_id = 0;
- $this->brouillon = 1;
+ // Nettoyage paramètres
+ if (! $this->type) $this->type = 0;
+ $this->ref_client=trim($this->ref_client);
+ $this->note=trim($this->note);
+ $this->note_public=trim($this->note_public);
+ if (! $this->remise) $this->remise = 0;
+ if (! $this->mode_reglement_id) $this->mode_reglement_id = 0;
+ $this->brouillon = 1;
- dolibarr_syslog("Facture::Create");
+ dolibarr_syslog("Facture::Create user=".$user->id);
- $soc = new Societe($this->db);
- $soc->fetch($this->socid);
+ $soc = new Societe($this->db);
+ $soc->fetch($this->socid);
- $this->db->begin();
+ $error=0;
+
+ $this->db->begin();
- // Facture récurrente
- if ($this->fac_rec > 0)
- {
- require_once DOL_DOCUMENT_ROOT . '/compta/facture/facture-rec.class.php';
- $_facrec = new FactureRec($this->db, $this->fac_rec);
- $_facrec->fetch($this->fac_rec);
+ // Facture récurrente
+ if ($this->fac_rec > 0)
+ {
+ require_once DOL_DOCUMENT_ROOT . '/compta/facture/facture-rec.class.php';
+ $_facrec = new FactureRec($this->db, $this->fac_rec);
+ $_facrec->fetch($this->fac_rec);
- $this->projetid = $_facrec->projetid;
- $this->cond_reglement = $_facrec->cond_reglement_id;
- $this->cond_reglement_id = $_facrec->cond_reglement_id;
- $this->mode_reglement = $_facrec->mode_reglement_id;
- $this->mode_reglement_id = $_facrec->mode_reglement_id;
- $this->amount = $_facrec->amount;
- $this->remise_absolue = $_facrec->remise_absolue;
- $this->remise_percent = $_facrec->remise_percent;
- $this->remise = $_facrec->remise;
- }
+ $this->projetid = $_facrec->projetid;
+ $this->cond_reglement = $_facrec->cond_reglement_id;
+ $this->cond_reglement_id = $_facrec->cond_reglement_id;
+ $this->mode_reglement = $_facrec->mode_reglement_id;
+ $this->mode_reglement_id = $_facrec->mode_reglement_id;
+ $this->amount = $_facrec->amount;
+ $this->remise_absolue = $_facrec->remise_absolue;
+ $this->remise_percent = $_facrec->remise_percent;
+ $this->remise = $_facrec->remise;
+ }
- // Definition de la date limite
- $datelim=$this->calculate_date_lim_reglement();
+ // Definition de la date limite
+ $datelim=$this->calculate_date_lim_reglement();
- // Insertion dans la base
- $socid = $this->socid;
- $amount = $this->amount;
- $remise = $this->remise;
+ // Insertion dans la base
+ $socid = $this->socid;
+ $amount = $this->amount;
+ $remise = $this->remise;
- $totalht = ($amount - $remise);
+ $totalht = ($amount - $remise);
- $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture (';
- $sql.= ' facnumber, type, fk_soc, datec, amount, remise_absolue, remise_percent,';
- $sql.= ' datef,';
- $sql.= ' note,';
- $sql.= ' note_public,';
- $sql.= ' ref_client,';
- $sql.= ' fk_facture_source, fk_user_author, fk_projet,';
- $sql.= ' fk_cond_reglement, fk_mode_reglement, date_lim_reglement, model_pdf)';
- $sql.= ' VALUES (';
- $sql.= "'$number', '".$this->type."', '$socid', now(), '$totalht', '".$this->remise_absolue."'";
- $sql.= ",'".$this->remise_percent."', ".$this->db->idate($this->date);
- $sql.= ",".($this->note?"'".addslashes($this->note)."'":"null");
- $sql.= ",".($this->note_public?"'".addslashes($this->note_public)."'":"null");
- $sql.= ",".($this->ref_client?"'".addslashes($this->ref_client)."'":"null");
- $sql.= ",".($this->fk_facture_source?"'".addslashes($this->fk_facture_source)."'":"null");
- $sql.= ",".$user->id;
- $sql.= ",".($this->projetid?$this->projetid:"null");
- $sql.= ','.$this->cond_reglement_id;
- $sql.= ",".$this->mode_reglement_id;
- $sql.= ",".$this->db->idate($datelim).", '".$this->modelpdf."')";
+ $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture (';
+ $sql.= ' facnumber, type, fk_soc, datec, amount, remise_absolue, remise_percent,';
+ $sql.= ' datef,';
+ $sql.= ' note,';
+ $sql.= ' note_public,';
+ $sql.= ' ref_client,';
+ $sql.= ' fk_facture_source, fk_user_author, fk_projet,';
+ $sql.= ' fk_cond_reglement, fk_mode_reglement, date_lim_reglement, model_pdf)';
+ $sql.= ' VALUES (';
+ $sql.= "'$number', '".$this->type."', '$socid', now(), '$totalht', '".$this->remise_absolue."'";
+ $sql.= ",'".$this->remise_percent."', ".$this->db->idate($this->date);
+ $sql.= ",".($this->note?"'".addslashes($this->note)."'":"null");
+ $sql.= ",".($this->note_public?"'".addslashes($this->note_public)."'":"null");
+ $sql.= ",".($this->ref_client?"'".addslashes($this->ref_client)."'":"null");
+ $sql.= ",".($this->fk_facture_source?"'".addslashes($this->fk_facture_source)."'":"null");
+ $sql.= ",".$user->id;
+ $sql.= ",".($this->projetid?$this->projetid:"null");
+ $sql.= ','.$this->cond_reglement_id;
+ $sql.= ",".$this->mode_reglement_id;
+ $sql.= ",".$this->db->idate($datelim).", '".$this->modelpdf."')";
- $resql=$this->db->query($sql);
- if ($resql)
- {
- $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture');
+ dolibarr_syslog("Facture::Create sql=".$sql);
+ $resql=$this->db->query($sql);
+ if ($resql)
+ {
+ $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture');
- $sql = 'UPDATE '.MAIN_DB_PREFIX."facture SET facnumber='(PROV".$this->id.")' WHERE rowid=".$this->id;
- $resql=$this->db->query($sql);
+ $sql = 'UPDATE '.MAIN_DB_PREFIX."facture SET facnumber='(PROV".$this->id.")' WHERE rowid=".$this->id;
+ $resql=$this->db->query($sql);
+ if (! $resql) $error++;
+
+ // Mise a jour lien avec propal ou commande
+ if (! $error && $this->id && $this->propalid)
+ {
+ $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'fa_pr (fk_facture, fk_propal) VALUES ('.$this->id.','.$this->propalid.')';
+ $resql=$this->db->query($sql);
+ if (! $resql) $error++;
+ }
+ if (! $error && $this->id && $this->commandeid)
+ {
+ $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'co_fa (fk_facture, fk_commande) VALUES ('.$this->id.','.$this->commandeid.')';
+ $resql=$this->db->query($sql);
+ if (! $resql) $error++;
+ }
- // Mise a jour lien avec propal ou commande
- if ($resql && $this->id && $this->propalid)
- {
- $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'fa_pr (fk_facture, fk_propal) VALUES ('.$this->id.','.$this->propalid.')';
- $resql=$this->db->query($sql);
- }
- if ($resql && $this->id && $this->commandeid)
- {
- $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'co_fa (fk_facture, fk_commande) VALUES ('.$this->id.','.$this->commandeid.')';
- $resql=$this->db->query($sql);
- }
+ /*
+ * Insertion du detail des produits dans la base,
+ * si tableau products défini.
+ */
+ for ($i = 0 ; $i < sizeof($this->products) ; $i++)
+ {
+ $result = $this->addline(
+ $this->id,
+ $this->products[$i]->desc,
+ $this->products[$i]->subprice,
+ $this->products[$i]->qty,
+ $this->products[$i]->tva_tx,
+ $this->products[$i]->fk_product,
+ $this->products[$i]->remise_percent,
+ $this->products[$i]->date_start,
+ $this->products[$i]->date_end
+ );
- /*
- * Insertion du detail des produits dans la base
- */
- for ($i = 0 ; $i < sizeof($this->products) ; $i++)
- {
- $resql = $this->addline(
- $this->id,
- $this->products[$i]->desc,
- $this->products[$i]->subprice,
- $this->products[$i]->qty,
- $this->products[$i]->tva_tx,
- $this->products[$i]->fk_product,
- $this->products[$i]->remise_percent,
- $this->products[$i]->date_start,
- $this->products[$i]->date_end
- );
+ if ($result < 0)
+ {
+ $error++;
+ break;
+ }
+ }
- if ($resql < 0)
- {
- $this->error=$this->db->error;
- dolibarr_print_error($this->db);
- break;
- }
- }
+ /*
+ * Produits de la facture récurrente
+ */
+ if (! $error && $this->fac_rec > 0)
+ {
+ for ($i = 0 ; $i < sizeof($_facrec->lignes) ; $i++)
+ {
+ if ($_facrec->lignes[$i]->produit_id)
+ {
+ $prod = new Product($this->db, $_facrec->lignes[$i]->produit_id);
+ $res=$prod->fetch($_facrec->lignes[$i]->produit_id);
+ }
+ $tva_tx = get_default_tva($mysoc,$soc,$prod->tva_tx);
- /*
- * Produits de la facture récurrente
- */
- if ($resql && $this->fac_rec > 0)
- {
- for ($i = 0 ; $i < sizeof($_facrec->lignes) ; $i++)
- {
- if ($_facrec->lignes[$i]->produit_id)
- {
- $prod = new Product($this->db, $_facrec->lignes[$i]->produit_id);
- $res=$prod->fetch($_facrec->lignes[$i]->produit_id);
- }
- $tva_tx = get_default_tva($mysoc,$soc,$prod->tva_tx);
+ $result_insert = $this->addline(
+ $this->id,
+ $_facrec->lignes[$i]->desc,
+ $_facrec->lignes[$i]->subprice,
+ $_facrec->lignes[$i]->qty,
+ $tva_tx,
+ $_facrec->lignes[$i]->produit_id,
+ $_facrec->lignes[$i]->remise_percent);
- $result_insert = $this->addline(
- $this->id,
- $_facrec->lignes[$i]->desc,
- $_facrec->lignes[$i]->subprice,
- $_facrec->lignes[$i]->qty,
- $tva_tx,
- $_facrec->lignes[$i]->produit_id,
- $_facrec->lignes[$i]->remise_percent);
+ if ( $result_insert < 0)
+ {
+ $error++;
+ $this->error=$this->db->error();
+ break;
+ }
+ }
+ }
- if ( $result_insert < 0)
- {
- dolibarr_print_error($this->db);
- }
- }
- }
+ if (! $error)
+ {
+ $resql=$this->update_price($this->id);
+ if ($resql)
+ {
+ // Appel des triggers
+ include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php");
+ $interface=new Interfaces($this->db);
+ $result=$interface->run_triggers('BILL_CREATE',$this,$user,$langs,$conf);
+ // Fin appel triggers
- if ($resql)
- {
- $resql=$this->update_price($this->id);
- if ($resql)
- {
- // Appel des triggers
- include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php");
- $interface=new Interfaces($this->db);
- $result=$interface->run_triggers('BILL_CREATE',$this,$user,$langs,$conf);
- // Fin appel triggers
-
- $this->db->commit();
- return $this->id;
- }
- else
- {
- $this->db->rollback();
- return -3;
- }
- }
- else
- {
- $this->db->rollback();
- return -2;
- }
- }
- else
- {
- $this->error=$this->db->error();
- dolibarr_syslog("Facture::create error ".$this->error." sql=".$sql);
- $this->db->rollback();
- return -1;
- }
- }
+ $this->db->commit();
+ return $this->id;
+ }
+ else
+ {
+ $this->db->rollback();
+ return -3;
+ }
+ }
+ else
+ {
+ dolibarr_syslog("Facture::create error ".$this->error);
+ $this->db->rollback();
+ return -2;
+ }
+ }
+ else
+ {
+ $this->error=$this->db->error();
+ dolibarr_syslog("Facture::create error ".$this->error." sql=".$sql);
+ $this->db->rollback();
+ return -1;
+ }
+ }
/**
@@ -1109,32 +1118,41 @@ class Facture extends CommonObject
// On vérifie si la facture était une provisoire
if (! $error && $facref == 'PROV')
{
- /*
- * Pour chaque produit, on met a jour indicateur nbvente
- * On crée ici une dénormalisation des données pas forcément utilisée.
- */
- $sql = 'SELECT fk_product FROM '.MAIN_DB_PREFIX.'facturedet';
- $sql.= ' WHERE fk_facture = '.$this->id;
- $sql.= ' AND fk_product > 0';
+ $this->fetch_lines();
- $resql = $this->db->query($sql);
- if ($resql)
+/* La vérif qu'une remise n'est pas utilisée 2 fois est faite au moment de l'insertion de ligne
+ foreach($this->lignes as $i => $line)
{
- $num = $this->db->num_rows($resql);
- $i = 0;
- while ($i < $num)
+ // For each line, we check if it's a discount and, if a discount,
+ // we check it is not already affected to another invoice
+ if ($line->fk_remise_except)
{
- $obj = $this->db->fetch_object($resql);
- $sql = 'UPDATE '.MAIN_DB_PREFIX.'product SET nbvente=nbvente+1 WHERE rowid = '.$obj->fk_product;
+ $discount=new DiscountAbsolute($this->db);
+ $result=$discount->fetch($line->fk_remise_except);
+ if ($result > 0)
+ {
+
+ }
+ else
+ {
+ $this->error=$discount->error;
+ $error++;
+ }
+ }
+*/
+
+ // On met a jour table des ventes
+ // On crée ici une denormalisation pas forcement utilisé !!!
+ // TODO Virer utilisation du champ nbvente si utilisation non justifié
+ foreach($this->lignes as $i => $line)
+ {
+ if ($line->fk_product)
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'product SET nbvente=nbvente+1 WHERE rowid = '.$line->rowid;
$resql2 = $this->db->query($sql);
$i++;
}
}
- else
- {
- $error++;
- $this->error=$this->db->error().' sql='.$sql;
- }
}
if (! $error)
@@ -1271,7 +1289,7 @@ class Facture extends CommonObject
* \param date_start Date de debut de validité du service
* \param date_end Date de fin de validité du service
* \param ventil Code de ventilation comptable
- * \param info_bits Bits de type de lignes
+ * \param info_bits Bits de type de lignes
* \remarks Les parametres sont deja censé 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)
@@ -1279,7 +1297,7 @@ class Facture extends CommonObject
*/
function addline($facid, $desc, $pu, $qty, $txtva, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits='', $fk_remise_except='', $price_base_type='HT', $pu_ttc=0)
{
- dolibarr_syslog("Facture::Addline $facid,$desc,$pu,$qty,$txtva,$fk_product,$remise_percent,$date_start,$date_end,$ventil,$info_bits", LOG_DEBUG);
+ dolibarr_syslog("Facture::Addline $facid,$desc,$pu,$qty,$txtva,$fk_product,$remise_percent,$date_start,$date_end,$ventil,$info_bits,$fk_remise_except", LOG_DEBUG);
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
if ($this->brouillon)
@@ -1295,13 +1313,6 @@ class Facture extends CommonObject
$pu = price2num($pu);
$txtva=price2num($txtva);
- // Si facture de type avoir, le montant est forcé négatif
- if ($this->type == 2)
- {
-// $pu=-abs($pu);
-// $txtva=-abs($txtva);
- }
-
// 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
@@ -2659,7 +2670,8 @@ class FactureLigne
var $remise_percent; // % de la remise ligne (exemple 20%)
var $rang = 0;
var $info_bits = 0; // Bit 0: 0 si TVA normal - 1 si TVA NPR
- //! Bit 1: 0 si ligne normal - 1 si bit discount
+ // Bit 1: 0 si ligne normal - 1 si bit discount
+
//! Total HT de la ligne toute quantité et incluant la remise ligne
var $total_ht;
//! Total TVA de la ligne toute quantité et incluant la remise ligne
@@ -2719,7 +2731,7 @@ class FactureLigne
$this->tva_tx = $objp->tva_taux;
$this->remise_percent = $objp->remise_percent;
$this->fk_remise_except = $objp->fk_remise_except;
- $this->produit_id = $objp->fk_product;
+ $this->produit_id = $objp->fk_product; // Ne plus utiliser
$this->fk_product = $objp->fk_product;
$this->date_start = $objp->date_start;
$this->date_end = $objp->date_end;
@@ -2748,90 +2760,135 @@ class FactureLigne
}
- /**
- * \brief Insère l'objet ligne de facture en base
- * \return int <0 si ko, >0 si ok
- */
- function insert()
- {
- dolibarr_syslog("FactureLigne::Insert rang=".$this->rang, LOG_DEBUG);
- $this->db->begin();
+ /**
+ * \brief Insère l'objet ligne de facture en base
+ * \return int <0 si ko, >0 si ok
+ */
+ function insert()
+ {
+ global $langs;
+
+ dolibarr_syslog("FactureLigne::Insert rang=".$this->rang, LOG_DEBUG);
+ $this->db->begin();
- $rangtouse=$this->rang;
- if ($rangtouse == -1)
- {
- // Récupère rang max de la facture dans $rangmax
- $sql = 'SELECT max(rang) as max FROM '.MAIN_DB_PREFIX.'facturedet';
- $sql.= ' WHERE fk_facture ='.$this->fk_facture;
- $resql = $this->db->query($sql);
- if ($resql)
- {
- $obj = $this->db->fetch_object($resql);
- $rangtouse = $obj->max + 1;
- }
- else
- {
- dolibarr_print_error($this->db);
- $this->db->rollback();
- return -1;
- }
- }
+ $rangtouse=$this->rang;
+ if ($rangtouse == -1)
+ {
+ // Récupère rang max de la facture dans $rangmax
+ $sql = 'SELECT max(rang) as max FROM '.MAIN_DB_PREFIX.'facturedet';
+ $sql.= ' WHERE fk_facture ='.$this->fk_facture;
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $obj = $this->db->fetch_object($resql);
+ $rangtouse = $obj->max + 1;
+ }
+ else
+ {
+ dolibarr_print_error($this->db);
+ $this->db->rollback();
+ return -1;
+ }
+ }
- // Insertion dans base de la ligne
- $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facturedet';
- $sql.= ' (fk_facture, description, qty, tva_taux,';
- $sql.= ' fk_product, remise_percent, subprice, price, remise, fk_remise_except,';
- $sql.= ' date_start, date_end, fk_code_ventilation, fk_export_compta, ';
- $sql.= ' rang,';
- $sql.= ' info_bits, total_ht, total_tva, total_ttc)';
- $sql.= " VALUES (".$this->fk_facture.",";
- $sql.= " '".addslashes($this->desc)."',";
- $sql.= " '".price2num($this->qty)."',";
- $sql.= " '".price2num($this->tva_tx)."',";
- if ($this->fk_product) { $sql.= "'".$this->fk_product."',"; }
- else { $sql.='null,'; }
- $sql.= " '".price2num($this->remise_percent)."',";
- $sql.= " '".price2num($this->subprice)."',";
- $sql.= " '".price2num($this->price)."',";
- $sql.= " '".price2num($this->remise)."',";
- if ($this->fk_remise_except) $sql.= $this->fk_remise_except.",";
- else $sql.= 'null,';
- if ($this->date_start) { $sql.= "'".$this->date_start."',"; }
- else { $sql.='null,'; }
- if ($this->date_end) { $sql.= "'".$this->date_end."',"; }
- else { $sql.='null,'; }
- $sql.= ' '.$this->fk_code_ventilation.',';
- $sql.= ' '.$this->fk_export_compta.',';
- $sql.= ' '.$rangtouse.',';
- $sql.= " '".$this->info_bits."',";
- $sql.= " '".price2num($this->total_ht)."',";
- $sql.= " '".price2num($this->total_tva)."',";
- $sql.= " '".price2num($this->total_ttc)."'";
- $sql.= ')';
+ // Insertion dans base de la ligne
+ $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facturedet';
+ $sql.= ' (fk_facture, description, qty, tva_taux,';
+ $sql.= ' fk_product, remise_percent, subprice, price, remise, fk_remise_except,';
+ $sql.= ' date_start, date_end, fk_code_ventilation, fk_export_compta, ';
+ $sql.= ' rang,';
+ $sql.= ' info_bits, total_ht, total_tva, total_ttc)';
+ $sql.= " VALUES (".$this->fk_facture.",";
+ $sql.= " '".addslashes($this->desc)."',";
+ $sql.= " '".price2num($this->qty)."',";
+ $sql.= " '".price2num($this->tva_tx)."',";
+ if ($this->fk_product) { $sql.= "'".$this->fk_product."',"; }
+ else { $sql.='null,'; }
+ $sql.= " '".price2num($this->remise_percent)."',";
+ $sql.= " '".price2num($this->subprice)."',";
+ $sql.= " '".price2num($this->price)."',";
+ $sql.= " '".price2num($this->remise)."',";
+ if ($this->fk_remise_except) $sql.= $this->fk_remise_except.",";
+ else $sql.= 'null,';
+ if ($this->date_start) { $sql.= "'".$this->date_start."',"; }
+ else { $sql.='null,'; }
+ if ($this->date_end) { $sql.= "'".$this->date_end."',"; }
+ else { $sql.='null,'; }
+ $sql.= ' '.$this->fk_code_ventilation.',';
+ $sql.= ' '.$this->fk_export_compta.',';
+ $sql.= ' '.$rangtouse.',';
+ $sql.= " '".$this->info_bits."',";
+ $sql.= " '".price2num($this->total_ht)."',";
+ $sql.= " '".price2num($this->total_tva)."',";
+ $sql.= " '".price2num($this->total_ttc)."'";
+ $sql.= ')';
- dolibarr_syslog("FactureLigne::insert sql=".$sql);
- $resql=$this->db->query($sql);
- if ($resql)
- {
- $this->rowid=$this->db->last_insert_id(MAIN_DB_PREFIX.'facturedet');
+ dolibarr_syslog("FactureLigne::insert sql=".$sql);
+ $resql=$this->db->query($sql);
+ if ($resql)
+ {
+ $this->rowid=$this->db->last_insert_id(MAIN_DB_PREFIX.'facturedet');
- // Appel des triggers
- include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php");
- $interface=new Interfaces($this->db);
- $result = $interface->run_triggers('LINEBILL_INSERT',$this,$user,$langs,$conf);
- // Fin appel triggers
+ // Si fk_remise_except défini, on lie la remise à la facture
+ // ce qui la flague comme "consommée".
+ if ($this->fk_remise_except)
+ {
+ $discount=new DiscountAbsolute($this->db);
+ $result=$discount->fetch($this->fk_remise_except);
+ if ($result >= 0)
+ {
+ // Check if discount was found
+ if ($result > 0)
+ {
+ // Check if discount not already affected to another invoice
+ if ($discount->fk_facture)
+ {
+ $this->error=$langs->trans("ErrorDiscountAlreadyUsed",$discount->id);
+ dolibarr_syslog("FactureLigne::insert Error ".$this->error);
+ $this->db->rollback();
+ return -3;
+ }
+ else
+ {
+ $discount->link_to_invoice($this->rowid);
- $this->db->commit();
- return $this->rowid;
- }
- else
- {
- $this->error=$this->db->error();
- dolibarr_syslog("FactureLigne::insert Error ".$this->error);
- $this->db->rollback();
- return -2;
- }
- }
+ }
+ }
+ else
+ {
+ $this->error=$langs->trans("ErrorADiscountThatHasBeenRemovedIsIncluded");
+ dolibarr_syslog("FactureLigne::insert Error ".$this->error);
+ $this->db->rollback();
+ return -3;
+ }
+ }
+ else
+ {
+ $this->error=$discount->error;
+ dolibarr_syslog("FactureLigne::insert Error ".$this->error);
+ $this->db->rollback();
+ return -3;
+ }
+ }
+
+ // Appel des triggers
+ include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php");
+ $interface=new Interfaces($this->db);
+ $result = $interface->run_triggers('LINEBILL_INSERT',$this,$user,$langs,$conf);
+ // Fin appel triggers
+
+ $this->db->commit();
+ return $this->rowid;
+
+ }
+ else
+ {
+ $this->error=$this->db->error();
+ dolibarr_syslog("FactureLigne::insert Error ".$this->error);
+ $this->db->rollback();
+ return -2;
+ }
+ }
/**