From bd20798a1cc60c4b7863a72d80eb269803e9f45d Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 8 Aug 2022 00:05:18 +0200 Subject: [PATCH] Add module account_statement_import_base The 2 modules account_statement_import_online and account_statement_import depend on account_statement_import_base (and not on each other) and share common code, in particular a hook to update the statement line. So we can now have reconciliation modules that use this hook and therefore work both on file import and online import. More details on https://github.com/OCA/bank-statement-import/issues/481. Improve bank statement line form view and journal form view. --- account_statement_import_base/README.rst | 1 + account_statement_import_base/__init__.py | 1 + account_statement_import_base/__manifest__.py | 19 +++++ .../models/__init__.py | 2 + .../models/account_bank_statement_line.py | 22 ++++++ .../models/account_journal.py | 69 +++++++++++++++++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 4 ++ .../views/account_bank_statement_line.xml | 61 ++++++++++++++++ 9 files changed, 180 insertions(+) create mode 100644 account_statement_import_base/README.rst create mode 100644 account_statement_import_base/__init__.py create mode 100644 account_statement_import_base/__manifest__.py create mode 100644 account_statement_import_base/models/__init__.py create mode 100644 account_statement_import_base/models/account_bank_statement_line.py create mode 100644 account_statement_import_base/models/account_journal.py create mode 100644 account_statement_import_base/readme/CONTRIBUTORS.rst create mode 100644 account_statement_import_base/readme/DESCRIPTION.rst create mode 100644 account_statement_import_base/views/account_bank_statement_line.xml diff --git a/account_statement_import_base/README.rst b/account_statement_import_base/README.rst new file mode 100644 index 00000000..b04982bf --- /dev/null +++ b/account_statement_import_base/README.rst @@ -0,0 +1 @@ +Will be autogenerated from the readme subdir diff --git a/account_statement_import_base/__init__.py b/account_statement_import_base/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/account_statement_import_base/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/account_statement_import_base/__manifest__.py b/account_statement_import_base/__manifest__.py new file mode 100644 index 00000000..0cfbf924 --- /dev/null +++ b/account_statement_import_base/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# Licence LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0). + +{ + "name": "Base module for Bank Statement Import", + "category": "Accounting", + "version": "14.0.1.0.0", + "license": "LGPL-3", + "depends": ["account"], + "author": "Akretion, Odoo Community Association (OCA)", + "maintainers": ["alexis-via"], + "development_status": "Mature", + "website": "https://github.com/OCA/bank-statement-import", + "data": [ + "views/account_bank_statement_line.xml", + ], + "installable": True, +} diff --git a/account_statement_import_base/models/__init__.py b/account_statement_import_base/models/__init__.py new file mode 100644 index 00000000..4c252e45 --- /dev/null +++ b/account_statement_import_base/models/__init__.py @@ -0,0 +1,2 @@ +from . import account_bank_statement_line +from . import account_journal diff --git a/account_statement_import_base/models/account_bank_statement_line.py b/account_statement_import_base/models/account_bank_statement_line.py new file mode 100644 index 00000000..0058331f --- /dev/null +++ b/account_statement_import_base/models/account_bank_statement_line.py @@ -0,0 +1,22 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from odoo import fields, models + + +class AccountBankStatementLine(models.Model): + _inherit = "account.bank.statement.line" + + # Ensure transactions can be imported only once + # if the import format provides unique transaction IDs + unique_import_id = fields.Char(string="Import ID", readonly=True, copy=False) + raw_data = fields.Text(readonly=True, copy=False) + + _sql_constraints = [ + ( + "unique_import_id", + "unique(unique_import_id)", + "A bank account transaction can be imported only once!", + ) + ] diff --git a/account_statement_import_base/models/account_journal.py b/account_statement_import_base/models/account_journal.py new file mode 100644 index 00000000..3080fe74 --- /dev/null +++ b/account_statement_import_base/models/account_journal.py @@ -0,0 +1,69 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from odoo import api, models + +from odoo.addons.base.models.res_bank import sanitize_account_number + + +class AccountJournal(models.Model): + _inherit = "account.journal" + + def _statement_line_import_speeddict(self): + """This method is designed to be inherited by reconciliation modules. + These modules can take advantage of this method to pre-fetch data + that will later be used for many statement lines (to avoid + searching data for each statement line). + The goal is to improve performances. + """ + self.ensure_one() + speeddict = {"account_number": {}} + partner_banks = self.env["res.partner.bank"].search_read( + [("company_id", "in", (False, self.company_id.id))], + ["acc_number", "partner_id"], + ) + for partner_bank in partner_banks: + speeddict["account_number"][partner_bank["acc_number"]] = { + "partner_id": partner_bank["partner_id"][0], + "partner_bank_id": partner_bank["id"], + } + return speeddict + + def _statement_line_import_update_hook(self, st_line_vals, speeddict): + """This method is designed to be inherited by reconciliation modules. + In this method you can: + - update the partner of the line by writing st_line_vals['partner_id'] + - set an automated counter-part via counterpart_account_id by writing + st_line_vals['counterpart_account_id'] + - do anythink you want with the statement line + """ + self.ensure_one() + if st_line_vals.get("account_number"): + st_line_vals["account_number"] = self._sanitize_bank_account_number( + st_line_vals["account_number"] + ) + if not st_line_vals.get("partner_id") and speeddict["account_number"].get( + st_line_vals["account_number"] + ): + st_line_vals.update( + speeddict["account_number"][st_line_vals["account_number"]] + ) + + def _statement_line_import_update_unique_import_id( + self, st_line_vals, account_number + ): + self.ensure_one() + if st_line_vals.get("unique_import_id"): + sanitized_acc_number = self._sanitize_bank_account_number(account_number) + st_line_vals["unique_import_id"] = ( + (sanitized_acc_number and sanitized_acc_number + "-" or "") + + str(self.id) + + "-" + + st_line_vals["unique_import_id"] + ) + + @api.model + def _sanitize_bank_account_number(self, account_number): + """Hook for extension""" + return sanitize_account_number(account_number) diff --git a/account_statement_import_base/readme/CONTRIBUTORS.rst b/account_statement_import_base/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..ff65d68c --- /dev/null +++ b/account_statement_import_base/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexis de Lattre diff --git a/account_statement_import_base/readme/DESCRIPTION.rst b/account_statement_import_base/readme/DESCRIPTION.rst new file mode 100644 index 00000000..4bf07f19 --- /dev/null +++ b/account_statement_import_base/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +This is a technical module designed to share code between 2 other modules: + +* **account_statement_import** that allows to import bank statements from files, +* **account_statement_import_online** that allows to import bank statements from webservices/APIs. diff --git a/account_statement_import_base/views/account_bank_statement_line.xml b/account_statement_import_base/views/account_bank_statement_line.xml new file mode 100644 index 00000000..f2067d07 --- /dev/null +++ b/account_statement_import_base/views/account_bank_statement_line.xml @@ -0,0 +1,61 @@ + + + + + + account.bank.statement.line + + + + not context.get('statement_line_main_view') + + + 2 + + + 1 + + + + 1 + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + +