From 822719c9e0e128dd0a41f4ff865433fca5085b10 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Thu, 1 Oct 2015 13:05:38 +0200 Subject: [PATCH] Port partner_contact_vat to OCA. --- partner_contact_vat/README.rst | 73 ++++++++++++++++++ partner_contact_vat/__init__.py | 5 ++ partner_contact_vat/__openerp__.py | 23 ++++++ partner_contact_vat/i18n/es.po | 42 ++++++++++ partner_contact_vat/models/__init__.py | 5 ++ partner_contact_vat/models/res_partner.py | 51 ++++++++++++ .../static/description/icon.png | Bin 0 -> 18360 bytes partner_contact_vat/tests/__init__.py | 5 ++ partner_contact_vat/tests/test_validation.py | 54 +++++++++++++ partner_contact_vat/view/res_partner.xml | 60 ++++++++++++++ 10 files changed, 318 insertions(+) create mode 100644 partner_contact_vat/README.rst create mode 100644 partner_contact_vat/__init__.py create mode 100644 partner_contact_vat/__openerp__.py create mode 100644 partner_contact_vat/i18n/es.po create mode 100644 partner_contact_vat/models/__init__.py create mode 100644 partner_contact_vat/models/res_partner.py create mode 100644 partner_contact_vat/static/description/icon.png create mode 100644 partner_contact_vat/tests/__init__.py create mode 100644 partner_contact_vat/tests/test_validation.py create mode 100644 partner_contact_vat/view/res_partner.xml diff --git a/partner_contact_vat/README.rst b/partner_contact_vat/README.rst new file mode 100644 index 000000000..7a3f42a65 --- /dev/null +++ b/partner_contact_vat/README.rst @@ -0,0 +1,73 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +======================= +VAT in contact partners +======================= + +This module was written to extend the functionality of contacts management to +support setting a VAT in contact partners (those partners that are not not +companies) and allow you to have separate VAT codes for contact and for their +company. + +Odoo by default only allows VAT in companies. When a contact belongs to a +company and you go to *accounting* page, it shows *Accounting is managed in the +parent company*. + +If you manage any kind of personal information of your clients (prevention of +occupational hazards, training, event assistants, legal stuff, etc.) you +probably need their VAT. + +Indeed the company VAT will still be used for invoices and other legal +documents, but for other things you need the person's. For that reason, instead +of overwriting the VAT field, this module just adds a new one that will be +hidden for companies. + +You will not be able to save a contact VAT with an invalid format. + +Usage +===== + +To use this module, you need to: + +* Go to any contact's form. +* Enter its *personal information* page. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/134/8.0 + +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 `here `_. + + +Credits +======= + +Contributors +------------ + +* Jairo Llopis + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/partner_contact_vat/__init__.py b/partner_contact_vat/__init__.py new file mode 100644 index 000000000..71ed6930e --- /dev/null +++ b/partner_contact_vat/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# © 2015 Grupo ESOC Ingeniería de servicios, S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/partner_contact_vat/__openerp__.py b/partner_contact_vat/__openerp__.py new file mode 100644 index 000000000..2055d6003 --- /dev/null +++ b/partner_contact_vat/__openerp__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# © 2015 Grupo ESOC Ingeniería de servicios, S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "VAT in contact partners", + "summary": "Allow to set up VAT for contacts", + "version": "8.0.1.0.0", + "category": "Accounting & Finance", + "website": "https://grupoesoc.es", + "author": "Grupo ESOC Ingeniería de servicios, " + "Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": [ + "base_vat", + "partner_contact_personal_information_page", + ], + "data": [ + "view/res_partner.xml", + ], +} diff --git a/partner_contact_vat/i18n/es.po b/partner_contact_vat/i18n/es.po new file mode 100644 index 000000000..ab6e9859d --- /dev/null +++ b/partner_contact_vat/i18n/es.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_contact_vat +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 7.0-20140804-231303\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-08 09:55+0000\n" +"PO-Revision-Date: 2014-08-08 11:58+0100\n" +"Last-Translator: Jairo Llopis \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.4\n" +"Language: es\n" + +#. module: partner_contact_vat +#: model:ir.model,name:partner_contact_vat.model_res_partner +msgid "Partner" +msgstr "Empresa" + +#. module: partner_contact_vat +#: help:res.partner,contact_vat:0 +msgid "" +"Tax Identification Number of the contact. This will not be used for " +"commercial actions; instead, parent company's TIN will be used." +msgstr "" +"Número de Identificación Fiscal del contacto. Este código no se usará para " +"acciones comerciales; en su lugar, se usará el NIF de la empresa a la que " +"pertenece el contacto." + +#. module: partner_contact_vat +#: field:res.partner,contact_vat:0 +msgid "Contact TIN" +msgstr "NIF del contacto" + +#. module: partner_contact_vat +#: view:res.partner:0 +msgid "e.g. BE0477472701" +msgstr "Por ejemplo, ESA00000000" diff --git a/partner_contact_vat/models/__init__.py b/partner_contact_vat/models/__init__.py new file mode 100644 index 000000000..e14e5919f --- /dev/null +++ b/partner_contact_vat/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# © 2015 Grupo ESOC Ingeniería de servicios, S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import res_partner diff --git a/partner_contact_vat/models/res_partner.py b/partner_contact_vat/models/res_partner.py new file mode 100644 index 000000000..0319aa79d --- /dev/null +++ b/partner_contact_vat/models/res_partner.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# © 2015 Grupo ESOC Ingeniería de servicios, S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import string +from openerp import _, api, exceptions, fields, models +from openerp.addons.base_vat.base_vat import _ref_vat + + +class PartnerVATInContacts(models.Model): + """Allow to set up individual VAT for a company's contacts.""" + _inherit = "res.partner" + + contact_vat = fields.Char( + "Contact TIN", + size=32, + help="Tax Identification Number of the contact. " + "This will not be used for commercial actions; " + "instead, parent company's TIN will be used.") + + @api.multi + @api.constrains("is_company", "contact_vat") + def contact_vat_check(self): + """Check validity of `contact_vat`. + + It does not use VIES because usually it would fail when checking + persons' VAT codes. + """ + for s in self.filtered(lambda r: not r.is_company and r.contact_vat): + country, code = s._split_vat(s.contact_vat) + values = { + "vat": s.contact_vat, + "name": s.display_name, + } + + # VAT should start with 2 letters + if any(char not in string.ascii_lowercase for char in country): + raise exceptions.ValidationError( + _("VAT %(vat)s of %(name)s should start with " + "2 letters that indicate the country code.") % values) + + # Use core methods for VAT checking + elif not s.simple_vat_check(country, code): + # Display a useful message to user + values["template"] = ( + _ref_vat.get(country) or + _("CCNNNNNNNNN (CC=Country Code of 2 letters, " + "NNN... Local VAT number).")) + raise exceptions.ValidationError( + _("VAT %(vat)s of %(name)s has a wrong format. " + "It should be similar to %(template)s") % values) diff --git a/partner_contact_vat/static/description/icon.png b/partner_contact_vat/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e8561948c4fffafcac24e6a490f7b769f47657ce GIT binary patch literal 18360 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 T=N{zi00000NkvXXu0mjf>-tmF literal 0 HcmV?d00001 diff --git a/partner_contact_vat/tests/__init__.py b/partner_contact_vat/tests/__init__.py new file mode 100644 index 000000000..3d4bd0cc4 --- /dev/null +++ b/partner_contact_vat/tests/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# © 2015 Grupo ESOC Ingeniería de servicios, S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import test_validation diff --git a/partner_contact_vat/tests/test_validation.py b/partner_contact_vat/tests/test_validation.py new file mode 100644 index 000000000..a673bee14 --- /dev/null +++ b/partner_contact_vat/tests/test_validation.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# © 2015 Grupo ESOC Ingeniería de servicios, S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp.tests.common import TransactionCase +from openerp.addons.base_vat.base_vat import _ref_vat +from openerp import exceptions as ex + + +class CommonCase(TransactionCase): + """Test common cases, independent to the country of the VAT code.""" + def setUp(self): + super(CommonCase, self).setUp() + + self.partner = self.env["res.partner"].create({ + "name": __file__, + "is_company": False, + }) + + def test_empty(self): + """Remove a VAT from a contact.""" + # First, set a good VAT to have no errors + self.partner.contact_vat = "ES00000001R" + + # Then remove it + self.partner.contact_vat = False + + # Nothing special should happen + self.assertEqual(self.partner.contact_vat, False) + + def test_company_to_partner(self): + """Set a wrong contact VAT to a company and convert it to person.""" + self.partner.is_company = True + + # Set a wrong contact_vat, but no errors because it is a company + self.partner.contact_vat = "ES00000001W" + + # Now say it's a person + with self.assertRaises(ex.ValidationError): + self.partner.is_company = False + + def test_vat_without_country_code(self): + """Set a VAT without the country code prefix.""" + with self.assertRaises(ex.ValidationError): + self.partner.contact_vat = "00000001R" + + def test_wrong_format_hint(self): + """Ensure the format hint is given to user.""" + try: + # Set a wrong VAT + self.partner.with_context(lang="en_US").contact_vat = "ES00000001W" + except ex.ValidationError as error: + self.assertIn(_ref_vat.get("es"), error.value) + self.assertEqual(error.value, error.args[1]) diff --git a/partner_contact_vat/view/res_partner.xml b/partner_contact_vat/view/res_partner.xml new file mode 100644 index 000000000..e2c9b8e56 --- /dev/null +++ b/partner_contact_vat/view/res_partner.xml @@ -0,0 +1,60 @@ + + + + + + + + + VAT for contacts + res.partner + + + + + + + + + + + + + + + + + +