Skip to content

Commit

Permalink
Update Irish PPS validator to support new numbers
Browse files Browse the repository at this point in the history
  • Loading branch information
Ollymid authored and arthurdejong committed Jun 23, 2024
1 parent fb4d792 commit 58ecb03
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 4 deletions.
11 changes: 7 additions & 4 deletions stdnum/ie/pps.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,11 @@
When present (which should be the case for new numbers as of 2013),
the second letter can be 'A' (for individuals) or 'H' (for
non-individuals, such as limited companies, trusts, partnerships
and unincorporated bodies). Pre-2013 values may have 'W', 'T',
or 'X' as the second letter ; it is ignored by the check.
and unincorporated bodies). As of 2024, B was accepted as a second
letter on all new PPS numbers.
Pre-2013 values may have 'W', 'T', or 'X' as the second letter ;
it is ignored by the check.
>>> validate('6433435F') # pre-2013
'6433435F'
Expand Down Expand Up @@ -55,7 +58,7 @@
from stdnum.util import clean


pps_re = re.compile(r'^\d{7}[A-W][AHWTX]?$')
pps_re = re.compile(r'^\d{7}[A-W][ABHWTX]?$')
"""Regular expression used to check syntax of PPS numbers."""


Expand All @@ -71,7 +74,7 @@ def validate(number):
number = compact(number)
if not pps_re.match(number):
raise InvalidFormat()
if len(number) == 9 and number[8] in 'AH':
if len(number) == 9 and number[8] in 'ABH':
# new 2013 format
if number[7] != vat.calc_check_digit(number[:7] + number[8:]):
raise InvalidChecksum()
Expand Down
59 changes: 59 additions & 0 deletions tests/test_ie_pps.doctest
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
test_ie_pps.doctest - more detailed doctests for stdnum.ie.pps module

Copyright (C) 2024 Olly Middleton

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.ie.pps module. It
tries to cover more corner cases and detailed functionality that is not
really useful as module documentation.

>>> from stdnum.ie import pps


Extra tests for length checking and corner cases:

>>> pps.validate('111222333') # check number should contain letters
Traceback (most recent call last):
...
InvalidFormat: ...
>>> pps.validate('1234567ABC') # too long
Traceback (most recent call last):
...
InvalidFormat: ...
>>> pps.validate('1234567XX') # invalid letters
Traceback (most recent call last):
...
InvalidFormat: ...


The validate() function should check with new format if last letter is A, B or H.

>>> pps.validate('1234567FA')
'1234567FA'
>>> pps.validate('1234567WH')
'1234567WH'
>>> pps.validate('1234567OB')
'1234567OB'


The validate() function should check with old format if last letter is W or T.

>>> pps.validate('1234567TW')
'1234567TW'
>>> pps.validate('1234567TT')
'1234567TT'

0 comments on commit 58ecb03

Please sign in to comment.