Jump to content

Bug: Calcul total TTC erroné lorsqu'une réduction est appliquée


Recommended Posts

Bonjour à tous,

 

Je post ici pour tous ceux qui auraient un soucis avec l'arrondi de TVA sur leur facture.

 

Nous sommes actuellement sur des tests sur Prestashop 1.5.2 à 1.5.4.1

 

J'ai un soucis lorsque j'ai une facture avec une réduction, le calcul du prix de la TVA des produits est supérieur de 1c au calcul du prix de la TVA total de la commande.

Alors 1c ce n'est pas grave me direz-vous, sauf que lorsque je sors le fichier de compta (un module d'export vers Ciel qu'on a créé), la ligne des D n'est pas égales à la ligne des C... et là c'est le drame.

 

Que se passe-t-il?

 

J'ai un produit qui coûte à l'origine 124.58 € HT, TVA à 19.6%

On a donc un prix TTC à 148.997€ soit 148.50€.

J'applique une réduction de 5% (sur le HT) soit un nouveau prix HT à 118.351€ (enregistré comme tel dans la base, jusque là on est OK), et donc un prix unitaire TTC à 141.5477 soit 141.55€TTC.

 

Je commande 3 quantités de ce produit, donc 118.351 * 3 = 355.053 (arrondi justement à 355.05€ HT sur la facture).

Le TTC devrait donc etre 355.053 * 1.196 = 424.6433. Or il est affiché à 424.65 sur ma facture.

 

Alors maintenant que se passe-t-il en base? Ma TVA nouvellement calculé sur le prix réduit est arrondi à 2 chiffres, et stockée comme tel. Résultat j'ai une TVA stockée à 23.200000 l'unité (au lieu de 23.196796). Quand on multiplie par 3 .... on tombe sur 69.600000 d'un côté (faux) ou 69.590388 (juste).

 

La solution est de modifier l'arrondi du calcul de la tva stockée dans la table order_detail_tax. Modifiez donc la fonction saveTaxCalculator du fichier OrderDetail.php (dossier classes > order) comme suis (le plus propre étant de le faire dans l'override):

public function saveTaxCalculator(Order $order, $replace = false)
{
 // Nothing to save
 if ($this->tax_calculator == null)
  return true;
 if (!($this->tax_calculator instanceOf TaxCalculator))
  return false;
 if (count($this->tax_calculator->taxes) == 0)
  return true;
 if ($order->total_products <= 0)
  return true;
 $ratio = $this->unit_price_tax_excl / $order->total_products;
 $order_reduction_amount = $order->total_discounts_tax_excl * $ratio;
 $discounted_price_tax_excl = $this->unit_price_tax_excl - $order_reduction_amount;
 $values = '';
 foreach ($this->tax_calculator->getTaxesAmount($discounted_price_tax_excl) as $id_tax => $amount)
 {
  $unit_amount = (float)Tools::ps_round($amount, 6);
  $total_amount = $unit_amount * $this->product_quantity;
  $values .= '('.(int)$this->id.','.(float)$id_tax.','.$unit_amount.','.(float)$total_amount.'),';
 }
 if ($replace)
  Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'order_detail_tax` WHERE id_order_detail='.(int)$this->id);

 $values = rtrim($values, ',');
 $sql = 'INSERT INTO `'._DB_PREFIX_.'order_detail_tax` (id_order_detail, id_tax, unit_amount, total_amount)
VALUES '.$values;

 return Db::getInstance()->execute($sql);
}

 

Il a suffit de remplacer $unit_amount = (float)Tools::ps_round($amount, 2); par $unit_amount = (float)Tools::ps_round($amount, 6);

 

Ma question à la Prestateam du coup: pourquoi faire un stockage à 6 chiffres en base et limiter l'arrondi à 2 (avec toutes les erreurs que cela engendre du coup)? C'est juste pour savoir si cela peut provoquer des effets de bord.

 

Il reste encore le soucis d'affichage sur la facture.. mais j'ai envie de dire.. ce n'est que de l'affichage.

post-343284-0-57404100-1372760096_thumb.png

Edited by IllicoPresta (see edit history)
Link to comment
Share on other sites

  • 2 months later...

Bonjour,

 

Dans mon cas aucune de ces 2 solutions n'a fonctionné sur une 1.5.4.

