Browse Source

[MIG] partner_create_by_vat: Migration to 13.0

14.0
Mihai Fekete 5 years ago
committed by Alexis de Lattre
parent
commit
1b4dc1c113
  1. 71
      partner_create_by_vat/README.rst
  2. 5
      partner_create_by_vat/__init__.py
  3. 26
      partner_create_by_vat/__openerp__.py
  4. 36
      partner_create_by_vat/i18n/de.po
  5. 36
      partner_create_by_vat/i18n/es.po
  6. 36
      partner_create_by_vat/i18n/eu.po
  7. 31
      partner_create_by_vat/i18n/partner_create_by_vat.pot
  8. 36
      partner_create_by_vat/i18n/ro.po
  9. 37
      partner_create_by_vat/i18n/sl.po
  10. 5
      partner_create_by_vat/models/__init__.py
  11. 62
      partner_create_by_vat/models/res_partner.py
  12. BIN
      partner_create_by_vat/static/description/customer.png
  13. BIN
      partner_create_by_vat/static/description/customer1.png
  14. BIN
      partner_create_by_vat/static/description/icon.png
  15. 5
      partner_create_by_vat/tests/__init__.py
  16. 72
      partner_create_by_vat/tests/test_partner_create_by_vat.py
  17. 23
      partner_create_by_vat/views/res_partner_view.xml
  18. 96
      partner_data_vies_populator/README.rst
  19. 1
      partner_data_vies_populator/__init__.py
  20. 21
      partner_data_vies_populator/__manifest__.py
  21. 1
      partner_data_vies_populator/models/__init__.py
  22. 55
      partner_data_vies_populator/models/res_partner.py
  23. 3
      partner_data_vies_populator/readme/CONTRIBUTORS.rst
  24. 5
      partner_data_vies_populator/readme/DESCRIPTION.rst
  25. 7
      partner_data_vies_populator/readme/INSTALL.rst
  26. 1
      partner_data_vies_populator/readme/USAGE.rst
  27. BIN
      partner_data_vies_populator/static/description/icon.png
  28. 443
      partner_data_vies_populator/static/description/index.html
  29. 1
      partner_data_vies_populator/tests/__init__.py
  30. 57
      partner_data_vies_populator/tests/test_partner_data_vies_populator.py

71
partner_create_by_vat/README.rst

