Le raisonnement a été fait dans l'autre sens et tous les round() ont été supprimés. L'arrondi ne doit être effectué qu'en final/display, pas pendant les calculs surtout que Prestashop n'a jamais compris que la somme des arrondis n'est pas égale à l'arrondi de la somme.
Ils font la même erreur dans la génération des avoirs.
Et dans Phenix on limite les calculs vu que les valeurs des règles paniers (getContextualValue()) sont stockées dans la table ps_cart_cart_rule
Et si, comme dans votre cas, une réduction est appliquée en montant TTC sur une commande, il faut se baser sur le TTC.
Exemple simple, le panier comporte 3 produits avec 3 taux de taxe:
1 produit à 10€ à 5%
1 produit à 10€ à 10%
1 produit à 10€ à 20%
Dans cette exemple le prorata de chaque produit représente 33.33% du total.
Total TTC = 30€
- Remise TTC 5€
Total remisé : 25€
Le prorata des produits reste le même après remise globale: 33.33%
Après remise (25 €/3):
Produit 1 TTC = 8.333€
Produit 1 TTC = 8.333€
Produit 1 TTC = 8.333€
On peut à présent récupérer les HT et taxes:
Produit 1 HT = 8.333/1.05 = 7.94 HT (0.39 de TVA)
Produit 2 HT = 8.333/1.1 = 7.57 HT (0.76 de TVA)
Produit 3HT = 8.333/1.2 = 6.94 HT (1.39 de TVA)
Ensuite pour l'affichage, soit on conserve les prix et taxes avant remise et on détaille les taxes de la remise, soit on affiche dans le récap les taxes finales payées sur cette commande.
Soit:
- Un total avant remise TTC de 30€, 26.94 HT (9.52 + 9.09 + 8.33) + TVA 3.06€
- Un total remisé TTC de 25€, 22.45 € HT + total TVA 2.54 €
- Une remise de 5€ TTC, 4.48 HT + TVA 0.52 €