From e1996c447963dab1a7ab0c827b26082ea9c738b2 Mon Sep 17 00:00:00 2001 From: Emilio Pascual Date: Sat, 12 Aug 2023 12:45:34 +0200 Subject: [PATCH] [15.0][IMP] base_vat_optional_vies: vies sync in children contact - Sync field vies_passed from parent partner to children contact. - Wizard in settings to update vies_passed field after activate check vies. --- base_vat_optional_vies/__manifest__.py | 6 ++- base_vat_optional_vies/models/__init__.py | 1 + .../models/res_config_settings.py | 23 ++++++++++ base_vat_optional_vies/models/res_partner.py | 3 +- .../readme/CONTRIBUTORS.rst | 1 + .../tests/tes_config_settings.py | 44 +++++++++++++++++++ .../tests/test_res_partner.py | 14 +++++- .../views/res_config_settings_view.xml | 27 ++++++++++++ 8 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 base_vat_optional_vies/models/res_config_settings.py create mode 100644 base_vat_optional_vies/tests/tes_config_settings.py create mode 100644 base_vat_optional_vies/views/res_config_settings_view.xml diff --git a/base_vat_optional_vies/__manifest__.py b/base_vat_optional_vies/__manifest__.py index 8909ad504..74c7b10ae 100644 --- a/base_vat_optional_vies/__manifest__.py +++ b/base_vat_optional_vies/__manifest__.py @@ -3,13 +3,17 @@ # Copyright 2017 Tecnativa - David Vidal # Copyright 2019 FactorLibre - Rodrigo Bonilla # Copyright 2022 Moduon - Eduardo de Miguel +# Copyright 2023 Moduon - Emilio Pascual # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { "name": "Optional validation of VAT via VIES", "category": "Accounting", "version": "15.0.1.0.3", "depends": ["base_vat"], - "data": ["views/res_partner_view.xml"], + "data": [ + "views/res_partner_view.xml", + "views/res_config_settings_view.xml", + ], "author": "Tecnativa," "Odoo Community Association (OCA)", "website": "https://github.com/OCA/account-financial-tools", "license": "AGPL-3", diff --git a/base_vat_optional_vies/models/__init__.py b/base_vat_optional_vies/models/__init__.py index 91fed54d4..0d7a048a3 100644 --- a/base_vat_optional_vies/models/__init__.py +++ b/base_vat_optional_vies/models/__init__.py @@ -1 +1,2 @@ from . import res_partner +from . import res_config_settings diff --git a/base_vat_optional_vies/models/res_config_settings.py b/base_vat_optional_vies/models/res_config_settings.py new file mode 100644 index 000000000..4208eb719 --- /dev/null +++ b/base_vat_optional_vies/models/res_config_settings.py @@ -0,0 +1,23 @@ +# Copyright 2022-2023 Moduon Team S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + def execute_update_check_vies(self): + # Only parent partners, children are synced from parent + count_partners = self.env["res.partner"].search_count( + [("parent_id", "=", False)] + ) + self.env["res.partner"].search([("parent_id", "=", False)]).check_vat() + return { + "effect": { + "fadeout": "slow", + "message": _("Vies passed calculated in %s partners") % count_partners, + "img_url": "/web/static/src/img/smile.svg", + "type": "rainbow_man", + } + } diff --git a/base_vat_optional_vies/models/res_partner.py b/base_vat_optional_vies/models/res_partner.py index 7eacabc1d..96d956601 100644 --- a/base_vat_optional_vies/models/res_partner.py +++ b/base_vat_optional_vies/models/res_partner.py @@ -2,6 +2,7 @@ # Copyright 2017 Tecnativa - David Vidal # Copyright 2019 FactorLibre - Rodrigo Bonilla # Copyright 2022 Moduon - Eduardo de Miguel +# Copyright 2023 Moduon - Emilio Pascual # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import _, api, fields, models @@ -21,7 +22,7 @@ class ResPartner(models.Model): ) partner = self.env.context.get("vat_partner") if partner: - partner.update({"vies_passed": False}) + partner.update({"vies_passed": self.parent_id.vies_passed or False}) return res @api.model diff --git a/base_vat_optional_vies/readme/CONTRIBUTORS.rst b/base_vat_optional_vies/readme/CONTRIBUTORS.rst index d86e534d7..c24f5cdc2 100644 --- a/base_vat_optional_vies/readme/CONTRIBUTORS.rst +++ b/base_vat_optional_vies/readme/CONTRIBUTORS.rst @@ -6,3 +6,4 @@ * Alexandre Díaz * Harald Panten * Eduardo de Miguel +* Emilio Pascual diff --git a/base_vat_optional_vies/tests/tes_config_settings.py b/base_vat_optional_vies/tests/tes_config_settings.py new file mode 100644 index 000000000..93cd36873 --- /dev/null +++ b/base_vat_optional_vies/tests/tes_config_settings.py @@ -0,0 +1,44 @@ +# Copyright 2022-2023 Moduon Team S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from unittest import mock + +from odoo.tests import common + + +class TestConfigSettings(common.TransactionCase): + def setUp(self): + super(TestConfigSettings, self).setUp() + self.company = self.env.user.company_id + self.partner1_test = self.env["res.partner"].create( + { + "name": "Test partner", + "is_company": True, + "vat": "ESB87530432", + "country_id": self.env.ref("base.be").id, + } + ) + self.partner2_test = self.env["res.partner"].create( + { + "name": "Test partner2", + "is_company": True, + "vat": "ESB87530432", + } + ) + self.vatnumber_path = "odoo.addons.base_vat.models.res_partner.check_vies" + + def test_execute_update_check_vies_validate(self): + with mock.patch(self.vatnumber_path) as mock_vatnumber: + self.company.vat_check_vies = True + mock_vatnumber.check_vies.return_value = True + self.env["res.config.settings"].execute_update_check_vies() + self.assertTrue(self.partner1_test.vies_passed) + self.assertFalse(self.partner2_test.vies_passed) + + def test_execute_update_check_vies_no_validate(self): + with mock.patch(self.vatnumber_path) as mock_vatnumber: + self.company.vat_check_vies = False + mock_vatnumber.check_vies.return_value = False + self.env["res.config.settings"].execute_update_check_vies() + self.assertFalse(self.partner1_test.vies_passed) + self.assertFalse(self.partner2_test.vies_passed) diff --git a/base_vat_optional_vies/tests/test_res_partner.py b/base_vat_optional_vies/tests/test_res_partner.py index 2313b29d3..f6e2d6129 100644 --- a/base_vat_optional_vies/tests/test_res_partner.py +++ b/base_vat_optional_vies/tests/test_res_partner.py @@ -4,7 +4,7 @@ # Copyright 2022 Moduon - Eduardo de Miguel # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -import mock +from unittest import mock from odoo.exceptions import ValidationError from odoo.tests import common @@ -18,6 +18,9 @@ class TestResPartner(common.TransactionCase): self.partner = self.env["res.partner"].create( {"name": "Test partner", "is_company": True} ) + self.partner_child = self.env["res.partner"].create( + {"name": "Test partner child", "parent_id": self.partner.id} + ) self.vatnumber_path = "odoo.addons.base_vat.models.res_partner.check_vies" def test_validate_vat_vies(self): @@ -59,3 +62,12 @@ class TestResPartner(common.TransactionCase): def test_validate_wrong_vat_shows_simple_message(self): with self.assertRaisesRegex(ValidationError, "does not seem to be valid"): self.partner.vat = "ES11111111A" + + def test_sync_vies_passed_parent_with_child(self): + with mock.patch(self.vatnumber_path) as mock_vatnumber: + mock_vatnumber.check_vies.return_value = True + self.partner.vat = "ESB87530432" + self.partner.country_id = self.env.ref("base.be") + self.assertEqual(self.partner.vies_passed, self.partner_child.vies_passed) + self.partner.vat = False + self.assertEqual(self.partner.vies_passed, self.partner_child.vies_passed) diff --git a/base_vat_optional_vies/views/res_config_settings_view.xml b/base_vat_optional_vies/views/res_config_settings_view.xml new file mode 100644 index 000000000..bba75d864 --- /dev/null +++ b/base_vat_optional_vies/views/res_config_settings_view.xml @@ -0,0 +1,27 @@ + + + + + res.config.settings.view.form.inherit.account + res.config.settings + + + +