From 9e3c723c19e3889e589e9497236f80e09e5e612e Mon Sep 17 00:00:00 2001 From: "Lucas Perais (lpe)" Date: Mon, 23 Oct 2017 13:06:04 +0200 Subject: [PATCH] [FIX] account: fix rounding of taxes in invoices Set the round_globally method on the company. Have an invoice with several lines and some of them having two (or more) taxes. See the OPW 775501 for exact numbers. It is a practical example case where round(0.003 + 0.004) = 0.007 ~ 0.01 BUT round(0.003) + round(0.004) ~ 0.00 + 0.00 = 0.00 Before this commit there could be a difference between amount_residual and amount_total on invoices. This was because the two amounts are based on something different: AMOUNT RESIDUAL It computed in function of account_move_lines of the invoice. For such an invoice the structure of those lines would be 1 line per tax + 1 line in the receivable account Here the amount tax of each line is rounded before the addition. In summary, the total amount of each tax are rounded and then added to each other AMOUNT TOTAL It is computed in function of the on-the-fly computation of the taxes with two cases: - round per line: obviously each invoice_line gets its taxes rounded before addition, which isn't problematic as regards to the previous paragraph - round globally: Here lied the problem. the rounding of the tax_line_ids was made **after** each tax amount was added to each other, which contradicts the above argument After this commit, we round tax_line_ids before their addition, it is rather logical and matches the expectation one can have reading the tooltip of the rounding method field >> If you select 'Round per Line' : for each tax, the tax amount will first be computed and rounded for each PO/SO/invoice line and then these rounded amounts will be summed, leading to the total amount for that tax. If you select 'Round Globally': for *****each tax*****, the tax amount will be computed for each PO/SO/invoice line, then these amounts will be summed and eventually ***this total tax amount*** will be rounded << OPW 775501 After this commit, it is expected that the behavior of sale.order and purchase.order won't be the same as the invoice in the same conditions. See PR #20349 for an explanation --- addons/account/models/account_invoice.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py index 06fba95630c..2dc3222456f 100644 --- a/addons/account/models/account_invoice.py +++ b/addons/account/models/account_invoice.py @@ -44,8 +44,9 @@ class AccountInvoice(models.Model): @api.one @api.depends('invoice_line_ids.price_subtotal', 'tax_line_ids.amount', 'currency_id', 'company_id', 'date_invoice', 'type') def _compute_amount(self): + round_curr = self.currency_id.round self.amount_untaxed = sum(line.price_subtotal for line in self.invoice_line_ids) - self.amount_tax = sum(line.amount for line in self.tax_line_ids) + self.amount_tax = sum(round_curr(line.amount) for line in self.tax_line_ids) self.amount_total = self.amount_untaxed + self.amount_tax amount_total_company_signed = self.amount_total amount_untaxed_signed = self.amount_untaxed