Fix: vat rate for supplier order or invoice if supplier is in europe but country differ from user.

This commit is contained in:
Laurent Destailleur 2008-03-07 01:50:56 +00:00
parent 98fb6a72b4
commit c2811ffa52
4 changed files with 87 additions and 37 deletions

View File

@ -99,7 +99,8 @@ if ($_POST['action'] == 'addligne' && $user->rights->fournisseur->commande->cree
} }
$soc = new Societe($db, $commande->socid); $soc = new Societe($db, $commande->socid);
$soc->fetch($commande->socid); $result=$soc->fetch($commande->socid);
//print $result;
// Ecrase $pu par celui du produit // Ecrase $pu par celui du produit
// Ecrase $desc par celui du produit // Ecrase $desc par celui du produit
@ -116,16 +117,17 @@ if ($_POST['action'] == 'addligne' && $user->rights->fournisseur->commande->cree
$desc = $prod->description; $desc = $prod->description;
$desc.= $prod->description && $_POST['np_desc'] ? "\n" : ""; $desc.= $prod->description && $_POST['np_desc'] ? "\n" : "";
$desc.= $_POST['np_desc']; $desc.= $_POST['np_desc'];
$tva_tx = get_default_tva($soc,$mysoc,$prod->tva_tx); $tva_tx = get_default_tva($soc,$mysoc,$prod->tva_tx,$prodfournprice->product_id);
} }
else else
{ {
$pu=$_POST['pu']; $pu=$_POST['pu'];
$tva_tx=$_POST['tva_tx']; $tva_tx=$_POST['tva_tx'];
$desc=$_POST['dp_desc']; $desc=$_POST['dp_desc'];
} }
//print "xx".$tva_tx; exit;
$result=$commande->addline( $result=$commande->addline(
$desc, $desc,

View File

@ -662,7 +662,7 @@ class CommandeFournisseur extends Commande
*/ */
function addline($desc, $pu, $qty, $txtva, $fk_product=0, $fk_prod_fourn_price=0, $fourn_ref='', $remise_percent=0, $price_base_type='HT') function addline($desc, $pu, $qty, $txtva, $fk_product=0, $fk_prod_fourn_price=0, $fourn_ref='', $remise_percent=0, $price_base_type='HT')
{ {
global $langs; global $langs,$mysoc;
// Clean parameters // Clean parameters
$qty = price2num($qty); $qty = price2num($qty);
@ -670,7 +670,7 @@ class CommandeFournisseur extends Commande
$desc = trim($desc); $desc = trim($desc);
$remise_percent = price2num($remise_percent); $remise_percent = price2num($remise_percent);
dolibarr_syslog("Fournisseur.Commande.class::addline $desc, $pu, $qty, $txtva, $fk_product, $remise_percent"); dolibarr_syslog("Fournisseur.Commande::addline $desc, $pu, $qty, $txtva, $fk_product, $remise_percent");
if ($qty < 1 && ! $fk_product) if ($qty < 1 && ! $fk_product)
{ {
@ -691,7 +691,6 @@ class CommandeFournisseur extends Commande
if ($result > 0) if ($result > 0)
{ {
$label = $prod->libelle; $label = $prod->libelle;
$txtva = $prod->tva_tx;
$pu = $prod->fourn_pu; $pu = $prod->fourn_pu;
$ref = $prod->ref_fourn; $ref = $prod->ref_fourn;
} }
@ -699,14 +698,14 @@ class CommandeFournisseur extends Commande
{ {
$this->error="Aucun tarif trouvé pour cette quantité. Quantité saisie insuffisante ?"; $this->error="Aucun tarif trouvé pour cette quantité. Quantité saisie insuffisante ?";
$this->db->rollback(); $this->db->rollback();
dolibarr_syslog("Fournisseur.commande.class::addline result=".$result." - ".$this->error); dolibarr_syslog("Fournisseur.commande::addline result=".$result." - ".$this->error);
return -1; return -1;
} }
if ($result < -1) if ($result < -1)
{ {
$this->error=$prod->error; $this->error=$prod->error;
$this->db->rollback(); $this->db->rollback();
dolibarr_syslog("Fournisseur.commande.class::addline result=".$result." - ".$this->error); dolibarr_syslog("Fournisseur.commande::addline result=".$result." - ".$this->error);
return -1; return -1;
} }
} }
@ -736,7 +735,7 @@ class CommandeFournisseur extends Commande
if ($fk_product) { $sql.= $fk_product.","; } if ($fk_product) { $sql.= $fk_product.","; }
else { $sql.= "null,"; } else { $sql.= "null,"; }
$sql.= price2num($price,'MU').", '$qty', $txtva, $remise_percent,'".price2num($subprice,'MU')."','".price2num($remise)."','".$ref."') ;"; $sql.= price2num($price,'MU').", '$qty', $txtva, $remise_percent,'".price2num($subprice,'MU')."','".price2num($remise)."','".$ref."') ;";
dolibarr_syslog('Fournisseur.commande.class::addline sql='.$sql); dolibarr_syslog('Fournisseur.commande::addline sql='.$sql);
$resql=$this->db->query($sql); $resql=$this->db->query($sql);
//print $sql; //print $sql;
if ($resql) if ($resql)
@ -756,10 +755,7 @@ class CommandeFournisseur extends Commande
/** /**
* Dispatch un element de la commande dans un stock * \brief Dispatch un element de la commande dans un stock
*
*
*
*/ */
function DispatchProducts($user, $products, $qtys, $entrepots) function DispatchProducts($user, $products, $qtys, $entrepots)
{ {

View File

@ -1928,6 +1928,23 @@ function price2num($amount,$rounding='')
} }
/**
* \brief Return vat rate of a product in a particular selling country
*/
function get_product_vat_for_country($idprod, $countrycode)
{
global $db;
$product=new Product($db);
$product->fetch($idprod);
// \TODO Read rate according to countrycode
// For the moment only one rate supported
return $product->tva_tx;
}
/** /**
\brief Fonction qui renvoie la tva d'une ligne (en fonction du vendeur, acheteur et taux du produit) \brief Fonction qui renvoie la tva d'une ligne (en fonction du vendeur, acheteur et taux du produit)
\remarks Si vendeur non assujeti a TVA, TVA par défaut=0. Fin de régle. \remarks Si vendeur non assujeti a TVA, TVA par défaut=0. Fin de régle.
@ -1938,12 +1955,13 @@ function price2num($amount,$rounding='')
Sinon TVA proposée par défaut=0. Fin de régle. Sinon TVA proposée par défaut=0. Fin de régle.
\param societe_vendeuse Objet société vendeuse \param societe_vendeuse Objet société vendeuse
\param societe_acheteuse Objet société acheteuse \param societe_acheteuse Objet société acheteuse
\param taux_produit Taux par defaut du produit vendu \param taux_produit Taux par defaut du produit vendu (old way to get product vat rate)
\param idprod Id product (new way to get product vat rate)
\return float Taux de tva a appliquer, -1 si ne peut etre déterminé \return float Taux de tva a appliquer, -1 si ne peut etre déterminé
*/ */
function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit) function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit, $idprod=0)
{ {
dolibarr_syslog("get_default_tva vendeur_assujeti=".$societe_vendeuse->tva_assuj." pays_vendeur=".$societe_vendeuse->pays_id.", pays_acheteur=".$societe_acheteuse->pays_id.", taux_produit=".$taux_produit); dolibarr_syslog("get_default_tva vendeur_assujeti=".$societe_vendeuse->tva_assuj." pays_vendeur=".$societe_vendeuse->pays_code.", seller in cee=".$societe_vendeuse->isInEEC().", pays_acheteur=".$societe_acheteuse->pays_code.", buyer in cee=".$societe_acheteuse->isInEEC().", taux_produit(deprecated)=".$taux_produit.", idprod=".$idprod);
if (!is_object($societe_vendeuse)) return -1; if (!is_object($societe_vendeuse)) return -1;
if (!is_object($societe_acheteuse)) return -1; if (!is_object($societe_acheteuse)) return -1;
@ -1957,8 +1975,9 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit)
// Le test ci-dessus ne devrait pas etre necessaire. Me signaler l'exemple du cas juridique concercné si le test suivant n'est pas suffisant. // Le test ci-dessus ne devrait pas etre necessaire. Me signaler l'exemple du cas juridique concercné si le test suivant n'est pas suffisant.
if ($societe_vendeuse->pays_id == $societe_acheteuse->pays_id) if ($societe_vendeuse->pays_id == $societe_acheteuse->pays_id)
{ {
if ($idprod) return get_product_vat_for_country($idprod,$societe_vendeuse->pays_code);
if (strlen($taux_produit) == 0) return -1; // Si taux produit = '', on ne peut déterminer taux tva if (strlen($taux_produit) == 0) return -1; // Si taux produit = '', on ne peut déterminer taux tva
return $taux_produit; return $taux_produit;
} }
// Si (vendeur et acheteur dans Communauté européenne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par défaut=0 (La TVA doit étre payé par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de régle. // Si (vendeur et acheteur dans Communauté européenne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par défaut=0 (La TVA doit étre payé par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de régle.
@ -1967,6 +1986,7 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit)
// Si (vendeur et acheteur dans Communauté europé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é européenne) et (acheteur = particulier ou entreprise sans num TVA intra) alors TVA par défaut=TVA du produit vendu. Fin de régle.
if (($societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC()) && ! $societe_acheteuse->tva_intra) if (($societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC()) && ! $societe_acheteuse->tva_intra)
{ {
if ($idprod) return get_product_vat_for_country($idprod,$societe_vendeuse->pays_code);
if (strlen($taux_produit) == 0) return -1; // Si taux produit = '', on ne peut déterminer taux tva if (strlen($taux_produit) == 0) return -1; // Si taux produit = '', on ne peut déterminer taux tva
return $taux_produit; return $taux_produit;
} }

View File

@ -126,7 +126,7 @@ class Societe extends CommonObject
} }
/** /**
* \brief Cr<EFBFBD>e la societe en base * \brief Cree la societe en base
* \param user Objet utilisateur qui demande la cr<EFBFBD>ation * \param user Objet utilisateur qui demande la cr<EFBFBD>ation
* \return int 0 si ok, < 0 si erreur * \return int 0 si ok, < 0 si erreur
*/ */
@ -160,12 +160,12 @@ class Societe extends CommonObject
$ret = $this->update($this->id,$user,0,1,1); $ret = $this->update($this->id,$user,0,1,1);
// si un commercial cr<EFBFBD>e un client il lui est affect<63> automatiquement // si un commercial cree un client il lui est affecte automatiquement
if (!$user->rights->societe->client->voir) if (!$user->rights->societe->client->voir)
{ {
$this->add_commercial($user, $user->id); $this->add_commercial($user, $user->id);
} }
// Ajout du commercial affect<EFBFBD> // Ajout du commercial affecte
else if ($this->commercial_id != '' && $this->commercial_id != -1) else if ($this->commercial_id != '' && $this->commercial_id != -1)
{ {
$this->add_commercial($user, $this->commercial_id); $this->add_commercial($user, $this->commercial_id);
@ -1795,7 +1795,7 @@ class Societe extends CommonObject
} }
} }
/* /**
* \brief Charge les informations d'ordre info dans l'objet societe * \brief Charge les informations d'ordre info dans l'objet societe
* \param id id de la societe a charger * \param id id de la societe a charger
*/ */
@ -1840,19 +1840,50 @@ class Societe extends CommonObject
} }
} }
/* /**
* \brief Renvoi si pays appartient <EFBFBD> CEE * \brief Renvoi si pays appartient <EFBFBD> CEE
* \param boolean true = pays dans CEE, false= pays hors CEE * \param boolean true = pays dans CEE, false= pays hors CEE
*/ */
function isInEEC() function isInEEC()
{ {
// \todo liste code pays <20> compl<70>ter // List of all country codes that are in europe for european vat rules
$country_code_in_EEC=array('BE','FR','LU','GB','IT'); $country_code_in_EEC=array(
//print "dd".$this->pays_code; 'AT', // Austria
return in_array($this->pays_code,$country_code_in_EEC); 'BE', // Belgium
'BG', // Bulgaria
'CY', // Cyprus
'CZ', // Czech republic
'DK', // Danemark
'EE', // Estonia
'FI', // Finland
'FR', // France
'DE', // Germany
'GB', // Royaume-uni
'GR', // Greece
'NL', // Holland
'HU', // Hungary
'IE', // Ireland
'IT', // Italy
'LV', // Latvia
'LT', // Lithuania
'LU', // Luxembourg
'MT', // Malta
'NO', // Norway
'PL', // Poland
'PT', // Portugal
'RO', // Romania
'SK', // Slovakia
'SI', // Slovenia
'ES', // Spain
'SE', // Sweden
'CH', // Switzerland
);
//print "dd".$this->pays_code;
return in_array($this->pays_code,$country_code_in_EEC);
} }
/*
* \brief Charge la liste des categories fournisseurs /**
* \brief Charge la liste des categories fournisseurs
* \return 0 in success, <> 0 in error * \return 0 in success, <> 0 in error
*/ */
function LoadSupplierCateg() function LoadSupplierCateg()
@ -1876,6 +1907,7 @@ class Societe extends CommonObject
return -1; return -1;
} }
} }
/* /*
* \brief Charge la liste des categories fournisseurs * \brief Charge la liste des categories fournisseurs
* \return 0 in success, <> 0 in error * \return 0 in success, <> 0 in error