68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
# Copyright 2021 Tecnativa - Víctor Martínez
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
|
|
from odoo import api, models
|
|
|
|
|
|
class AccountMove(models.Model):
|
|
_inherit = "account.move"
|
|
|
|
@api.depends(
|
|
"currency_id",
|
|
"company_currency_id",
|
|
"company_id",
|
|
"invoice_date",
|
|
"state",
|
|
"line_ids.amount_currency",
|
|
"line_ids.balance",
|
|
)
|
|
def _compute_invoice_currency_rate(self):
|
|
# If move is posted, get rate based on line amount
|
|
res = super()._compute_invoice_currency_rate()
|
|
for move in self:
|
|
lines = move.line_ids.filtered(lambda x: abs(x.amount_currency) > 0)
|
|
if move.state != "posted" or not lines or not move.currency_id:
|
|
continue
|
|
amount_currency_positive = sum(
|
|
[abs(amc) for amc in lines.mapped("amount_currency")]
|
|
)
|
|
total_balance_positive = sum([abs(b) for b in lines.mapped("balance")])
|
|
move.invoice_currency_rate = (
|
|
amount_currency_positive / total_balance_positive
|
|
)
|
|
return res
|
|
|
|
# Add the 'state', 'line_ids.amount_currency', and 'line_ids.balance'
|
|
# dependencies to the base dependencies to recalculate the expected exchange rate.
|
|
#
|
|
# Without this change, which causes expected_currency_rate and invoice_currency_rate
|
|
# to be updated simultaneously, invoice_currency_rate is updated with an outdated
|
|
# expected_currency_rate value in account.move.
|
|
@api.depends("state", "line_ids.amount_currency", "line_ids.balance")
|
|
def _compute_expected_currency_rate(self):
|
|
return super()._compute_expected_currency_rate()
|
|
|
|
|
|
class AccountMoveLine(models.Model):
|
|
_inherit = "account.move.line"
|
|
|
|
@api.depends(
|
|
"currency_id",
|
|
"company_id",
|
|
"move_id.invoice_currency_rate",
|
|
"move_id.date",
|
|
"move_id.state",
|
|
"amount_currency",
|
|
"balance",
|
|
)
|
|
def _compute_currency_rate(self):
|
|
# If move is posted, get rate based on line amount
|
|
res = super()._compute_currency_rate()
|
|
for line in self:
|
|
if line.move_id.state != "posted" or not line.amount_currency:
|
|
continue
|
|
line.currency_rate = (
|
|
abs(line.amount_currency) / abs(line.balance) if line.balance else 0
|
|
)
|
|
return res
|