Skip to content

Commit

Permalink
[IMP] partner_vat_unique: add configuration parameter for unique VAT …
Browse files Browse the repository at this point in the history
…constraint

- Defined `partner_vat_unique` as a boolean configuration parameter.
- Updated `res.partner` to validate VAT uniqueness based on this parameter.
- Added a new section in ResConfigSettings for enabling/disabling the constraint.
- Updated tests to include scenarios with the configuration parameter.
  • Loading branch information
lef-adhoc committed Jan 28, 2025
1 parent 6e33608 commit ecfd23a
Show file tree
Hide file tree
Showing 8 changed files with 89 additions and 22 deletions.
12 changes: 12 additions & 0 deletions partner_vat_unique/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,18 @@ Installation
Will not check previous VAT duplicates, so it is recomended make sure
there isn't any duplicated VAT before installation.

Configuration
=============

To configure this module, you need to:

1. Go to **Settings > Contacts**.
2. Locate the option: Unique VAT Constraint.
3. Enable the setting to enforce VAT uniqueness across partners.

Once enabled, Odoo will validate that VAT numbers are unique across
partners, preventing duplicate entries.

Known issues / Roadmap
======================

Expand Down
5 changes: 4 additions & 1 deletion partner_vat_unique/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,8 @@
"license": "AGPL-3",
"application": True,
"installable": True,
"depends": ["base"],
"depends": ["base_setup"],
"data": [
"views/res_config_settings_views.xml",
],
}
1 change: 1 addition & 0 deletions partner_vat_unique/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from . import res_partner
from . import res_config_settings
13 changes: 13 additions & 0 deletions partner_vat_unique/models/res_config_settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo import fields, models


class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"

partner_vat_unique = fields.Boolean(
string="Unique VAT Constraint",
config_parameter="partner_vat_unique.partner_vat_unique",
help="Check this if you want to constrain VAT number to be unique.",
)
14 changes: 8 additions & 6 deletions partner_vat_unique/models/res_partner.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

from odoo import api, fields, models
from odoo.exceptions import ValidationError
from odoo.tools import config


class ResPartner(models.Model):
Expand All @@ -14,14 +13,17 @@ class ResPartner(models.Model):

@api.constrains("vat", "parent_id")
def _check_vat_unique(self):
if (
not self.env["ir.config_parameter"]
.sudo()
.get_param("partner_vat_unique.partner_vat_unique", default=False)
):
return

for record in self:
if record.parent_id or not record.vat:
continue

Check warning on line 25 in partner_vat_unique/models/res_partner.py

View check run for this annotation

Codecov / codecov/patch

partner_vat_unique/models/res_partner.py#L25

Added line #L25 was not covered by tests
test_condition = config["test_enable"] and not self.env.context.get(
"test_vat"
)
if test_condition:
continue

if record.same_vat_partner_id:
raise ValidationError(
self.env._(
Expand Down
36 changes: 24 additions & 12 deletions partner_vat_unique/static/description/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -376,12 +376,13 @@ <h1 class="title">Partner VAT Unique</h1>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="toc-entry-1">Installation</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="toc-entry-2">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
<li><a class="reference internal" href="#configuration" id="toc-entry-2">Configuration</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="toc-entry-3">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-6">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-7">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-8">Maintainers</a></li>
</ul>
</li>
</ul>
Expand All @@ -391,32 +392,43 @@ <h1><a class="toc-backref" href="#toc-entry-1">Installation</a></h1>
<p>Will not check previous VAT duplicates, so it is recomended make sure
there isn’t any duplicated VAT before installation.</p>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-2">Configuration</a></h1>
<p>To configure this module, you need to:</p>
<ol class="arabic simple">
<li>Go to <strong>Settings &gt; Contacts</strong>.</li>
<li>Locate the option: Unique VAT Constraint.</li>
<li>Enable the setting to enforce VAT uniqueness across partners.</li>
</ol>
<p>Once enabled, Odoo will validate that VAT numbers are unique across
partners, preventing duplicate entries.</p>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#toc-entry-2">Known issues / Roadmap</a></h1>
<h1><a class="toc-backref" href="#toc-entry-3">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>Creation of the partner from XML-RPC.</li>
<li>Partner creation by importing a CSV file, in those cases you miss the
notice.</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
<h1><a class="toc-backref" href="#toc-entry-4">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/partner-contact/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/partner-contact/issues/new?body=module:%20partner_vat_unique%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
<h1><a class="toc-backref" href="#toc-entry-5">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
<h2><a class="toc-backref" href="#toc-entry-6">Authors</a></h2>
<ul class="simple">
<li>Grant Thornton S.L.P</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<h2><a class="toc-backref" href="#toc-entry-7">Contributors</a></h2>
<ul class="simple">
<li>Ismael Calvo &lt;<a class="reference external" href="mailto:ismael.calvo&#64;es.gt.com">ismael.calvo&#64;es.gt.com</a>&gt;</li>
<li>Michael Michot &lt;<a class="reference external" href="mailto:michotm&#64;gmail.com">michotm&#64;gmail.com</a>&gt;</li>
Expand All @@ -431,7 +443,7 @@ <h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
<h2><a class="toc-backref" href="#toc-entry-8">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
Expand Down
14 changes: 11 additions & 3 deletions partner_vat_unique/tests/test_vat_unique.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,23 @@ class TestVatUnique(TransactionCase):
def setUpClass(cls):
super().setUpClass()
cls.partner_model = cls.env["res.partner"]
cls.config_parameter = cls.env["ir.config_parameter"]
cls.partner = cls.partner_model.create(
{"name": "Test partner", "vat": "ESA12345674"}
)

def test_duplicated_vat_creation(self):
self.config_parameter.set_param("partner_vat_unique.partner_vat_unique", True)

with self.assertRaises(ValidationError):
self.partner_model.with_context(test_vat=True).create(
{"name": "Second partner", "vat": "ESA12345674"}
)
self.partner_model.create({"name": "Second partner", "vat": "ESA12345674"})

self.config_parameter.set_param("partner_vat_unique.partner_vat_unique", False)

partner_duplicated = self.partner_model.create(
{"name": "Second partner", "vat": "ESA12345674"}
)
self.assertEqual(partner_duplicated.vat, "ESA12345674")

def test_duplicate_partner(self):
partner_copied = self.partner.copy()
Expand Down
16 changes: 16 additions & 0 deletions partner_vat_unique/views/res_config_settings_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.partner.vat.unique</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.res_config_settings_view_form" />
<field name="arch" type="xml">
<block name="contacts_setting_container" position="inside">
<setting
help="Check this if you want to constrain VAT number to be unique"
>
<field name="partner_vat_unique" />
</setting>
</block>
</field>
</record>
</odoo>

0 comments on commit ecfd23a

Please sign in to comment.