@ -1,71 +0,0 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:alt: License: AGPL-3
==============================================
Automatic partner creation based on VAT number
==============================================
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
Installation
============
To install this module, you need to:
#. Clone the branch 8.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 Create by VAT" in your addons
#. install the module
Usage
=====
On the partner's form view you will have a button in the header, called
"Get Vies Data", available only on companies (is_company field set to True).
Clicking the button will fetch data, when available, from the VIES Webservice, for most of
the EU countries.
.. 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 <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
`here <https://github.com/OCA/partner-contact/issues/new?body=module:%20partner_create_by_vat%0Aversion:%208.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Credits
=======
Images
------
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
Contributors
------------
* Fekete Mihai <feketemihai@gmail.com>
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.

5
partner_create_by_vat/__init__.py

@ -1,5 +0,0 @@
# -*- coding: utf-8 -*-
# © 2015 Forest and Biomass Services Romania
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import models

26
partner_create_by_vat/__openerp__.py

@ -1,26 +0,0 @@
# -*- coding: utf-8 -*-
# © 2015 Forest and Biomass Services Romania
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
'name': 'Automatic partner creation based on VAT number',
'summary': 'Using VIES webservice, name and address information will '
'be fetched and added to the partner.',
'version': '8.0.1.0.0',
'category': 'Customer Relationship Management',
'author': 'Forest and Biomass Services Romania, '
'Odoo Community Association (OCA)',
'website': 'https://www.forbiom.eu',
'license': 'AGPL-3',
'application': False,
'installable': True,
'external_dependencies': {
'python': ['stdnum', 'suds'],
},
'depends': ['base_vat'],
'data': ['views/res_partner_view.xml'],
'images': ['static/description/icon.png',
'static/description/customer.png',
'static/description/customer1.png'],
'auto_install': False,
}

36
partner_create_by_vat/i18n/de.po

@ -1,36 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_create_by_vat
#
# Translators:
# Rudolf Schnapka <rs@techno-flex.de>, 2017
msgid ""
msgstr ""
"Project-Id-Version: partner-contact (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-21 16:57+0000\n"
"PO-Revision-Date: 2017-02-24 20:44+0000\n"
"Last-Translator: Rudolf Schnapka <rs@techno-flex.de>\n"
"Language-Team: German (http://www.transifex.com/oca/OCA-partner-contact-8-0/"
"language/de/)\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: partner_create_by_vat
#: view:res.partner:partner_create_by_vat.view_partner_create_by_vat
msgid "Get Vies Data"
msgstr "Hole MIAS-Daten"
#. module: partner_create_by_vat
#: model:ir.model,name:partner_create_by_vat.model_res_partner
msgid "Partner"
msgstr "Partner"
#. module: partner_create_by_vat
#: code:addons/partner_create_by_vat/models/res_partner.py:29
#, python-format
msgid "The partner is not listed on Vies Webservice."
msgstr "Der Partner ist nicht im MIAS-Webdienst eingetragen."

36
partner_create_by_vat/i18n/es.po

@ -1,36 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_create_by_vat
#
# Translators:
# Oihane Crucelaegui <oihanecruce@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: partner-contact (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-07-03 07:56+0000\n"
"PO-Revision-Date: 2016-07-04 07:42+0000\n"
"Last-Translator: Oihane Crucelaegui <oihanecruce@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/oca/OCA-partner-contact-8-0/"
"language/es/)\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: partner_create_by_vat
#: view:res.partner:partner_create_by_vat.view_partner_create_by_vat
msgid "Get Vies Data"
msgstr ""
#. module: partner_create_by_vat
#: model:ir.model,name:partner_create_by_vat.model_res_partner
msgid "Partner"
msgstr "Empresa"
#. module: partner_create_by_vat
#: code:addons/partner_create_by_vat/models/res_partner.py:29
#, python-format
msgid "The partner is not listed on Vies Webservice."
msgstr ""

36
partner_create_by_vat/i18n/eu.po

@ -1,36 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_create_by_vat
#
# Translators:
# Esther Martín Menéndez <esthermartin001@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: partner-contact (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-21 16:57+0000\n"
"PO-Revision-Date: 2017-02-23 15:55+0000\n"
"Last-Translator: Esther Martín Menéndez <esthermartin001@gmail.com>\n"
"Language-Team: Basque (http://www.transifex.com/oca/OCA-partner-contact-8-0/"
"language/eu/)\n"
"Language: eu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: partner_create_by_vat
#: view:res.partner:partner_create_by_vat.view_partner_create_by_vat
msgid "Get Vies Data"
msgstr ""
#. module: partner_create_by_vat
#: model:ir.model,name:partner_create_by_vat.model_res_partner
msgid "Partner"
msgstr "Kidea"
#. module: partner_create_by_vat
#: code:addons/partner_create_by_vat/models/res_partner.py:29
#, python-format
msgid "The partner is not listed on Vies Webservice."
msgstr ""

31
partner_create_by_vat/i18n/partner_create_by_vat.pot

@ -1,31 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_create_by_vat
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: partner_create_by_vat
#: view:res.partner:partner_create_by_vat.view_partner_create_by_vat
msgid "Get Vies Data"
msgstr ""
#. module: partner_create_by_vat
#: model:ir.model,name:partner_create_by_vat.model_res_partner
msgid "Partner"
msgstr ""
#. module: partner_create_by_vat
#: code:addons/partner_create_by_vat/models/res_partner.py:29
#, python-format
msgid "The partner is not listed on Vies Webservice."
msgstr ""

36
partner_create_by_vat/i18n/ro.po

@ -1,36 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_create_by_vat
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: partner-contact (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-05-07 07:18+0000\n"
"PO-Revision-Date: 2016-05-06 15:15+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>\n"
"Language-Team: Romanian (http://www.transifex.com/oca/OCA-partner-"
"contact-8-0/language/ro/)\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
#. module: partner_create_by_vat
#: view:res.partner:partner_create_by_vat.view_partner_create_by_vat
msgid "Get Vies Data"
msgstr ""
#. module: partner_create_by_vat
#: model:ir.model,name:partner_create_by_vat.model_res_partner
msgid "Partner"
msgstr "Partener"
#. module: partner_create_by_vat
#: code:addons/partner_create_by_vat/models/res_partner.py:29
#, python-format
msgid "The partner is not listed on Vies Webservice."
msgstr "Partenerul nu este listat pe site-ul Vies."

37
partner_create_by_vat/i18n/sl.po

@ -1,37 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * partner_create_by_vat
#
# Translators:
# Matjaž Mozetič <m.mozetic@matmoz.si>, 2016
msgid ""
msgstr ""
"Project-Id-Version: partner-contact (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-05-07 07:18+0000\n"
"PO-Revision-Date: 2016-05-07 07:16+0000\n"
"Last-Translator: Matjaž Mozetič <m.mozetic@matmoz.si>\n"
"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-partner-"
"contact-8-0/language/sl/)\n"
"Language: sl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3);\n"
#. module: partner_create_by_vat
#: view:res.partner:partner_create_by_vat.view_partner_create_by_vat
msgid "Get Vies Data"
msgstr "Pridobi podatke VIES"
#. module: partner_create_by_vat
#: model:ir.model,name:partner_create_by_vat.model_res_partner
msgid "Partner"
msgstr "Partner"
#. module: partner_create_by_vat
#: code:addons/partner_create_by_vat/models/res_partner.py:29
#, python-format
msgid "The partner is not listed on Vies Webservice."
msgstr "Partnerja ni na seznamu spletne storitve VIES."

5
partner_create_by_vat/models/__init__.py

@ -1,5 +0,0 @@
# -*- coding: utf-8 -*-
# © 2015 Forest and Biomass Services Romania
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import res_partner

62
partner_create_by_vat/models/res_partner.py

@ -1,62 +0,0 @@
# -*- coding: utf-8 -*-
# © 2015 Forest and Biomass Services Romania
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
from openerp import api, models, _
from openerp.exceptions import ValidationError
_logger = logging.getLogger(__name__)
try:
from stdnum.eu.vat import check_vies
except ImportError:
_logger.debug("Cannot import check_vies method from python stdnum.")
class ResPartner(models.Model):
_inherit = "res.partner"
@api.model
def _get_vies_data(self, vat):
res = {}
vat = vat.strip().upper()
vat_country, vat_number = self._split_vat(vat)
result = check_vies(vat)
# Raise error if partner is not listed on Vies
if result.name is None:
raise ValidationError(_("The partner is not listed on Vies "
"Webservice."))
res['vat'] = vat
res['vat_subjected'] = result.valid
# Update partner name if listed on VIES
if result.name != '---':
res['name'] = result.name.upper()
# Update partner address if listed on VIES
if result.address != '---':
res['street'] = \
result.address.replace('\n', ' ').replace('\r', '').title()
# Get country by country code
country = self.env['res.country'].search(
[('code', 'ilike', vat_country)])
if country:
res['country_id'] = country[0].id
return res
@api.multi
def vat_change(self, value):
res = super(ResPartner, self).vat_change(value)
# Update fields with the values available in the upper method
# Skip required name error
with self.env.do_in_onchange():
if value:
result = self._get_vies_data(value)
res['value'].update(result)
return res
@api.one
def get_vies_data_from_vat(self):
if self.vat:
res = self._get_vies_data(self.vat)
self.update(res)

BIN
partner_create_by_vat/static/description/customer.png

Before

Width: 1855  |  Height: 945  |  Size: 108 KiB

BIN
partner_create_by_vat/static/description/customer1.png

Before

Width: 1852  |  Height: 950  |  Size: 118 KiB

BIN
partner_create_by_vat/static/description/icon.png

Before

Width: 128  |  Height: 128  |  Size: 12 KiB

5
partner_create_by_vat/tests/__init__.py

@ -1,5 +0,0 @@
# -*- coding: utf-8 -*-
# © 2015 Forest and Biomass Services Romania
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import test_partner_create_by_vat

72
partner_create_by_vat/tests/test_partner_create_by_vat.py

@ -1,72 +0,0 @@
# -*- coding: utf-8 -*-
# © 2015 Forest and Biomass Services Romania
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import mock
from openerp.tests.common import TransactionCase
from openerp.exceptions import ValidationError
mock_vies = 'openerp.addons.partner_create_by_vat.' \
'models.res_partner.check_vies'
class TestPartnerCreatebyVAT(TransactionCase):
def setUp(self):
super(TestPartnerCreatebyVAT, self).setUp()
self.partner_model = self.env['res.partner']
self.sample_1 = {
'valid': True,
'name': u'SA ODOO',
'address': u'Chaussée De Namur 40 1367 Ramillies',
}
def test_create_from_vat1(self):
# Create an partner from VAT number field
self.partner1_id = self.partner_model.create({'name': '1',
'vat': 'be0477472701',
'is_company': True})
with mock.patch(mock_vies) as mock_func:
mock_func.return_value = type('obj', (object,), self.sample_1)
# Push the button to fetch partner's data
self.partner1_id.get_vies_data_from_vat()
# Check if the datas fetch correspond with the datas from VIES.
self.assertEqual(
unicode(self.partner1_id.name), self.sample_1['name'])
self.assertEqual(
unicode(self.partner1_id.street), self.sample_1['address'])
self.assertEqual(self.partner1_id.country_id.name, 'Belgium')
self.assertEqual(self.partner1_id.vat, 'BE0477472701')
self.assertEqual(self.partner1_id.vat_subjected, True)
def test_vat_change1(self):
# Create an partner from VAT number field
self.partner11_id = self.partner_model.create({'name': '1',
'is_company': True})
with self.env.do_in_onchange():
with mock.patch(mock_vies) as mock_func:
mock_func.return_value = type('obj', (object,), self.sample_1)
res = self.partner11_id.vat_change('be0477472701')
self.partner11_id.update(res['value'])
# Check if the datas fetch correspond with the datas from VIES.
self.assertEqual(
unicode(self.partner11_id.name), self.sample_1['name'])
self.assertEqual(
unicode(self.partner11_id.street), self.sample_1['address'])
self.assertEqual(self.partner11_id.country_id.name, 'Belgium')
self.assertEqual(self.partner11_id.vat, 'BE0477472701')
self.assertEqual(self.partner11_id.vat_subjected, True)
def test_create_from_vat2(self):
# Create an partner from VAT number field
self.partner2_id = self.partner_model.create({'name': '1',
'vat': 'ro4400972',
'is_company': True})
# Check VAT number not listed on VIES
with self.assertRaises(ValidationError):
self.partner2_id.get_vies_data_from_vat()

23
partner_create_by_vat/views/res_partner_view.xml

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_partner_create_by_vat" model="ir.ui.view">
<field name="name">res.partner.create.by.vat</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base_vat.view_partner_form"/>
<field name="arch" type="xml">
<field name="vat" position="after">
<button name="get_vies_data_from_vat"
attrs="{'invisible': [
('vat', '=', False),
('is_company', '=', False )]}"
colspan="2" string="Get Vies Data"
type="object" icon="gtk-execute"/>
</field>
</field>
</record>
</data>
</openerp>

96
partner_data_vies_populator/README.rst

@ -0,0 +1,96 @@
===========================
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 partners VAT number, this module will try to fetch the partner data from VIES webservice, if available on VIES will udpate 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.

1
partner_data_vies_populator/__init__.py

@ -0,0 +1 @@
from . import models

21
partner_data_vies_populator/__manifest__.py

@ -0,0 +1,21 @@
# Copyright (C) 2015 Forest and Biomass Romania
# Copyright (C) 2020 NextERP Romania
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"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",
"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,
}

1
partner_data_vies_populator/models/__init__.py

@ -0,0 +1 @@
from . import res_partner

55
partner_data_vies_populator/models/res_partner.py

@ -0,0 +1,55 @@
# Copyright (C) 2015 Forest and Biomass Romania
# Copyright (C) 2020 NextERP Romania
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
import logging
from odoo import api, models
_logger = logging.getLogger(__name__)
try:
from stdnum.eu.vat import check_vies
except ImportError:
_logger.debug("Cannot import check_vies method from python stdnum.")
class ResPartner(models.Model):
_inherit = "res.partner"
@api.model
def _get_vies_data(self, vat):
res = {}
vat_country, vat_number = self._split_vat(vat)
result = check_vies(vat)
if result.name:
res["vat"] = vat
# Update partner name if listed on VIES
if result.name != "---":
res["name"] = result.name.upper()
# Update partner address if listed on VIES
if result.address != "---":
res["street"] = (
result.address.replace("\n", " ").replace("\r", "").title()
)
# Get country by country code
country = self.env["res.country"].search([("code", "ilike", vat_country)])
if country:
res["country_id"] = country[0].id
return res
@api.onchange("vat")
def vies_vat_change(self):
eu_group = self.env.ref("base.europe", raise_if_not_found=False)
if eu_group:
for partner in self:
if not partner.vat or not partner.is_company:
continue
vat = partner.vat.strip().upper()
vat_country, vat_number = self._split_vat(vat)
vat_country = vat_country.upper()
eu_countries = eu_group.country_ids.mapped("code")
if vat_country and vat_country not in eu_countries:
continue
result = self._get_vies_data(vat)
partner.update(result)

3
partner_data_vies_populator/readme/CONTRIBUTORS.rst

@ -0,0 +1,3 @@
* `NextERP Romania <https://www.nexterp.ro>`_:
* Fekete Mihai <feketemihai@nexterp.ro>

