103 lines
4.3 KiB
Python
103 lines
4.3 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})
|
||
|
|
||
|
def test_vat_eu(self):
|
||
|
""" Foreign companies that trade with non-enterprises in the EU may have a VATIN starting with "EU" instead of
|
||
|
a country code.
|
||
|
"""
|
||
|
test_partner = self.env['res.partner'].create({'name': "Turlututu", 'country_id': self.env.ref('base.fr').id})
|
||
|
test_partner.write({'vat': "EU528003646", 'country_id': None})
|
||
|
|
||
|
test_partner.write({'vat': "EU528003646", 'country_id': self.env.ref('base.ca').id})
|
||
|
|
||
|
with self.assertRaises(ValidationError):
|
||
|
test_partner.write({'vat': 'EU528003646', 'country_id': self.env.ref('base.be').id})
|
||
|
|
||
|
|
||
|
@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
|