UNPKG

@kenyaemr/esm-dispensing-app

Version:
1,468 lines (1,441 loc) 101 kB
import { Coding, DosageInstruction, Medication, MedicationDispense, MedicationDispenseStatus, MedicationReferenceOrCodeableConcept, MedicationRequest, MedicationRequestBundle, MedicationRequestCombinedStatus, MedicationRequestFulfillerStatus, MedicationRequestStatus, } from "./types"; import { computeMedicationRequestCombinedStatus, computeMedicationRequestStatus, computeNewFulfillerStatusAfterDelete, computeNewFulfillerStatusAfterDispenseEvent, computePrescriptionStatus, computeQuantityRemaining, computeTotalQuantityDispensed, computeTotalQuantityOrdered, getAssociatedMedicationDispenses, getAssociatedMedicationRequest, getConceptCoding, getConceptCodingDisplay, getConceptCodingUuid, getDosageInstruction, getMedicationDisplay, getMedicationReferenceOrCodeableConcept, getMedicationsByConceptEndpoint, getMostRecentMedicationDispenseStatus, getNextMostRecentMedicationDispenseStatus, getOpenMRSMedicineDrugName, getPrescriptionDetailsEndpoint, getPrescriptionTableActiveMedicationRequestsEndpoint, getPrescriptionTableAllMedicationRequestsEndpoint, getQuantity, getQuantityUnitsMatch, getRefillsAllowed, isMostRecentMedicationDispense, } from "./utils"; import dayjs from "dayjs"; describe("Util Tests", () => { describe("test computeMedicationRequestCombinedStatus", () => { test("should return on-hold if status active and fulfiller status on-hold", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.active, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.on_hold, }, ], }; expect( computeMedicationRequestCombinedStatus(medicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.on_hold); }); test("should return declined if status active and fulfiller status declined", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.active, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.declined, }, ], }; expect( computeMedicationRequestCombinedStatus(medicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.declined); }); test("should return completed if status completed and fulfiller status completed", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.completed, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.completed, }, ], }; expect( computeMedicationRequestCombinedStatus(medicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.completed); }); test("should return cancelled if status cancelled and no fulfiller status", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.cancelled, subject: { display: "", reference: "", type: "" }, }; expect( computeMedicationRequestCombinedStatus(medicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.cancelled); }); test("should return cancelled if status cancelled and fulfiller on-hold", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.cancelled, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.on_hold, }, ], }; expect( computeMedicationRequestCombinedStatus(medicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.cancelled); }); test("should return cancelled if status cancelled and fulfiller declined", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.cancelled, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.declined, }, ], }; expect( computeMedicationRequestCombinedStatus(medicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.cancelled); }); test("should return expired if validity period over 90 days ago and no fulfiller status", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "2020-04-04" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.active, subject: { display: "", reference: "", type: "" }, }; expect( computeMedicationRequestCombinedStatus(medicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.expired); }); test("should return expired if validity period over 90 days and fulfiller status on-hold", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "2020-04-04" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.active, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.on_hold, }, ], }; expect( computeMedicationRequestCombinedStatus(medicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.expired); }); test("should return expired if validity period over 90 days and fulfiller status declined", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "2020-04-04" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.active, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.declined, }, ], }; expect( computeMedicationRequestCombinedStatus(medicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.expired); }); }); describe("test computeMedicationRequestStatus", () => { test("should return Cancelled if Medication Request has status cancelled", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.cancelled, subject: { display: "", reference: "", type: "" }, }; expect(computeMedicationRequestStatus(medicationRequest, 0)).toBe( MedicationRequestStatus.cancelled ); }); test("should return Completed if Medication Request has status completed", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.completed, subject: { display: "", reference: "", type: "" }, }; expect(computeMedicationRequestStatus(medicationRequest, 0)).toBe( MedicationRequestStatus.completed ); }); test("should return Expired if Medication Request older than expired timeframe", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: dayjs().subtract(91, "days").toString() }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: null, subject: { display: "", reference: "", type: "" }, }; expect(computeMedicationRequestStatus(medicationRequest, 90)).toBe( MedicationRequestStatus.expired ); }); test("should return Expired if Medication Request age is passed expired timeframe", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: dayjs().subtract(91, "days").toString() }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: null, subject: { display: "", reference: "", type: "" }, }; expect(computeMedicationRequestStatus(medicationRequest, 90)).toBe( MedicationRequestStatus.expired ); }); test("should return Active if Medication Request age is equal to expired timeframe (even if status is expired)", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: dayjs().startOf("day").subtract(90, "days").toString(), }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.expired, subject: { display: "", reference: "", type: "" }, }; expect(computeMedicationRequestStatus(medicationRequest, 90)).toBe( MedicationRequestStatus.active ); }); test("should return Active if Medication Request is age is less than expired timeframe (even if status is expired)", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: dayjs().startOf("day").subtract(90, "days").toString(), }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.expired, subject: { display: "", reference: "", type: "" }, }; expect(computeMedicationRequestStatus(medicationRequest, 90)).toBe( MedicationRequestStatus.active ); }); test("should return Active as default", () => { const medicationRequest: MedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: null, subject: { display: "", reference: "", type: "" }, }; expect(computeMedicationRequestStatus(medicationRequest, 90)).toBe( MedicationRequestStatus.active ); }); }); describe("test computeNewFulfillerStatusAfterDelete", () => { const medicationRequest: MedicationRequest = { id: "1c1ad91e-8653-453a-9f59-8d5c36249aff", dispenseRequest: { numberOfRepeatsAllowed: undefined, quantity: { value: 30, unit: "mg", code: "123abc", }, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "MedicationRequest", status: MedicationRequestStatus.completed, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.declined, }, ], }; const medicationDispenseCompleteMostRecent: MedicationDispense = { dosageInstruction: undefined, id: "ab663520-8b5f-4afe-a333-5196f69ccea7", extension: [ { url: "http://fhir.openmrs.org/ext/medicationdispense/recorded", valueDateTime: "2023-01-05T14:00:00-05:00", }, ], authorizingPrescription: [ { reference: "MedicationRequest/", type: "MedicationRequest", }, ], location: { display: "", reference: "", type: "" }, medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, quantity: { value: 5, unit: "mg", code: "123abc", }, performer: undefined, resourceType: "MedicationDispense", status: MedicationDispenseStatus.completed, subject: { display: "", reference: "", type: "" }, substitution: { reason: [], type: undefined, wasSubstituted: false }, type: undefined, whenHandedOver: "", whenPrepared: "", }; const medicationDispenseDeclined: MedicationDispense = { dosageInstruction: undefined, id: "9f7987e8-95c6-42f3-96e6-fd2eaa3134a5", extension: [ { url: "http://fhir.openmrs.org/ext/medicationdispense/recorded", valueDateTime: "2023-01-04T14:00:00-05:00", }, ], authorizingPrescription: [ { reference: "MedicationRequest/1c1ad91e-8653-453a-9f59-8d5c36249aff", type: "MedicationRequest", }, ], location: { display: "", reference: "", type: "" }, medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, quantity: { value: 5, unit: "mg", code: "123abc", }, performer: undefined, resourceType: "MedicationDispense", status: MedicationDispenseStatus.declined, subject: { display: "", reference: "", type: "" }, substitution: { reason: [], type: undefined, wasSubstituted: false }, type: undefined, whenHandedOver: "", whenPrepared: "", }; const medicationDispenseOnHold: MedicationDispense = { dosageInstruction: undefined, id: "e2bf7117-aa87-4a92-9e61-f985f29a82aa", extension: [ { url: "http://fhir.openmrs.org/ext/medicationdispense/recorded", valueDateTime: "2023-01-03T14:00:00-05:00", }, ], authorizingPrescription: [ { reference: "MedicationRequest/1c1ad91e-8653-453a-9f59-8d5c36249aff", type: "MedicationRequest", }, ], location: { display: "", reference: "", type: "" }, medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, quantity: { value: 5, unit: "mg", code: "123abc", }, performer: undefined, resourceType: "MedicationDispense", status: MedicationDispenseStatus.on_hold, subject: { display: "", reference: "", type: "" }, substitution: { reason: [], type: undefined, wasSubstituted: false }, type: undefined, whenHandedOver: "", whenPrepared: "", }; const medicationDispenseCompleteOldest: MedicationDispense = { dosageInstruction: undefined, id: "7fd2dcd2-6621-444d-9054-fe1d36acf498", extension: [ { url: "http://fhir.openmrs.org/ext/medicationdispense/recorded", valueDateTime: "2023-01-01T14:00:00-05:00", }, ], authorizingPrescription: [ { reference: "MedicationRequest/", type: "MedicationRequest", }, ], location: { display: "", reference: "", type: "" }, medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, quantity: { value: 5, unit: "mg", code: "123abc", }, performer: undefined, resourceType: "MedicationDispense", status: MedicationDispenseStatus.completed, subject: { display: "", reference: "", type: "" }, substitution: { reason: [], type: undefined, wasSubstituted: false }, type: undefined, whenHandedOver: "", whenPrepared: "", }; test("should return declined if deleting most recent medication dispense and next most recent status declined", () => { const medicationRequestBundle: MedicationRequestBundle = { request: medicationRequest, dispenses: [ medicationDispenseCompleteMostRecent, medicationDispenseDeclined, medicationDispenseOnHold, medicationDispenseCompleteOldest, ], }; expect( computeNewFulfillerStatusAfterDelete( medicationDispenseCompleteMostRecent, medicationRequestBundle, false ) ).toBe(MedicationRequestFulfillerStatus.declined); }), test("should return on-hold if deleting most recent medication dispense next most recent status on-hold", () => { const medicationRequestBundle: MedicationRequestBundle = { request: medicationRequest, dispenses: [ medicationDispenseCompleteMostRecent, medicationDispenseOnHold, medicationDispenseCompleteOldest, ], }; expect( computeNewFulfillerStatusAfterDelete( medicationDispenseCompleteMostRecent, medicationRequestBundle, false ) ).toBe(MedicationRequestFulfillerStatus.on_hold); }), test("should return null if deleting only medication dispense", () => { const medicationRequestBundle: MedicationRequestBundle = { request: medicationRequest, dispenses: [medicationDispenseCompleteMostRecent], }; expect( computeNewFulfillerStatusAfterDelete( medicationDispenseCompleteMostRecent, medicationRequestBundle, false ) ).toBeNull(); }), test("should return current fulfiller status if not most recent medication dispense and deleted dispense does not have status of completed", () => { const medicationRequestBundle: MedicationRequestBundle = { request: medicationRequest, dispenses: [medicationDispenseDeclined, medicationDispenseOnHold], }; expect( computeNewFulfillerStatusAfterDelete( medicationDispenseOnHold, medicationRequestBundle, false ) ).toBe(MedicationRequestFulfillerStatus.declined); }); }); describe("test computeNewFulfillerStatusAfterDispenseEvent", () => { const medicationRequest: MedicationRequest = { id: "1c1ad91e-8653-453a-9f59-8d5c36249aff", dispenseRequest: { numberOfRepeatsAllowed: undefined, quantity: { value: 30, unit: "mg", code: "123abc", }, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "MedicationRequest", status: null, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.completed, }, ], }; const newMedicationDispense: MedicationDispense = { // ie quantity dispense = quantity ordered dosageInstruction: undefined, id: "", extension: [ { url: "http://fhir.openmrs.org/ext/medicationdispense/recorded", valueDateTime: "", }, ], authorizingPrescription: [ { reference: "MedicationRequest/", type: "MedicationRequest", }, ], location: { display: "", reference: "", type: "" }, medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, quantity: { value: null, unit: "mg", code: "123abc", }, performer: undefined, resourceType: "MedicationDispense", status: null, subject: { display: "", reference: "", type: "" }, substitution: { reason: [], type: undefined, wasSubstituted: false }, type: undefined, whenHandedOver: "", whenPrepared: "", }; const existingMedicationDispense: MedicationDispense = { // ie quantity dispense = quantity ordered dosageInstruction: undefined, id: "ab663520-8b5f-4afe-a333-5196f69ccea7", extension: [ { url: "http://fhir.openmrs.org/ext/medicationdispense/recorded", valueDateTime: "", }, ], authorizingPrescription: [ { reference: "MedicationRequest/", type: "MedicationRequest", }, ], location: { display: "", reference: "", type: "" }, medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, quantity: { value: null, unit: "mg", code: "123abc", }, performer: undefined, resourceType: "MedicationDispense", status: null, subject: { display: "", reference: "", type: "" }, substitution: { reason: [], type: undefined, wasSubstituted: false }, type: undefined, whenHandedOver: "", whenPrepared: "", }; test("when adding new dispense should return null even if dispense meets or exceeds quantitiy if restrict total quantity dispensed config is false", () => { newMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; newMedicationDispense.status = MedicationDispenseStatus.completed; newMedicationDispense.quantity.value = 30; expect( computeNewFulfillerStatusAfterDispenseEvent( newMedicationDispense, { request: medicationRequest, dispenses: [] }, false ) ).toBeNull(); }); test("when adding new dispense should return on-hold if status of new dispense is on-hold and if restrict total quantity dispensed config is false", () => { newMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; newMedicationDispense.status = MedicationDispenseStatus.on_hold; newMedicationDispense.quantity.value = 0; expect( computeNewFulfillerStatusAfterDispenseEvent( newMedicationDispense, { request: medicationRequest, dispenses: [] }, false ) ).toBe(MedicationRequestFulfillerStatus.on_hold); }); test("when adding new dispense should return complete if total dispensed equals total ordered and restrict total quantity dispensed config is true", () => { newMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; newMedicationDispense.status = MedicationDispenseStatus.completed; newMedicationDispense.quantity.value = 30; expect( computeNewFulfillerStatusAfterDispenseEvent( newMedicationDispense, { request: medicationRequest, dispenses: [] }, true ) ).toBe(MedicationRequestFulfillerStatus.completed); }); test("when adding new dispense should return null if total dispensed less than total ordered and restrict total quantity dispensed config is true", () => { newMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; newMedicationDispense.status = MedicationDispenseStatus.completed; newMedicationDispense.quantity.value = 20; expect( computeNewFulfillerStatusAfterDispenseEvent( newMedicationDispense, { request: medicationRequest, dispenses: [] }, true ) ).toBeNull(); }); test("when adding new on-hold dispense should return on-hold if restrict total quantity dispensed config is true", () => { newMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; newMedicationDispense.status = MedicationDispenseStatus.on_hold; newMedicationDispense.quantity.value = 0; expect( computeNewFulfillerStatusAfterDispenseEvent( newMedicationDispense, { request: medicationRequest, dispenses: [] }, true ) ).toBe(MedicationRequestFulfillerStatus.on_hold); }); test("when adding new dispense to request with existing dispense should return complete if meets total quantity ordered and restrict total quantity dispensed config is true", () => { newMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; newMedicationDispense.status = MedicationDispenseStatus.on_hold; newMedicationDispense.quantity.value = 20; existingMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; existingMedicationDispense.status = MedicationDispenseStatus.on_hold; existingMedicationDispense.quantity.value = 10; expect( computeNewFulfillerStatusAfterDispenseEvent( newMedicationDispense, { request: medicationRequest, dispenses: [existingMedicationDispense], }, true ) ).toBe(MedicationRequestFulfillerStatus.completed); }); test("when adding new dispense to request with existing dispense should return null if does not meet total quantiy order and restrict total quantity dispensed config is true", () => { newMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; newMedicationDispense.status = MedicationDispenseStatus.completed; newMedicationDispense.quantity.value = 10; existingMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; existingMedicationDispense.status = MedicationDispenseStatus.completed; existingMedicationDispense.quantity.value = 10; expect( computeNewFulfillerStatusAfterDispenseEvent( newMedicationDispense, { request: medicationRequest, dispenses: [existingMedicationDispense], }, true ) ).toBeNull(); }); test("when editing existing dispense should return null if does not meet total quantity order and restrict total quantity dispensed config is true", () => { existingMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; existingMedicationDispense.status = MedicationDispenseStatus.completed; existingMedicationDispense.quantity.value = 30; const editedExistingMedicationDispense = { ...existingMedicationDispense, }; editedExistingMedicationDispense.quantity.value = 20; expect( computeNewFulfillerStatusAfterDispenseEvent( editedExistingMedicationDispense, { request: medicationRequest, dispenses: [existingMedicationDispense], }, true ) ).toBeNull(); }); test("when editing existing dispense should return complete if meets total quantity order and restrict total quantity dispensed config is true", () => { existingMedicationDispense.extension[0].valueDateTime = "2023-01-03T14:00:00-05:00"; existingMedicationDispense.status = MedicationDispenseStatus.completed; existingMedicationDispense.quantity.value = 20; const editedExistingMedicationDispense = { ...existingMedicationDispense, }; editedExistingMedicationDispense.quantity.value = 30; expect( computeNewFulfillerStatusAfterDispenseEvent( editedExistingMedicationDispense, { request: medicationRequest, dispenses: [existingMedicationDispense], }, true ) ).toBe(MedicationRequestFulfillerStatus.completed); }); }); describe("test computePrescriptionStatus", () => { const activeMedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.active, subject: { display: "", reference: "", type: "" }, }; // sanity check expect( computeMedicationRequestCombinedStatus(activeMedicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.active); const cancelledMedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.cancelled, subject: { display: "", reference: "", type: "" }, }; // sanity check expect( computeMedicationRequestCombinedStatus(cancelledMedicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.cancelled); const expiredMedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "2020-04-04" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.active, subject: { display: "", reference: "", type: "" }, }; // sanity check expect( computeMedicationRequestCombinedStatus(expiredMedicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.expired); const onHoldMedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.active, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.on_hold, }, ], }; // sanity check expect( computeMedicationRequestCombinedStatus(onHoldMedicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.on_hold); const declinedMedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.active, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.declined, }, ], }; // santity check expect( computeMedicationRequestCombinedStatus(declinedMedicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.declined); const completedMedicationRequest = { dispenseRequest: { numberOfRepeatsAllowed: 0, quantity: undefined, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, id: "", intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "", status: MedicationRequestStatus.completed, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.completed, }, ], }; // santiy-check expect( computeMedicationRequestCombinedStatus(completedMedicationRequest, 90) ).toBe(MedicationRequestCombinedStatus.completed); test("should return active if any medication request combined status active", () => { expect( computePrescriptionStatus( [ activeMedicationRequest, cancelledMedicationRequest, expiredMedicationRequest, onHoldMedicationRequest, declinedMedicationRequest, completedMedicationRequest, ], 90 ) ).toBe(MedicationRequestCombinedStatus.active); }); test("should return on-hold if any medication request combined status on-hold, and none active", () => { expect( computePrescriptionStatus( [ cancelledMedicationRequest, expiredMedicationRequest, onHoldMedicationRequest, declinedMedicationRequest, completedMedicationRequest, ], 90 ) ).toBe(MedicationRequestCombinedStatus.on_hold); }); test("should return completed if any medication request combined status completed, and none active or on hold", () => { expect( computePrescriptionStatus( [ cancelledMedicationRequest, expiredMedicationRequest, declinedMedicationRequest, completedMedicationRequest, ], 90 ) ).toBe(MedicationRequestCombinedStatus.completed); }); test("should return declined if any medication request combined status declined, and none active or on hold or completed", () => { expect( computePrescriptionStatus( [ cancelledMedicationRequest, expiredMedicationRequest, declinedMedicationRequest, ], 90 ) ).toBe(MedicationRequestCombinedStatus.declined); }); test("should return cancelled if any medication request combined status cancelled, and none active or on hold or completed or declined", () => { expect( computePrescriptionStatus( [cancelledMedicationRequest, expiredMedicationRequest], 90 ) ).toBe(MedicationRequestCombinedStatus.cancelled); }); test("should return expired if any medication request combined status expired, and none active or on hold or completed or declined or cancelled", () => { expect(computePrescriptionStatus([expiredMedicationRequest], 90)).toBe( MedicationRequestCombinedStatus.expired ); }); test("should return null for empty array", () => { expect(computePrescriptionStatus([], 90)).toBe(null); }); test("should return null for null input", () => { expect(computePrescriptionStatus(null, 90)).toBe(null); }); }); describe("test computeRemainingQuantity", () => { const medicationRequest: MedicationRequest = { id: "1c1ad91e-8653-453a-9f59-8d5c36249aff", dispenseRequest: { numberOfRepeatsAllowed: undefined, quantity: { value: 30, unit: "mg", code: "123abc", }, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "MedicationRequest", status: MedicationRequestStatus.completed, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.completed, }, ], }; const medicationDispense1: MedicationDispense = { dosageInstruction: undefined, id: "", authorizingPrescription: [ { reference: "MedicationRequest/1c1ad91e-8653-453a-9f59-8d5c36249aff", type: "MedicationRequest", }, ], location: { display: "", reference: "", type: "" }, medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, quantity: { value: 5, unit: "mg", code: "123abc", }, performer: undefined, resourceType: "MedicationDispense", status: MedicationDispenseStatus.completed, subject: { display: "", reference: "", type: "" }, substitution: { reason: [], type: undefined, wasSubstituted: false }, type: undefined, whenHandedOver: "", whenPrepared: "", }; const medicationDispense2: MedicationDispense = { dosageInstruction: undefined, id: "", authorizingPrescription: [ { reference: "MedicationRequest/1c1ad91e-8653-453a-9f59-8d5c36249aff", type: "MedicationRequest", }, ], location: { display: "", reference: "", type: "" }, medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, quantity: { value: 10, unit: "mg", code: "123abc", }, performer: undefined, resourceType: "MedicationDispense", status: MedicationDispenseStatus.completed, subject: { display: "", reference: "", type: "" }, substitution: { reason: [], type: undefined, wasSubstituted: false }, type: undefined, whenHandedOver: "", whenPrepared: "", }; const medicationDispenseNoQuantity: MedicationDispense = { dosageInstruction: undefined, id: "", authorizingPrescription: [ { reference: "MedicationRequest/1c1ad91e-8653-453a-9f59-8d5c36249aff", type: "MedicationRequest", }, ], location: { display: "", reference: "", type: "" }, medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, quantity: undefined, performer: undefined, resourceType: "MedicationDispense", status: MedicationDispenseStatus.completed, subject: { display: "", reference: "", type: "" }, substitution: { reason: [], type: undefined, wasSubstituted: false }, type: undefined, whenHandedOver: "", whenPrepared: "", }; const medicationRequestDifferentUnits: MedicationRequest = { id: "1c1ad91e-8653-453a-9f59-8d5c36249aff", dispenseRequest: { numberOfRepeatsAllowed: undefined, quantity: { value: 30, unit: "kg", code: "456def", }, validityPeriod: { start: "" }, }, dosageInstruction: undefined, encounter: { reference: "", type: "" }, intent: "", medicationReference: { display: "", reference: "", type: "" }, meta: { lastUpdated: "" }, priority: "", requester: { display: "", identifier: { value: "" }, reference: "", type: "", }, resourceType: "MedicationRequest", status: MedicationRequestStatus.completed, subject: { display: "", reference: "", type: "" }, extension: [ { url: "http://fhir.openmrs.org/ext/medicationrequest/fullfillerstatus", valueCode: MedicationRequestFulfillerStatus.completed, }, ], }; test("should return quantity remaining", () => { expect( computeQuantityRemaining({ request: medicationRequest, dispenses: [ medicationDispense1, medicationDispense2, medicationDispenseNoQuantity, ], }) ).toBe(15); }); test("should return quantity ordered if no dispense has happened", () => { expect( computeQuantityRemaining({ request: medicationRequest, dispenses: [medicationDispenseNoQuantity], }) ).toBe(30); }); test("should return amount orders if no dispenses", () => { expect( computeQuantityRemaining({ request: medicationRequest, dispenses: [] }) ).toBe(30); }); test("should return zero for null input", () => { expect(computeQuantityRemaining(null)).toBe(0); }); /* // TODO: figure out how to get this to work test("should throw Error if unit mismatch", () => { expect( computeQuantityRemaining(medicationRequestDifferentUnits, [ medicationDispen