@@ -53,30 +53,68 @@ function randomNHSNumberInRange(start, end) {
5353 return start + rand ;
5454}
5555
56- function generateValidNHSNumber ( first9 ) {
57- const first9Str = String ( first9 ) . padStart ( 9 , "0" ) ;
58-
59- if ( first9Str . match ( / ^ \d { 9 } $ / ) ) {
60- throw new Error (
61- "bad NHS number generated - expected 9 digits" ,
62- first9Str ,
63- first9
56+ function generateValidNHSNumber ( start , end ) {
57+ let nhsNumber = undefined ;
58+
59+ while ( ! nhsNumber ) {
60+ const seedNumber = randomNHSNumberInRange ( start , end ) ;
61+ const first9Str = String ( seedNumber ) . padStart ( 9 , "0" ) . substring ( 0 , 8 ) ;
62+
63+ console . log (
64+ `Generating NHS number from seed: ${ seedNumber } , first 9 digits: ${ first9Str } `
6465 ) ;
66+
67+ if ( first9Str . match ( / ^ \d { 9 } $ / ) ) {
68+ throw new Error (
69+ `bad NHS number generated - expected 9 digits: ${ first9Str } , ${ seedNumber } `
70+ ) ;
71+ }
72+
73+ //parts_list = [
74+ // int(digit) * (10 - index)
75+ // for index, digit in enumerate(identifier_digits)
76+ //]
77+ //list_sum = sum(parts_list)
78+ //checksum = 11 - (list_sum % 11)
79+ //if checksum == 11:
80+ // checksum = 0
81+ //return checksum
82+
83+ const parts = [ ] ;
84+ const digits = first9Str . split ( "" ) ;
85+ for ( let i = 0 ; i < digits . length ; i ++ ) {
86+ parts . push ( parseInt ( digits [ i ] , 10 ) * ( 10 - i ) ) ;
87+ }
88+
89+ const list_sum = parts . reduce ( ( a , b ) => a + b , 0 ) ;
90+ let checksum = 11 - ( list_sum % 11 ) ;
91+ if ( checksum === 11 ) {
92+ checksum = 0 ;
93+ }
94+
95+ console . log (
96+ `Generated NHS number parts: ${ parts } , sum: ${ list_sum } , checksum: ${ checksum } `
97+ ) ;
98+
99+ if ( checksum === 10 ) {
100+ // Checksum of 10 means NHS number is invalid
101+ continue ;
102+ }
103+
104+ nhsNumber = `${ first9Str } ${ checksum } ` ;
105+ console . log ( `Generated NHS number: ${ nhsNumber } ` ) ;
65106 }
66107
67- // NHS numbers not validated, checksum doesn't need to be legit
68- return `${ first9Str } ${ "1" } ` ;
108+ return nhsNumber ;
69109}
70110
71111function pickNHSNumber ( ) {
72112 if ( Math . random ( ) < ReuseNHSNumbersRatio ) {
73113 // Reuse: pick within [NHSNumberStart, NHSNumberEnd]
74- const first9 = randomNHSNumberInRange ( NHSNumberStart , NHSNumberEnd ) ;
75- return generateValidNHSNumber ( first9 ) ;
114+ return generateValidNHSNumber ( NHSNumberStart , NHSNumberEnd ) ;
76115 } else {
77116 // New: always pick from [NHSNumberEnd + 1, NHS_NUMBER_MAX]
78- const first9 = randomNHSNumberInRange ( NHSNumberEnd + 1 , NHS_NUMBER_MAX ) ;
79- return generateValidNHSNumber ( first9 ) ;
117+ return generateValidNHSNumber ( NHSNumberEnd + 1 , NHS_NUMBER_MAX ) ;
80118 }
81119}
82120
0 commit comments