diff --git a/base_vat_optional_vies/models/res_partner.py b/base_vat_optional_vies/models/res_partner.py index 2124c5da..a629c199 100644 --- a/base_vat_optional_vies/models/res_partner.py +++ b/base_vat_optional_vies/models/res_partner.py @@ -17,22 +17,23 @@ class ResPartner(models.Model): def simple_vat_check(self, country_code, vat_number): res = super().simple_vat_check(country_code, vat_number) partner = self._context.get("vat_partner") - if partner: + if res is False and partner: partner.update({"vies_passed": False}) + elif partner: + if self.env.context.get("company_id"): + company = self.env["res.company"].browse(self.env.context["company_id"]) + else: + company = self.env.company + if company.vat_check_vies: + self.vies_vat_check(country_code, vat_number) return res @api.model def vies_vat_check(self, country_code, vat_number): partner = self._context.get("vat_partner") - if partner: - # If there's an exception checking VIES, the upstream method will - # call simple_vat_check and thus the flag will be removed - partner.update({"vies_passed": True}) res = super().vies_vat_check(country_code, vat_number) - if res is False: - if partner: - partner.update({"vies_passed": False}) - return self.simple_vat_check(country_code, vat_number) + if res is False and partner: + partner.update({"vies_passed": False}) elif partner: partner.update({"vies_passed": True}) return res @@ -40,11 +41,26 @@ class ResPartner(models.Model): @api.constrains("vat", "country_id") def check_vat(self): self.update({"vies_passed": False}) - for partner in self: + for partner in self.sorted(lambda p: bool(p.commercial_partner_id)): partner = partner.with_context(vat_partner=partner) - super(ResPartner, partner).check_vat() + if ( + partner.commercial_partner_id + and partner.commercial_partner_id != partner + ): + partner.update( + {"vies_passed": partner.commercial_partner_id.vies_passed} + ) + else: + super(ResPartner, partner).check_vat() return True + @api.onchange("vat", "country_id") + def _onchange_check_vies(self): + self.update({"vies_passed": False}) + return super( + ResPartner, self.with_context(vat_partner=self) + )._onchange_check_vies() + @api.model def _build_vat_error_message(self, country_code, wrong_vat, record_label): return "\n" + _( diff --git a/base_vat_optional_vies/tests/test_res_partner.py b/base_vat_optional_vies/tests/test_res_partner.py index fce0979a..77052568 100644 --- a/base_vat_optional_vies/tests/test_res_partner.py +++ b/base_vat_optional_vies/tests/test_res_partner.py @@ -11,32 +11,54 @@ from odoo.tests import common class TestResPartner(common.TransactionCase): - def setUp(self): - super().setUp() - self.company = self.env.user.company_id - self.company.vat_check_vies = True - self.partner = self.env["res.partner"].create( + @classmethod + def setUpClass(cls): + def check_vies(vat_number): + return {"valid": vat_number == "ESB87530432"} + + super().setUpClass() + cls.company = cls.env.user.company_id + cls.company.vat_check_vies = True + cls.partner = cls.env["res.partner"].create( {"name": "Test partner", "is_company": True} ) - self.vatnumber_path = "odoo.addons.base_vat.models.res_partner.check_vies" + cls.vatnumber_path = "odoo.addons.base_vat.models.res_partner.check_vies" + + cls._vies_check_func = check_vies def test_validate_vat_vies(self): - with 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") + with patch(self.vatnumber_path, type(self)._vies_check_func): + values = {"vat": "ESB87530432", "country_id": self.env.ref("base.be").id} + field_onchange = self.partner._onchange_spec() + result = self.partner.onchange( + values=values, + field_name=["vat", "country_id"], + field_onchange=field_onchange, + ) + self.assertEqual(result.get("value", {}).get("vies_passed"), True) + self.assertEqual(self.partner.vies_passed, False) + self.partner.write(values) self.assertEqual(self.partner.vies_passed, True) def test_exception_vat_vies(self): - with patch(self.vatnumber_path) as mock_vatnumber: - mock_vatnumber.check_vies.side_effect = Exception() - self.partner.vat = "ESB87530432" + with patch(self.vatnumber_path, side_effect=Exception()): + values = {"vat": "87530432", "country_id": self.env.ref("base.es").id} + field_onchange = self.partner._onchange_spec() + result = self.partner.onchange( + values=values, + field_name=["vat", "country_id"], + field_onchange=field_onchange, + ) + self.assertEqual(result.get("value", {}).get("vies_passed"), True) + with self.assertRaises(ValidationError): + self.partner.write(values) self.assertEqual(self.partner.vies_passed, False) def test_no_validate_vat(self): with patch(self.vatnumber_path) as mock_vatnumber: mock_vatnumber.check_vies.return_value = False - self.partner.vat = "ESB87530432" + with self.assertRaises(ValidationError): + self.partner.vat = "ESB11" self.assertEqual(self.partner.vies_passed, False) def test_validate_simple_vat_vies(self): diff --git a/base_vat_optional_vies/views/res_partner_view.xml b/base_vat_optional_vies/views/res_partner_view.xml index 8edae786..c15b8941 100644 --- a/base_vat_optional_vies/views/res_partner_view.xml +++ b/base_vat_optional_vies/views/res_partner_view.xml @@ -6,7 +6,7 @@ - +