Skip to content

Commit f637a93

Browse files
committed
VED-755: refactor process_nhs_number
1 parent 876485f commit f637a93

File tree

3 files changed

+50
-56
lines changed

3 files changed

+50
-56
lines changed

lambdas/id_sync/src/ieds_db_operations.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ def extract_patient_resource_from_item(item: dict) -> dict | None:
151151
if not isinstance(patient_resource, dict):
152152
return None
153153

154-
# Otherwise, check contained
155154
for response in patient_resource.get("contained", []):
156155
if isinstance(response, dict) and response.get("resourceType") == "Patient":
157156
return response

lambdas/id_sync/src/record_processor.py

Lines changed: 32 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -57,55 +57,46 @@ def process_nhs_number(nhs_number: str) -> Dict[str, Any]:
5757
}
5858
logger.info("Update patient ID from %s to %s", nhs_number, new_nhs_number)
5959

60-
if ieds_check_exist(nhs_number):
61-
# Fetch PDS details for demographic comparison
62-
try:
63-
pds_details = pds_get_patient_details(nhs_number)
64-
except Exception:
65-
logger.exception("process_nhs_number: failed to fetch PDS details, aborting update")
66-
return {
67-
"status": "error",
68-
"message": "Failed to fetch PDS details for demographic comparison",
69-
"nhs_number": nhs_number,
70-
}
71-
72-
# Get IEDS items for this patient id and compare demographics
73-
try:
74-
items = get_items_from_patient_id(nhs_number)
75-
except Exception:
76-
logger.exception("process_nhs_number: failed to fetch IEDS items, aborting update")
77-
return {
60+
if not ieds_check_exist(nhs_number):
61+
logger.info("No IEDS record found for: %s", nhs_number)
62+
response = {"status": "success", "message": f"No records returned for ID: {nhs_number}"}
63+
return response
64+
try:
65+
pds_details, ieds_details = fetch_demographic_details(nhs_number)
66+
except Exception as e:
67+
logger.exception("process_nhs_number: %s, aborting update", e)
68+
return {
7869
"status": "error",
79-
"message": "Failed to fetch IEDS items for demographic comparison",
70+
"message": str(e),
8071
"nhs_number": nhs_number,
81-
}
72+
}
8273

83-
# If at least one IEDS item matches demographics, proceed with update
84-
match_found = False
85-
for item in items:
86-
try:
87-
if demographics_match(pds_details, item):
88-
match_found = True
89-
break
90-
except Exception:
91-
logger.exception("process_nhs_number: error while comparing demographics for item: %s", item)
92-
93-
if not match_found:
94-
logger.info("process_nhs_number: No IEDS items matched PDS demographics. Skipping update for %s", nhs_number)
95-
response = {
96-
"status": "success",
97-
"message": "No IEDS items matched PDS demographics; update skipped",
98-
}
99-
else:
100-
response = ieds_update_patient_id(nhs_number, new_nhs_number)
101-
else:
102-
logger.info("No IEDS record found for: %s", nhs_number)
103-
response = {"status": "success", "message": f"No records returned for ID: {nhs_number}"}
74+
# If at least one IEDS item matches demographics, proceed with update
75+
if not all(demographics_match(pds_details, detail) for detail in ieds_details):
76+
logger.info("Not all IEDS items matched PDS demographics; skipping update for %s", nhs_number)
77+
return {
78+
"status": "success",
79+
"message": "Not all IEDS items matched PDS demographics; update skipped",
80+
"nhs_number": nhs_number,
81+
}
10482

83+
response = ieds_update_patient_id(nhs_number, new_nhs_number)
10584
response["nhs_number"] = nhs_number
10685
return response
10786

10887

88+
def fetch_demographic_details(nhs_number: str):
89+
try:
90+
pds = pds_get_patient_details(nhs_number)
91+
except Exception as e:
92+
raise RuntimeError("Failed to fetch PDS details") from e
93+
try:
94+
ieds = get_items_from_patient_id(nhs_number)
95+
except Exception as e:
96+
raise RuntimeError("Failed to fetch IEDS items") from e
97+
return pds, ieds
98+
99+
109100
def extract_normalized_name_from_patient(patient: dict) -> str | None:
110101
"""Return a normalized 'given family' name string from a Patient resource or None."""
111102
if not patient:

