New: Support the Non Percu Recuperable vat in invoice form

This commit is contained in:
Laurent Destailleur
2008-02-21 23:15:55 +00:00
parent 074937aeb7
commit 520717cbbf
12 changed files with 232 additions and 180 deletions

View File

@@ -656,7 +656,7 @@ class Commande extends CommonObject
// qty, pu, remise_percent et txtva // qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // 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. // 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, $remise_percent, $txtva, 0, $price_base_type); $tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
$total_ht = $tabprice[0]; $total_ht = $tabprice[0];
$total_tva = $tabprice[1]; $total_tva = $tabprice[1];
$total_ttc = $tabprice[2]; $total_ttc = $tabprice[2];
@@ -1827,9 +1827,10 @@ class Commande extends CommonObject
* \param qty Quantit<69> * \param qty Quantit<69>
* \param remise_percent Pourcentage de remise de la ligne * \param remise_percent Pourcentage de remise de la ligne
* \param tva_tx Taux TVA * \param tva_tx Taux TVA
* \param info_bits Miscellanous informations on line
* \return int < 0 si erreur, > 0 si ok * \return int < 0 si erreur, > 0 si ok
*/ */
function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $txtva, $price_base_type='HT') function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $txtva, $price_base_type='HT', $info_bits=0)
{ {
dolibarr_syslog("Commande::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $txtva"); dolibarr_syslog("Commande::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $txtva");
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php'); include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
@@ -1849,7 +1850,7 @@ class Commande extends CommonObject
// qty, pu, remise_percent et txtva // qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // 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. // 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, $remise_percent, $txtva, 0, $price_base_type); $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
$total_ht = $tabprice[0]; $total_ht = $tabprice[0];
$total_tva = $tabprice[1]; $total_tva = $tabprice[1];
$total_ttc = $tabprice[2]; $total_ttc = $tabprice[2];

View File

@@ -798,7 +798,8 @@ if (($_POST['action'] == 'addligne' || $_POST['action'] == 'addligne_predef') &&
$prod->fetch($_POST['idprod']); $prod->fetch($_POST['idprod']);
$tva_tx = get_default_tva($mysoc,$fac->client,$prod->tva_tx); $tva_tx = get_default_tva($mysoc,$fac->client,$prod->tva_tx);
$tva_npr = get_default_npr($mysoc,$fac->client,$prod->tva_tx);
// On defini prix unitaire // On defini prix unitaire
if ($conf->global->PRODUIT_MULTIPRICES == 1) if ($conf->global->PRODUIT_MULTIPRICES == 1)
{ {
@@ -834,9 +835,13 @@ if (($_POST['action'] == 'addligne' || $_POST['action'] == 'addligne_predef') &&
else else
{ {
$pu_ht=$_POST['pu']; $pu_ht=$_POST['pu'];
$tva_tx=$_POST['tva_tx']; $tva_tx=eregi_replace('\*','',$_POST['tva_tx']);
$tva_npr=eregi('\*',$_POST['tva_tx'])?1:0;
$desc=$_POST['dp_desc']; $desc=$_POST['dp_desc'];
} }
$info_bit=0;
if ($tva_npr) $info_bit |= 0x01;
// Insere ligne // Insere ligne
$result = $fac->addline( $result = $fac->addline(
@@ -850,7 +855,7 @@ if (($_POST['action'] == 'addligne' || $_POST['action'] == 'addligne_predef') &&
$date_start, $date_start,
$date_end, $date_end,
0, 0,
'', $info_bit,
'', '',
$price_base_type, $price_base_type,
$pu_ttc $pu_ttc
@@ -888,6 +893,14 @@ if ($_POST['action'] == 'updateligne' && $user->rights->facture->creer && $_POST
$date_end=$_POST['date_endyear'].'-'.$_POST['date_endmonth'].'-'.$_POST['date_endday']; $date_end=$_POST['date_endyear'].'-'.$_POST['date_endmonth'].'-'.$_POST['date_endday'];
} }
// Define info_bits
$info_bits=0;
if (eregi('\*',$_POST['tva_tx'])) $info_bits |= 0x01;
// Define vat_rate
$vat_rate=$_POST['tva_tx'];
$vat_rate=eregi_replace('\*','',$vat_rate);
$result = $fac->updateline($_POST['rowid'], $result = $fac->updateline($_POST['rowid'],
$_POST['desc'], $_POST['desc'],
$_POST['price'], $_POST['price'],
@@ -895,7 +908,9 @@ if ($_POST['action'] == 'updateligne' && $user->rights->facture->creer && $_POST
$_POST['remise_percent'], $_POST['remise_percent'],
$date_start, $date_start,
$date_end, $date_end,
$_POST['tva_tx'] $vat_rate,
'HT',
$info_bits
); );
if ($_REQUEST['lang_id']) if ($_REQUEST['lang_id'])
@@ -2405,7 +2420,7 @@ else
} }
print "</td>\n"; print "</td>\n";
} }
print '<td align="right">'.vatrate($objp->tva_taux).'%</td>'; print '<td align="right">'.vatrate($objp->tva_taux).'%'.($objp->info_bits & 1?' *':'').'</td>';
print '<td align="right">'.price($objp->subprice)."</td>\n"; print '<td align="right">'.price($objp->subprice)."</td>\n";
print '<td align="right">'; print '<td align="right">';
if (($objp->info_bits & 2) != 2) if (($objp->info_bits & 2) != 2)
@@ -2507,10 +2522,7 @@ else
} }
print '</td>'; print '</td>';
print '<td align="right">'; print '<td align="right">';
if(! $soc->tva_assuj) print $html->select_tva('tva_tx',$objp->tva_taux,$mysoc,$soc,'',$objp->info_bits);
print '<input type="hidden" name="tva_tx" value="0">0%';
else
print $html->select_tva('tva_tx',$objp->tva_taux,$mysoc,$soc);
print '</td>'; print '</td>';
print '<td align="right"><input size="6" type="text" class="flat" name="price" value="'.price($objp->subprice,0,'',0).'"></td>'; print '<td align="right"><input size="6" type="text" class="flat" name="price" value="'.price($objp->subprice,0,'',0).'"></td>';
print '<td align="right">'; print '<td align="right">';
@@ -2591,10 +2603,8 @@ else
} }
print '</td>'; print '</td>';
print '<td align="right">'; print '<td align="right">';
if (! $soc->tva_assuj)
print '<input type="hidden" name="tva_tx" value="0">0%'; $html->select_tva('tva_tx',$conf->defaulttx,$mysoc,$soc);
else
$html->select_tva('tva_tx',$conf->defaulttx,$mysoc,$soc);
print '</td>'; print '</td>';
print '<td align="right"><input type="text" name="pu" size="6"></td>'; print '<td align="right"><input type="text" name="pu" size="6"></td>';
print '<td align="right"><input type="text" name="qty" value="'.($fac->type==2?'-1':'1').'" size="2"></td>'; print '<td align="right"><input type="text" name="qty" value="'.($fac->type==2?'-1':'1').'" size="2"></td>';

View File

@@ -358,7 +358,7 @@ class FactureRec extends Facture
/** /**
* \brief Ajoute une ligne de facture * \brief Ajoute une ligne de facture
*/ */
function addline($facid, $desc, $pu, $qty, $txtva, $fk_product='NULL', $remise_percent=0, $price_base_type='HT') function addline($facid, $desc, $pu, $qty, $txtva, $fk_product='NULL', $remise_percent=0, $price_base_type='HT', $info_bits=0)
{ {
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php'); include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
@@ -376,7 +376,7 @@ class FactureRec extends Facture
// qty, pu, remise_percent et txtva // qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // 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. // 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, $remise_percent, $txtva, 0, $price_base_type); $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
$total_ht = $tabprice[0]; $total_ht = $tabprice[0];
$total_tva = $tabprice[1]; $total_tva = $tabprice[1];
$total_ttc = $tabprice[2]; $total_ttc = $tabprice[2];

View File

@@ -670,7 +670,7 @@ class Contrat extends CommonObject
$pu = price2num($pu,'MU'); $pu = price2num($pu,'MU');
$txtva = price2num($txtva,'MU'); $txtva = price2num($txtva,'MU');
dolibarr_syslog("Contrat::addline $desc, $pu, $qty, $txtva, $fk_product, $remise_percent, $date_start, $date_end, $price_base_type"); dolibarr_syslog("Contrat::addline $desc, $pu, $qty, $txtva, $fk_product, $remise_percent, $date_start, $date_end, $price_base_type, $info_bits");
if ($this->statut == 0) if ($this->statut == 0)
{ {
@@ -693,7 +693,7 @@ class Contrat extends CommonObject
// qty, pu, remise_percent et txtva // qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // 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. // 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, $remise_percent, $txtva, 0, $price_base_type); $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
$total_ht = $tabprice[0]; $total_ht = $tabprice[0];
$total_tva = $tabprice[1]; $total_tva = $tabprice[1];
$total_ttc = $tabprice[2]; $total_ttc = $tabprice[2];

View File

@@ -46,57 +46,58 @@ class Facture extends CommonObject
var $element='facture'; var $element='facture';
var $table_element='facture'; var $table_element='facture';
var $table; var $table;
var $tabledetail; var $tabledetail;
var $id; var $id;
//! Id client //! Id client
var $socid; var $socid;
//! Objet societe client (<28> charger par fetch_client) //! Objet societe client (<28> charger par fetch_client)
var $client; var $client;
var $number; var $number;
var $author; var $author;
var $date; var $date;
var $ref; var $ref;
var $ref_client; var $ref_client;
//! 0=Facture normale, 1=Facture remplacement, 2=Facture avoir, 3=Facture r<>currente //! 0=Facture normale, 1=Facture remplacement, 2=Facture avoir, 3=Facture r<>currente
var $type; var $type;
var $amount; var $amount;
var $remise; var $remise;
var $tva; var $tva;
var $total; var $total;
var $note; var $note;
var $note_public; var $note_public;
//! 0=brouillon, //! 0=brouillon,
//! 1=valid<69>e, //! 1=valid<69>e,
//! 2=class<73>e pay<61>e partiellement (close_code='discount_vat','badcustomer') ou compl<70>tement (close_code=null), //! 2=class<73>e pay<61>e partiellement (close_code='discount_vat','badcustomer') ou compl<70>tement (close_code=null),
//! 3=class<73>e abandonn<6E>e et aucun paiement n'a eu lieu (close_code='badcustomer','abandon' ou 'replaced') //! 3=class<73>e abandonn<6E>e et aucun paiement n'a eu lieu (close_code='badcustomer','abandon' ou 'replaced')
var $statut; var $statut;
//! 1 si facture pay<61>e COMPLETEMENT, 0 sinon (ce champ ne devrait plus servir car insuffisant) //! 1 si facture pay<61>e COMPLETEMENT, 0 sinon (ce champ ne devrait plus servir car insuffisant)
var $paye; var $paye;
//! id facture source si facture de remplacement ou avoir //! id facture source si facture de remplacement ou avoir
var $fk_facture_source; var $fk_facture_source;
//! Fermeture apres paiement partiel: discount_vat, bad_customer, abandon //! Fermeture apres paiement partiel: discount_vat, bad_customer, abandon
//! Fermeture alors que aucun paiement: replaced (si remplac<61>), abandon //! Fermeture alors que aucun paiement: replaced (si remplac<61>), abandon
var $close_code; var $close_code;
//! Commentaire si mis a paye sans paiement complet //! Commentaire si mis a paye sans paiement complet
var $close_note; var $close_note;
var $propalid; var $propalid;
var $projetid; var $projetid;
var $date_lim_reglement; var $date_lim_reglement;
var $cond_reglement_id; var $cond_reglement_id;
var $cond_reglement_code; var $cond_reglement_code;
var $mode_reglement_id; var $mode_reglement_id;
var $mode_reglement_code; var $mode_reglement_code;
var $modelpdf; var $modelpdf;
var $products=array(); var $products=array();
var $lignes=array(); var $lignes=array();
//! Pour board //! Pour board
var $nbtodo; var $nbtodo;
var $nbtodolate; var $nbtodolate;
var $specimen; var $specimen;
//! Numero d'erreur de 512 <20> 1023 //! Numero d'erreur de 512 <20> 1023
var $errno = 0; var $errno = 0;
/**
/**
\brief Constructeur de la classe \brief Constructeur de la classe
\param DB handler acc<63>s base de donn<6E>es \param DB handler acc<63>s base de donn<6E>es
\param socid id societe ('' par defaut) \param socid id societe ('' par defaut)
@@ -1337,7 +1338,7 @@ class Facture extends CommonObject
* par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,taux_produit) * 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) * et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue)
*/ */
function addline($facid, $desc, $pu_ht, $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) function addline($facid, $desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits=0, $fk_remise_except='', $price_base_type='HT', $pu_ttc=0)
{ {
dolibarr_syslog("Facture::Addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,fk_product=$fk_product,remise_percent=$remise_percent,date_start=$date_start,date_end=$date_end,ventil=$ventil,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc", LOG_DEBUG); dolibarr_syslog("Facture::Addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,fk_product=$fk_product,remise_percent=$remise_percent,date_start=$date_start,date_end=$date_end,ventil=$ventil,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc", LOG_DEBUG);
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php'); include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
@@ -1369,7 +1370,7 @@ class Facture extends CommonObject
// qty, pu, remise_percent et txtva // qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // 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. // 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, $remise_percent, $txtva, 0, $price_base_type); $tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
$total_ht = $tabprice[0]; $total_ht = $tabprice[0];
$total_tva = $tabprice[1]; $total_tva = $tabprice[1];
$total_ttc = $tabprice[2]; $total_ttc = $tabprice[2];
@@ -1443,97 +1444,100 @@ class Facture extends CommonObject
} }
} }
/** /**
* \brief Mets <20> jour une ligne de facture * \brief Mets <20> jour une ligne de facture
* \param rowid Id de la ligne de facture * \param rowid Id de la ligne de facture
* \param desc Description de la ligne * \param desc Description de la ligne
* \param pu Prix unitaire (HT ou TTC selon price_base_type) * \param pu Prix unitaire (HT ou TTC selon price_base_type)
* \param qty Quantit<69> * \param qty Quantit<69>
* \param remise_percent Pourcentage de remise de la ligne * \param remise_percent Pourcentage de remise de la ligne
* \param date_start Date de debut de validit<69> du service * \param date_start Date de debut de validit<69> du service
* \param date_end Date de fin de validit<69> du service * \param date_end Date de fin de validit<69> du service
* \param tva_tx Taux TVA * \param tva_tx Taux TVA
* \param price_base_type HT ou TTC * \param price_base_type HT ou TTC
* \return int < 0 si erreur, > 0 si ok * \param info_bits Miscellanous informations
*/ * \return int < 0 si erreur, > 0 si ok
function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $date_start, $date_end, $txtva, $price_base_type='HT') */
{ function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $date_start, $date_end, $txtva, $price_base_type='HT', $info_bits=0)
dolibarr_syslog("Facture::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $txtva", LOG_DEBUG); {
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php'); include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
if ($this->brouillon) dolibarr_syslog("Facture::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $txtva, $price_base_type, $info_bits", LOG_DEBUG);
{
$this->db->begin();
// Nettoyage param<61>tres if ($this->brouillon)
$remise_percent=price2num($remise_percent); {
$qty=price2num($qty); $this->db->begin();
if (! $qty) $qty=1;
$pu = price2num($pu);
$txtva=price2num($txtva);
// Calcul du total TTC et de la TVA pour la ligne a partir de // Nettoyage param<61>tres
// qty, pu, remise_percent et txtva $remise_percent=price2num($remise_percent);
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker $qty=price2num($qty);
// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva. if (! $qty) $qty=1;
$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type); $pu = price2num($pu);
$total_ht = $tabprice[0]; $txtva=price2num($txtva);
$total_tva = $tabprice[1];
$total_ttc = $tabprice[2];
$pu_ht = $tabprice[3];
$pu_tva = $tabprice[4];
$pu_ttc = $tabprice[5];
// Anciens indicateurs: $price, $remise (a ne plus utiliser) // Calcul du total TTC et de la TVA pour la ligne a partir de
$price = $pu; // qty, pu, remise_percent et txtva
$remise = 0; // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
if ($remise_percent > 0) // 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, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
$remise = round(($pu * $remise_percent / 100),2); $total_ht = $tabprice[0];
$price = ($pu - $remise); $total_tva = $tabprice[1];
} $total_ttc = $tabprice[2];
$price = price2num($price); $pu_ht = $tabprice[3];
$pu_tva = $tabprice[4];
$pu_ttc = $tabprice[5];
// Mise a jour ligne en base // Anciens indicateurs: $price, $remise (a ne plus utiliser)
$ligne=new FactureLigne($this->db); $price = $pu;
$ligne->rowid=$rowid; $remise = 0;
$ligne->fetch($rowid); if ($remise_percent > 0)
{
$remise = round(($pu * $remise_percent / 100),2);
$price = ($pu - $remise);
}
$price = price2num($price);
$ligne->desc=$desc; // Mise a jour ligne en base
$ligne->qty=$qty; $ligne=new FactureLigne($this->db);
$ligne->tva_tx=$txtva; $ligne->rowid=$rowid;
$ligne->remise_percent=$remise_percent; $ligne->fetch($rowid);
$ligne->subprice=$pu;
$ligne->date_start=$date_start;
$ligne->date_end=$date_end;
$ligne->total_ht=$total_ht;
$ligne->total_tva=$total_tva;
$ligne->total_ttc=$total_ttc;
// A ne plus utiliser $ligne->desc=$desc;
$ligne->price=$price; $ligne->qty=$qty;
$ligne->remise=$remise; $ligne->tva_tx=$txtva;
$ligne->remise_percent=$remise_percent;
$ligne->subprice=$pu;
$ligne->date_start=$date_start;
$ligne->date_end=$date_end;
$ligne->total_ht=$total_ht;
$ligne->total_tva=$total_tva;
$ligne->total_ttc=$total_ttc;
$ligne->info_bits=$info_bits;
// A ne plus utiliser
$ligne->price=$price;
$ligne->remise=$remise;
$result=$ligne->update(); $result=$ligne->update();
if ($result > 0) if ($result > 0)
{ {
// Mise a jour info denormalisees au niveau facture // Mise a jour info denormalisees au niveau facture
$this->update_price($this->id); $this->update_price($this->id);
$this->db->commit(); $this->db->commit();
return $result; return $result;
} }
else else
{ {
$this->db->rollback(); $this->db->rollback();
return -1; return -1;
} }
} }
else else
{ {
$this->error="Facture::UpdateLine Invoice statut makes operation forbidden"; $this->error="Facture::UpdateLine Invoice statut makes operation forbidden";
return -2; return -2;
} }
} }
/** /**
* \brief Supprime une ligne facture de la base * \brief Supprime une ligne facture de la base
@@ -3108,7 +3112,7 @@ class FactureLigne
$sql.= ",total_ttc=".price2num($this->total_ttc).""; $sql.= ",total_ttc=".price2num($this->total_ttc)."";
$sql.= " WHERE rowid = ".$this->rowid; $sql.= " WHERE rowid = ".$this->rowid;
dolibarr_syslog("FactureLigne::update sql=$sql"); dolibarr_syslog("FactureLigne::update sql=".$sql);
$resql=$this->db->query($sql); $resql=$this->db->query($sql);
if ($resql) if ($resql)
@@ -3119,7 +3123,7 @@ class FactureLigne
else else
{ {
$this->error=$this->db->error(); $this->error=$this->db->error();
dolibarr_syslog("FactureLigne::update Error ".$this->error); dolibarr_syslog("FactureLigne::update Error ".$this->error, LOG_ERR);
$this->db->rollback(); $this->db->rollback();
return -2; return -2;
} }

View File

@@ -1244,9 +1244,10 @@ class CommandeFournisseur extends Commande
* \param qty Quantit<69> * \param qty Quantit<69>
* \param remise_percent Pourcentage de remise de la ligne * \param remise_percent Pourcentage de remise de la ligne
* \param tva_tx Taux TVA * \param tva_tx Taux TVA
* \param info_bits Miscellanous informations
* \return int < 0 si erreur, > 0 si ok * \return int < 0 si erreur, > 0 si ok
*/ */
function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $txtva, $price_base_type='HT') function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $txtva, $price_base_type='HT', $info_bits=0)
{ {
dolibarr_syslog("CommandeFournisseur::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $txtva"); dolibarr_syslog("CommandeFournisseur::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $txtva");
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php'); include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
@@ -1266,7 +1267,7 @@ class CommandeFournisseur extends Commande
// qty, pu, remise_percent et txtva // qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // 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. // 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, $remise_percent, $txtva, $price_base_type); $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $price_base_type, $info_bits);
$total_ht = $tabprice[0]; $total_ht = $tabprice[0];
$total_tva = $tabprice[1]; $total_tva = $tabprice[1];
$total_ttc = $tabprice[2]; $total_ttc = $tabprice[2];

View File

@@ -458,9 +458,10 @@ class FactureFournisseur extends Facture
* \param qty Quantit<69> * \param qty Quantit<69>
* \param idproduct Id produit * \param idproduct Id produit
* \param price_base_type HT ou TTC * \param price_base_type HT ou TTC
* \param info_bits Miscellanous informations of line
* \return int <0 si ko, >0 si ok * \return int <0 si ko, >0 si ok
*/ */
function updateline($id, $label, $pu, $tauxtva, $qty=1, $idproduct=0, $price_base_type='HT') 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'); include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
@@ -474,7 +475,7 @@ class FactureFournisseur extends Facture
// qty, pu, remise_percent et txtva // qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // 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. // 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); $tabprice = calcul_price_total($qty, $pu, 0, $tauxtva, 0, $price_base_type, $info_bits);
$total_ht = $tabprice[0]; $total_ht = $tabprice[0];
$total_tva = $tabprice[1]; $total_tva = $tabprice[1];
$total_ttc = $tabprice[2]; $total_ttc = $tabprice[2];

View File

@@ -2176,22 +2176,29 @@ class Form
/** /**
* \brief Selection du taux de tva <20> appliquer * \brief Selection du taux de tva <20> appliquer
* \param name Nom champ html * \param name Nom champ html
* \param defaulttx For<6F>age du taux tva pr<70>-s<>lectionn<6E>. Mettre '' pour aucun forcage. * \param selectedrate For<6F>age du taux tva pr<70>-s<>lectionn<6E>. Mettre '' pour aucun forcage.
* \param societe_vendeuse Objet soci<63>t<EFBFBD> vendeuse * \param societe_vendeuse Objet soci<63>t<EFBFBD> vendeuse
* \param societe_acheteuse Objet soci<63>t<EFBFBD> acheteuse * \param societe_acheteuse Objet soci<63>t<EFBFBD> acheteuse
* \param taux_produit Taux par defaut du produit vendu * \param taux_produit Taux par defaut du produit vendu
* \param info_bits Miscellanous information on line
* \remarks Si vendeur non assujeti <20> TVA, TVA par d<>faut=0. Fin de r<>gle. * \remarks Si vendeur non assujeti <20> TVA, TVA par d<>faut=0. Fin de r<>gle.
* Si le (pays vendeur = pays acheteur) alors la TVA par d<>faut=TVA du produit vendu. Fin de r<>gle. * Si le (pays vendeur = pays acheteur) alors la TVA par d<>faut=TVA du produit vendu. Fin de r<>gle.
* Si (vendeur et acheteur dans Communaut<75> europ<6F>enne) et bien vendu = moyen de transports neuf (auto, bateau, avion), TVA par d<>faut=0 (La TVA doit <20>tre pay<61> par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de r<>gle. * Si (vendeur et acheteur dans Communaut<75> europ<6F>enne) et bien vendu = moyen de transports neuf (auto, bateau, avion), TVA par d<>faut=0 (La TVA doit <20>tre pay<61> par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de r<>gle.
* Si (vendeur et acheteur dans Communaut<75> europ<6F>enne) et bien vendu autre que transport neuf alors la TVA par d<>faut=TVA du produit vendu. Fin de r<>gle. * Si (vendeur et acheteur dans Communaut<75> europ<6F>enne) et bien vendu autre que transport neuf alors la TVA par d<>faut=TVA du produit vendu. Fin de r<>gle.
* Sinon la TVA propos<6F>e par d<>faut=0. Fin de r<>gle. * Sinon la TVA propos<6F>e par d<>faut=0. Fin de r<>gle.
*/ */
function select_tva($name='tauxtva', $defaulttx='', $societe_vendeuse='', $societe_acheteuse='', $taux_produit='') function select_tva($name='tauxtva', $selectedrate='', $societe_vendeuse='', $societe_acheteuse='', $taux_produit='', $info_bits=0)
{ {
global $langs,$conf,$mysoc; global $langs,$conf,$mysoc;
$txtva=array(); $txtva=array();
$libtva=array(); $libtva=array();
$nprtva=array();
// Define defaultnpr and defaultttx
$defaultnpr=($info_bits & 0x01);
$defaultnpr=(eregi('\*',$selectedrate) ? 1 : $defaultnpr);
$defaulttx=eregi_replace('\*','',$selectedrate);
//print $societe_vendeuse."-".$societe_acheteuse; //print $societe_vendeuse."-".$societe_acheteuse;
if (is_object($societe_vendeuse) && ! $societe_vendeuse->pays_code) if (is_object($societe_vendeuse) && ! $societe_vendeuse->pays_code)
@@ -2232,8 +2239,9 @@ class Form
for ($i = 0; $i < $num; $i++) for ($i = 0; $i < $num; $i++)
{ {
$obj = $this->db->fetch_object($resql); $obj = $this->db->fetch_object($resql);
$txtva[$i] = $obj->taux; $txtva[$i] = $obj->taux;
$libtva[$i] = $obj->taux.'%'.($obj->recuperableonly ? ' *':''); $libtva[$i] = $obj->taux.'%';
$nprtva[$i] = $obj->recuperableonly;
} }
} }
else else
@@ -2250,6 +2258,7 @@ class Form
if ($defaulttx < 0 || strlen($defaulttx) == 0) if ($defaulttx < 0 || strlen($defaulttx) == 0)
{ {
$defaulttx=get_default_tva($societe_vendeuse,$societe_acheteuse,$taux_produit); $defaulttx=get_default_tva($societe_vendeuse,$societe_acheteuse,$taux_produit);
$defaultnpr=get_default_npr($societe_vendeuse,$societe_acheteuse,$taux_produit);
} }
// Si taux par defaut n'a pu etre d<>termin<69>, on prend dernier de la liste. // Si taux par defaut n'a pu etre d<>termin<69>, on prend dernier de la liste.
// Comme ils sont tri<72>s par ordre croissant, dernier = plus <20>lev<65> = taux courant // Comme ils sont tri<72>s par ordre croissant, dernier = plus <20>lev<65> = taux courant
@@ -2267,16 +2276,21 @@ class Form
for ($i = 0 ; $i < $nbdetaux ; $i++) for ($i = 0 ; $i < $nbdetaux ; $i++)
{ {
print '<option value="'.$txtva[$i].'"'; //print "xxxxx".$txtva[$i]."-".$nprtva[$i];
if ($txtva[$i] == $defaulttx) print '<option value="'.$txtva[$i];
print $nprtva[$i] ? '*': '';
print '"';
if ($txtva[$i] == $defaulttx && $nprtva[$i] == $defaultnpr)
{ {
print ' selected="true"'; print ' selected="true"';
} }
print '>'.vatrate($libtva[$i]).'</option>'; print '>'.vatrate($libtva[$i]);
print $nprtva[$i] ? ' *': '';
print '</option>';
$this->tva_taux_value[$i] = $txtva[$i]; $this->tva_taux_value[$i] = $txtva[$i];
$this->tva_taux_libelle[$i] = $libtva[$i]; $this->tva_taux_libelle[$i] = $libtva[$i];
$this->tva_taux_npr[$i] = $nprtva[$i];
} }
print '</select>'; print '</select>';
} }

