diff --git a/src/config-schema.ts b/src/config-schema.ts index 3ae27752..a5544a66 100644 --- a/src/config-schema.ts +++ b/src/config-schema.ts @@ -6,6 +6,11 @@ export const configSchema = { _default: "52a447d3-a64a-11e3-9aeb-50e549534c5e", _description: "Uuid for orderType", }, + laboratoryResultEncounterTypeUuid: { + _type: Type.String, + _default: "3596fafb-6f6f-4396-8c87-6e63a0f1bd71", + _description: "Uuid for lab resulting encounter type", + }, targetPatientDashboard: { redirectToResultsViewer: { _type: Type.String, @@ -26,5 +31,6 @@ export const configSchema = { export type Config = { laboratoryOrderTypeUuid: string; + laboratoryResultEncounterTypeUuid: string; targetPatientDashboard: Object; }; diff --git a/src/results/result-form.component.tsx b/src/results/result-form.component.tsx index ce944b13..0476ec74 100644 --- a/src/results/result-form.component.tsx +++ b/src/results/result-form.component.tsx @@ -11,6 +11,7 @@ import { useConfig, useLayoutType, usePatient, + useSession, } from "@openmrs/esm-framework"; import { useGetOrderConceptByUuid, @@ -31,7 +32,8 @@ interface ResultFormProps { const ResultForm: React.FC = ({ order, patientUuid }) => { const { t } = useTranslation(); - const { laboratoryOrderTypeUuid } = useConfig(); + const { laboratoryOrderTypeUuid, laboratoryResultEncounterTypeUuid } = + useConfig(); const { control, register, @@ -46,6 +48,8 @@ const ResultForm: React.FC = ({ order, patientUuid }) => { const { concept, isLoading: isLoadingConcepts } = useGetOrderConceptByUuid( order.concept.uuid ); + const userSession = useSession(); + const userLocation = userSession?.sessionLocation?.uuid; const bannerState = useMemo(() => { if (patient) { return { @@ -125,10 +129,16 @@ const ResultForm: React.FC = ({ order, patientUuid }) => { orderer: order.orderer, }; + const encounterPostData = { + patient: patientUuid, + location: userLocation, + encounterType: laboratoryResultEncounterTypeUuid, + obs: [], + }; UpdateOrderResult( - order.encounter.uuid, obsPayload, - orderDiscontinuationPayload + orderDiscontinuationPayload, + encounterPostData ) .then( (resp) => { diff --git a/src/results/result-form.resource.ts b/src/results/result-form.resource.ts index 11740854..d94401da 100644 --- a/src/results/result-form.resource.ts +++ b/src/results/result-form.resource.ts @@ -343,30 +343,83 @@ export async function UpdateEncounter(uuid: string, payload: any) { //TODO: the calls to update order and observations for results should be transactional to allow for rollback export async function UpdateOrderResult( - encounterUuid: string, obsPayload: any, - orderPayload: any + orderPayload: any, + encounterPostData: any ) { const abortController = new AbortController(); - const updateOrderCall = await openmrsFetch(`${restBaseUrl}/order`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - signal: abortController.signal, - body: orderPayload, - }); - if (updateOrderCall.status === 201) { - return await openmrsFetch(`${restBaseUrl}/encounter/${encounterUuid}`, { + const patientVisits = await openmrsFetch( + `${restBaseUrl}/visit?patient=${orderPayload.patient}&v=custom:(uuid,encounters:(uuid))`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + signal: abortController.signal, + } + ); + + function findVisitUuidByOrderEncounterUuid(visits, orderEncounterUuid) { + for (const visit of visits) { + if ( + visit.encounters.some( + (encounter) => encounter.uuid === orderEncounterUuid + ) + ) { + return visit.uuid; + } + } + return null; + } + + const visitUuid = findVisitUuidByOrderEncounterUuid( + patientVisits.data.results, + orderPayload.encounter + ); + + encounterPostData.visit = visitUuid; + + const createOrderResultEncounterCall = await openmrsFetch( + `${restBaseUrl}/encounter`, + { method: "POST", headers: { "Content-Type": "application/json", }, signal: abortController.signal, - body: obsPayload, + body: encounterPostData, + } + ); + + if (createOrderResultEncounterCall.status === 201) { + const orderResultEncounterUuid = createOrderResultEncounterCall.data.uuid; + + orderPayload.encounter = orderResultEncounterUuid; + + const updateOrderCall = await openmrsFetch(`${restBaseUrl}/order`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + signal: abortController.signal, + body: orderPayload, }); - } else { - // handle errors + + if (updateOrderCall.status === 201) { + return await openmrsFetch( + `${restBaseUrl}/encounter/${orderResultEncounterUuid}`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + signal: abortController.signal, + body: obsPayload, + } + ); + } else { + // handle errors + } } }