5
partner_data_vies_populator/readme/DESCRIPTION.rst

@ -0,0 +1,5 @@
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

7
partner_data_vies_populator/readme/INSTALL.rst

@ -0,0 +1,7 @@
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

1
partner_data_vies_populator/readme/USAGE.rst

@ -0,0 +1 @@
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.

BIN
partner_data_vies_populator/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

443
partner_data_vies_populator/static/description/index.html

@ -0,0 +1,443 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Partner Data VIES Populator</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="partner-data-vies-populator">
<h1 class="title">Partner Data VIES Populator</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/partner-contact/tree/13.0/partner_data_vies_populator"><img alt="OCA/partner-contact" src="https://img.shields.io/badge/github-OCA%2Fpartner--contact-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/partner-contact-13-0/partner-contact-13-0-partner_data_vies_populator"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/134/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>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.</p>
<p>VIES Service (based on stdnum python)
<a class="reference external" href="http://ec.europa.eu/taxation_customs/vies/vieshome.do">http://ec.europa.eu/taxation_customs/vies/vieshome.do</a></p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="id1">Installation</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="installation">
<h1><a class="toc-backref" href="#id1">Installation</a></h1>
<p>To install this module, you need to:</p>
<ol class="arabic simple">
<li>Clone the branch 13.0 of the repository <a class="reference external" href="https://github.com/OCA/partner-contact">https://github.com/OCA/partner-contact</a></li>
<li>Add the path to this repository in your configuration (addons-path)</li>
<li>Update the module list</li>
<li>Search for “Partner Data VIES Populator” in your addons</li>
<li>install the module</li>
</ol>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<p>When changing a partners VAT number, this module will try to fetch the partner data from VIES webservice, if available on VIES will udpate the name, address and country.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id3">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 smashing it by providing a detailed and welcomed
<a class="reference external" href="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**">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="#id4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<ul class="simple">
<li>NextERP Romania</li>
<li>Forest and Biomass Romania</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.nexterp.ro">NextERP Romania</a>:<ul>
<li>Fekete Mihai &lt;<a class="reference external" href="mailto:feketemihai&#64;nexterp.ro">feketemihai&#64;nexterp.ro</a>&gt;</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id7">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" /></a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/partner-contact/tree/13.0/partner_data_vies_populator">OCA/partner-contact</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

1
partner_data_vies_populator/tests/__init__.py

@ -0,0 +1 @@
from . import test_partner_data_vies_populator

57
partner_data_vies_populator/tests/test_partner_data_vies_populator.py

@ -0,0 +1,57 @@
# Copyright (C) 2015 Forest and Biomass Romania
# Copyright (C) 2020 NextERP Romania
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo.tests.common import Form, TransactionCase
class TestPartnerCreateByVAT(TransactionCase):
def setUp(self):
super().setUp()
self.partner_model = self.env["res.partner"]
self.sample_1 = {
"valid": True,
"name": u"SA ODOO",
"address": u"Chaussée De Namur 40 1367 Ramillies",
}
def test_create_from_vat1(self):
# Create an partner from VAT number field
with Form(self.env["res.partner"]) 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.vat, "BE0477472701")
def test_vat_change1(self):
# Change partner VAT number field
partner1 = self.partner_model.create({"name": "1", "is_company": True})
with Form(partner1) 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.vat, "BE0477472701")
# Empty VAT
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")
# 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")
# Not EU country
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")
Loading…
Cancel
Save