Browse Source

[MIG] partner_data_vies_populator from v13 to v14

Improve error handling to avoid crash when Internet connectivity is down
Read country code from VIES, not from VAT number
No update when VAT number is invalid
Improve tests
14.0
Alexis de Lattre 3 years ago
parent
commit
b949dcc5f5
  1. 97
      partner_data_vies_populator/README.rst
  2. 8
      partner_data_vies_populator/__manifest__.py
  3. 23
      partner_data_vies_populator/models/res_partner.py
  4. 6
      partner_data_vies_populator/readme/CONTRIBUTORS.rst
  5. 2
      partner_data_vies_populator/readme/DESCRIPTION.rst
  6. 8
      partner_data_vies_populator/readme/INSTALL.rst
  7. 72
      partner_data_vies_populator/tests/test_partner_data_vies_populator.py
  8. 1
      requirements.txt
  9. 1
      setup/partner_data_vies_populator/odoo/addons/partner_data_vies_populator
  10. 6
      setup/partner_data_vies_populator/setup.py

97
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 <https://github.com/OCA/partner-contact/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 <https://github.com/OCA/partner-contact/issues/new?body=module:%20partner_data_vies_populator%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* NextERP Romania
* Forest and Biomass Romania
Contributors
~~~~~~~~~~~~
* `NextERP Romania <https://www.nexterp.ro>`_:
* Fekete Mihai <feketemihai@nexterp.ro>
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 <https://github.com/OCA/partner-contact/tree/13.0/partner_data_vies_populator>`_ 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

8
partner_data_vies_populator/__manifest__.py

@ -6,16 +6,14 @@
"name": "Partner Data VIES Populator", "name": "Partner Data VIES Populator",
"summary": "Using VIES webservice, name and address information will " "summary": "Using VIES webservice, name and address information will "
"be fetched and added to the partner.", "be fetched and added to the partner.",
"version": "13.0.1.0.0",
"version": "14.0.1.0.0",
"category": "Customer Relationship Management", "category": "Customer Relationship Management",
"author": "NextERP Romania," "author": "NextERP Romania,"
"Forest and Biomass Romania," "Forest and Biomass Romania,"
"Odoo Community Association (OCA)", "Odoo Community Association (OCA)",
"website": "https://github.com/OCA/partner-contact", "website": "https://github.com/OCA/partner-contact",
"license": "AGPL-3", "license": "AGPL-3",
"application": False,
"installable": True,
"external_dependencies": {"python": ["python-stdnum"]},
"depends": ["base_vat"], "depends": ["base_vat"],
"auto_install": False,
"external_dependencies": {"python": ["python-stdnum"]},
"installable": True,
} }

23
partner_data_vies_populator/models/res_partner.py

@ -4,7 +4,8 @@
import logging import logging
from odoo import api, models
from odoo import _, api, models
from odoo.exceptions import UserError
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -18,11 +19,16 @@ class ResPartner(models.Model):
_inherit = "res.partner" _inherit = "res.partner"
@api.model @api.model
def _get_vies_data(self, vat):
def _get_vies_data(self, vat, raise_if_fail=False):
res = {} 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 res["vat"] = vat
# Update partner name if listed on VIES # Update partner name if listed on VIES
if result.name != "---": if result.name != "---":
@ -33,7 +39,9 @@ class ResPartner(models.Model):
result.address.replace("\n", " ").replace("\r", "").title() result.address.replace("\n", " ").replace("\r", "").title()
) )
# Get country by country code # 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: if country:
res["country_id"] = country[0].id res["country_id"] = country[0].id
return res return res
@ -52,4 +60,5 @@ class ResPartner(models.Model):
if vat_country and vat_country not in eu_countries: if vat_country and vat_country not in eu_countries:
continue continue
result = self._get_vies_data(vat) result = self._get_vies_data(vat)
partner.update(result)
if result:
partner.update(result)

6
partner_data_vies_populator/readme/CONTRIBUTORS.rst

@ -1,3 +1,9 @@
* `NextERP Romania <https://www.nexterp.ro>`_: * `NextERP Romania <https://www.nexterp.ro>`_:
* Fekete Mihai <feketemihai@nexterp.ro> * Fekete Mihai <feketemihai@nexterp.ro>
* `Forest and Biomass Romania <https://www.forbiom.eu/>`_
* `Akretion <https://akretion.com/>`_ :
* Alexis de Lattre <alexis.delattre@akretion.com>

2
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) VIES Service (based on stdnum python)
http://ec.europa.eu/taxation_customs/vies/vieshome.do 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.

8
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 <https://pypi.org/project/python-stdnum/>`_ librairy. As Odoo itself depend on this librairy, it should already be installed on your system.

72
partner_data_vies_populator/tests/test_partner_data_vies_populator.py

@ -9,49 +9,77 @@ class TestPartnerCreateByVAT(TransactionCase):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
self.partner_model = self.env["res.partner"] self.partner_model = self.env["res.partner"]
self.be_country_id = self.env.ref("base.be").id
self.sample_1 = { 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): def test_create_from_vat1(self):
# Create an partner from VAT number field # 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.is_company = True
partner_form.vat = "be0477472701" partner_form.vat = "be0477472701"
# Check if the datas fetch correspond with the datas from VIES. # Check if the datas fetch correspond with the datas from VIES.
self.assertEqual(partner_form.name, self.sample_1["name"]) self.assertEqual(partner_form.name, self.sample_1["name"])
self.assertEqual(partner_form.street, self.sample_1["address"]) 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") self.assertEqual(partner_form.vat, "BE0477472701")
def test_vat_change1(self):
def test_company_vat_change(self):
# Change partner VAT number field # 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. # Check if the datas fetch correspond with the datas from VIES.
partner_form.vat = "be0477472701" partner_form.vat = "be0477472701"
self.assertEqual(partner_form.name, self.sample_1["name"]) self.assertEqual(partner_form.name, self.sample_1["name"])
self.assertEqual(partner_form.street, self.sample_1["address"]) 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") 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 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" 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)

1
requirements.txt

@ -1,3 +1,4 @@
# generated from manifests external_dependencies # generated from manifests external_dependencies
email-validator email-validator
phonenumbers phonenumbers
python-stdnum

1
setup/partner_data_vies_populator/odoo/addons/partner_data_vies_populator

@ -0,0 +1 @@
../../../../partner_data_vies_populator

6
setup/partner_data_vies_populator/setup.py

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
Loading…
Cancel
Save