diff --git a/htdocs/margin/lib/margins.lib.php b/htdocs/margin/lib/margins.lib.php
index 1ee6fd99e2a12335a06f85ec5ea7daccc322edf4..8556548dcbc20a56a4c8f56e02bf593699fd01a1 100644
--- a/htdocs/margin/lib/margins.lib.php
+++ b/htdocs/margin/lib/margins.lib.php
@@ -81,50 +81,49 @@ function marges_prepare_head()
 }
 
 /**
- * getMarginInfos
+ * Return an array with margins information of a line
  *
- * @param 	float 	$pvht				Buying price with tax
- * @param 	float	$remise_percent		Discount percent
- * @param 	float	$tva_tx				Vat rate
- * @param 	float	$localtax1_tx		Vat rate special 1
- * @param 	float	$localtax2_tx		Vat rate special 2
- * @param 	int		$fk_pa				???
- * @param 	float	$paht				Buying price without tax
- * @param	int		$type				Type of line (product or service)
- * @param	Societe	$seller				Object of seller
- * @param	array	$localtaxes_array	Array of localtaxes
- * @return	array						Array of margin info
- * 
- * FIXME This function is called too frequently without type, seller and without localtaxes_array defined. This make vat rate detection wrong.
+ * @param 	float 	$pvht					Selling price without tax
+ * @param 	float	$remise_percent_ligne	Discount percent on line
+ * @param 	float	$tva_tx					Vat rate
+ * @param 	float	$localtax1_tx			Vat rate special 1
+ * @param 	float	$localtax2_tx			Vat rate special 2
+ * @param 	int		$fk_pa					Id of buying price (prefer set this to 0 and provide $paht instead. With id, buying price may have change)
+ * @param 	float	$paht					Buying price without tax
+ * @return	array							Array of margin info
  */
-function getMarginInfos($pvht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $paht, $type=0, $seller='', $localtaxes_array='')
+function getMarginInfos($pvht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $paht)
 {
-	global $db, $conf, $mysoc;
+	global $db, $conf;
 
 	$marge_tx_ret='';
 	$marque_tx_ret='';
 
-	if (empty($seller) || ! is_object($seller)) $seller=$mysoc;
-	if (empty($localtaxes_array) || ! is_array($localtaxes_array)) $localtaxes_array=array();
-	
-	if($fk_pa > 0) {
+	if ($fk_pa > 0) {
 		require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
 		$product = new ProductFournisseur($db);
-		if ($product->fetch_product_fournisseur_price($fk_pa)) {
+		if ($product->fetch_product_fournisseur_price($fk_pa)) 
+		{
 			$paht_ret = $product->fourn_unitprice * (1 - $product->fourn_remise_percent / 100);
 			if ($conf->global->MARGIN_TYPE == "2" && $product->fourn_unitcharges > 0)
 				$paht_ret += $product->fourn_unitcharges;
 		}
 		else
+		{
 			$paht_ret = $paht;
+		}
 	}
-	else
+	else 
+	{
 		$paht_ret	= $paht;
+	}
+	
+	// Calculate selling unit price including line discount
+	// We don't use calculate_price, because this function is dedicated to calculation of total with accuracy of total. We need an accuracy of a unit price.
+	// Also we must not apply rounding on non decimal rule defined by option MAIN_ROUNDING_RULE_TOT
+	$pu_ht_remise = $pvht * (1 - ($remise_percent / 100));
+	$pu_ht_remise = price2num($pu_ht_remise, 'MU');
 
-	require_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
-	// calcul pu_ht remisés
-	$tabprice=calcul_price_total(1, $pvht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, 0, 'HT', 0, $type, $seller, $localtaxes_array);
-	$pu_ht_remise = $tabprice[0];
 	// calcul marge
 	if ($pu_ht_remise < 0)
 		$marge = -1 * (abs($pu_ht_remise) - $paht_ret);