From a2830f96ff9d2f6281c8700a7714e8856a3d3ec9 Mon Sep 17 00:00:00 2001 From: Darren Tuit Date: Tue, 5 Dec 2017 13:35:26 +1300 Subject: [PATCH 1/4] nz ird numbers --- stdnum/nz/ird.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 stdnum/nz/ird.py diff --git a/stdnum/nz/ird.py b/stdnum/nz/ird.py new file mode 100644 index 00000000..f14ffaa1 --- /dev/null +++ b/stdnum/nz/ird.py @@ -0,0 +1,63 @@ +from stdnum.exceptions import * +from stdnum.util import clean +import string +import re + +""" +NZ IRD numbers + +https://www.ird.govt.nz/resources/d/8/d8e49dce-1bda-4875-8acf-9ebf908c6e17/rwt-nrwt-spec-2014.pdf + +""" + +def compact(number): + return re.sub('[^0-9]','', number) + +def checksum(number): + weights = [3, 2, 7, 6, 5, 4, 3, 2] + weights2 = [7, 4, 3, 2, 5, 2, 7, 6] + + def calc_cksum(weights, number): + r = sum( w *int(n) for w, n in zip(weights, number)) % 11 + if r == 0: + return 0 + else: + return 11 - r + + csum = calc_cksum(weights, number) + if csum < 10: + return csum + else: + csum = calc_cksum(weights2, number) + if csum < 10: + return csum + else: + raise InvalidChecksum() + +def validate(number): + num_str = compact(number) + if not 8 <= len(num_str) <= 9: + raise InvalidLength() + if 10**7 < int(num_str) < 15**7: + + if len(num_str) == 8: + num_str = '0' + num_str + try: + chk = checksum(num_str[0:-1]) + if chk == int(num_str[-1]): + return num_str + except InvalidChecksum: + raise + else: + raise InvalidLength() + +def is_valid(number): + try: + return bool(validate(number)) + except ValidationError: + return False + +if __name__ == "__main__": + irds = ['109 682 624','63 178 640', '63-563-803', '123456789'] + y = [is_valid(x) for x in irds] + print(y) \ No newline at end of file From a20a93a1093b0c8eb5405695581caabc3b8c0764 Mon Sep 17 00:00:00 2001 From: Darren Tuit Date: Tue, 5 Dec 2017 14:24:56 +1300 Subject: [PATCH 2/4] Update __init__.py --- stdnum/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdnum/__init__.py b/stdnum/__init__.py index cbca9252..582c2f95 100644 --- a/stdnum/__init__.py +++ b/stdnum/__init__.py @@ -178,4 +178,4 @@ # the version number of the library -__version__ = '1.7' +__version__ = '1.8' From ed5506a0e7b2706debf3151bb2daf8928479e1b1 Mon Sep 17 00:00:00 2001 From: Darren Tuit Date: Tue, 5 Dec 2017 15:07:13 +1300 Subject: [PATCH 3/4] init.py --- stdnum/nz/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 stdnum/nz/__init__.py diff --git a/stdnum/nz/__init__.py b/stdnum/nz/__init__.py new file mode 100644 index 00000000..538d0289 --- /dev/null +++ b/stdnum/nz/__init__.py @@ -0,0 +1 @@ +from stdnum.nz import ird \ No newline at end of file From 9da837f35b9d6e209ba6877a5cae484a9bd9a955 Mon Sep 17 00:00:00 2001 From: Darren Tuit Date: Mon, 19 Feb 2018 11:36:43 +1300 Subject: [PATCH 4/4] correct range --- stdnum/nz/ird.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdnum/nz/ird.py b/stdnum/nz/ird.py index f14ffaa1..60740d51 100644 --- a/stdnum/nz/ird.py +++ b/stdnum/nz/ird.py @@ -38,7 +38,7 @@ def validate(number): num_str = compact(number) if not 8 <= len(num_str) <= 9: raise InvalidLength() - if 10**7 < int(num_str) < 15**7: + if 10**7 < int(num_str) < 15*10**7: if len(num_str) == 8: num_str = '0' + num_str @@ -58,6 +58,6 @@ def is_valid(number): return False if __name__ == "__main__": - irds = ['109 682 624','63 178 640', '63-563-803', '123456789'] + irds = ['109 682 624','63 178 640', '63-563-803', '123456789', '24-882-403'] y = [is_valid(x) for x in irds] print(y) \ No newline at end of file