From d4acd0fbd4c8d3198a4c27de83b7132d5fe72395 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 15 Jan 2026 17:15:36 +0000 Subject: [PATCH 1/2] fix: ensure most recent update displayed --- packages/enrichPrescriptions/src/statusUpdates.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/enrichPrescriptions/src/statusUpdates.ts b/packages/enrichPrescriptions/src/statusUpdates.ts index fba742676..bd7868e95 100644 --- a/packages/enrichPrescriptions/src/statusUpdates.ts +++ b/packages/enrichPrescriptions/src/statusUpdates.ts @@ -187,6 +187,10 @@ export function applyStatusUpdates(logger: Logger, searchsetBundle: Bundle, stat const itemUpdates = prescriptionUpdate.items.filter((item) => item.itemId === medicationRequestID) if (itemUpdates.length > 0) { logger.info(`Update found for MedicationRequest with id ${medicationRequestID}. Applying.`) + // there may be > 1 updates, ensure picking the most recent + itemUpdates.sort((a, b) => + moment(b.lastUpdateDateTime).utc().valueOf() - moment(a.lastUpdateDateTime).utc().valueOf() + ) updateMedicationRequest(logger, medicationRequest, itemUpdates[0]) } else { logger.info(`No update found for MedicationRequest with id ${medicationRequestID}. Applying default.`) From 22220585d94218929bb7c6e6565c02060377a0d1 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Fri, 16 Jan 2026 10:12:07 +0000 Subject: [PATCH 2/2] test: coverage of sort + placate SQ --- .../tests/testStatusUpdate.test.ts | 56 ++++++++++++++++--- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/packages/enrichPrescriptions/tests/testStatusUpdate.test.ts b/packages/enrichPrescriptions/tests/testStatusUpdate.test.ts index db8d3bd75..2e8fa7f57 100644 --- a/packages/enrichPrescriptions/tests/testStatusUpdate.test.ts +++ b/packages/enrichPrescriptions/tests/testStatusUpdate.test.ts @@ -242,7 +242,7 @@ describe("Unit tests for statusUpdate", function () { const statusUpdates = simpleStatusUpdatesPayload() - const responseBundle = JSON.parse(JSON.stringify(requestBundle)) + const responseBundle = structuredClone(requestBundle) applyStatusUpdates(logger, requestBundle, statusUpdates) @@ -410,9 +410,9 @@ describe("Unit tests for statusUpdate", function () { const statusUpdateRequest = createStatusUpdateRequest([{odsCode: "FLM49", prescriptionID: prescriptionID}]) applyTemporaryStatusUpdates(logger, requestBundle, statusUpdateRequest) - const statusExtension = medicationRequest.extension![0].extension!.filter((e) => e.url === "status")[0] + const statusExtension = medicationRequest.extension![0].extension!.find((e) => e.url === "status") - expect(statusExtension.valueCoding!.code!).toEqual(TEMPORARILY_UNAVAILABLE_STATUS) + expect(statusExtension!.valueCoding!.code!).toEqual(TEMPORARILY_UNAVAILABLE_STATUS) expect(medicationRequest.status).toEqual("active") }) @@ -451,9 +451,9 @@ describe("Unit tests for statusUpdate", function () { const statusUpdateRequest = createStatusUpdateRequest([{odsCode: "FLM49", prescriptionID: prescriptionID}]) applyTemporaryStatusUpdates(logger, requestBundle, statusUpdateRequest) - const statusExtension = medicationRequest.extension![0].extension!.filter((e) => e.url === "status")[0] + const statusExtension = medicationRequest.extension![0].extension!.find((e) => e.url === "status") - expect(statusExtension.valueCoding!.code!).toEqual(shouldUpdate ? TEMPORARILY_UNAVAILABLE_STATUS : status) + expect(statusExtension!.valueCoding!.code!).toEqual(shouldUpdate ? TEMPORARILY_UNAVAILABLE_STATUS : status) } ) }) @@ -487,10 +487,10 @@ describe("Unit tests for statusUpdate", function () { applyTemporaryStatusUpdates(logger, requestBundle, statusUpdateRequest) const tempStatusUpdateFilter = (medicationRequest: MedicationRequest) => { - const outerExtension = medicationRequest.extension?.filter( + const outerExtension = medicationRequest.extension?.find( (extension) => extension.url === OUTER_EXTENSION_URL - )[0] - const statusExtension = outerExtension?.extension?.filter((extension) => extension.url === "status")[0] + ) + const statusExtension = outerExtension?.extension?.find((extension) => extension.url === "status") return statusExtension?.valueCoding!.code === TEMPORARILY_UNAVAILABLE_STATUS } @@ -522,4 +522,44 @@ describe("Unit tests for statusUpdate", function () { expect(scenario).toEqual(expected) }) + + describe("Multiple updates for same item", () => { + it("when multiple updates exist for the same item, the most recent one is applied", async () => { + const requestBundle = simpleRequestBundle() + const statusUpdates = simpleStatusUpdatesPayload() + + // Add multiple updates for the same item with different timestamps + const itemId = "E76812CF-C893-42FF-AB02-B19EA1FA11B4" + statusUpdates.prescriptions[0].items = [ + { + isTerminalState: false, + itemId: itemId, + lastUpdateDateTime: "2023-09-11T08:00:00.000Z", // Earlier update + latestStatus: "With Pharmacy" + }, + { + isTerminalState: false, + itemId: itemId, + lastUpdateDateTime: "2023-09-11T10:11:12.000Z", // Most recent update + latestStatus: "Ready to Collect" + }, + { + isTerminalState: false, + itemId: itemId, + lastUpdateDateTime: "2023-09-11T09:00:00.000Z", // Middle update + latestStatus: "Being Prepared" + } + ] + + applyStatusUpdates(logger, requestBundle, statusUpdates) + + const prescriptionBundle = requestBundle.entry![0].resource as Bundle + const medicationRequest = prescriptionBundle.entry![0].resource as MedicationRequest + const statusExtension = medicationRequest.extension![0].extension!.find((e) => e.url === "status") + + // Expect the most recent status + expect(statusExtension!.valueCoding!.code).toEqual("Ready to Collect") + expect(medicationRequest.extension![0].extension![1].valueDateTime).toEqual("2023-09-11T10:11:12.000Z") + }) + }) })