@@ -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