From c838ddf2f8c9faae24ecf5ba932fc6c3406493f8 Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Thu, 16 Feb 2023 18:01:59 -0300 Subject: [PATCH 1/4] [ADD] sync_multi_company_bank_account --- sync_multi_company_bank_account/README.rst | 68 +++ sync_multi_company_bank_account/__init__.py | 2 + .../__manifest__.py | 16 + sync_multi_company_bank_account/hooks.py | 25 ++ .../models/__init__.py | 2 + .../models/res_company.py | 34 ++ .../models/res_partner_bank.py | 62 +++ .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 3 + .../readme/USAGE.rst | 3 + .../static/description/icon.png | Bin 0 -> 2873 bytes .../static/description/index.html | 424 ++++++++++++++++++ .../tests/__init__.py | 1 + .../tests/test_res_partner_bank.py | 81 ++++ 14 files changed, 724 insertions(+) create mode 100644 sync_multi_company_bank_account/README.rst create mode 100644 sync_multi_company_bank_account/__init__.py create mode 100644 sync_multi_company_bank_account/__manifest__.py create mode 100644 sync_multi_company_bank_account/hooks.py create mode 100644 sync_multi_company_bank_account/models/__init__.py create mode 100644 sync_multi_company_bank_account/models/res_company.py create mode 100644 sync_multi_company_bank_account/models/res_partner_bank.py create mode 100644 sync_multi_company_bank_account/readme/CONTRIBUTORS.rst create mode 100644 sync_multi_company_bank_account/readme/DESCRIPTION.rst create mode 100644 sync_multi_company_bank_account/readme/USAGE.rst create mode 100644 sync_multi_company_bank_account/static/description/icon.png create mode 100644 sync_multi_company_bank_account/static/description/index.html create mode 100644 sync_multi_company_bank_account/tests/__init__.py create mode 100644 sync_multi_company_bank_account/tests/test_res_partner_bank.py diff --git a/sync_multi_company_bank_account/README.rst b/sync_multi_company_bank_account/README.rst new file mode 100644 index 0000000..94c657f --- /dev/null +++ b/sync_multi_company_bank_account/README.rst @@ -0,0 +1,68 @@ +=============================== +Sync Multi Company Bank Account +=============================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-escodoo%2Faccount--addons-lightgray.png?logo=github + :target: https://github.com/escodoo/account-addons/tree/14.0/sync_multi_company_bank_account + :alt: escodoo/account-addons + +|badge1| |badge2| |badge3| + +The Multi-Company Bank Account Synchronization module aims to ensure that all companies within a business group have the same bank accounts registered and updated, so that all of them can carry out financial transactions without data compatibility issues. + +The synchronization is performed automatically, so that the addition, update or deletion of a bank account in one of the companies is reflected in all other companies of the group. To ensure data integrity, the module also checks whether the bank account can be deleted without compromising the integrity of the records in other companies. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use the Multi-Company Bank Account Synchronization module, follow these steps: + +Install the module in your Odoo system. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Escodoo + +Contributors +~~~~~~~~~~~~ + +* `Escodoo `_: + + * Marcel Savegnago + +Maintainers +~~~~~~~~~~~ + +This module is part of the `escodoo/account-addons `_ project on GitHub. + +You are welcome to contribute. diff --git a/sync_multi_company_bank_account/__init__.py b/sync_multi_company_bank_account/__init__.py new file mode 100644 index 0000000..cc6b635 --- /dev/null +++ b/sync_multi_company_bank_account/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .hooks import post_init_hook diff --git a/sync_multi_company_bank_account/__manifest__.py b/sync_multi_company_bank_account/__manifest__.py new file mode 100644 index 0000000..a26bf41 --- /dev/null +++ b/sync_multi_company_bank_account/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2023 - TODAY, Escodoo +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Sync Multi Company Bank Account", + "summary": """ + Sync Multi Company Bank Accounts""", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "author": "Escodoo", + "website": "https://github.com/Escodoo/account-addons", + "depends": ["base"], + "data": [], + "demo": [], + "post_init_hook": "post_init_hook", +} diff --git a/sync_multi_company_bank_account/hooks.py b/sync_multi_company_bank_account/hooks.py new file mode 100644 index 0000000..8f040b3 --- /dev/null +++ b/sync_multi_company_bank_account/hooks.py @@ -0,0 +1,25 @@ +# Copyright 2023 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import SUPERUSER_ID, api + + +def post_init_hook(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + cr.execute("SELECT * FROM res_partner_bank") + res_partner_bank = [] + res_partner_bank = cr.dictfetchall() + if res_partner_bank: + bank_accounts = env["res.partner.bank"] + companies = env["res.company"].search([]) + for company in companies: + bank_accounts |= company.bank_ids + for bank_account in bank_accounts: + for company in companies: + if company.id != bank_account.company_id.id: + if bank_account.acc_number not in company.bank_ids.mapped( + "acc_number" + ): + bank_account.sudo().with_context( + no_sync_partner_bank=True + ).copy({"company_id": company.id}) diff --git a/sync_multi_company_bank_account/models/__init__.py b/sync_multi_company_bank_account/models/__init__.py new file mode 100644 index 0000000..7e68b8a --- /dev/null +++ b/sync_multi_company_bank_account/models/__init__.py @@ -0,0 +1,2 @@ +from . import res_partner_bank +from . import res_company diff --git a/sync_multi_company_bank_account/models/res_company.py b/sync_multi_company_bank_account/models/res_company.py new file mode 100644 index 0000000..ebbc5f2 --- /dev/null +++ b/sync_multi_company_bank_account/models/res_company.py @@ -0,0 +1,34 @@ +# Copyright 2023 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + def copy_bank_accounts(self): + oldest_company = self.search([], order="create_date").filtered( + lambda c: c.id != self.id + )[:1] + if not oldest_company: + return + + bank_accounts = self.env["res.partner.bank"].search( + [ + ("company_id", "=", oldest_company.id), + ] + ) + + for bank_account in bank_accounts: + bank_account.sudo().with_context(no_sync_partner_bank=True).copy( + default={ + "company_id": self.id, + } + ) + + @api.model + def create(self, vals): + company = super().create(vals) + company.copy_bank_accounts() + return company diff --git a/sync_multi_company_bank_account/models/res_partner_bank.py b/sync_multi_company_bank_account/models/res_partner_bank.py new file mode 100644 index 0000000..c310a3c --- /dev/null +++ b/sync_multi_company_bank_account/models/res_partner_bank.py @@ -0,0 +1,62 @@ +# Copyright 2023 - TODAY, Marcel Savegnago +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from odoo import api, models + + +class ResPartnerBank(models.Model): + + _inherit = "res.partner.bank" + + @api.model + def create(self, vals): + res = super(ResPartnerBank, self).create(vals) + if not self.env.context.get("no_sync_partner_bank"): + res.sudo()._sync_partner_bank(vals) + return res + + def write(self, vals): + old_acc_number = self.acc_number + old_partner_id = self.partner_id.id + res = super(ResPartnerBank, self).write(vals) + if not self.env.context.get("no_sync_partner_bank"): + self.sudo()._sync_partner_bank(vals, old_acc_number, old_partner_id) + return res + + def unlink(self): + if not self.env.context.get("no_sync_partner_bank_check_unlink"): + for bank in self: + for company in self.env["res.company"].search([]): + if company.id != bank.company_id.id: + partner_bank = self.env["res.partner.bank"].search( + [ + ("partner_id", "=", bank.partner_id.id), + ("acc_number", "=", bank.acc_number), + ("company_id", "=", company.id), + ], + limit=1, + ) + if partner_bank: + partner_bank.sudo().with_context( + no_sync_partner_bank_check_unlink=True + ).unlink() + return super().unlink() + + def _sync_partner_bank(self, vals, old_acc_number=None, old_partner_id=None): + for rec in self: + for company in self.env["res.company"].search([]): + if company.id != rec.company_id.id: + partner_bank = self.env["res.partner.bank"].search( + [ + ("partner_id", "=", old_partner_id or rec.partner_id.id), + ("acc_number", "=", old_acc_number or rec.acc_number), + ("company_id", "=", company.id), + ], + limit=1, + ) + if partner_bank: + partner_bank.with_context(no_sync_partner_bank=True).write(vals) + else: + rec.with_context(no_sync_partner_bank=True).copy( + {"company_id": company.id} + ) diff --git a/sync_multi_company_bank_account/readme/CONTRIBUTORS.rst b/sync_multi_company_bank_account/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..ae453a6 --- /dev/null +++ b/sync_multi_company_bank_account/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Escodoo `_: + + * Marcel Savegnago diff --git a/sync_multi_company_bank_account/readme/DESCRIPTION.rst b/sync_multi_company_bank_account/readme/DESCRIPTION.rst new file mode 100644 index 0000000..6d003f6 --- /dev/null +++ b/sync_multi_company_bank_account/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +The Multi-Company Bank Account Synchronization module aims to ensure that all companies within a business group have the same bank accounts registered and updated, so that all of them can carry out financial transactions without data compatibility issues. + +The synchronization is performed automatically, so that the addition, update or deletion of a bank account in one of the companies is reflected in all other companies of the group. To ensure data integrity, the module also checks whether the bank account can be deleted without compromising the integrity of the records in other companies. diff --git a/sync_multi_company_bank_account/readme/USAGE.rst b/sync_multi_company_bank_account/readme/USAGE.rst new file mode 100644 index 0000000..2b4d222 --- /dev/null +++ b/sync_multi_company_bank_account/readme/USAGE.rst @@ -0,0 +1,3 @@ +To use the Multi-Company Bank Account Synchronization module, follow these steps: + +Install the module in your Odoo system. diff --git a/sync_multi_company_bank_account/static/description/icon.png b/sync_multi_company_bank_account/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..12ab0051e3b9ac413f0f0016b7cff54f02fc763e GIT binary patch literal 2873 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 XXqTGI$C0NT00000NkvXXu0mjf?G|(} literal 0 HcmV?d00001 diff --git a/sync_multi_company_bank_account/static/description/index.html b/sync_multi_company_bank_account/static/description/index.html new file mode 100644 index 0000000..a4913c9 --- /dev/null +++ b/sync_multi_company_bank_account/static/description/index.html @@ -0,0 +1,424 @@ + + + + + + +Sync Multi Company Bank Account + + + +
+