View File

@@ -988,7 +988,7 @@ function migrate_price_facture($db,$langs,$conf)
$facligne= new FactureLigne($db); $facligne= new FactureLigne($db);
$facligne->fetch($rowid); $facligne->fetch($rowid);
$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT'); $result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT',$info_bits);
$total_ht = $result[0]; $total_ht = $result[0];
$total_tva = $result[1]; $total_tva = $result[1];
$total_ttc = $result[2]; $total_ttc = $result[2];
@@ -1094,7 +1094,7 @@ function migrate_price_propal($db,$langs,$conf)
$propalligne= new PropaleLigne($db); $propalligne= new PropaleLigne($db);
$propalligne->fetch($rowid); $propalligne->fetch($rowid);
$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT'); $result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT',$info_bits);
$total_ht = $result[0]; $total_ht = $result[0];
$total_tva = $result[1]; $total_tva = $result[1];
$total_ttc = $result[2]; $total_ttc = $result[2];
@@ -1199,7 +1199,7 @@ function migrate_price_contrat($db,$langs,$conf)
//$contratligne->fetch($rowid); Non requis car le update_total ne met a jour que chp redefinis //$contratligne->fetch($rowid); Non requis car le update_total ne met a jour que chp redefinis
$contratligne->rowid=$rowid; $contratligne->rowid=$rowid;
$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT'); $result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT',$info_bits);
$total_ht = $result[0]; $total_ht = $result[0];
$total_tva = $result[1]; $total_tva = $result[1];
$total_ttc = $result[2]; $total_ttc = $result[2];
@@ -1302,7 +1302,7 @@ function migrate_price_commande($db,$langs,$conf)
$commandeligne= new CommandeLigne($db); $commandeligne= new CommandeLigne($db);
$commandeligne->fetch($rowid); $commandeligne->fetch($rowid);
$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT'); $result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT',$info_bits);
$total_ht = $result[0]; $total_ht = $result[0];
$total_tva = $result[1]; $total_tva = $result[1];
$total_ttc = $result[2]; $total_ttc = $result[2];

View File

@@ -1893,6 +1893,26 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit)
} }
/**
\brief Fonction qui renvoie si tva doit etre tva percue r<>cup<75>rable
\remarks Si vendeur non assujeti a TVA, TVA par d<>faut=0. Fin de r<>gle.
Si le (pays vendeur = pays acheteur) alors TVA par d<>faut=TVA du produit vendu. Fin de r<>gle.
Si (vendeur et acheteur dans Communaut<75> europ<6F>enne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par d<>faut=0 (La TVA doit <20>tre pay<61> par acheteur au centre d'impots de son pays et non au vendeur). Fin de r<>gle.
Si (vendeur et acheteur dans Communaut<75> europ<6F>enne) et (acheteur = particulier ou entreprise sans num TVA intra) alors TVA par d<>faut=TVA du produit vendu. Fin de r<>gle.
Si (vendeur et acheteur dans Communaut<75> europ<6F>enne) et (acheteur = entreprise avec num TVA) intra alors TVA par d<>faut=0. Fin de r<>gle.
Sinon TVA propos<6F>e par d<>faut=0. Fin de r<>gle.
\param societe_vendeuse Objet soci<63>t<EFBFBD> vendeuse
\param societe_acheteuse Objet soci<63>t<EFBFBD> acheteuse
\param taux_produit Taux par defaut du produit vendu
\return float 0 or 1
*/
function get_default_npr($societe_vendeuse, $societe_acheteuse, $taux_produit)
{
return 0;
}
/** /**
\brief Renvoie oui ou non dans la langue choisie \brief Renvoie oui ou non dans la langue choisie
\param yesno Variable pour test si oui ou non \param yesno Variable pour test si oui ou non

View File

@@ -35,15 +35,16 @@
\param txtva Taux tva \param txtva Taux tva
\param remise_percent_global 0 \param remise_percent_global 0
\param price_base_type HT=on calcule sur le HT, TTC=on calcule sur le TTC \param price_base_type HT=on calcule sur le HT, TTC=on calcule sur le TTC
\param info_bits Miscellanous informations on line
\return result[0,1,2,3,4,5] (total_ht, total_tva, total_ttc, pu_ht, pu_tva, pu_ttc) \return result[0,1,2,3,4,5] (total_ht, total_tva, total_ttc, pu_ht, pu_tva, pu_ttc)
*/ */
function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $remise_percent_global=0, $price_base_type='HT') function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $remise_percent_global=0, $price_base_type='HT', $info_bits=0)
{ {
global $conf; global $conf;
$result=array(); $result=array();
//dolibarr_syslog("price.lib::calcul_price_total $qty, $pu, $remise_percent_ligne, $txtva, $price_base_type"); //dolibarr_syslog("price.lib::calcul_price_total $qty, $pu, $remise_percent_ligne, $txtva, $price_base_type $info_bits");
if ($price_base_type == 'HT') if ($price_base_type == 'HT')
{ {
// On travaille par defaut en partant du prix HT // On travaille par defaut en partant du prix HT

View File

@@ -296,7 +296,7 @@ class Propal extends CommonObject
// qty, pu, remise_percent et txtva // qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // 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. // 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, $remise_percent, $txtva, 0, $price_base_type); $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
$total_ht = $tabprice[0]; $total_ht = $tabprice[0];
$total_tva = $tabprice[1]; $total_tva = $tabprice[1];
$total_ttc = $tabprice[2]; $total_ttc = $tabprice[2];
@@ -375,11 +375,11 @@ class Propal extends CommonObject
* \param price_base_type HT ou TTC * \param price_base_type HT ou TTC
* \return int 0 en cas de succ<63>s * \return int 0 en cas de succ<63>s
*/ */
function updateline($rowid, $pu, $qty, $remise_percent=0, $txtva, $desc='', $price_base_type='HT') function updateline($rowid, $pu, $qty, $remise_percent=0, $txtva, $desc='', $price_base_type='HT', $info_bits=0)
{ {
global $conf; global $conf;
dolibarr_syslog("Propal::UpdateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type"); dolibarr_syslog("Propal::UpdateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits");
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php'); include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
if ($this->statut == 0) if ($this->statut == 0)
@@ -405,7 +405,7 @@ class Propal extends CommonObject
// qty, pu, remise_percent et txtva // qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // 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. // 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, $remise_percent, $txtva, 0, $price_base_type); $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
$total_ht = $tabprice[0]; $total_ht = $tabprice[0];
$total_tva = $tabprice[1]; $total_tva = $tabprice[1];
$total_ttc = $tabprice[2]; $total_ttc = $tabprice[2];