Files
suite/account_us_wa_salestax/models/wa_tax_request.py
2018-09-12 14:01:55 -07:00

75 lines
2.6 KiB
Python

from urllib.request import urlopen, quote
from urllib.error import HTTPError
from ssl import _create_unverified_context
from logging import getLogger
from odoo.exceptions import ValidationError
_logger = getLogger(__name__)
class WATaxRequest(object):
def __init__(self):
pass
def get_rate(self, partner):
# https://webgis.dor.wa.gov/webapi/addressrates.aspx/?output=text\&addr=test\&city=Marysville\&zip=98270
if not all((partner.street, partner.city, partner.zip)):
raise ValidationError('WATaxRequest impossible without Street, City and ZIP.')
url = 'https://webgis.dor.wa.gov/webapi/addressrates.aspx?output=text&addr=' + quote(partner.street) + \
'&city=' + quote(partner.city) + '&zip=' + quote(partner.zip)
_logger.info(url)
try:
response = urlopen(url, context=_create_unverified_context())
response_body = response.read()
_logger.info(response_body)
except HTTPError as e:
_logger.warn('Error on request: ' + str(e))
response_body = ''
return self._parse_rate(response_body)
def is_success(self, result):
'''
ADDRESS = 0,
LATLON = 0,
PLUS4 = 1,
ADDRESS_STANARDIZED = 2,
PLUS4_STANARDIZED = 3,
ADDRESS_CHANGED = 4,
ZIPCODE = 5,
ADDRESS_NOT_FOUND = 6,
LATLON_NOT_FOUND = 7,
POI = 8,
ERROR = 9
internal parse_error = 100
'''
if 'result_code' not in result or result['result_code'] >= 9 or result['result_code'] < 0:
return False
return True
def _parse_rate(self, response_body):
# 'LocationCode=1704 Rate=0.100 ResultCode=0'
# {
# 'result_code': 0,
# 'location_code': '1704',
# 'rate': '10.00',
# }
res = {'result_code': 100}
if len(response_body) > 200:
# this likely means that they returned an HTML page
return res
body_parts = response_body.decode().split(' ')
for part in body_parts:
if part.find('ResultCode=') >= 0:
res['result_code'] = int(part[len('ResultCode='):])
elif part.find('Rate=') >= 0:
res['rate'] = '%.2f' % (float(part[len('Rate='):]) * 100.0)
elif part.find('LocationCode=') >= 0:
res['location_code'] = part[len('LocationCode='):]
elif part.find('debughint=') >= 0:
res['debug_hint'] = part[len('debughint='):]
return res