Sync Multi Company Bank Account

+ + +

Beta License: AGPL-3 escodoo/account-addons

+

The Multi-Company Bank Account Synchronization module aims to ensure that all companies within a business group have the same bank accounts registered and updated, so that all of them can carry out financial transactions without data compatibility issues.

+

The synchronization is performed automatically, so that the addition, update or deletion of a bank account in one of the companies is reflected in all other companies of the group. To ensure data integrity, the module also checks whether the bank account can be deleted without compromising the integrity of the records in other companies.

+

Table of contents

+ +
+

Usage

+

To use the Multi-Company Bank Account Synchronization module, follow these steps:

+

Install the module in your Odoo system.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Escodoo
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is part of the escodoo/account-addons project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/sync_multi_company_bank_account/tests/__init__.py b/sync_multi_company_bank_account/tests/__init__.py new file mode 100644 index 0000000..9a23be1 --- /dev/null +++ b/sync_multi_company_bank_account/tests/__init__.py @@ -0,0 +1 @@ +from . import test_res_partner_bank diff --git a/sync_multi_company_bank_account/tests/test_res_partner_bank.py b/sync_multi_company_bank_account/tests/test_res_partner_bank.py new file mode 100644 index 0000000..4faf52e --- /dev/null +++ b/sync_multi_company_bank_account/tests/test_res_partner_bank.py @@ -0,0 +1,81 @@ +# Copyright 2023 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase + + +class TestResPartnerBank(TransactionCase): + def setUp(self, *args, **kwargs): + super().setUp(*args, **kwargs) + self.partner = self.env["res.partner"].create( + { + "name": "Test Partner", + } + ) + self.company1 = self.env["res.company"].create( + { + "name": "Test Company 1", + } + ) + self.company2 = self.env["res.company"].create( + { + "name": "Test Company 2", + } + ) + + def test_copy_bank_accounts(self): + + company1_bank = self.env["res.partner.bank"].search( + [ + ("company_id", "=", self.company1.id), + ] + ) + company2_bank = self.env["res.partner.bank"].search( + [ + ("company_id", "=", self.company2.id), + ] + ) + + self.assertEqual(len(company1_bank), 1) + self.assertEqual(len(company2_bank), 1) + + def test_create_no_sync_partner_bank(self): + bank = self.env["res.partner.bank"].create( + { + "acc_number": "987654321", + "partner_id": self.partner.id, + "company_id": self.company1.id, + } + ) + + company2_bank = self.env["res.partner.bank"].search( + [ + ("company_id", "=", self.company2.id), + ("acc_number", "=", bank.acc_number), + ] + ) + + self.assertEqual(company2_bank.acc_number, "987654321") + + def test_write_sync_partner_bank(self): + bank = self.env["res.partner.bank"].create( + { + "acc_number": "433322244", + "partner_id": self.partner.id, + "company_id": self.company1.id, + } + ) + bank.write( + { + "acc_number": "888444333", + } + ) + + company2_bank = self.env["res.partner.bank"].search( + [ + ("company_id", "=", self.company2.id), + ("acc_number", "=", bank.acc_number), + ] + ) + + self.assertEqual(company2_bank.acc_number, "888444333") From b540b5fd44c45b25b66320881fa60319f51f03b2 Mon Sep 17 00:00:00 2001 From: Kaynnan Bardauil Date: Mon, 17 Apr 2023 12:43:48 -0300 Subject: [PATCH 2/4] [MIG] sync_multi_company_bank_account: Migration to 15.0 --- sync_multi_company_bank_account/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sync_multi_company_bank_account/__manifest__.py b/sync_multi_company_bank_account/__manifest__.py index a26bf41..b6736ea 100644 --- a/sync_multi_company_bank_account/__manifest__.py +++ b/sync_multi_company_bank_account/__manifest__.py @@ -5,7 +5,7 @@ "name": "Sync Multi Company Bank Account", "summary": """ Sync Multi Company Bank Accounts""", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "license": "AGPL-3", "author": "Escodoo", "website": "https://github.com/Escodoo/account-addons", From 4be2b6fffe56cd4cbb1315d5bf17cd0a091857a3 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Mon, 17 Apr 2023 16:05:33 +0000 Subject: [PATCH 3/4] [UPD] Update sync_multi_company_bank_account.pot --- .../i18n/sync_multi_company_bank_account.pot | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 sync_multi_company_bank_account/i18n/sync_multi_company_bank_account.pot diff --git a/sync_multi_company_bank_account/i18n/sync_multi_company_bank_account.pot b/sync_multi_company_bank_account/i18n/sync_multi_company_bank_account.pot new file mode 100644 index 0000000..97eda2f --- /dev/null +++ b/sync_multi_company_bank_account/i18n/sync_multi_company_bank_account.pot @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sync_multi_company_bank_account +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sync_multi_company_bank_account +#: model:ir.model,name:sync_multi_company_bank_account.model_res_partner_bank +msgid "Bank Accounts" +msgstr "" + +#. module: sync_multi_company_bank_account +#: model:ir.model,name:sync_multi_company_bank_account.model_res_company +msgid "Companies" +msgstr "" From 5584a3f2701bfd19401a675e6100dd84faa679df Mon Sep 17 00:00:00 2001 From: CristianoMafraJunior Date: Fri, 31 Oct 2025 08:59:13 -0300 Subject: [PATCH 4/4] [MIG] sync_multi_company_bank_account: Migration to 16.0 --- sync_multi_company_bank_account/README.rst | 28 ++++++---- .../__manifest__.py | 2 +- .../models/res_company.py | 19 +++++-- .../models/res_partner_bank.py | 33 ++++++++---- .../pyproject.toml | 3 ++ .../readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 54 ++++++++++--------- .../tests/test_res_partner_bank.py | 47 +++++++++------- 8 files changed, 118 insertions(+), 69 deletions(-) create mode 100644 sync_multi_company_bank_account/pyproject.toml diff --git a/sync_multi_company_bank_account/README.rst b/sync_multi_company_bank_account/README.rst index 94c657f..e5cca64 100644 --- a/sync_multi_company_bank_account/README.rst +++ b/sync_multi_company_bank_account/README.rst @@ -1,23 +1,30 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + =============================== Sync Multi Company Bank Account =============================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:2cb1117e7eeae500370f540a90494e7d195242b9492ae0ffc2f344857e97e33a + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-escodoo%2Faccount--addons-lightgray.png?logo=github - :target: https://github.com/escodoo/account-addons/tree/14.0/sync_multi_company_bank_account - :alt: escodoo/account-addons +.. |badge3| image:: https://img.shields.io/badge/github-Escodoo%2Faccount--addons-lightgray.png?logo=github + :target: https://github.com/Escodoo/account-addons/tree/16.0/sync_multi_company_bank_account + :alt: Escodoo/account-addons -|badge1| |badge2| |badge3| +|badge1| |badge2| |badge3| The Multi-Company Bank Account Synchronization module aims to ensure that all companies within a business group have the same bank accounts registered and updated, so that all of them can carry out financial transactions without data compatibility issues. @@ -38,10 +45,10 @@ Install the module in your Odoo system. Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -59,10 +66,11 @@ Contributors * `Escodoo `_: * Marcel Savegnago + * Cristiano Mafra Junior Maintainers ~~~~~~~~~~~ -This module is part of the `escodoo/account-addons `_ project on GitHub. +This module is part of the `Escodoo/account-addons `_ project on GitHub. You are welcome to contribute. diff --git a/sync_multi_company_bank_account/__manifest__.py b/sync_multi_company_bank_account/__manifest__.py index b6736ea..a4c1cab 100644 --- a/sync_multi_company_bank_account/__manifest__.py +++ b/sync_multi_company_bank_account/__manifest__.py @@ -5,7 +5,7 @@ "name": "Sync Multi Company Bank Account", "summary": """ Sync Multi Company Bank Accounts""", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "license": "AGPL-3", "author": "Escodoo", "website": "https://github.com/Escodoo/account-addons", diff --git a/sync_multi_company_bank_account/models/res_company.py b/sync_multi_company_bank_account/models/res_company.py index ebbc5f2..d5be731 100644 --- a/sync_multi_company_bank_account/models/res_company.py +++ b/sync_multi_company_bank_account/models/res_company.py @@ -1,4 +1,5 @@ # Copyright 2023 - TODAY, Marcel Savegnago +# Copyright 2025 - TODAY, Cristiano Mafra Junior # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import api, models @@ -21,11 +22,21 @@ def copy_bank_accounts(self): ) for bank_account in bank_accounts: - bank_account.sudo().with_context(no_sync_partner_bank=True).copy( - default={ - "company_id": self.id, - } + dst_partner = self.partner_id + existing = self.env["res.partner.bank"].search( + [ + ("partner_id", "=", dst_partner.id), + ("sanitized_acc_number", "=", bank_account.sanitized_acc_number), + ], + limit=1, ) + if not existing: + bank_account.sudo().with_context(no_sync_partner_bank=True).copy( + default={ + "company_id": self.id, + "partner_id": dst_partner.id, + } + ) @api.model def create(self, vals): diff --git a/sync_multi_company_bank_account/models/res_partner_bank.py b/sync_multi_company_bank_account/models/res_partner_bank.py index c310a3c..70f28f1 100644 --- a/sync_multi_company_bank_account/models/res_partner_bank.py +++ b/sync_multi_company_bank_account/models/res_partner_bank.py @@ -5,12 +5,11 @@ class ResPartnerBank(models.Model): - _inherit = "res.partner.bank" @api.model def create(self, vals): - res = super(ResPartnerBank, self).create(vals) + res = super().create(vals) if not self.env.context.get("no_sync_partner_bank"): res.sudo()._sync_partner_bank(vals) return res @@ -18,7 +17,7 @@ def create(self, vals): def write(self, vals): old_acc_number = self.acc_number old_partner_id = self.partner_id.id - res = super(ResPartnerBank, self).write(vals) + res = super().write(vals) if not self.env.context.get("no_sync_partner_bank"): self.sudo()._sync_partner_bank(vals, old_acc_number, old_partner_id) return res @@ -28,11 +27,15 @@ def unlink(self): for bank in self: for company in self.env["res.company"].search([]): if company.id != bank.company_id.id: + dst_partner = company.partner_id partner_bank = self.env["res.partner.bank"].search( [ - ("partner_id", "=", bank.partner_id.id), - ("acc_number", "=", bank.acc_number), - ("company_id", "=", company.id), + ("partner_id", "=", dst_partner.id), + ( + "sanitized_acc_number", + "=", + bank.sanitized_acc_number, + ), ], limit=1, ) @@ -46,17 +49,25 @@ def _sync_partner_bank(self, vals, old_acc_number=None, old_partner_id=None): for rec in self: for company in self.env["res.company"].search([]): if company.id != rec.company_id.id: + dst_partner = company.partner_id + partner_bank = self.env["res.partner.bank"].search( [ - ("partner_id", "=", old_partner_id or rec.partner_id.id), - ("acc_number", "=", old_acc_number or rec.acc_number), - ("company_id", "=", company.id), + ("partner_id", "=", dst_partner.id), + ( + "sanitized_acc_number", + "=", + rec.sanitized_acc_number, + ), ], limit=1, ) if partner_bank: partner_bank.with_context(no_sync_partner_bank=True).write(vals) else: - rec.with_context(no_sync_partner_bank=True).copy( - {"company_id": company.id} + rec.sudo().with_context(no_sync_partner_bank=True).copy( + { + "company_id": company.id, + "partner_id": dst_partner.id, + } ) diff --git a/sync_multi_company_bank_account/pyproject.toml b/sync_multi_company_bank_account/pyproject.toml new file mode 100644 index 0000000..4231d0c --- /dev/null +++ b/sync_multi_company_bank_account/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sync_multi_company_bank_account/readme/CONTRIBUTORS.rst b/sync_multi_company_bank_account/readme/CONTRIBUTORS.rst index ae453a6..d812cd8 100644 --- a/sync_multi_company_bank_account/readme/CONTRIBUTORS.rst +++ b/sync_multi_company_bank_account/readme/CONTRIBUTORS.rst @@ -1,3 +1,4 @@ * `Escodoo `_: * Marcel Savegnago + * Cristiano Mafra Junior diff --git a/sync_multi_company_bank_account/static/description/index.html b/sync_multi_company_bank_account/static/description/index.html index a4913c9..fb4a311 100644 --- a/sync_multi_company_bank_account/static/description/index.html +++ b/sync_multi_company_bank_account/static/description/index.html @@ -1,20 +1,19 @@ - - -Sync Multi Company Bank Account + +README.rst -
-

