1- import ast
21import json
32from typing import Any , Dict
43
1312
1413
1514def process_record (event_record : Dict [str , Any ]) -> Dict [str , Any ]:
16- logger .info ("process_record. Processing record: %s" , event_record )
15+ logger .info ("Processing record with SQS messageId : %s" , event_record . get ( "messageId" ) )
1716 body_text = event_record .get ("body" , "" )
1817
19- # convert body to json (try JSON first, then fall back to Python literal)
20- if isinstance (body_text , str ):
21- try :
22- body = json .loads (body_text )
23- except json .JSONDecodeError :
24- try :
25- body = ast .literal_eval (body_text )
26- except (ValueError , SyntaxError ):
27- logger .error ("Failed to parse body: %s" , body_text )
28- return {"status" : "error" , "message" : "Invalid body format" }
29- else :
30- body = body_text
18+ try :
19+ body = json .loads (body_text )
20+ except json .JSONDecodeError :
21+ logger .error ("Failed to parse body: %s" , body_text )
22+ return {"status" : "error" , "message" : "Invalid body format" }
3123
3224 nhs_number = body .get ("subject" )
33- logger .info ("process record NHS number: %s" , nhs_number )
34- if nhs_number :
35- return process_nhs_number (nhs_number )
25+ logger .info ("Processing MNS event with id: %s" , body .get ("id" ))
26+
27+ if not nhs_number :
28+ logger .info ("No NHS number found in event record" )
29+ return {"status" : "error" , "message" : "No NHS number found in event record" }
3630
37- logger .info ("No NHS number found in event record" )
38- return {"status" : "error" , "message" : "No NHS number found in event record" }
31+ return process_nhs_number (nhs_number )
3932
4033
4134def process_nhs_number (nhs_number : str ) -> Dict [str , Any ]:
42- # get patient details from PDS
4335 new_nhs_number = pds_get_patient_id (nhs_number )
4436
4537 if not new_nhs_number :
46- return make_status ("No patient ID found for NHS number" , nhs_number )
38+ return make_status ("No patient ID found for NHS number" )
4739
4840 if new_nhs_number == nhs_number :
49- return make_status ("No update required" , nhs_number )
41+ return make_status ("No update required" )
5042
51- logger .info ("Update patient ID from %s to %s" , nhs_number , new_nhs_number )
43+ logger .info ("NHS Number has changed. Performing updates on relevant IEDS records" )
5244
5345 try :
5446 # Fetch PDS Patient resource and IEDS resources for the old NHS number
5547 pds_patient_resource , ieds_resources = fetch_pds_and_ieds_resources (nhs_number )
5648 except Exception as e :
5749 logger .exception ("process_nhs_number: failed to fetch demographic details: %s" , e )
58- return make_status (str (e ), nhs_number , "error" )
50+ return make_status (str (e ), status = "error" )
5951
6052 logger .info (
6153 "Fetched IEDS resources. IEDS count: %d" ,
6254 len (ieds_resources ) if ieds_resources else 0 ,
6355 )
6456
6557 if not ieds_resources :
66- logger .info ("No IEDS records returned for NHS number: %s" , nhs_number )
67- return make_status (f "No records returned for ID: { nhs_number } " , nhs_number )
58+ logger .info ("No IEDS records returned for NHS number" )
59+ return make_status ("No records returned for NHS Number" )
6860
6961 # Compare demographics from PDS to each IEDS item, keep only matching records
7062 matching_records = []
7163 discarded_count = 0
7264 for detail in ieds_resources :
73- logger .info ("Processing IEDS record: %s" , detail )
7465 if demographics_match (pds_patient_resource , detail ):
7566 matching_records .append (detail )
7667 else :
7768 discarded_count += 1
7869
7970 if not matching_records :
8071 logger .info ("No records matched PDS demographics: %d" , discarded_count )
81- return make_status ("No records matched PDS demographics; update skipped" , nhs_number )
72+ return make_status ("No records matched PDS demographics; update skipped" )
8273
8374 response = ieds_update_patient_id (nhs_number , new_nhs_number , items_to_update = matching_records )
84- response ["nhs_number" ] = nhs_number
8575 # add counts for observability
8676 response ["matched" ] = len (matching_records )
8777 response ["discarded" ] = discarded_count
@@ -90,23 +80,16 @@ def process_nhs_number(nhs_number: str) -> Dict[str, Any]:
9080
9181# Function to fetch PDS Patient details and IEDS Immunisation records.
9282def fetch_pds_and_ieds_resources (nhs_number : str ):
93- logger .info ("fetch_pds_and_ieds_resources: fetching for %s" , nhs_number )
9483 try :
9584 pds = pds_get_patient_details (nhs_number )
9685 except Exception as e :
97- logger .exception (
98- "fetch_pds_and_ieds_resources: failed to fetch PDS details for %s" ,
99- nhs_number ,
100- )
86+ logger .exception ("fetch_pds_and_ieds_resources: failed to fetch PDS details" )
10187 raise RuntimeError ("Failed to fetch PDS details" ) from e
10288
10389 try :
10490 ieds = get_items_from_patient_id (nhs_number )
10591 except Exception as e :
106- logger .exception (
107- "fetch_pds_and_ieds_resources: failed to fetch IEDS items for %s" ,
108- nhs_number ,
109- )
92+ logger .exception ("fetch_pds_and_ieds_resources: failed to fetch IEDS items" )
11093 raise RuntimeError ("Failed to fetch IEDS items" ) from e
11194
11295 return pds , ieds
@@ -147,13 +130,7 @@ def normalize_strings(item: Any) -> str | None:
147130 # Retrieve patient resource from PDS
148131 pds_name = normalize_strings (extract_normalized_name_from_patient (pds_details ))
149132 pds_gender = normalize_strings (pds_details .get ("gender" ))
150- pds_birth = normalize_strings (pds_details .get ("birthDate" ))
151- logger .debug (
152- "demographics_match: demographics match for name=%s, gender=%s, birthDate=%s" ,
153- pds_name ,
154- pds_gender ,
155- pds_birth ,
156- )
133+ pds_dob = normalize_strings (pds_details .get ("birthDate" ))
157134
158135 # Retrieve patient resource from IEDS item
159136 patient = extract_patient_resource_from_item (ieds_item )
@@ -164,24 +141,24 @@ def normalize_strings(item: Any) -> str | None:
164141 # normalize patient fields from IEDS
165142 ieds_name = normalize_strings (extract_normalized_name_from_patient (patient ))
166143 ieds_gender = normalize_strings (patient .get ("gender" ))
167- ieds_birth = normalize_strings (patient .get ("birthDate" ))
144+ ieds_dob = normalize_strings (patient .get ("birthDate" ))
168145
169146 # All required fields must be present
170- if not all ([pds_name , pds_gender , pds_birth , ieds_name , ieds_gender , ieds_birth ]):
147+ if not all ([pds_name , pds_gender , pds_dob , ieds_name , ieds_gender , ieds_dob ]):
171148 logger .debug ("demographics_match: missing required demographics" )
172149 return False
173150
174151 # Compare fields
175- if pds_birth != ieds_birth :
176- logger .debug ("demographics_match: birthDate mismatch %s != %s" , pds_birth , ieds_birth )
152+ if pds_dob != ieds_dob :
153+ logger .debug ("demographics_match: birthDate mismatch between the patient resources" )
177154 return False
178155
179156 if pds_gender != ieds_gender :
180- logger .debug ("demographics_match: gender mismatch %s != %s" , pds_gender , ieds_gender )
157+ logger .debug ("demographics_match: gender mismatch between the patient resources" )
181158 return False
182159
183160 if pds_name != ieds_name :
184- logger .debug ("demographics_match: name mismatch %s != %s" , pds_name , ieds_name )
161+ logger .debug ("demographics_match: name mismatch between the patient resources" )
185162 return False
186163
187164 return True
0 commit comments