Skip to content

Commit

Permalink
[FIX] account_reconcile_oca: Make it work with foreign currency
Browse files Browse the repository at this point in the history
  • Loading branch information
etobella committed Aug 21, 2023
1 parent afed064 commit a525235
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 19 deletions.
1 change: 0 additions & 1 deletion account_reconcile_oca/models/account_account_reconcile.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class AccountAccountReconcile(models.Model):
account_id = fields.Many2one("account.account", readonly=True)
name = fields.Char(readonly=True)
is_reconciled = fields.Boolean(readonly=True)
currency_id = fields.Many2one("res.currency", readonly=True)

@property
def _table_query(self):
Expand Down
28 changes: 19 additions & 9 deletions account_reconcile_oca/models/account_bank_statement_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@ def _onchange_add_account_move_line_id(self):
self.add_account_move_line_id = False

def _recompute_suspense_line(self, data, reconcile_auxiliary_id, manual_reference):
reconcile_auxiliary_id = self._compute_exchange_rate(
data, reconcile_auxiliary_id
)
can_reconcile = True
total_amount = 0
new_data = []
Expand Down Expand Up @@ -189,6 +192,8 @@ def _recompute_suspense_line(self, data, reconcile_auxiliary_id, manual_referenc
"debit": -total_amount if total_amount < 0 else 0.0,
"kind": "suspense",
"currency_id": self.currency_id.id,
"line_currency_id": self.currency_id.id,
"currency_amount": -total_amount,
}
reconcile_auxiliary_id += 1
new_data.append(suspense_line)
Expand Down Expand Up @@ -366,6 +371,8 @@ def _reconcile_data_by_model(self, data, reconcile_model, reconcile_auxiliary_id
.browse(line["account_id"])
.name_get()[0],
"date": fields.Date.to_string(self.date),
"line_currency_id": self.currency_id.id,
"currency_amount": amount,
}
)
reconcile_auxiliary_id += 1
Expand All @@ -376,15 +383,14 @@ def _reconcile_data_by_model(self, data, reconcile_model, reconcile_auxiliary_id
new_data.append(new_line)
return new_data, reconcile_auxiliary_id

def _compute_exchange_rate(self, data):
reconcile_auxiliary_id = 1
if not self.foreign_currency_id or self.is_reconciled:
def _compute_exchange_rate(self, data, reconcile_auxiliary_id):
foreign_currency = self.foreign_currency_id or any(
line["currency_id"] != line["line_currency_id"] for line in data
)
if not foreign_currency or self.is_reconciled:
return reconcile_auxiliary_id
currency = self.journal_id.currency_id or self.company_id.currency_id
currency_amount = self.foreign_currency_id._convert(
self.amount_currency, currency, self.company_id, self.date
)
amount = sum(d["amount"] for d in data) - currency_amount
amount = sum(d.get("net_amount", 0) for d in data)
if not currency.is_zero(amount):
account = self.company_id.expense_currency_exchange_account_id
if amount > 0:
Expand All @@ -402,6 +408,8 @@ def _compute_exchange_rate(self, data):
"debit": -amount if amount < 0 else 0.0,
"kind": "other",
"currency_id": self.currency_id.id,
"line_currency_id": self.currency_id.id,
"currency_amount": -amount,
}
)
reconcile_auxiliary_id += 1
Expand All @@ -410,7 +418,7 @@ def _compute_exchange_rate(self, data):
def _default_reconcile_data(self):
liquidity_lines, suspense_lines, other_lines = self._seek_for_lines()
data = [self._get_reconcile_line(line, "liquidity") for line in liquidity_lines]
reconcile_auxiliary_id = self._compute_exchange_rate(data)
reconcile_auxiliary_id = 1
res = (
self.env["account.reconcile.model"]
.search([("rule_type", "in", ["invoice_matching", "writeoff_suggestion"])])
Expand Down Expand Up @@ -605,7 +613,7 @@ def create(self, mvals):
record._get_reconcile_line(line, "liquidity")
for line in liquidity_lines
]
reconcile_auxiliary_id = record._compute_exchange_rate(data)
reconcile_auxiliary_id = 1
if res.get("status", "") == "write_off":
data = record._recompute_suspense_line(
*record._reconcile_data_by_model(
Expand Down Expand Up @@ -664,6 +672,8 @@ def button_manual_reference_full_paid(self):
"debit": -total_amount if total_amount < 0 else 0.0,
"kind": "other",
"currency_id": line["currency_id"],
"line_currency_id": line["currency_id"],
"currency_amount": -total_amount,
}
)
reconcile_auxiliary_id += 1
Expand Down
33 changes: 24 additions & 9 deletions account_reconcile_oca/models/account_reconcile_abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,33 @@ class AccountReconcileAbstract(models.AbstractModel):
default=False,
prefetch=False,
)
currency_id = fields.Many2one("res.currency", readonly=True)

