emily_d Posted June 15, 2013 Share Posted June 15, 2013 (edited) Avant de commencer, deux remarques : - Ce n’est pas un message sur comment calculer la TVA. - Il y a pas mal de message concernant le sujet mais ce sont souvent des messages sans réponse et éparpillés. L’erreur est la suivante : le montant de TVA affiché dans le détail des taxes n’est pas le même que celui affiché à la fin du récapitulatif des totaux dans une facture. Dans une boutique de base, ajoutez 5 Housses portefeuille en cuir à 18 euros TTC avec une réduction à 10%, donc un prix unitaire TTC de 16,20. Dans le récap des totaux, on obtient 67,75 en Total Produits HT et 81,00 en total TTC et une TVA de 13,25. Par contre dans le détail des taxes le montant de la TVA est à 13,30. Le problème se situe dans OrderDetail :: saveTaxCalculator. Le total TVA du détail est faussé de deux manières : $unit_amount = (float)Tools::ps_round($amount, 2); Cela va arrondir avant l’heure le total TVA par produit. Même en réglant le problème précédant, on aura tout de même un décalage de TVA car le calcul de la TVA ne correspond pas à celui utilisé dans le récapitulatif des totaux. Pour régler le problème, je n’ai pas vraiment de solution miracle mais j’en ai deux – de solutions. En premier, en changeant dans saveTaxCalculator: //$unit_amount = (float)Tools::ps_round($amount, 2); //$total_amount = $unit_amount * $this->product_quantity; $unit_amount = $amount; $total_amount = (($this->unit_price_tax_incl - $this->unit_price_tax_excl) * $this->product_quantity) - ($order->total_discounts_tax_incl - $order->total_discounts_tax_excl); On prend le prix TTC du produit on lui soustrait le prix HT on multiplie par le nombre de produit (puis si nécessaire on soustrait la TVA réduction). Il faut bien comprendre que le détail des taxes n’est pas recalculé avec la régénération du PDF, il est sauvegardé dans la table ps_order_detail_tax donc ce changement n’impactera pas les factures déjà enregistrées ! J’ai testé avec un prix spécifique (montant et pourcentage) et une règle panier et cela semble fonctionner. Mais je n’ai pas de recul pour voir quelles conditions mettraient à mal ce calcul. Toutefois pour le surveiller vous pouvez logger toute différence trop importante entre l'ancien et le nouveau calcul : if(abs($old_total_amount - $total_amount) > 0.50) Logger::addLog("VAT fix is no longer working in OrderDetail::saveTaxCalculator for order id " . $order->id,4,null,null,null,true); Edit. En y réfléchissant, avec des TVA à taux différents, le calcul sera caduque car la réduction TVA serait enlevée pour chaque taux. Il ne parait pas évident à quel taux appliquer la réduction. Peut-être que le détail des taxes devrait être exempt de la réduction. Je ne sais pas. Autre solution, plus simple à mettre en oeuvre, mais qui a cependant un gros défaut. Dans invoice.tax-tab.tpl, on remplace la TVA produits par : {displayPrice currency=$order->id_currency price=($order_invoice->total_products_wt - $order_invoice->total_products) - ($order_invoice->total_discount_tax_incl - $order_invoice->total_discount_tax_excl)} {*}{displayPrice currency=$order->id_currency price=$product_tax_infos.total_amount}{*} On soustrait simplement au montant produits TTC le montant produits HT (moins la TVA réduction). Mais, et c'est le défaut, cela fonctionne pas si vous avez des taux de TVA différents ! Autre remarque, il faut aussi repenser le calcul de la TVA pour les avoirs. Edited June 16, 2013 by emily_d (see edit history) Link to comment Share on other sites More sharing options...
emily_d Posted June 16, 2013 Author Share Posted June 16, 2013 (edited) Pour les avoirs dans la deuxième solution on ferait : {if isset($is_order_slip) && $is_order_slip} {displayPrice currency=$order->id_currency price=($order->total_products_wt - $order->total_products)} {else} {displayPrice currency=$order->id_currency price=($order_invoice->total_products_wt - $order_invoice->total_products) - ($order_invoice->total_discount_tax_incl - $order_invoice->total_discount_tax_excl)} {/if} Mais comment intégrer le remboursement d'une réduction ? En fait, on ne peut pas rembourser une réduction. Pour la première solution, toujours pour les avoirs, il faut récupérer amount_tax_ecl et amount_tax_incl qui se trouve dans ps_order_slip_detail et ensuite faire la soustraction dans HTMLTemplateOrderSlip::getProductTaxesBreakdown. $infos['total_price_tax_excl'] = (float)Tools::ps_round($order_slip_details['amount_tax_excl'], 2); //$infos['total_amount'] += (float)Tools::ps_round($amount, 2); } $infos['total_amount'] = ($order_slip_details['amount_tax_incl'] - $order_slip_details['amount_tax_excl']); if(abs((float)Tools::ps_round($order_slip_details['amount_tax_excl'], 2) - $infos['total_amount']) > 0.50) Logger::addLog("VAT fix is no longer working in HTMLTemplateOrderSlip::getProductTaxesBreakdown for order slip id " . $order_slip_details['id_order_slip'],4,null,null,null,true); J'ai réglé un autre problème dans le détail des taxes lorsqu'il y a plusieurs taux, le total HT des lignes s'ajoutait à cause de : $infos['total_price_tax_excl'] += (float)Tools::ps_round($order_slip_details['amount_tax_excl'], 2); Edited June 16, 2013 by emily_d (see edit history) Link to comment Share on other sites More sharing options...
emily_d Posted June 17, 2013 Author Share Posted June 17, 2013 (edited) A chaque fois que je fais un nouvel essai, je trouve de nouveaux problèmes. Maintenant dans la liste des totaux. Si vous avez un code de réduction + un code de réduction livraison gratuite, le Total Réductions sera eronné. Dans invoice.tpl, $order_invoice->total_discount_tax_incl contient déjà la réduction de la livraison, donc elle sera doublée : {if $order_invoice->total_discount_tax_incl > 0} <tr style="line-height:5px;"> <td style="text-align: right; font-weight: bold">{l s='Total Vouchers' pdf='true'}</td> <td style="width: 15%; text-align: right;">-{displayPrice currency=$order->id_currency price=($order_invoice->total_discount_tax_incl + $shipping_discount_tax_incl)}</td> </tr> {/if} Y a un autre souci dans le détail des taxes, cette fois concernant la TVA. Mais est-ce que cela vaut vraiment la peine d’en parler... Allez, je donne juste la solution, pas la force d'expliquer le problème et sa résolution. De toute façon dans quelques heures je trouverais sûrement d'autres problèmes... C'est mon dernière essai, avec la seconde solution (modifications des templates uniquement) : {if isset($is_order_slip) && $is_order_slip} {displayPrice currency=$order->id_currency price=($order->total_products_wt - $order->total_products)} {else} {if $product_tax_breakdown|count == 1 && (isset($shipping_tax_breakdown) && !$shipping_tax_breakdown)} {displayPrice currency=$order->id_currency price=($order_invoice->total_paid_tax_incl - $order_invoice->total_paid_tax_excl)} {else} {displayPrice currency=$order->id_currency price=($order_invoice->total_products_wt - $order_invoice->total_products) - ($order_invoice->total_discount_tax_incl - $order_invoice->total_discount_tax_excl)} {/if} {/if} Edited June 17, 2013 by emily_d (see edit history) Link to comment Share on other sites More sharing options...
emily_d Posted June 18, 2013 Author Share Posted June 18, 2013 Bon ça n'a pas raté dans OrderInvoice::getProductTaxesBreakdown, lorsqu'on a une réduction livraison ("règle panier avec livraions offerte"), elle est soustraite au total produit HT : $tmp_tax_infos[$tax_infos['rate']]['total_price_tax_excl'] += $tax_infos['total_price_tax_excl'] - $order_reduction_amount - Tools::ps_round($tax_infos['ecotax'] * $tax_infos['product_quantity'], 2); $order_reduction_amount contient la réduction livraison donc cela va fausser le total produit ht dans le détail des taxes. J'abandonne. Link to comment Share on other sites More sharing options...
micandmod Posted July 24, 2013 Share Posted July 24, 2013 Bonjour Emily, Avez-vous trouvé la solution depuis ? :S Link to comment Share on other sites More sharing options...
tuk66 Posted July 25, 2013 Share Posted July 25, 2013 Est-ce la même chose? http://www.prestashop.com/forums/topic/166816-pdf-invoice-in-different-prestashop-versions-wrong-amounts-updated/ Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now