@@ -39,6 +39,7 @@ def __init__(self, dataParser, summarise, report_unexpected_exception):
3939 self .dataLookUp = LookUpData () # used for generic look up
4040 self .summarise = summarise # instance attribute
4141 self .report_unexpected_exception = report_unexpected_exception # instance attribute
42+ self .errorRecords = [] # Store all errors here
4243
4344 # Main entry point called by converter.py
4445 def convertData (self , expressionType , expressionRule , fieldName , fieldValue ):
@@ -55,6 +56,10 @@ def convertData(self, expressionType, expressionRule, fieldName, fieldValue):
5556 return self ._convertToNotEmpty (
5657 expressionRule , fieldName , fieldValue , self .summarise , self .report_unexpected_exception
5758 )
59+ case "DOSESEQUENCE" :
60+ return self ._convertToDose (
61+ expressionRule , fieldName , fieldValue , self .summarise , self .report_unexpected_exception
62+ )
5863 case "GENDER" :
5964 return self ._convertToGender (
6065 expressionRule , fieldName , fieldValue , self .summarise , self .report_unexpected_exception
@@ -88,18 +93,10 @@ def _convertToDate(self, expressionRule, fieldName, fieldValue, summarise, repor
8893 return ""
8994
9095 if not isinstance (fieldValue , str ):
91- raise RecordError (
92- ExceptionMessages .RECORD_CHECK_FAILED ,
93- f"{ fieldName } rejected: not a string." ,
94- f"Received: { type (fieldValue )} " ,
95- )
96+ return ""
9697 # Reject partial dates like "2024" or "2024-05"
9798 if re .match (r"^\d{4}(-\d{2})?$" , fieldValue ):
98- raise RecordError (
99- ExceptionMessages .RECORD_CHECK_FAILED ,
100- f"{ fieldName } rejected: partial date not accepted." ,
101- f"Invalid partial date: { fieldValue } " ,
102- )
99+ return ""
103100 try :
104101 dt = datetime .fromisoformat (fieldValue )
105102 format_str = expressionRule .replace ("format:" , "" )
@@ -161,30 +158,56 @@ def _convertToNotEmpty(self, expressionRule, fieldName, fieldValue, summarise, r
161158
162159 # NHSNumber Validate
163160 def _convertToNHSNumber (self , expressionRule , fieldName , fieldValue , summarise , report_unexpected_exception ):
161+ """
162+ Validates that the NHS Number is exactly 10 digits.
163+ """
164+ # If it is outright empty, return back an empty string
165+ if not fieldValue :
166+ return ""
167+
164168 try :
165- regexRule = "^6[0-9]{10}$"
166- result = re .search (regexRule , fieldValue )
167- if not result :
168- raise RecordError (
169- ExceptionMessages .RECORD_CHECK_FAILED ,
170- "NHS Number check failed" ,
171- "NHS Number does not meet regex rules, data- " + fieldValue ,
172- )
169+ regexRule = r"^\d{10}$"
170+ if isinstance (fieldValue , str ) and re .fullmatch (regexRule , fieldValue ):
171+ return fieldValue
172+ raise ValueError (f"NHS Number must be exactly 10 digits: { fieldValue } " )
173173 except Exception as e :
174174 if report_unexpected_exception :
175175 message = ExceptionMessages .MESSAGES [ExceptionMessages .UNEXPECTED_EXCEPTION ] % (e .__class__ .__name__ , e )
176- return message
176+ self .errorRecords .append ({
177+ "field" : fieldName ,
178+ "value" : fieldValue ,
179+ "message" : message
180+ })
181+ return ""
177182
178183 # Gender Validate
179184 def _convertToGender (self , expressionRule , fieldName , fieldValue , summarise , report_unexpected_exception ):
185+ """
186+ Converts gender string to numeric representation.
187+ Mapping:
188+ - "male" → "1"
189+ - "female" → "2"
190+ - "other" → "9"
191+ - "unknown" → "0"
192+ """
180193 try :
181- genderlist = {"male" : "1" , "female" : "2" , "other" : "9" , "unknown" : "0" }
182- genderNumber = genderlist [fieldValue ]
183- return genderNumber
194+ gender_map = {
195+ "male" : "1" ,
196+ "female" : "2" ,
197+ "other" : "9" ,
198+ "unknown" : "0"
199+ }
200+
201+ # Normalize input
202+ normalized_gender = str (fieldValue ).lower ()
203+
204+ if normalized_gender not in gender_map :
205+ return ""
206+ return gender_map [normalized_gender ]
207+
184208 except Exception as e :
185209 if report_unexpected_exception :
186- message = ExceptionMessages .MESSAGES [ExceptionMessages .UNEXPECTED_EXCEPTION ] % (e .__class__ .__name__ , e )
187- return message
210+ return f"Unexpected exception [{ e .__class__ .__name__ } ]: { str (e )} "
188211
189212 # Code for converting Action Flag
190213 def _convertToChangeTo (self , expressionRule , fieldName , fieldValue , summarise , report_unexpected_exception ):
@@ -194,6 +217,11 @@ def _convertToChangeTo(self, expressionRule, fieldName, fieldValue, summarise, r
194217 if report_unexpected_exception :
195218 message = ExceptionMessages .MESSAGES [ExceptionMessages .UNEXPECTED_EXCEPTION ] % (e .__class__ .__name__ , e )
196219 return message
220+ # Code for converting Dose Sequence
221+ def _convertToDose (self , expressionRule , fieldName , fieldValue , summarise , report_unexpected_exception ):
222+ if isinstance (fieldValue , (int , float )) and 1 <= fieldValue <= 9 :
223+ return fieldValue
224+ return ""
197225
198226 # Change to Lookup
199227 def _convertToLookUp (self , expressionRule , fieldName , fieldValue , summarise , report_unexpected_exception ):
0 commit comments