Some countries, such as Portugal, persons also have VAT-like tax numbers, that can be used in invoices, just like company VAT numbers can. However, the VIES service does not work for these person VAT numbers, only for companies. This fix ensures that VIES validation is only used for companies. closes odoo/odoo#80521 X-original-commit: 87028f8b08628b8c643d84b0c19810470f540533 Signed-off-by: William André (wan) <wan@odoo.com> Co-authored-by: Daniel Reis <dreis.pt@hotmail.com> Co-authored-by: Ricardo Gomes Rodrigues (rigr) <rigr@odoo.com>
91 lines
3.7 KiB
Python
91 lines
3.7 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from odoo.tests.common import TransactionCase, tagged
|
|
from odoo.exceptions import ValidationError
|
|
from unittest.mock import patch
|
|
|
|
import stdnum.eu.vat
|
|
|
|
|
|
class TestStructure(TransactionCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
def check_vies(vat_number):
|
|
return {'valid': vat_number == 'BE0477472701'}
|
|
|
|
super().setUpClass()
|
|
cls.env.user.company_id.vat_check_vies = False
|
|
cls._vies_check_func = check_vies
|
|
|
|
def test_peru_ruc_format(self):
|
|
"""Only values that has the length of 11 will be checked as RUC, that's what we are proving. The second part
|
|
will check for a valid ruc and there will be no problem at all.
|
|
"""
|
|
partner = self.env['res.partner'].create({'name': "Dummy partner", 'country_id': self.env.ref('base.pe').id})
|
|
|
|
with self.assertRaises(ValidationError):
|
|
partner.vat = '11111111111'
|
|
partner.vat = '20507822470'
|
|
|
|
def test_vat_country_difference(self):
|
|
"""Test the validation when country code is different from vat code"""
|
|
partner = self.env['res.partner'].create({
|
|
'name': "Test",
|
|
'country_id': self.env.ref('base.mx').id,
|
|
'vat': 'RORO790707I47',
|
|
})
|
|
self.assertEqual(partner.vat, 'RORO790707I47', "Partner VAT should not be altered")
|
|
|
|
def test_parent_validation(self):
|
|
"""Test the validation with company and contact"""
|
|
|
|
# set an invalid vat number
|
|
self.env.user.company_id.vat_check_vies = False
|
|
company = self.env["res.partner"].create({
|
|
"name": "World Company",
|
|
"country_id": self.env.ref("base.be").id,
|
|
"vat": "ATU12345675",
|
|
"company_type": "company",
|
|
})
|
|
|
|
# reactivate it and correct the vat number
|
|
with patch('odoo.addons.base_vat.models.res_partner.check_vies', type(self)._vies_check_func):
|
|
self.env.user.company_id.vat_check_vies = True
|
|
with self.assertRaises(ValidationError), self.env.cr.savepoint():
|
|
company.vat = "BE0987654321" # VIES refused, don't fallback on other check
|
|
company.vat = "BE0477472701"
|
|
|
|
def test_vat_syntactic_validation(self):
|
|
""" Tests VAT validation (both successes and failures), with the different country
|
|
detection cases possible.
|
|
"""
|
|
test_partner = self.env['res.partner'].create({'name': "John Dex"})
|
|
|
|
# VAT starting with country code: use the starting country code
|
|
test_partner.write({'vat': 'BE0477472701', 'country_id': self.env.ref('base.fr').id})
|
|
test_partner.write({'vat': 'BE0477472701', 'country_id': None})
|
|
|
|
with self.assertRaises(ValidationError):
|
|
test_partner.write({'vat': 'BE42', 'country_id': self.env.ref('base.fr').id})
|
|
|
|
with self.assertRaises(ValidationError):
|
|
test_partner.write({'vat': 'BE42', 'country_id': None})
|
|
|
|
# No country code in VAT: use the partner's country
|
|
test_partner.write({'vat': '0477472701', 'country_id': self.env.ref('base.be').id})
|
|
|
|
with self.assertRaises(ValidationError):
|
|
test_partner.write({'vat': '42', 'country_id': self.env.ref('base.be').id})
|
|
|
|
# If no country can be guessed: VAT number should always be considered valid
|
|
# (for technical reasons due to ORM and res.company making related fields towards res.partner for country_id and vat)
|
|
test_partner.write({'vat': '0477472701', 'country_id': None})
|
|
|
|
|
|
@tagged('-standard', 'external')
|
|
class TestStructureVIES(TestStructure):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.env.user.company_id.vat_check_vies = True
|
|
cls._vies_check_func = stdnum.eu.vat.check_vies
|