From a98d1f51d884cb71be30448fd715da153907ef76 Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Thu, 3 Dec 2015 17:01:41 +0100 Subject: [PATCH] [FIX] account: do not convert amount In a multi-currency environment, the difference amount computed will be affected by the exchange rate change. In other words, if the exchange rate changes between the invoice date and the payment date, this difference will be reflected in the difference amount. For example: - Company currency is USD, invoice currency is EUR - At invoice date, 1 USD = 1 EUR - At payment date, 1 USD = 0.9 EUR - An invoice of 1000 EUR is created - A payment of 1000 EUR is done Without this fix, a payment difference of -100 EUR is shown. The reason is that at invoice date, we expect a payment corresponding to 1000 USD, which is equal to 900 EUR at payment date. This fix doesn't do any currency conversion if the payment currency is the same than the invoice currency, to prevent any exchange rate difference shown. Indeed, if an invoice is 1000 EUR, a user expects that a payment of 1000 EUR will not show any payment difference. Note that this doesn't fix the payment difference amount when an invoice in a given currency is paid in another currency. opw-658177 --- addons/account/models/account_payment.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/addons/account/models/account_payment.py b/addons/account/models/account_payment.py index 4f918c1846b..7195170a86a 100644 --- a/addons/account/models/account_payment.py +++ b/addons/account/models/account_payment.py @@ -81,13 +81,16 @@ class account_abstract_payment(models.AbstractModel): def _compute_total_invoices_amount(self): """ Compute the sum of the residual of invoices, expressed in the payment currency """ - total = 0 payment_currency = self.currency_id or self.journal_id.currency_id or self.journal_id.company_id.currency_id - for inv in self._get_invoices(): - total += inv.residual_company_signed - company_currency = self.company_id.currency_id if self.company_id else self.env.user.company_id.currency_id - if company_currency and company_currency != payment_currency: - total = company_currency.with_context(date=self.payment_date).compute(total, payment_currency) + invoices = self._get_invoices() + + if all(inv.currency_id == payment_currency for inv in invoices): + total = sum(invoices.mapped('residual_signed')) + else: + total = sum(invoices.mapped('residual_company_signed')) + company_currency = self.company_id.currency_id if self.company_id else self.env.user.company_id.currency_id + if company_currency and company_currency != payment_currency: + total = company_currency.with_context(date=self.payment_date).compute(total, payment_currency) return abs(total)