From 3960c5bd086876bb65622960c92bd8e9283ada46 Mon Sep 17 00:00:00 2001 From: Leandro Regueiro Date: Sun, 15 Jan 2023 15:47:18 +0100 Subject: [PATCH] Add support for Mauritius TIN Fixes #356 --- stdnum/mu/__init__.py | 4 ++ stdnum/mu/tan.py | 78 +++++++++++++++++++++++++++++++++++++++ tests/test_mu_tan.doctest | 57 ++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 stdnum/mu/tan.py create mode 100644 tests/test_mu_tan.doctest diff --git a/stdnum/mu/__init__.py b/stdnum/mu/__init__.py index 1fff1660..0490c520 100644 --- a/stdnum/mu/__init__.py +++ b/stdnum/mu/__init__.py @@ -2,6 +2,7 @@ # coding: utf-8 # # Copyright (C) 2018 Arthur de Jong +# Copyright (C) 2023 Leandro Regueiro # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -19,3 +20,6 @@ # 02110-1301 USA """Collection of Mauritian numbers.""" + +# provide aliases +from stdnum.mu import tan as vat # noqa: F401 diff --git a/stdnum/mu/tan.py b/stdnum/mu/tan.py new file mode 100644 index 00000000..98861648 --- /dev/null +++ b/stdnum/mu/tan.py @@ -0,0 +1,78 @@ +# tan.py - functions for handling Mauritius TAN numbers +# coding: utf-8 +# +# Copyright (C) 2023 Leandro Regueiro +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +"""TAN (Tax Account Number, Mauritius tax number). + +This number consists of 8 digits. For individuals the first digit is always 1, +5, 7 or 8. For entities the first digit is always 2 or 3. + +More information: + +* https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Mauritius-TIN.pdf + +>>> validate('20405553') +'20405553' +>>> validate('12345') +Traceback (most recent call last): + ... +InvalidLength: ... +>>> format('20405553') +'20405553' +""" # noqa: E501 + +from stdnum.exceptions import * +from stdnum.util import clean, isdigits + + +def compact(number): + """Convert the number to the minimal representation. + + This strips the number of any valid separators and removes surrounding + whitespace. + """ + return clean(number, ' -').strip() + + +def validate(number): + """Check if the number is a valid Mauritius TAN number. + + This checks the length and formatting. + """ + number = compact(number) + if len(number) != 8: + raise InvalidLength() + if not isdigits(number): + raise InvalidFormat() + if number[0] not in ('1', '2', '3', '5', '7', '8'): + raise InvalidComponent() + return number + + +def is_valid(number): + """Check if the number is a valid Mauritius TAN number.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def format(number): + """Reformat the number to the standard presentation format.""" + return compact(number) diff --git a/tests/test_mu_tan.doctest b/tests/test_mu_tan.doctest new file mode 100644 index 00000000..9dd266ff --- /dev/null +++ b/tests/test_mu_tan.doctest @@ -0,0 +1,57 @@ +test_mu_tan.doctest - more detailed doctests for stdnum.mu.tan module + +Copyright (C) 2023 Leandro Regueiro + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + +This file contains more detailed doctests for the stdnum.mu.tan module. It +tries to test more corner cases and detailed functionality that is not really +useful as module documentation. + +>>> from stdnum.mu import tan + + +Tests for some corner cases. + +>>> tan.validate('20405553') +'20405553' +>>> tan.validate('12345') +Traceback (most recent call last): + ... +InvalidLength: ... +>>> tan.validate('1234567V') +Traceback (most recent call last): + ... +InvalidFormat: ... +>>> tan.validate('42345678') +Traceback (most recent call last): + ... +InvalidComponent: ... +>>> tan.format('20405553') +'20405553' + + +These have been found online and should all be valid numbers. + +>>> numbers = ''' +... +... 20405553 +... 18421000 +... +... ''' +>>> [x for x in numbers.splitlines() if x and not tan.is_valid(x)] +[]