account-reconcile/account_move_reconcile_helper/models/account_move_line.py

73 lines
2.4 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2017 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class AccountMoveLine(models.Model):
_inherit = 'account.move.line'
partial_reconciliation_in_progress = fields.Boolean(
compute='_compute_partial_reconciliation_in_progress')
reconcile_line_ids = fields.One2many(
compute='_compute_reconciled_lines',
comodel_name='account.move.line',
string="Reconciled lines")
@api.multi
@api.depends('matched_debit_ids', 'matched_credit_ids')
def _compute_partial_reconciliation_in_progress(self):
for rec in self:
rec.partial_reconciliation_in_progress = (
bool(rec.matched_debit_ids) or bool(rec.matched_credit_ids))
@api.multi
def _compute_reconciled_lines(self):
for rec in self:
rec.reconcile_line_ids = rec._get_reconciled_lines()
@api.multi
def _get_reconciled_lines(self, move_lines=None):
"""
Returns lines which were reconciled directly or indirectly with
current lines given in self.
If A has been reconciled (or partially) with B, and B with C. This
method will returns A, B, and C.
:param move_lines: found moves lines to avoid recursivity
:return: recordset('account.move.line')
"""
move_lines = move_lines or self.env[self._name]
for line in self:
if line.full_reconcile_id:
matched_lines = line.full_reconcile_id.reconciled_line_ids
elif line.credit > 0:
matched_lines = line.matched_debit_ids.mapped('debit_move_id')
else:
matched_lines = line.matched_credit_ids.mapped(
'credit_move_id')
if not matched_lines:
continue
move_lines |= line
for matched_line in matched_lines:
if matched_line not in move_lines:
move_lines |= matched_line
move_lines |= matched_line._get_reconciled_lines(
move_lines)
return move_lines
@api.multi
def open_full_reconcile_view(self):
action = self.env.ref('account.action_account_moves_all_a').read()[0]
action['domain'] = [
('id', 'in', self.mapped('reconcile_line_ids').ids)]
return action