From a3cb0e502e643c45dbecd54d58261b32bfa50498 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@destailleur.fr>
Date: Wed, 5 Sep 2012 14:05:17 +0200
Subject: [PATCH] Uniformize code and add comment on localtax to prepare usage
 for other countries.

---
 htdocs/core/lib/functions.lib.php | 97 +++++++++++++++++--------------
 1 file changed, 53 insertions(+), 44 deletions(-)

diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index dacce61e572..e7b608cfb0e 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -2712,38 +2712,47 @@ function price2num($amount,$rounding='',$alreadysqlnb=0)
  *	Return localtaxe rate for a particular vat
  *
  * 	@param	float		$tva			        Vat taxe
- * 	@param  int			$local		         	Local tax to search and return (1 or 2)
- *  @param  Societe		$societe_acheteuse    	Object of buying third party
+ * 	@param  int			$local		         	Local tax to search and return (1 or 2 return only tax rate 1 or tax rate 2)
+ *  @param  Societe		$thirdparty_buyer    	Object of buying third party
+ *  @param	Societe		$thirdparty_seller		Object of selling third party
  * 	@return	int				   					0 if not found, localtax if found
  */
-function get_localtax($tva, $local, $societe_acheteuse="")
+function get_localtax($tva, $local, $thirdparty_buyer="", $thirdparty_seller="")
 {
 	global $db, $conf, $mysoc;
 
-	if ($local == 1 && ! $mysoc->localtax1_assuj) return 0;
-	if ($local == 2 && ! $mysoc->localtax2_assuj) return 0;
+	if (empty($thirdparty_seller) || ! is_object($thirdparty_seller)) $thirdparty_seller=$mysoc;
 
-	$code_pays=$mysoc->pays_code;
+	dol_syslog("get_localtax tva=".$tva." local=".$local." thirdparty_buyer=".(is_object($thirdparty_buyer)?$thirdparty_buyer->id:'')." thirdparty_seller=".$thirdparty_seller->id);
 
-	if (is_object($societe_acheteuse))
+	// Some test to guess with no need to make database access
+	if ($local == 1 && ! $thirdparty_seller->localtax1_assuj) return 0;
+	if ($local == 2 && ! $thirdparty_seller->localtax2_assuj) return 0;
+	//if ($local == 0 && ! $thirdparty_seller->localtax1_assuj && ! $thirdparty_seller->localtax2_assuj) return array('localtax1'=>0,'localtax2'=>0);
+
+	$code_country=$thirdparty_seller->country_code;
+
+	if (is_object($thirdparty_buyer))
 	{
-		if ($code_pays!=$societe_acheteuse->pays_code) return 0;
-		if ($local==1 && !$societe_acheteuse->localtax1_assuj) return 0;
-		elseif ($local==2 && !$societe_acheteuse->localtax2_assuj) return 0;
+		if ($code_country!=$thirdparty_buyer->country_code) return 0;
+		if ($local==1 && !$thirdparty_buyer->localtax1_assuj) return 0;		// TODO Not sure this is good
+		elseif ($local==2 && !$thirdparty_buyer->localtax2_assuj) return 0;	// TODO Not sure this is good
 	}
 
 	// Search local taxes
 	$sql  = "SELECT t.localtax1, t.localtax2";
 	$sql .= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_pays as p";
-	$sql .= " WHERE t.fk_pays = p.rowid AND p.code = '".$code_pays."'";
+	$sql .= " WHERE t.fk_pays = p.rowid AND p.code = '".$code_country."'";
 	$sql .= " AND t.taux = ".$tva." AND t.active = 1";
 
+	dol_syslog("get_localtax sql=".$sql);
 	$resql=$db->query($sql);
 	if ($resql)
 	{
 		$obj = $db->fetch_object($resql);
 		if ($local==1) return $obj->localtax1;
 		elseif ($local==2) return $obj->localtax2;
+		//else return array($obj->localtax1,$obj->localtax2);
 	}
 
 	return 0;
@@ -2776,7 +2785,7 @@ function get_product_vat_for_country($idprod, $thirdparty_seller, $idprodfournpr
 		$product=new Product($db);
 		$result=$product->fetch($idprod);
 
-		if ($mysoc->pays_code == $thirdparty_seller->country_code) // If selling country is ours
+		if ($mysoc->country_code == $thirdparty_seller->country_code) // If selling country is ours
 		{
 			if ($idprodfournprice > 0)     // We want vat for product for a supplier order or invoice
 			{
@@ -2853,42 +2862,42 @@ function get_product_localtax_for_country($idprod, $local, $countrycode)
  *	 Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = entreprise avec num TVA) intra alors TVA par defaut=0. Fin de regle
  *	 Sinon TVA proposee par defaut=0. Fin de regle.
  *
- *	@param	Societe		$societe_vendeuse    	Objet societe vendeuse
- *	@param  Societe		$societe_acheteuse   	Objet societe acheteuse
+ *	@param	Societe		$thirdparty_seller    	Objet societe vendeuse
+ *	@param  Societe		$thirdparty_buyer   	Objet societe acheteuse
  *	@param  int			$idprod					Id product
  *	@param	int			$idprodfournprice		Id product_fournisseur_price (for supplier order/invoice)
  *	@return float         				      	Taux de tva a appliquer, -1 si ne peut etre determine
  */
-function get_default_tva($societe_vendeuse, $societe_acheteuse, $idprod=0, $idprodfournprice=0)
+function get_default_tva($thirdparty_seller, $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
 {
 	global $conf;
 
-	if (!is_object($societe_vendeuse)) return -1;
-	if (!is_object($societe_acheteuse)) return -1;
+	if (!is_object($thirdparty_seller)) return -1;
+	if (!is_object($thirdparty_buyer)) return -1;
 
-	dol_syslog("get_default_tva: seller use vat=".$societe_vendeuse->tva_assuj.", seller country=".$societe_vendeuse->pays_code.", seller in cee=".$societe_vendeuse->isInEEC().", buyer country=".$societe_acheteuse->pays_code.", buyer in cee=".$societe_acheteuse->isInEEC().", idprod=".$idprod.", idprodfournprice=".$idprodfournprice.", SERVICE_ARE_ECOMMERCE_200238EC=".(! empty($conf->global->SERVICES_ARE_ECOMMERCE_200238EC)?$conf->global->SERVICES_ARE_ECOMMERCE_200238EC:''));
+	dol_syslog("get_default_tva: seller use vat=".$thirdparty_seller->tva_assuj.", seller country=".$thirdparty_seller->country_code.", seller in cee=".$thirdparty_seller->isInEEC().", buyer country=".$thirdparty_buyer->country_code.", buyer in cee=".$thirdparty_buyer->isInEEC().", idprod=".$idprod.", idprodfournprice=".$idprodfournprice.", SERVICE_ARE_ECOMMERCE_200238EC=".(! empty($conf->global->SERVICES_ARE_ECOMMERCE_200238EC)?$conf->global->SERVICES_ARE_ECOMMERCE_200238EC:''));
 
 	// Si vendeur non assujeti a TVA (tva_assuj vaut 0/1 ou franchise/reel)
-	if (is_numeric($societe_vendeuse->tva_assuj) && ! $societe_vendeuse->tva_assuj)
+	if (is_numeric($thirdparty_seller->tva_assuj) && ! $thirdparty_seller->tva_assuj)
 	{
 		//print 'VATRULE 1';
 		return 0;
 	}
-	if (! is_numeric($societe_vendeuse->tva_assuj) && $societe_vendeuse->tva_assuj=='franchise')
+	if (! is_numeric($thirdparty_seller->tva_assuj) && $thirdparty_seller->tva_assuj=='franchise')
 	{
 		//print 'VATRULE 2';
 		return 0;
 	}
 
-	//if (is_object($societe_acheteuse) && ($societe_vendeuse->country_id == $societe_acheteuse->country_id) && ($societe_acheteuse->tva_assuj == 1 || $societe_acheteuse->tva_assuj == 'reel'))
+	//if (is_object($thirdparty_buyer) && ($thirdparty_seller->country_id == $thirdparty_buyer->country_id) && ($thirdparty_buyer->tva_assuj == 1 || $thirdparty_buyer->tva_assuj == 'reel'))
 	// Le test ci-dessus ne devrait pas etre necessaire. Me signaler l'exemple du cas juridique concerne si le test suivant n'est pas suffisant.
 
 	// Si le (pays vendeur = pays acheteur) alors la TVA par defaut=TVA du produit vendu. Fin de regle.
-	if (($societe_vendeuse->country_code == $societe_acheteuse->country_code)
-	|| (in_array($societe_vendeuse->country_code,array('FR,MC')) && in_array($societe_acheteuse->country_code,array('FR','MC')))) // Warning ->country_code not always defined
+	if (($thirdparty_seller->country_code == $thirdparty_buyer->country_code)
+	|| (in_array($thirdparty_seller->country_code,array('FR,MC')) && in_array($thirdparty_buyer->country_code,array('FR','MC')))) // Warning ->country_code not always defined
 	{
 		//print 'VATRULE 3';
-		return get_product_vat_for_country($idprod,$societe_vendeuse,$idprodfournprice);
+		return get_product_vat_for_country($idprod,$thirdparty_seller,$idprodfournprice);
 	}
 
 	// Si (vendeur et acheteur dans Communaute europeenne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par defaut=0 (La TVA doit etre paye par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de regle.
@@ -2896,9 +2905,9 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $idprod=0, $idpr
 
 	// Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = entreprise) alors TVA par defaut=0. Fin de regle
 	// Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = particulier) alors TVA par defaut=TVA du produit vendu. Fin de regle
-	if (($societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC()))
+	if (($thirdparty_seller->isInEEC() && $thirdparty_buyer->isInEEC()))
 	{
-		$isacompany=$societe_acheteuse->isACompany();
+		$isacompany=$thirdparty_buyer->isACompany();
 		if ($isacompany)
 		{
 			//print 'VATRULE 4';
@@ -2907,7 +2916,7 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $idprod=0, $idpr
 		else
 		{
 			//print 'VATRULE 5';
-			return get_product_vat_for_country($idprod,$societe_vendeuse,$idprodfournprice);
+			return get_product_vat_for_country($idprod,$thirdparty_seller,$idprodfournprice);
 		}
 	}
 
@@ -2915,11 +2924,11 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $idprod=0, $idpr
 	// we use the buyer VAT.
 	if (! empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC))
 	{
-		//print "eee".$societe_acheteuse->isACompany();exit;
-		if (! $societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC() && ! $societe_acheteuse->isACompany())
+		//print "eee".$thirdparty_buyer->isACompany();exit;
+		if (! $thirdparty_seller->isInEEC() && $thirdparty_buyer->isInEEC() && ! $thirdparty_buyer->isACompany())
 		{
 			//print 'VATRULE 6';
-			return get_product_vat_for_country($idprod,$societe_acheteuse,$idprodfournprice);
+			return get_product_vat_for_country($idprod,$thirdparty_buyer,$idprodfournprice);
 		}
 	}
 
@@ -2933,12 +2942,12 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $idprod=0, $idpr
 /**
  *	Fonction qui renvoie si tva doit etre tva percue recuperable
  *
- *	@param	Societe		$societe_vendeuse    	Objet societe vendeuse
- *	@param  Societe		$societe_acheteuse   	Objet societe acheteuse
+ *	@param	Societe		$thirdparty_seller    	Objet societe vendeuse
+ *	@param  Societe		$thirdparty_buyer   	Objet societe acheteuse
  *  @param  int			$idprod                 Id product
  *	@return float       			        	0 or 1
  */
-function get_default_npr($societe_vendeuse, $societe_acheteuse, $idprod)
+function get_default_npr($thirdparty_seller, $thirdparty_buyer, $idprod)
 {
 	return 0;
 }
@@ -2946,33 +2955,33 @@ function get_default_npr($societe_vendeuse, $societe_acheteuse, $idprod)
 /**
  *	Function that return localtax of a product line (according to seller, buyer and product vat rate)
  *
- *	@param	Societe		$societe_vendeuse    	Objet societe vendeuse
- *	@param  Societe		$societe_acheteuse   	Objet societe acheteuse
+ *	@param	Societe		$thirdparty_seller    	Objet societe vendeuse
+ *	@param  Societe		$thirdparty_buyer   	Objet societe acheteuse
  *  @param	int			$local					Localtax to process (1 or 2)
  *	@param  int			$idprod					Id product
  *	@return float        				       	Taux de localtax appliquer, -1 si ne peut etre determine
  */
-function get_default_localtax($societe_vendeuse, $societe_acheteuse, $local, $idprod=0)
+function get_default_localtax($thirdparty_seller, $thirdparty_buyer, $local, $idprod=0)
 {
-	if (!is_object($societe_vendeuse)) return -1;
-	if (!is_object($societe_acheteuse)) return -1;
+	if (!is_object($thirdparty_seller)) return -1;
+	if (!is_object($thirdparty_buyer)) return -1;
 
-	if ($societe_vendeuse->country_id=='ES' || $societe_vendeuse->country_code=='ES')
+	if ($thirdparty_seller->country_id=='ES' || $thirdparty_seller->country_code=='ES')
 	{
 		if ($local==1) //RE
 		{
 			// Si achatteur non assujeti a RE, localtax1 par default=0
-			if (is_numeric($societe_acheteuse->localtax1_assuj) && ! $societe_acheteuse->localtax1_assuj) return 0;
-			if (! is_numeric($societe_acheteuse->localtax1_assuj) && $societe_acheteuse->localtax1_assuj=='localtax1off') return 0;
+			if (is_numeric($thirdparty_buyer->localtax1_assuj) && ! $thirdparty_buyer->localtax1_assuj) return 0;
+			if (! is_numeric($thirdparty_buyer->localtax1_assuj) && $thirdparty_buyer->localtax1_assuj=='localtax1off') return 0;
 		}
 		elseif ($local==2) //IRPF
 		{
 			// Si vendeur non assujeti a IRPF, localtax2 par default=0
-			if (is_numeric($societe_vendeuse->localtax2_assuj) && ! $societe_vendeuse->localtax2_assuj) return 0;
-			if (! is_numeric($societe_vendeuse->localtax2_assuj) && $societe_vendeuse->localtax2_assuj=='localtax2off') return 0;
+			if (is_numeric($thirdparty_seller->localtax2_assuj) && ! $thirdparty_seller->localtax2_assuj) return 0;
+			if (! is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj=='localtax2off') return 0;
 		} else return -1;
 
-		if ($idprod) return get_product_localtax_for_country($idprod, $local, $societe_vendeuse->country_code);
+		if ($idprod) return get_product_localtax_for_country($idprod, $local, $thirdparty_seller->country_code);
 		else return -1;
 	}
 	return 0;
-- 
GitLab