Et ça a même empiré le problème  :unsure:

D'un différence de 1 centime pour une commande à 200€ environ je passe à 15 centimes quand je force 6 décimales au lieu de 2 avec les 2 méthodes.

Est ce que j'aurais fait un truc de travers ?

 

Edit : mince mauvais sujet, je parlais de la 2nde méthode consistant à modifier la classe product.php

Edited by FredCD (see edit history)
Link to comment
Share on other sites

  • 2 months later...

Hello

 

Je suis en 1.5.2.0 et le problème reste identique quand j'applique la solution d'illicopresta, toutefois il est vrai que j'ai une règle de remise sur la commande qui rentre en jeu en plus...

 

Exemple

Total produits TTC :(1) 49,56 € Total bons de réduction TTC (2) -4,96 € Total frais de port TTC : (3) 9,90 € Total HT : (4) 45,59 € Total taxes : (5) 8,91 €

Total TTC: 54,50 €

 

Le total HT est incorrecte il devrait être:

((49.56-4.96)+9.9)/1.196 soit Total HT: 45.568 € <=> 54.50/1.196 = 45.568 €

 

Vraiment pas cool comme bug.

Merci pour votre aide

Edited by gueshfuli (see edit history)
Link to comment
Share on other sites

Bonjour gueshfuli,

 

Notre solution ne fonctionne que pour les commandes qui sont créées après l'application du patch. En effet les montant de TVA sont déjà stockées en base avec une approximation pour les commandes qui existante. Donc du coup même en appliquant la modif, vous ne verrez pas de différence sur une commande existante.

 

Cordialement,

Link to comment
Share on other sites

  • 1 month later...

Quelqu'un chez Prestashop peut-il prendre en compte ce bug ?

 

J'ai le même problème et malgré toutes mes recherches de solution, il ne semble pas que la Team Prestashop daigne prendre en compte ce grave problème de TVA qui met en porte à faux tous les magasins en ligne face à l'administraion fiscale !!

 

Ci joint une copie d'écran éloquente :

post-624746-0-01777200-1387146480_thumb.png

Edited by Ledfanatic (see edit history)
Link to comment
Share on other sites

  • 2 months later...

bonjour

je suis sur 1.5.6.1 et je rencontre le même problème d'arrondi avec les remise, j'ais failli balancer mon logiciel comptable croyant que c'était lui qui faisait n'importe quoi.

toujours pas de solution ? ( a part ne pas faire de remise)

 

cdlt

Link to comment
Share on other sites

Pareil pour moi, après avoir appliquer une réduction en % à un produit,

 

j'ai mon prix TTC qui est trop élevé quand je suis sur ma fiche produit, 

 

MAIS le prix TTC est correct dans la productlist et dans le panier  -_- je ne comprend pas, GgrRrrRr

 

ma solution pour le moment est d'appliquer la réduction en € et non en % 

 

J'ai besoin d'aide pour pouvoir appliquer m'a réduction en % car en € il faut calculé le montant de réduction pour chaque produit, c'est chiant!

 

Presta version 1.5.4.1    merciiiiii

Link to comment
Share on other sites

  • 2 weeks later...

Post créé en juillet 2013, plus de 5 MAJ des versions de prestashop entre temps et toujours pas de corrections !

C'est à croire que ce bug est dérisoire pour les gestionnaire de projet Presta...

Je le traine depuis la 1.5.4 et aujourd'hui en 1.5.6.2...

 

La réalité  c'est que ce bug est très fâcheux... Erreur de comptabilité, commandes en statut "erreur de paiement", clients qui appellent pour savoir pourquoi leur commande est bloquée, rembourser la différence ou s’asseoir sur des centimes dues... Voilà la réalité de ce bug

 

Ca serait bien qu'il y ait un correctif sur les versions actuelles

Link to comment
Share on other sites

Pour ma part j'ai pallié au problème en ne faisant pas de réduction au % mais en faisant des reduction en €.
Si je veux faire une réduction de 5% sur un article qui vait 10 € j'applique plutot une réduction de 0,50 € au moins j'ai pas ce problème d'arrondi. (A noter que ce problème à TOUJOURS existé sur prestashop et ne remonte pas spécialement à la 1.5).

Link to comment
Share on other sites

  • 1 year later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...