def _get_reconcile_line(self, line, kind, is_counterpart=False, max_amount=False):
original_amount = amount = line.debit - line.credit
original_amount = amount = net_amount = line.debit - line.credit
if is_counterpart:
original_amount = amount = (
line.amount_residual_currency or line.amount_residual
)
amount = line.amount_residual_currency or line.amount_residual
original_amount = net_amount = line.amount_residual
if max_amount:
currency_max_amount = self.currency_id._convert(
max_amount, line.currency_id, self.company_id, line.date
)
if max_amount:
if amount > max_amount > 0:
amount = max_amount
if amount < max_amount < 0:
amount = max_amount
if amount > currency_max_amount > 0:
amount = currency_max_amount
net_amount = max_amount
if amount < currency_max_amount < 0:
amount = currency_max_amount
net_amount = max_amount
if is_counterpart:
amount = -amount
original_amount = -original_amount
net_amount = -net_amount
currency_amount = amount
date = self.date if "date" in self._fields else line.date
amount = line.currency_id._convert(
amount, self.currency_id, self.company_id, date
)
vals = {
"reference": "account.move.line;%s" % line.id,
"id": line.id,
Expand All @@ -52,7 +64,10 @@ def _get_reconcile_line(self, line, kind, is_counterpart=False, max_amount=False
"debit": amount if amount > 0 else 0.0,
"credit": -amount if amount < 0 else 0.0,
"amount": amount,
"currency_id": line.currency_id.id,
"net_amount": amount - net_amount,
"currency_id": self.currency_id.id,
"line_currency_id": line.currency_id.id,
"currency_amount": currency_amount,
"analytic_distribution": line.analytic_distribution,
"kind": kind,
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,16 @@ import session from "web.session";
const {Component} = owl;

export class AccountReconcileDataWidget extends Component {
setup() {
super.setup(...arguments);
this.foreignCurrency =
this.props &&
this.props.record &&
(this.props.record.data.foreign_currency_id ||
this.props.record.data[this.props.name].data.some(
(item) => item.line_currency_id !== item.currency_id
));
}
getReconcileLines() {
var data = this.props.record.data[this.props.name].data;
for (var line in data) {
Expand All @@ -31,6 +41,13 @@ export class AccountReconcileDataWidget extends Component {
currency: session.get_currency(data[line].currency_id),
}
);
data[line].amount_currency_format = fieldUtils.format.monetary(
data[line].currency_amount,
undefined,
{
currency: session.get_currency(data[line].line_currency_id),
}
);
if (data[line].original_amount) {
data[line].original_amount_format = fieldUtils.format.monetary(
data[line].original_amount,
Expand Down
9 changes: 9 additions & 0 deletions account_reconcile_oca/static/src/xml/reconcile.xml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@
<th>Partner</th>
<th>Date</th>
<th>Label</th>
<th class="text-end" t-if="foreignCurrency">
Amount in currency
</th>
<th class="text-end">Debit</th>
<th class="text-end">Credit</th>
<th />
Expand Down Expand Up @@ -90,6 +93,12 @@
t-if="reconcile_line.name"
/>
</td>
<td
class="text-end o_field_account_reconcile_oca_balance_float"
t-if="foreignCurrency"
>
<span t-esc="reconcile_line.amount_currency_format" />
</td>
<td
class="text-end o_field_account_reconcile_oca_balance_float"
>
Expand Down

0 comments on commit a525235

Please sign in to comment.