Fix: vat rate for supplier order or invoice if supplier is in europe but country differ from user.
This commit is contained in:
parent
98fb6a72b4
commit
c2811ffa52
@ -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,
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user