[FIX] base_vat_autocomplete: enable feature on res.company

Filling the VAT on the company form will now call VIES to try to fill the rest of the company address
This commit is contained in:
qdp-odoo
2018-04-19 10:59:24 +02:00
parent 4dce643126
commit 23bf2ba33a
@@ -20,8 +20,8 @@ except ImportError:
class ResPartner(models.Model):
_inherit = 'res.partner'
@api.onchange('vat')
def vies_vat_change(self):
@api.model
def _get_partner_vals(self, vat):
def _check_city(lines, country='BE'):
if country == 'GB':
ukzip = '[A-Z]{1,2}[0-9][0-9A-Z]?\s?[0-9][A-Z]{2}'
@@ -36,59 +36,93 @@ class ResPartner(models.Model):
return (result.group(1), result.group(2))
return False
def _set_address_field(partner, field, value):
partner[field] = value
non_set_address_fields.remove(field)
# Equivalent to stdnum_vat.check_vies(partner.vat).
# However, we want to add a custom timeout to the suds.client
# because by default, it's 120 seconds and this is to long.
try:
client = Client(stdnum_vat.vies_wsdl, timeout=5)
partner_vat = stdnum_vat.compact(vat)
result = client.service.checkVat(partner_vat[:2], partner_vat[2:])
except:
# Avoid blocking the client when the service is unreachable/unavailable
return False, {}
if not result['valid']:
return False, {}
partner_name = False
partner_address = {}
if result['name'] != '---':
partner_name = result['name']
#parse the address from VIES and fill the partner's data
if result['address'] == '---': return partner_name, {}
lines = [x for x in result['address'].split("\n") if x]
if len(lines) == 1:
lines = [x.strip() for x in lines[0].split(',') if x]
if len(lines) == 1:
lines = [x.strip() for x in lines[0].split(' ') if x]
partner_address['street'] = lines.pop(0)
#_set_address_field(partner, 'street', lines.pop(0))
if len(lines) > 0:
res = _check_city(lines, result['countryCode'])
if res:
partner_address['zip'] = res[0]
partner_address['city'] = res[1]
#_set_address_field(partner, 'zip', res[0])
#_set_address_field(partner, 'city', res[1])
if len(lines) > 0:
partner_address['street2'] = lines.pop(0)
#_set_address_field(partner, 'street2', lines.pop(0))
country = self.env['res.country'].search([('code', '=', result['countryCode'])], limit=1)
#_set_address_field(partner, 'country_id', country and country.id or False)
partner_address['country_id'] = country and country.id or False
return partner_name, partner_address
@api.onchange('vat')
def vies_vat_change(self):
if stdnum_vat is None:
return {}
for partner in self:
# If a field is non set in this algorithm
# wipe it anyway
non_set_address_fields = set(['street', 'street2', 'city', 'zip', 'state_id', 'country_id'])
if not partner.vat:
return {}
continue
# If a field is not set in the response, wipe it anyway
non_set_address_fields = set(['street', 'street2', 'city', 'zip', 'state_id', 'country_id'])
if len(partner.vat) > 5 and partner.vat[:2].lower() in stdnum_vat.country_codes:
# Equivalent to stdnum_vat.check_vies(partner.vat).
# However, we want to add a custom timeout to the suds.client
# because by default, it's 120 seconds and this is to long.
try:
client = Client(stdnum_vat.vies_wsdl, timeout=5)
partner_vat = stdnum_vat.compact(partner.vat)
result = client.service.checkVat(partner_vat[:2], partner_vat[2:])
except:
# Avoid blocking the client when the service is unreachable/unavailable
return {}
partner_name, partner_address = self._get_partner_vals(partner.vat)
if not result['valid']:
return {}
if (not partner.name) and (result['name'] != '---'):
partner.name = result['name']
#parse the address from VIES and fill the partner's data
if result['address'] == '---': return {}
lines = [x for x in result['address'].split("\n") if x]
if len(lines) == 1:
lines = [x.strip() for x in lines[0].split(',') if x]
if len(lines) == 1:
lines = [x.strip() for x in lines[0].split(' ') if x]
_set_address_field(partner, 'street', lines.pop(0))
if len(lines) > 0:
res = _check_city(lines, result['countryCode'])
if res:
_set_address_field(partner, 'zip', res[0])
_set_address_field(partner, 'city', res[1])
if len(lines) > 0:
_set_address_field(partner, 'street2', lines.pop(0))
country = self.env['res.country'].search([('code', '=', result['countryCode'])], limit=1)
_set_address_field(partner, 'country_id', country and country.id or False)
if not partner.name and partner_name:
partner.name = partner_name
#set the address fields
for field, value in partner_address.items():
partner[field] = value
non_set_address_fields.remove(field)
for field in non_set_address_fields:
if partner[field]:
partner[field] = False
class ResCompany(models.Model):
_inherit = 'res.company'
@api.onchange('vat')
def vies_vat_change(self):
self.ensure_one()
company_address_fields = set(['street', 'street2', 'city', 'zip', 'state_id', 'country_id'])
company_name, company_address = self.env['res.partner']._get_partner_vals(self.vat)
if not self.name and company_name:
self.name = company_name
#set the address fields
for field, value in company_address.items():
self[field] = value
company_address_fields.remove(field)
for field in company_address_fields:
if self[field]:
self[field] = False