Skip to content

Commit a5b4752

Browse files
Updating NHS Number tools to perform checks on the generated NHS Number
1 parent 6fd0b0c commit a5b4752

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

utils/nhs_number_tools.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,34 @@ def generate_random_nhs_number() -> str:
6363
nhs_number_base + random.Random().randint(0, nhs_number_range - 1)
6464
)
6565
if NHSNumberTools.is_valid_nhs_number(nhs_number):
66-
break
67-
nhs_number += str(NHSNumberTools.calculate_nhs_number_checksum(nhs_number))
68-
logging.debug("generateRandomNHSNumber: end")
69-
return nhs_number
66+
nhs_number_full = nhs_number + str(
67+
NHSNumberTools.calculate_nhs_number_checksum(nhs_number)
68+
)
69+
# Final check for the full 10-digit number
70+
if NHSNumberTools.is_valid_nhs_number(nhs_number_full):
71+
logging.debug("generateRandomNHSNumber: end")
72+
return nhs_number_full
73+
# If invalid, continue loop to generate a new one
7074

7175
@staticmethod
7276
def is_valid_nhs_number(nhs_number: str) -> bool:
7377
"""
74-
Checks if the NHS number is valid
78+
Checks if the NHS number is valid.
7579
Returns:
76-
bool: True if it is valid, False if it is not
80+
bool: True if it is valid, False if it is not.
7781
"""
78-
return len(nhs_number) == 9 and nhs_number.isdigit()
82+
if len(nhs_number) == 9 and nhs_number.isdigit():
83+
return True # For base generation
84+
if len(nhs_number) == 10 and nhs_number.isdigit():
85+
# Validate checksum for full NHS number
86+
digits = [int(d) for d in nhs_number]
87+
total = sum((10 - i) * digits[i] for i in range(9))
88+
remainder = total % 11
89+
checksum = 11 - remainder
90+
if checksum == 11:
91+
checksum = 0
92+
return digits[9] == checksum
93+
return False
7994

8095
@staticmethod
8196
def calculate_nhs_number_checksum(nhs_number: str) -> int:

0 commit comments

Comments
 (0)