diff --git a/partner_data_vies_populator/README.rst b/partner_data_vies_populator/README.rst index 22a576133..d9f7957bc 100644 --- a/partner_data_vies_populator/README.rst +++ b/partner_data_vies_populator/README.rst @@ -1,96 +1 @@ -=========================== -Partner Data VIES Populator -=========================== - -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! This file is generated by oca-gen-addon-readme !! - !! changes will be overwritten. !! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png - :target: https://odoo-community.org/page/development-status - :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpartner--contact-lightgray.png?logo=github - :target: https://github.com/OCA/partner-contact/tree/13.0/partner_data_vies_populator - :alt: OCA/partner-contact -.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/partner-contact-13-0/partner-contact-13-0-partner_data_vies_populator - :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/134/13.0 - :alt: Try me on Runbot - -|badge1| |badge2| |badge3| |badge4| |badge5| - -This module allows you to create the partners (companies) based on their VAT number. -Name and address of the partner will automatically be completed via VIES Webservice. - -VIES Service (based on stdnum python) -http://ec.europa.eu/taxation_customs/vies/vieshome.do - -**Table of contents** - -.. contents:: - :local: - -Installation -============ - -To install this module, you need to: - -#. Clone the branch 13.0 of the repository https://github.com/OCA/partner-contact -#. Add the path to this repository in your configuration (addons-path) -#. Update the module list -#. Search for "Partner Data VIES Populator" in your addons -#. install the module - -Usage -===== - -When changing a company partner VAT number, this module will try to fetch the partner data from VIES webservice, if available on VIES will update the name, address and country. - -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 `_. - -Do not contact contributors directly about support or help with technical issues. - -Credits -======= - -Authors -~~~~~~~ - -* NextERP Romania -* Forest and Biomass Romania - -Contributors -~~~~~~~~~~~~ - -* `NextERP Romania `_: - - * Fekete Mihai - -Maintainers -~~~~~~~~~~~ - -This module is maintained by the OCA. - -.. image:: https://odoo-community.org/logo.png - :alt: Odoo Community Association - :target: https://odoo-community.org - -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. - -This module is part of the `OCA/partner-contact `_ project on GitHub. - -You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. +Will be regenerated from readme subdir diff --git a/partner_data_vies_populator/__manifest__.py b/partner_data_vies_populator/__manifest__.py index eaa8b7462..3ed7de8ce 100644 --- a/partner_data_vies_populator/__manifest__.py +++ b/partner_data_vies_populator/__manifest__.py @@ -6,16 +6,14 @@ "name": "Partner Data VIES Populator", "summary": "Using VIES webservice, name and address information will " "be fetched and added to the partner.", - "version": "13.0.1.0.0", + "version": "14.0.1.0.0", "category": "Customer Relationship Management", "author": "NextERP Romania," "Forest and Biomass Romania," "Odoo Community Association (OCA)", "website": "https://github.com/OCA/partner-contact", "license": "AGPL-3", - "application": False, - "installable": True, - "external_dependencies": {"python": ["python-stdnum"]}, "depends": ["base_vat"], - "auto_install": False, + "external_dependencies": {"python": ["python-stdnum"]}, + "installable": True, } diff --git a/partner_data_vies_populator/models/res_partner.py b/partner_data_vies_populator/models/res_partner.py index e9dcee445..59fba4054 100644 --- a/partner_data_vies_populator/models/res_partner.py +++ b/partner_data_vies_populator/models/res_partner.py @@ -4,7 +4,8 @@ import logging -from odoo import api, models +from odoo import _, api, models +from odoo.exceptions import UserError _logger = logging.getLogger(__name__) @@ -18,11 +19,16 @@ class ResPartner(models.Model): _inherit = "res.partner" @api.model - def _get_vies_data(self, vat): + def _get_vies_data(self, vat, raise_if_fail=False): res = {} - vat_country, vat_number = self._split_vat(vat) - result = check_vies(vat) - if result.name: + try: + result = check_vies(vat) + except Exception as e: + _logger.warning("Failed to query VIES: %s" % e) + if raise_if_fail: + raise UserError(_("Failed to query VIES.\nTechnical error: %s.") % e) + return res + if result.valid and result.name: res["vat"] = vat # Update partner name if listed on VIES if result.name != "---": @@ -33,7 +39,9 @@ class ResPartner(models.Model): result.address.replace("\n", " ").replace("\r", "").title() ) # Get country by country code - country = self.env["res.country"].search([("code", "ilike", vat_country)]) + country = self.env["res.country"].search( + [("code", "ilike", result.countryCode)] + ) if country: res["country_id"] = country[0].id return res @@ -52,4 +60,5 @@ class ResPartner(models.Model): if vat_country and vat_country not in eu_countries: continue result = self._get_vies_data(vat) - partner.update(result) + if result: + partner.update(result) diff --git a/partner_data_vies_populator/readme/CONTRIBUTORS.rst b/partner_data_vies_populator/readme/CONTRIBUTORS.rst index baba5d11c..0a77744a4 100644 --- a/partner_data_vies_populator/readme/CONTRIBUTORS.rst +++ b/partner_data_vies_populator/readme/CONTRIBUTORS.rst @@ -1,3 +1,9 @@ * `NextERP Romania `_: * Fekete Mihai + +* `Forest and Biomass Romania `_ + +* `Akretion `_ : + + * Alexis de Lattre diff --git a/partner_data_vies_populator/readme/DESCRIPTION.rst b/partner_data_vies_populator/readme/DESCRIPTION.rst index 3adabbf60..30490fd06 100644 --- a/partner_data_vies_populator/readme/DESCRIPTION.rst +++ b/partner_data_vies_populator/readme/DESCRIPTION.rst @@ -3,3 +3,5 @@ Name and address of the partner will automatically be completed via VIES Webserv VIES Service (based on stdnum python) http://ec.europa.eu/taxation_customs/vies/vieshome.do + +Unfortunately, VIES doesn't return a structured address but just a one-line address that aggregate street, zip and city. So, when you use this module to create a partner, the *City* and *Zip* fields will be left empty ; the *Street* field will contain the one-line address. diff --git a/partner_data_vies_populator/readme/INSTALL.rst b/partner_data_vies_populator/readme/INSTALL.rst index 4047a7fef..0f872545f 100644 --- a/partner_data_vies_populator/readme/INSTALL.rst +++ b/partner_data_vies_populator/readme/INSTALL.rst @@ -1,7 +1 @@ -To install this module, you need to: - -#. Clone the branch 13.0 of the repository https://github.com/OCA/partner-contact -#. Add the path to this repository in your configuration (addons-path) -#. Update the module list -#. Search for "Partner Data VIES Populator" in your addons -#. install the module +This module require the `python-stdnum `_ librairy. As Odoo itself depend on this librairy, it should already be installed on your system. diff --git a/partner_data_vies_populator/tests/test_partner_data_vies_populator.py b/partner_data_vies_populator/tests/test_partner_data_vies_populator.py index 17a5dd5a3..47b206891 100644 --- a/partner_data_vies_populator/tests/test_partner_data_vies_populator.py +++ b/partner_data_vies_populator/tests/test_partner_data_vies_populator.py @@ -9,49 +9,77 @@ class TestPartnerCreateByVAT(TransactionCase): def setUp(self): super().setUp() self.partner_model = self.env["res.partner"] + self.be_country_id = self.env.ref("base.be").id self.sample_1 = { - "valid": True, - "name": u"SA ODOO", - "address": u"Chaussée De Namur 40 1367 Ramillies", + "name": "SA ODOO", + "address": "Chaussée De Namur 40 1367 Ramillies", + "country_code": "BE", } def test_create_from_vat1(self): # Create an partner from VAT number field - with Form(self.env["res.partner"]) as partner_form: + with Form(self.partner_model) as partner_form: partner_form.is_company = True partner_form.vat = "be0477472701" # Check if the datas fetch correspond with the datas from VIES. self.assertEqual(partner_form.name, self.sample_1["name"]) self.assertEqual(partner_form.street, self.sample_1["address"]) - self.assertEqual(partner_form.country_id.name, "Belgium") + self.assertEqual( + partner_form.country_id.code, self.sample_1["country_code"] + ) self.assertEqual(partner_form.vat, "BE0477472701") - def test_vat_change1(self): + def test_company_vat_change(self): # Change partner VAT number field - partner1 = self.partner_model.create({"name": "1", "is_company": True}) - with Form(partner1) as partner_form: + partner = self.partner_model.create({"name": "1", "is_company": True}) + with Form(partner) as partner_form: # Check if the datas fetch correspond with the datas from VIES. partner_form.vat = "be0477472701" self.assertEqual(partner_form.name, self.sample_1["name"]) self.assertEqual(partner_form.street, self.sample_1["address"]) - self.assertEqual(partner_form.country_id.name, "Belgium") + self.assertEqual( + partner_form.country_id.code, self.sample_1["country_code"] + ) self.assertEqual(partner_form.vat, "BE0477472701") - # Empty VAT + def test_empty_vat_change(self): + partner = self.partner_model.create( + { + "name": "2", + "is_company": True, + "country_id": self.be_country_id, + } + ) + with Form(partner) as partner_form: partner_form.vat = False - self.assertEqual(partner_form.name, self.sample_1["name"]) - self.assertEqual(partner_form.street, self.sample_1["address"]) - self.assertEqual(partner_form.country_id.name, "Belgium") + self.assertEqual(partner_form.name, partner.name) + self.assertEqual(partner_form.street, False) + self.assertEqual(partner_form.country_id.id, partner.country_id.id) - # Not company - partner_form.is_company = False - self.assertEqual(partner_form.name, self.sample_1["name"]) - self.assertEqual(partner_form.street, self.sample_1["address"]) - self.assertEqual(partner_form.country_id.name, "Belgium") + def test_individual_vat_change(self): + partner = self.partner_model.create( + { + "name": "3", + "is_company": False, + "country_id": self.be_country_id, + } + ) + with Form(partner) as partner_form: + partner_form.vat = "BE0477472701" + self.assertEqual(partner_form.name, partner.name) + self.assertEqual(partner_form.street, False) + self.assertEqual(partner_form.country_id.id, partner.country_id.id) - # Not EU country + def test_non_eu_vat_change(self): + non_eu_country_id = self.env.ref("base.sc").id + partner = self.partner_model.create( + { + "name": "4", + "is_company": True, + "country_id": non_eu_country_id, + } + ) + with Form(partner) as partner_form: partner_form.vat = "GT1234567 - 1" - self.assertEqual(partner_form.name, self.sample_1["name"]) - self.assertEqual(partner_form.street, self.sample_1["address"]) - self.assertEqual(partner_form.country_id.name, "Belgium") + self.assertEqual(partner_form.name, partner.name) diff --git a/requirements.txt b/requirements.txt index 41b756f38..c35786a17 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ # generated from manifests external_dependencies email-validator phonenumbers +python-stdnum diff --git a/setup/partner_data_vies_populator/odoo/addons/partner_data_vies_populator b/setup/partner_data_vies_populator/odoo/addons/partner_data_vies_populator new file mode 120000 index 000000000..b9f44eac4 --- /dev/null +++ b/setup/partner_data_vies_populator/odoo/addons/partner_data_vies_populator @@ -0,0 +1 @@ +../../../../partner_data_vies_populator \ No newline at end of file diff --git a/setup/partner_data_vies_populator/setup.py b/setup/partner_data_vies_populator/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/partner_data_vies_populator/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)