Sync Multi Company Bank Account

+
+ +Odoo Community Association +
+

Sync Multi Company Bank Account

-

Beta License: AGPL-3 escodoo/account-addons

+

Beta License: AGPL-3 Escodoo/account-addons

The Multi-Company Bank Account Synchronization module aims to ensure that all companies within a business group have the same bank accounts registered and updated, so that all of them can carry out financial transactions without data compatibility issues.

The synchronization is performed automatically, so that the addition, update or deletion of a bank account in one of the companies is reflected in all other companies of the group. To ensure data integrity, the module also checks whether the bank account can be deleted without compromising the integrity of the records in other companies.

Table of contents

-

Usage

+

Usage

To use the Multi-Company Bank Account Synchronization module, follow these steps:

Install the module in your Odoo system.

-

Bug Tracker

-

Bugs are tracked on GitHub Issues. +

Bug Tracker

+

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Escodoo
-

Maintainers

-

This module is part of the escodoo/account-addons project on GitHub.

+

Maintainers

+

This module is part of the Escodoo/account-addons project on GitHub.

You are welcome to contribute.

+
diff --git a/sync_multi_company_bank_account/tests/test_res_partner_bank.py b/sync_multi_company_bank_account/tests/test_res_partner_bank.py index 4faf52e..0f75584 100644 --- a/sync_multi_company_bank_account/tests/test_res_partner_bank.py +++ b/sync_multi_company_bank_account/tests/test_res_partner_bank.py @@ -1,38 +1,49 @@ # Copyright 2023 - TODAY, Marcel Savegnago +# Copyright 2025 - TODAY, Cristiano Mafra Junior # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo.tests.common import TransactionCase class TestResPartnerBank(TransactionCase): - def setUp(self, *args, **kwargs): - super().setUp(*args, **kwargs) - self.partner = self.env["res.partner"].create( + @classmethod + def setUpClass(cls, *args, **kwargs): + super().setUpClass(*args, **kwargs) + cls.partner = cls.env["res.partner"].create( { "name": "Test Partner", } ) - self.company1 = self.env["res.company"].create( + cls.company1 = cls.env["res.company"].create( { "name": "Test Company 1", } ) - self.company2 = self.env["res.company"].create( + cls.company2 = cls.env["res.company"].create( { "name": "Test Company 2", } ) def test_copy_bank_accounts(self): + self.env["res.partner.bank"].create( + { + "acc_number": "123456789", + "partner_id": self.company1.partner_id.id, + "company_id": self.company1.id, + } + ) company1_bank = self.env["res.partner.bank"].search( [ - ("company_id", "=", self.company1.id), + ("partner_id", "=", self.company1.partner_id.id), + ("acc_number", "=", "123456789"), ] ) company2_bank = self.env["res.partner.bank"].search( [ - ("company_id", "=", self.company2.id), + ("partner_id", "=", self.company2.partner_id.id), + ("acc_number", "=", "123456789"), ] ) @@ -43,16 +54,17 @@ def test_create_no_sync_partner_bank(self): bank = self.env["res.partner.bank"].create( { "acc_number": "987654321", - "partner_id": self.partner.id, + "partner_id": self.company1.partner_id.id, "company_id": self.company1.id, } ) company2_bank = self.env["res.partner.bank"].search( [ - ("company_id", "=", self.company2.id), + ("partner_id", "=", self.company2.partner_id.id), ("acc_number", "=", bank.acc_number), - ] + ], + limit=1, ) self.assertEqual(company2_bank.acc_number, "987654321") @@ -61,21 +73,18 @@ def test_write_sync_partner_bank(self): bank = self.env["res.partner.bank"].create( { "acc_number": "433322244", - "partner_id": self.partner.id, + "partner_id": self.company1.partner_id.id, "company_id": self.company1.id, } ) - bank.write( - { - "acc_number": "888444333", - } - ) + bank.write({"acc_number": "888444333"}) company2_bank = self.env["res.partner.bank"].search( [ - ("company_id", "=", self.company2.id), - ("acc_number", "=", bank.acc_number), - ] + ("partner_id", "=", self.company2.partner_id.id), + ("acc_number", "=", "888444333"), + ], + limit=1, ) self.assertEqual(company2_bank.acc_number, "888444333")