diff --git a/partner_mobile_unique/README.rst b/partner_mobile_unique/README.rst new file mode 100644 index 000000000..e69de29bb diff --git a/partner_mobile_unique/__init__.py b/partner_mobile_unique/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/partner_mobile_unique/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/partner_mobile_unique/__manifest__.py b/partner_mobile_unique/__manifest__.py new file mode 100644 index 000000000..7d29ec8c3 --- /dev/null +++ b/partner_mobile_unique/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2020 Ashish (Ooops) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Partner Mobile Format and Duplicate Checker", + "version": "14.0.1.0.0", + "summary": "Restriction on partner creation if another partner has the same mobile", + "author": "Ashish Hirpara, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/partner-contact", + "category": "Partner Management", + "depends": ["base_setup", "phone_validation"], + "license": "AGPL-3", + "maintainers": ["AshishHirapara"], + "installable": True, + "application": False, + "data": ["views/res_config_settings_view.xml"], +} diff --git a/partner_mobile_unique/models/__init__.py b/partner_mobile_unique/models/__init__.py new file mode 100644 index 000000000..c11ec3c3c --- /dev/null +++ b/partner_mobile_unique/models/__init__.py @@ -0,0 +1,3 @@ +from . import res_config_settings +from . import res_company +from . import res_partner diff --git a/partner_mobile_unique/models/res_company.py b/partner_mobile_unique/models/res_company.py new file mode 100644 index 000000000..112acfea8 --- /dev/null +++ b/partner_mobile_unique/models/res_company.py @@ -0,0 +1,13 @@ +# Copyright 2022 Ooops, Ashish Hirpara +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + partner_mobile_unique_filter_duplicates = fields.Boolean( + string="Filter duplicate partner moblie number", + help="Don't allow multiple partners to have the same moblie number.", + ) diff --git a/partner_mobile_unique/models/res_config_settings.py b/partner_mobile_unique/models/res_config_settings.py new file mode 100644 index 000000000..1086bf932 --- /dev/null +++ b/partner_mobile_unique/models/res_config_settings.py @@ -0,0 +1,10 @@ +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + partner_mobile_unique_filter_duplicates = fields.Boolean( + related="company_id.partner_mobile_unique_filter_duplicates", + readonly=False, + ) diff --git a/partner_mobile_unique/models/res_partner.py b/partner_mobile_unique/models/res_partner.py new file mode 100644 index 000000000..8106a691c --- /dev/null +++ b/partner_mobile_unique/models/res_partner.py @@ -0,0 +1,39 @@ +# Copyright 2022 Ooops Ashish Hirpara +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import logging + +from odoo import _, api, models +from odoo.exceptions import UserError + +_logger = logging.getLogger(__name__) + + +class ResPartner(models.Model): + _inherit = "res.partner" + + @api.constrains("mobile") + def _check_mobile_unique(self): + if self.env.company.partner_mobile_unique_filter_duplicates: + for partner in self: + if partner.mobile: + domain = [("mobile", "=", partner.mobile)] + if partner.company_id: + domain += [ + "|", + ("company_id", "=", False), + ("company_id", "=", partner.company_id.id), + ] + partner_id = partner._origin.id + if partner_id: + domain += [ + ("id", "!=", partner.id), + ] + if self.search(domain): + raise UserError( + _( + "The mobile number is already exists for another partner." + " This is not supported when duplicate mobile numbers are " + "not allowed." + ) + ) diff --git a/partner_mobile_unique/readme/CONFIGURE.rst b/partner_mobile_unique/readme/CONFIGURE.rst new file mode 100644 index 000000000..7c72afbc7 --- /dev/null +++ b/partner_mobile_unique/readme/CONFIGURE.rst @@ -0,0 +1,3 @@ +To not allow multiple partners to have the same mobile, go to "General Settings" and use the +"Filter duplicate partner mobile number"/``partner_mobile_unique_filter_duplicates`` +setting. diff --git a/partner_mobile_unique/readme/CONTRIBUTORS.rst b/partner_mobile_unique/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..afc24227c --- /dev/null +++ b/partner_mobile_unique/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Ooops - Ashish Hirpara diff --git a/partner_mobile_unique/readme/DESCRIPTION.rst b/partner_mobile_unique/readme/DESCRIPTION.rst new file mode 100644 index 000000000..a413aea72 --- /dev/null +++ b/partner_mobile_unique/readme/DESCRIPTION.rst @@ -0,0 +1,9 @@ +This module validates the field ``mobile`` in the model +``res.partner`` for duplication. + +As part of the validation, this module throws error on the partner form view if another partner has the same mobile (Optionally). + +.. figure:: ../static/description/partner_duplicate_error.png + :alt: Error on partner form + +This module has a twin brother named **partner_email_check** which restricts the partner creation when another partner has the same email. diff --git a/partner_mobile_unique/readme/USAGE.rst b/partner_mobile_unique/readme/USAGE.rst new file mode 100644 index 000000000..2ff6e28bb --- /dev/null +++ b/partner_mobile_unique/readme/USAGE.rst @@ -0,0 +1 @@ +If configured, this module integrate automatically in all of the view ``res.partner`` diff --git a/partner_mobile_unique/static/description/icon.png b/partner_mobile_unique/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/partner_mobile_unique/static/description/icon.png differ diff --git a/partner_mobile_unique/static/description/partner_duplicate_error.png b/partner_mobile_unique/static/description/partner_duplicate_error.png new file mode 100644 index 000000000..3aab567de Binary files /dev/null and b/partner_mobile_unique/static/description/partner_duplicate_error.png differ diff --git a/partner_mobile_unique/tests/__init__.py b/partner_mobile_unique/tests/__init__.py new file mode 100644 index 000000000..4149bef86 --- /dev/null +++ b/partner_mobile_unique/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_mobile_check_unique diff --git a/partner_mobile_unique/tests/test_mobile_check_unique.py b/partner_mobile_unique/tests/test_mobile_check_unique.py new file mode 100644 index 000000000..793447ca7 --- /dev/null +++ b/partner_mobile_unique/tests/test_mobile_check_unique.py @@ -0,0 +1,25 @@ +from odoo.exceptions import UserError +from odoo.tests import common + + +class TestMobileCheckUnique(common.TransactionCase): + def _create_partners(self, name, mobile, company_id=False): + return self.env["res.partner"].create( + { + "name": name, + "mobile": mobile, + "company_id": company_id, + } + ) + + def test_01_partner_mobile_unique(self): + # create partners + + self.env.company.write({"partner_mobile_unique_filter_duplicates": True}) + + with self.assertRaises(UserError): + self._create_partners("Test Partner 1", "12345678") + self._create_partners("Test Partner 2", "12345678") + + with self.assertRaises(UserError): + self._create_partners("Test Partner 4", "12345678", self.env.company.id) diff --git a/partner_mobile_unique/views/res_config_settings_view.xml b/partner_mobile_unique/views/res_config_settings_view.xml new file mode 100644 index 000000000..179d87657 --- /dev/null +++ b/partner_mobile_unique/views/res_config_settings_view.xml @@ -0,0 +1,35 @@ + + + + partner_mobile_unique + res.config.settings + + + +

Mobile validation

+
+ +
+
+ +
+
+
+
+ +
+
+
+
+
diff --git a/setup/partner_mobile_unique/odoo/addons/partner_mobile_unique b/setup/partner_mobile_unique/odoo/addons/partner_mobile_unique new file mode 120000 index 000000000..641ed1a2f --- /dev/null +++ b/setup/partner_mobile_unique/odoo/addons/partner_mobile_unique @@ -0,0 +1 @@ +../../../../partner_mobile_unique \ No newline at end of file diff --git a/setup/partner_mobile_unique/setup.py b/setup/partner_mobile_unique/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/partner_mobile_unique/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)