lambdas/id_sync/tests/test_record_processor.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def test_process_record_demographics_mismatch_skips_update(self):
129129

130130
# Assert
131131
self.assertEqual(result["status"], "success")
132-
self.assertIn("update skipped", result["message"])
132+
self.assertEqual(result["message"], "Not all IEDS items matched PDS demographics; update skipped")
133133

134134
def test_invalid_body_parsing_returns_error(self):
135135
"""When body is a malformed string, process_record should return an error"""
@@ -182,8 +182,8 @@ def test_update_called_on_match(self):
182182
self.mock_pds_get_patient_details.return_value = {
183183
"name": [
184184
{
185-
"given": ["Tom"],
186-
"family": "Hanks"}
185+
"given": ["Sarah"],
186+
"family": "Fowley"}
187187
],
188188
"gender": "male",
189189
"birthDate": "1956-07-09"
@@ -194,7 +194,7 @@ def test_update_called_on_match(self):
194194
"contained": [{
195195
"resourceType": "Patient",
196196
"id": "PatM",
197-
"name": [{"given": ["Tom"], "family": "Hanks"}],
197+
"name": [{"given": ["Sarah"], "family": "Fowley"}],
198198
"gender": "male", "birthDate": "1956-07-09"}
199199
]}
200200
}
@@ -215,8 +215,6 @@ def test_process_record_no_records_exist(self):
215215
# Act
216216
result = process_record(test_record)
217217

218-
# Assert
219-
self.assertEqual(result["status"], "success")
220218
self.assertEqual(result["message"], f"No records returned for ID: {test_id}")
221219

222220
# Verify PDS was not called
@@ -307,15 +305,16 @@ def test_process_record_birthdate_mismatch_skips_update(self):
307305
"family": "Doe"
308306
}],
309307
"gender": "male",
310-
"birthDate": "1980-01-02"}
308+
"birthDate": "1980-01-02"
309+
}
311310
]
312311
}
313312
}
314313
self.mock_get_items_from_patient_id.return_value = [item]
315314

316315
result = process_record(test_sqs_record)
317316
self.assertEqual(result["status"], "success")
318-
self.assertIn("update skipped", result["message"])
317+
self.assertEqual(result["message"], "Not all IEDS items matched PDS demographics; update skipped")
319318

320319
def test_process_record_gender_mismatch_skips_update(self):
321320
"""If gender differs between PDS and IEDS, update should be skipped"""
@@ -342,14 +341,17 @@ def test_process_record_gender_mismatch_skips_update(self):
342341
"given": ["Alex"],
343342
"family": "Smith"
344343
}],
345-
"gender": "male", "birthDate": "1992-03-03"}
344+
"gender": "male",
345+
"birthDate": "1992-03-03"
346+
}
346347
]
347-
}}
348+
}
349+
}
348350
self.mock_get_items_from_patient_id.return_value = [item]
349351

350352
result = process_record(test_sqs_record)
351353
self.assertEqual(result["status"], "success")
352-
self.assertIn("update skipped", result["message"])
354+
self.assertEqual(result["message"], "Not all IEDS items matched PDS demographics; update skipped")
353355

354356
def test_process_record_no_comparable_fields_skips_update(self):
355357
"""If PDS provides no comparable fields, do not update (skip)"""
@@ -373,11 +375,13 @@ def test_process_record_no_comparable_fields_skips_update(self):
373375
"family": "Lee"
374376
}],
375377
"gender": "female",
376-
"birthDate": "2000-01-01"}
378+
"birthDate": "2000-01-01"
379+
}
377380
]
378-
}}
381+
}
382+
}
379383
self.mock_get_items_from_patient_id.return_value = [item]
380384

381385
result = process_record(test_sqs_record)
382386
self.assertEqual(result["status"], "success")
383-
self.assertIn("update skipped", result["message"])
387+
self.assertEqual(result["message"], "Not all IEDS items matched PDS demographics; update skipped")

0 commit comments

Comments
 (0)