From 317c6b82a2dfa86c51176d01ccf39976a2adbfa7 Mon Sep 17 00:00:00 2001 From: Joren Van Onder Date: Wed, 18 Nov 2015 14:21:33 +0100 Subject: [PATCH] [FIX] point_of_sale: compute the tax based on the rounded price Before this, we would compute taxes based on quantity * price. In account.tax (used by the POS backend) however taxes are computed on a rounded (based on currency precision) quantity * price. This would cause issues as orders in the backend would have a different total price as calculated in the frontend. An example that used to trigger the problem: Order with orderline with product with price of 5, excluded tax of 21% and a quantity of 0.985. This would cost 5.96 in the frontend and 5.97 in the backend. --- addons/point_of_sale/static/src/js/models.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index 1079125b2f9..8bac3a12519 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -1325,13 +1325,13 @@ exports.Orderline = Backbone.Model.extend({ return base_amount >= 0 ? ret : ret * -1; } if ((tax.amount_type === 'percent' && !tax.price_include) || (tax.amount_type === 'division' && tax.price_include)){ - return (base_amount * tax.amount / 100) * quantity; + return base_amount * tax.amount / 100; } if (tax.amount_type === 'percent' && tax.price_include){ - return (base_amount - (base_amount / (1 + tax.amount / 100))) * quantity; + return base_amount - (base_amount / (1 + tax.amount / 100)); } if (tax.amount_type === 'division' && !tax.price_include) { - return (base_amount / (1 - tax.amount / 100) - base_amount) * quantity; + return base_amount / (1 - tax.amount / 100) - base_amount; } return false; }, @@ -1354,7 +1354,7 @@ exports.Orderline = Backbone.Model.extend({ list_taxes.concat(ret.taxes); } else { - var tax_amount = self._compute_all(tax, price_unit, quantity); + var tax_amount = self._compute_all(tax, base, quantity); tax_amount = round_pr(tax_amount, currency_rounding); if (tax_amount){