@@ -114,25 +114,37 @@ def _convertToDate(self, expressionRule, fieldName, fieldValue, summarise, repor
114114 if report_unexpected_exception :
115115 self ._log_error (fieldName , fieldValue , "Value is not a string" )
116116 return ""
117-
118- # Reject partial dates like "2024" or "2024-05"
119- if re .match (r"^\d{4}(-\d{2})?$" , fieldValue ):
117+
118+ # Normalize expression rule
119+ format_str = expressionRule .replace ("format:" , "" ).strip ()
120+
121+ # Reject partial ISO dates like "2024" or "2024-05"
122+ if format_str == "%Y%m%d" and re .match (r"^\d{4}(-\d{2})?$" , fieldValue ):
120123 if report_unexpected_exception :
121124 self ._log_error (fieldName , fieldValue , "Partial date not accepted" )
122125 return ""
123126
124- try :
125- dt = datetime . fromisoformat ( fieldValue )
126-
127- # Reject future dates if the field is BirthDate
128- if fieldName == "contained|#:Patient|birthDate" and dt . date () > datetime . now ( timezone . utc ). date ( ):
127+ # Pre-process if expecting no delimiters
128+ if format_str == "%Y%m%d" :
129+ fieldValue = fieldValue . replace ( "-" , "" ). replace ( "/" , "" )
130+ # Validate expected raw input format if using %Y%m%d
131+ if not re . match ( r"^\d{8}$" , fieldValue ):
129132 if report_unexpected_exception :
130- self ._log_error (fieldName , fieldValue , "BirthDate cannot be in the future " )
133+ self ._log_error (fieldName , fieldValue , "Date must be in YYYYMMDD format " )
131134 return ""
132135
133- format_str = expressionRule .replace ("format:" , "" )
134- return dt .strftime (format_str )
135136
137+ try :
138+ dt = datetime .strptime (fieldValue , format_str )
139+
140+ # Reject future dates if the field is BirthDate
141+ if fieldName in ["contained|#:Patient|birthDate" , "recorded" ]:
142+ if dt .date () > datetime .now (timezone .utc ).date ():
143+ if report_unexpected_exception :
144+ self ._log_error (fieldName , fieldValue , "Date cannot be in the future" )
145+ return ""
146+
147+ return dt .strftime (expressionRule )
136148 except ValueError as e :
137149 if report_unexpected_exception :
138150 self ._log_error (fieldName , fieldValue , e )
0 commit comments