43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo import api, models, _
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class AccountFiscalPosition(models.Model):
|
|
_inherit = 'account.fiscal.position'
|
|
|
|
@api.constrains('country_id', 'foreign_vat')
|
|
def _validate_foreign_vat(self):
|
|
for record in self:
|
|
if not record.foreign_vat:
|
|
continue
|
|
|
|
checked_country_code = self.env['res.partner']._run_vat_test(record.foreign_vat, record.country_id)
|
|
|
|
if checked_country_code and checked_country_code != record.country_id.code.lower():
|
|
raise ValidationError(_("The country detected for this foreign VAT number does not match the one set on this fiscal position."))
|
|
|
|
if not checked_country_code:
|
|
fp_label = _("fiscal position [%s]", record.name)
|
|
error_message = self.env['res.partner']._build_vat_error_message(record.country_id.code.lower(), record.foreign_vat, fp_label)
|
|
raise ValidationError(error_message)
|
|
|
|
def _get_vat_valid(self, delivery, company=None):
|
|
eu_countries = self.env.ref('base.europe').country_ids
|
|
|
|
# If VIES validation does not apply to this partner (e.g. they
|
|
# are in the same country as the partner), then skip.
|
|
if not (company and delivery.with_company(company).perform_vies_validation):
|
|
return super()._get_vat_valid(delivery, company)
|
|
|
|
# If the company has a fiscal position with a foreign vat in Europe, in the same country as the partner, then the VIES validity applies
|
|
if self.search_count([
|
|
*self._check_company_domain(company),
|
|
('foreign_vat', '!=', False),
|
|
('country_id', '=', delivery.country_id.id),
|
|
]) or company.country_id in eu_countries:
|
|
return super()._get_vat_valid(delivery, company) and delivery.vies_valid
|
|
|
|
return super()._get_vat_valid(delivery, company)
|