Skip to content

Updating Irish PPS validator #441

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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) 2016 Arthur de Jong

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.vat 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'
Loading