From 4c0998c2a8c89f3f242cc3085ad4faadfd263930 Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 21 Nov 2022 11:06:35 +0100 Subject: [PATCH 1/2] [ADD] account_bank_reconciliation_cron --- account_bank_reconciliation_cron/__init__.py | 1 + .../__manifest__.py | 13 +++++ .../data/ir_cron.xml | 11 +++++ .../models/__init__.py | 1 + .../models/account_bank_statement.py | 48 +++++++++++++++++++ 5 files changed, 74 insertions(+) create mode 100644 account_bank_reconciliation_cron/__init__.py create mode 100644 account_bank_reconciliation_cron/__manifest__.py create mode 100644 account_bank_reconciliation_cron/data/ir_cron.xml create mode 100644 account_bank_reconciliation_cron/models/__init__.py create mode 100644 account_bank_reconciliation_cron/models/account_bank_statement.py diff --git a/account_bank_reconciliation_cron/__init__.py b/account_bank_reconciliation_cron/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/account_bank_reconciliation_cron/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/account_bank_reconciliation_cron/__manifest__.py b/account_bank_reconciliation_cron/__manifest__.py new file mode 100644 index 0000000000..4899fb3d2f --- /dev/null +++ b/account_bank_reconciliation_cron/__manifest__.py @@ -0,0 +1,13 @@ +# Copyright 2017 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Account Bank Reconciliation Cron", + "summary": "Cron for automatically reconcile open bank statement lines", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/account-reconcile", + "depends": ["account_reconciliation_widget"], + "data": ["data/ir_cron.xml"], +} diff --git a/account_bank_reconciliation_cron/data/ir_cron.xml b/account_bank_reconciliation_cron/data/ir_cron.xml new file mode 100644 index 0000000000..8f7d6f69e0 --- /dev/null +++ b/account_bank_reconciliation_cron/data/ir_cron.xml @@ -0,0 +1,11 @@ + + + Automatically reconciliation for bank statement lines + + code + model._cron_bank_automatic_reconciliation() + days + 1 + -1 + + diff --git a/account_bank_reconciliation_cron/models/__init__.py b/account_bank_reconciliation_cron/models/__init__.py new file mode 100644 index 0000000000..1c5c5ec4f0 --- /dev/null +++ b/account_bank_reconciliation_cron/models/__init__.py @@ -0,0 +1 @@ +from. import account_bank_statement diff --git a/account_bank_reconciliation_cron/models/account_bank_statement.py b/account_bank_reconciliation_cron/models/account_bank_statement.py new file mode 100644 index 0000000000..18225e5ab6 --- /dev/null +++ b/account_bank_reconciliation_cron/models/account_bank_statement.py @@ -0,0 +1,48 @@ +from odoo import models +from odoo.exceptions import UserError + + +class AccountBankStatement(models.Model): + _inherit = "account.bank.statement" + + def _cron_bank_automatic_reconciliation(self): + bs_ids = self.search([('state', '=', 'posted')]) + for bs in bs_ids: + for stl in bs.line_ids: + if not stl.is_reconciled: + counterpart_aml_dicts = [] + amls = self.env['account.move.line'].search([ + ('reconciled', '=', False), + ('name', 'ilike', stl.payment_ref), + ('parent_state', '=', 'posted') + ]) + amls = amls.filtered( + lambda l: l.account_id.internal_type in ['receivable', 'payable'] or l.account_id.id in [bs.journal_id.payment_debit_account_id.id, bs.journal_id.payment_credit_account_id.id] + ) + if len(amls) == 0: + continue + elif len(amls) == 1: + counterpart_aml_dicts.append({ + 'move_line': amls, + 'name': "{}".format(amls.name), + 'credit': abs(stl.amount) if stl.amount > 0 else 0.0, + 'debit': abs(stl.amount) if stl.amount < 0 else 0.0, + 'ref': amls.name, + }) + else: + if sum(abs(amls.residual_amount)) == abs(stl.amount): + for aml in amls: + counterpart_aml_dicts.append({ + 'move_line': aml, + 'name': "{}".format(aml.name), + 'credit': abs(aml.amount_residual) if amls.amount_residual > 0 else 0.0, + 'debit': abs(aml.amount_residual) if amls.amount_residual < 0 else 0.0, + 'ref': aml.name, + }) + if len(counterpart_aml_dicts) > 0: + stl.process_reconciliation(counterpart_aml_dicts=counterpart_aml_dicts) + if bs.all_lines_reconciled: + try: + bs.button_validate() + except UserError: + pass From 84e7272a1ccb56c60fa2e0215377ace8582beb19 Mon Sep 17 00:00:00 2001 From: ThiagoMForgeFlow Date: Tue, 31 Jan 2023 11:11:51 +0100 Subject: [PATCH 2/2] [14.0][FIX] account_bank_reconciliation_cron: change residual_amount field to amount_residual --- .../models/account_bank_statement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_bank_reconciliation_cron/models/account_bank_statement.py b/account_bank_reconciliation_cron/models/account_bank_statement.py index 18225e5ab6..0b9a82c2f3 100644 --- a/account_bank_reconciliation_cron/models/account_bank_statement.py +++ b/account_bank_reconciliation_cron/models/account_bank_statement.py @@ -30,7 +30,7 @@ def _cron_bank_automatic_reconciliation(self): 'ref': amls.name, }) else: - if sum(abs(amls.residual_amount)) == abs(stl.amount): + if sum(abs(amls.amount_residual)) == abs(stl.amount): for aml in amls: counterpart_aml_dicts.append({ 'move_line': aml,