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

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')
{
global $langs;
global $langs,$mysoc;
// Clean parameters
$qty = price2num($qty);
@ -670,7 +670,7 @@ class CommandeFournisseur extends Commande
$desc = trim($desc);
$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)
{
@ -691,7 +691,6 @@ class CommandeFournisseur extends Commande
if ($result > 0)
{
$label = $prod->libelle;
$txtva = $prod->tva_tx;
$pu = $prod->fourn_pu;
$ref = $prod->ref_fourn;
}
@ -699,14 +698,14 @@ class CommandeFournisseur extends Commande
{
$this->error="Aucun tarif trouvé pour cette quantité. Quantité saisie insuffisante ?";
$this->db->rollback();
dolibarr_syslog("Fournisseur.commande.class::addline result=".$result." - ".$this->error);
dolibarr_syslog("Fournisseur.commande::addline result=".$result." - ".$this->error);
return -1;
}
if ($result < -1)
{
$this->error=$prod->error;
$this->db->rollback();
dolibarr_syslog("Fournisseur.commande.class::addline result=".$result." - ".$this->error);
dolibarr_syslog("Fournisseur.commande::addline result=".$result." - ".$this->error);
return -1;
}
}
@ -736,7 +735,7 @@ class CommandeFournisseur extends Commande
if ($fk_product) { $sql.= $fk_product.","; }
else { $sql.= "null,"; }
$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);
//print $sql;
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)
{

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)
\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.
\param societe_vendeuse Objet société vendeuse
\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é
*/
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_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.
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
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.
@ -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.
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
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
* \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);
// 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)
{
$this->add_commercial($user, $user->id);
}
// Ajout du commercial affect<EFBFBD>
// Ajout du commercial affecte
else if ($this->commercial_id != '' && $this->commercial_id != -1)
{
$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
* \param id id de la societe a charger
*/
@ -1840,19 +1840,50 @@ class Societe extends CommonObject
}
}
/*
/**
* \brief Renvoi si pays appartient <EFBFBD> CEE
* \param boolean true = pays dans CEE, false= pays hors CEE
*/
function isInEEC()
{
// \todo liste code pays <20> compl<70>ter
$country_code_in_EEC=array('BE','FR','LU','GB','IT');
//print "dd".$this->pays_code;
return in_array($this->pays_code,$country_code_in_EEC);
// List of all country codes that are in europe for european vat rules
$country_code_in_EEC=array(
'AT', // Austria
'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
*/
function LoadSupplierCateg()
@ -1876,6 +1907,7 @@ class Societe extends CommonObject
return -1;
}
}
/*
* \brief Charge la liste des categories fournisseurs
* \return 0 in success, <> 0 in error