From e67b22946d506f4784a1813404ebcb04d25c5e29 Mon Sep 17 00:00:00 2001 From: Cedric Snauwaert Date: Wed, 7 Nov 2018 09:47:44 +0000 Subject: [PATCH] [FIX] base_vat: belgian vat number correct display Odoo Accept the following mask for vat encoding : BE0477472701 BE.0.477.472.701 BE.477.472.701 BE477.472.701 BE477472701 But, in certain cases we have to add the zero to be compliance (i.e. belgian official reports...). -> http://www.tvaintracommunautaire.eu/belgique.html This commit make use of the compact method defined in stdnum.be.vat (which is used by vatnumber in order to validate the vat). The compact method return a 10 digits vat number starting with a 0 which is compliant with the official reports. closes odoo/odoo#28523 --- addons/base_vat/models/res_partner.py | 56 +++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/addons/base_vat/models/res_partner.py b/addons/base_vat/models/res_partner.py index 432f7f04c42..c5118cd476b 100644 --- a/addons/base_vat/models/res_partner.py +++ b/addons/base_vat/models/res_partner.py @@ -17,6 +17,40 @@ except ImportError: from odoo import api, models, _ from odoo.tools.misc import ustr from odoo.exceptions import ValidationError +from stdnum.at.uid import compact as compact_at +from stdnum.be.vat import compact as compact_be +from stdnum.bg.vat import compact as compact_bg +from stdnum.ch.vat import compact as compact_ch +from stdnum.cy.vat import compact as compact_cy +from stdnum.cz.dic import compact as compact_cz +from stdnum.de.vat import compact as compact_de +from stdnum.ee.kmkr import compact as compact_ee +# el not in stdnum +from stdnum.es.nif import compact as compact_es +from stdnum.fi.alv import compact as compact_fi +from stdnum.fr.tva import compact as compact_fr +from stdnum.gb.vat import compact as compact_gb +from stdnum.gr.vat import compact as compact_gr +from stdnum.hu.anum import compact as compact_hu +from stdnum.hr.oib import compact as compact_hr +from stdnum.ie.vat import compact as compact_ie +from stdnum.it.iva import compact as compact_it +from stdnum.lt.pvm import compact as compact_lt +from stdnum.lu.tva import compact as compact_lu +from stdnum.lv.pvn import compact as compact_lv +from stdnum.mt.vat import compact as compact_mt +from stdnum.mx.rfc import compact as compact_mx +from stdnum.nl.btw import compact as compact_nl +from stdnum.no.mva import compact as compact_no +# pe is not in stdnum +from stdnum.pl.nip import compact as compact_pl +from stdnum.pt.nif import compact as compact_pt +from stdnum.ro.cf import compact as compact_ro +from stdnum.se.vat import compact as compact_se +from stdnum.si.ddv import compact as compact_si +from stdnum.sk.dph import compact as compact_sk +# tr compact vat is not in stdnum + _eu_country_vat = { 'GR': 'EL' @@ -363,3 +397,25 @@ class ResPartner(models.Model): return stdnum.al.vat.is_valid(vat) except ImportError: return True + + def default_compact(self, vat): + return vat + + def _fix_vat_number(self, vat): + vat_country, vat_number = self._split_vat(vat) + check_func_name = 'compact_' + vat_country + check_func = globals().get(check_func_name) or getattr(self, 'default_compact') + vat_number = check_func(vat_number) + return vat_country.upper() + vat_number + + @api.model + def create(self, values): + if values.get('vat'): + values['vat'] = self._fix_vat_number(values['vat']) + return super(ResPartner, self).create(values) + + @api.multi + def write(self, values): + if values.get('vat'): + values['vat'] = self._fix_vat_number(values['vat']) + return super(ResPartner, self).write(values)