From bffc01d618e5902c019f52482db7673a88c2cc63 Mon Sep 17 00:00:00 2001 From: Ariel Virgulto Date: Mon, 8 Apr 2024 13:01:47 -0400 Subject: [PATCH 1/3] Calls new etasu endpoint for pims --- .../database/schemas/doctorOrderSchemas.js | 18 ++++-- backend/src/routes/doctorOrders.js | 62 ++++++++++++++----- .../OrderCard/EtasuPopUp/EtasuPopUp.tsx | 27 ++++---- .../DoctorOrders/OrderCard/OrderCard.tsx | 15 +++-- 4 files changed, 86 insertions(+), 36 deletions(-) diff --git a/backend/src/database/schemas/doctorOrderSchemas.js b/backend/src/database/schemas/doctorOrderSchemas.js index 1c00b25..dc0eca5 100644 --- a/backend/src/database/schemas/doctorOrderSchemas.js +++ b/backend/src/database/schemas/doctorOrderSchemas.js @@ -19,17 +19,23 @@ export const orderSchema = new mongoose.Schema({ rxDate: String, drugPrice: Number, drugNdcCode: String, + drugRxnormCode: String, quantities: String, total: Number, pickupDate: String, dispenseStatus: String, metRequirements: [ - { - stakeholderId: String, - completed: Boolean, - metRequirementId: String, - requirementName: String, - requirementDescription: String + { + name: String, + resource: { + status: String, + moduleUri: String, + resourceType: String, + note: [ { text: String }], + subject: { + reference: String + } + } } ] }); diff --git a/backend/src/routes/doctorOrders.js b/backend/src/routes/doctorOrders.js index da3d422..7ba312f 100644 --- a/backend/src/routes/doctorOrders.js +++ b/backend/src/routes/doctorOrders.js @@ -75,24 +75,57 @@ router.patch('/api/updateRx/:id', async (req, res) => { const dontUpdateStatusBool = req.query.dontUpdateStatus; // Finding by id const order = await doctorOrder.findById(req.params.id).exec(); - console.log('Found doctor order by id!'); + console.log('Found doctor order by id! --- ', order); + + const body = { + resourceType: 'Parameters', + parameter: [ + { + name: 'patient', + resource: { + resourceType: 'Patient', + id: order.prescriberOrderNumber, + name: [{ + family: order.patientLastName, given: order.patientName.split(' '), use: 'official' + }], + birthDate: order.patientDOB, + }, + }, + { + name: 'medication', + resource: { + resourceType: 'Medication', + id: order.prescriberOrderNumber, + code: { + coding: [{system: 'http://www.nlm.nih.gov/research/umls/rxnorm', code: order.drugRxnormCode, display: order.drugNames}] + } + } + } + ] + }; // Reaching out to REMS Admin finding by pt name and drug name // '/etasu/met/patient/:patientFirstName/:patientLastName/:patientDOB/drug/:drugName', const remsBase = env.REMS_ADMIN_BASE; - const url = - remsBase + - '/etasu/met/patient/' + - order.patientFirstName + - '/' + - order.patientLastName + - '/' + - order.patientDOB + - '/drug/' + - order.simpleDrugName; - const response = await axios.get(url); + + const newUrl = remsBase + '/4_0_0/GuidanceResponse/$rems-etasu'; + + const response = await axios.post(newUrl, body, { + headers: { + 'content-type': 'application/json' + } + }); console.log('Retrieved order'); + const responseResource = response.data.parameter[0].resource; + const params = []; + if (responseResource.contained && responseResource.contained[0]) { + for (const param of responseResource.contained[0]['parameter']) { + params.push(param); + } + } + + const status = responseResource.status === 'success' ? 'Approved' : 'Pending'; // Saving and updating const newOrder = await doctorOrder.findOneAndUpdate( @@ -101,8 +134,8 @@ router.patch('/api/updateRx/:id', async (req, res) => { dispenseStatus: dontUpdateStatusBool || order.dispenseStatus === 'Picked Up' ? order.dispenseStatus - : response.data.status, - metRequirements: response.data.metRequirements + : status, + metRequirements: params }, { new: true @@ -233,6 +266,7 @@ function parseNCPDPScript(newRx) { drugNames: newRx.Message.Body.NewRx.MedicationPrescribed.DrugDescription, simpleDrugName: newRx.Message.Body.NewRx.MedicationPrescribed.DrugDescription.split(' ')[0], drugNdcCode: newRx.Message.Body.NewRx.MedicationPrescribed.DrugCoded.ProductCode.Code, + drugRxnormCode: newRx.Message.Body.NewRx.MedicationPrescribed.DrugCoded.DrugDBCode.Code, rxDate: newRx.Message.Body.NewRx.MedicationPrescribed.WrittenDate.Date, drugPrice: 200, // Add later? quantities: newRx.Message.Body.NewRx.MedicationPrescribed.Quantity.Value, diff --git a/frontend/src/views/DoctorOrders/OrderCard/EtasuPopUp/EtasuPopUp.tsx b/frontend/src/views/DoctorOrders/OrderCard/EtasuPopUp/EtasuPopUp.tsx index 916e239..c5006c6 100644 --- a/frontend/src/views/DoctorOrders/OrderCard/EtasuPopUp/EtasuPopUp.tsx +++ b/frontend/src/views/DoctorOrders/OrderCard/EtasuPopUp/EtasuPopUp.tsx @@ -12,12 +12,16 @@ import * as React from 'react'; import { useState } from 'react'; type MetRequirements = { - stakeholderId: string; - completed: boolean; - metRequirementId: string; - requirementName: string; - requirementDescription: string; - _id: string; + name: string; + resource: { + status: string, + moduleUri: string, + resourceType: string, + note: [ { text: string }], + subject: { + reference: string + } + }; }; interface DoctorOrder { @@ -30,6 +34,7 @@ interface DoctorOrder { doctorEmail?: string; drugNames?: string; drugPrice?: number; + drugRxnormCode: number; quanitities?: string; total?: number; pickupDate?: string; @@ -88,16 +93,16 @@ const EtasuPopUp = (props: any) => { {doctorOrder?.metRequirements .sort((first: MetRequirements, second: MetRequirements) => { // Keep the other forms unsorted. - if (second.requirementName.includes('Patient Status Update')) { + if (second.name.includes('Patient Status Update')) { // Sort the Patient Status Update forms in descending order of timestamp. - return second.requirementName.localeCompare(first.requirementName); + return second.name.localeCompare(first.name); } return 0; }) .map(etasuElement => ( - - {etasuElement.requirementName} - {etasuElement.completed ? '✅' : '❌'} + + {etasuElement.name} + {etasuElement.resource.status === 'success' ? '✅' : '❌'} ))} diff --git a/frontend/src/views/DoctorOrders/OrderCard/OrderCard.tsx b/frontend/src/views/DoctorOrders/OrderCard/OrderCard.tsx index 5984b44..12bd498 100644 --- a/frontend/src/views/DoctorOrders/OrderCard/OrderCard.tsx +++ b/frontend/src/views/DoctorOrders/OrderCard/OrderCard.tsx @@ -35,11 +35,16 @@ interface DoctorOrder { pickupDate?: string; dispenseStatus?: string; metRequirements: { - stakeholderId: string; - completed: boolean; - metRequirementId: string; - requirementName: string; - requirementDescription: string; + name: string; + resource: { + status: string, + moduleUri: string, + resourceType: string, + note: [ { text: string }], + subject: { + reference: string + } + }; }[]; } From 50592a53a92f135c28bd18084296086f911c93c3 Mon Sep 17 00:00:00 2001 From: Ariel Virgulto Date: Mon, 8 Apr 2024 13:12:52 -0400 Subject: [PATCH 2/3] prettier updates --- .../database/schemas/doctorOrderSchemas.js | 8 +++---- backend/src/routes/doctorOrders.js | 22 ++++++++++++++----- .../OrderCard/EtasuPopUp/EtasuPopUp.tsx | 18 ++++++++------- .../DoctorOrders/OrderCard/OrderCard.tsx | 14 ++++++------ 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/backend/src/database/schemas/doctorOrderSchemas.js b/backend/src/database/schemas/doctorOrderSchemas.js index dc0eca5..e95ff52 100644 --- a/backend/src/database/schemas/doctorOrderSchemas.js +++ b/backend/src/database/schemas/doctorOrderSchemas.js @@ -25,15 +25,15 @@ export const orderSchema = new mongoose.Schema({ pickupDate: String, dispenseStatus: String, metRequirements: [ - { + { name: String, - resource: { + resource: { status: String, moduleUri: String, resourceType: String, - note: [ { text: String }], + note: [{ text: String }], subject: { - reference: String + reference: String } } } diff --git a/backend/src/routes/doctorOrders.js b/backend/src/routes/doctorOrders.js index 7ba312f..89ad1b3 100644 --- a/backend/src/routes/doctorOrders.js +++ b/backend/src/routes/doctorOrders.js @@ -85,11 +85,15 @@ router.patch('/api/updateRx/:id', async (req, res) => { resource: { resourceType: 'Patient', id: order.prescriberOrderNumber, - name: [{ - family: order.patientLastName, given: order.patientName.split(' '), use: 'official' - }], - birthDate: order.patientDOB, - }, + name: [ + { + family: order.patientLastName, + given: order.patientName.split(' '), + use: 'official' + } + ], + birthDate: order.patientDOB + } }, { name: 'medication', @@ -97,7 +101,13 @@ router.patch('/api/updateRx/:id', async (req, res) => { resourceType: 'Medication', id: order.prescriberOrderNumber, code: { - coding: [{system: 'http://www.nlm.nih.gov/research/umls/rxnorm', code: order.drugRxnormCode, display: order.drugNames}] + coding: [ + { + system: 'http://www.nlm.nih.gov/research/umls/rxnorm', + code: order.drugRxnormCode, + display: order.drugNames + } + ] } } } diff --git a/frontend/src/views/DoctorOrders/OrderCard/EtasuPopUp/EtasuPopUp.tsx b/frontend/src/views/DoctorOrders/OrderCard/EtasuPopUp/EtasuPopUp.tsx index c5006c6..0ea16eb 100644 --- a/frontend/src/views/DoctorOrders/OrderCard/EtasuPopUp/EtasuPopUp.tsx +++ b/frontend/src/views/DoctorOrders/OrderCard/EtasuPopUp/EtasuPopUp.tsx @@ -13,14 +13,14 @@ import { useState } from 'react'; type MetRequirements = { name: string; - resource: { - status: string, - moduleUri: string, - resourceType: string, - note: [ { text: string }], + resource: { + status: string; + moduleUri: string; + resourceType: string; + note: [{ text: string }]; subject: { - reference: string - } + reference: string; + }; }; }; @@ -102,7 +102,9 @@ const EtasuPopUp = (props: any) => { .map(etasuElement => ( {etasuElement.name} - {etasuElement.resource.status === 'success' ? '✅' : '❌'} + + {etasuElement.resource.status === 'success' ? '✅' : '❌'} + ))} diff --git a/frontend/src/views/DoctorOrders/OrderCard/OrderCard.tsx b/frontend/src/views/DoctorOrders/OrderCard/OrderCard.tsx index 12bd498..9dda3b0 100644 --- a/frontend/src/views/DoctorOrders/OrderCard/OrderCard.tsx +++ b/frontend/src/views/DoctorOrders/OrderCard/OrderCard.tsx @@ -36,14 +36,14 @@ interface DoctorOrder { dispenseStatus?: string; metRequirements: { name: string; - resource: { - status: string, - moduleUri: string, - resourceType: string, - note: [ { text: string }], + resource: { + status: string; + moduleUri: string; + resourceType: string; + note: [{ text: string }]; subject: { - reference: string - } + reference: string; + }; }; }[]; } From 39a855d5740a1c9a6a3428548559ce1e988a0fde Mon Sep 17 00:00:00 2001 From: Ariel Virgulto Date: Mon, 8 Apr 2024 13:43:53 -0400 Subject: [PATCH 3/3] Update env variable --- backend/env.json | 5 ++--- backend/src/routes/doctorOrders.js | 6 ++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/backend/env.json b/backend/env.json index fb00048..327b4c4 100644 --- a/backend/env.json +++ b/backend/env.json @@ -38,11 +38,10 @@ "default": "admin" }, - "REMS_ADMIN_BASE": { + "REMS_ADMIN_FHIR_URL": { "type": "string", - "default": "http://localhost:8090" + "default": "http://localhost:8090/4_0_0" }, - "HTTPS_KEY_PATH": { "type": "string", "default": "server.key" diff --git a/backend/src/routes/doctorOrders.js b/backend/src/routes/doctorOrders.js index 89ad1b3..5dbc80e 100644 --- a/backend/src/routes/doctorOrders.js +++ b/backend/src/routes/doctorOrders.js @@ -115,11 +115,9 @@ router.patch('/api/updateRx/:id', async (req, res) => { }; // Reaching out to REMS Admin finding by pt name and drug name - // '/etasu/met/patient/:patientFirstName/:patientLastName/:patientDOB/drug/:drugName', + const remsBase = env.REMS_ADMIN_FHIR_URL; - const remsBase = env.REMS_ADMIN_BASE; - - const newUrl = remsBase + '/4_0_0/GuidanceResponse/$rems-etasu'; + const newUrl = remsBase + '/GuidanceResponse/$rems-etasu'; const response = await axios.post(newUrl, body, { headers: {