diff --git a/stdnum/ie/pps.py b/stdnum/ie/pps.py index e64514cc..a52d8f30 100644 --- a/stdnum/ie/pps.py +++ b/stdnum/ie/pps.py @@ -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' @@ -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.""" @@ -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() diff --git a/tests/test_ie_pps.doctest b/tests/test_ie_pps.doctest new file mode 100644 index 00000000..6527a4fd --- /dev/null +++ b/tests/test_ie_pps.doctest @@ -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'