From 5631214d404b6f445a88e8b1060ff46b30cf45ba Mon Sep 17 00:00:00 2001 From: Patrick LaRocque Date: Thu, 15 Feb 2024 00:46:12 -0500 Subject: [PATCH] Create the MedicationDispense when sending NewRx. Add button to clean up existing MedicationDispenses. --- src/components/RequestBox/RequestBox.js | 27 +++++++----- src/components/SettingsBox/SettingsBox.js | 52 ++++++++++++++++++++--- src/util/fhir.js | 19 ++++++++- 3 files changed, 81 insertions(+), 17 deletions(-) diff --git a/src/components/RequestBox/RequestBox.js b/src/components/RequestBox/RequestBox.js index 53627c31..482a284c 100644 --- a/src/components/RequestBox/RequestBox.js +++ b/src/components/RequestBox/RequestBox.js @@ -2,13 +2,11 @@ import { Button, ButtonGroup } from '@mui/material'; import _ from 'lodash'; import React, { Component } from 'react'; import buildNewRxRequest from '../../util/buildScript.2017071.js'; -import PersonIcon from '@mui/icons-material/Person'; import MuiAlert from '@mui/material/Alert'; import Snackbar from '@mui/material/Snackbar'; -import { defaultValues, shortNameMap } from '../../util/data'; -import { getAge } from '../../util/fhir'; +import { shortNameMap } from '../../util/data'; +import { getAge, createMedicationDispenseFromMedicationRequest } from '../../util/fhir'; import { retrieveLaunchContext } from '../../util/util'; -import InProgressFormBox from './InProgressFormBox/InProgressFormBox.js'; import './request.css'; export default class RequestBox extends Component { @@ -35,8 +33,6 @@ export default class RequestBox extends Component { this.submitOrderSign(request); } - componentDidMount() { } - prepPrefetch() { const preppedResources = new Map(); Object.keys(this.props.prefetchedResources).forEach(resourceKey => { @@ -257,9 +253,8 @@ export default class RequestBox extends Component { /** * Relaunch DTR using the available context */ - relaunch = e => { + relaunch = () => { this.buildLaunchLink().then(link => { - //e.preventDefault(); window.open(link.url, '_blank'); }); }; @@ -317,7 +312,7 @@ export default class RequestBox extends Component { /** * Send NewRx for new Medication to the Pharmacy Information System (PIMS) */ - sendRx = e => { + sendRx = () => { console.log('Sending NewRx to: ' + this.props.pimsUrl); // build the NewRx Message @@ -344,7 +339,19 @@ export default class RequestBox extends Component { }) .then(response => { console.log('Successfully sent NewRx to PIMS'); - console.log(response); + + // create the MedicationDispense + var medicationDispense = createMedicationDispenseFromMedicationRequest(this.props.request); + console.log('Create MedicationDispense:'); + console.log(medicationDispense); + + // store the MedicationDispense in the EHR + console.log(medicationDispense); + this.props.client.update(medicationDispense).then(result => { + console.log('Update MedicationDispense result:'); + console.log(result); + }); + this.handleRxResponse(); }) .catch(error => { diff --git a/src/components/SettingsBox/SettingsBox.js b/src/components/SettingsBox/SettingsBox.js index 29192dd9..f12a3487 100644 --- a/src/components/SettingsBox/SettingsBox.js +++ b/src/components/SettingsBox/SettingsBox.js @@ -1,16 +1,51 @@ import React, { Component } from 'react'; import './SettingsBox.css'; -import InputBox from '../Inputs/InputBox'; import Checkbox from '@mui/material/Checkbox'; import { headerDefinitions, types } from '../../util/data'; import FHIR from 'fhirclient'; import { Box, Button, FormControlLabel, Grid, TextField } from '@mui/material'; -import CloseIcon from '@mui/icons-material/Close'; + +const clearMedicationDispenses = + ({ ehrUrl, access_token }, consoleLog) => + () => { + console.log( + 'Clear MedicationDispenses from the EHR: ' + ehrUrl + ); + const client = FHIR.client({ + serverUrl: ehrUrl, + ...(access_token ? { tokenResponse: access_token } : {}) + }); + client + .request('MedicationDispense', { flat: true }) + .then(result => { + console.log(result); + result.forEach(resource => { + console.log(resource.id); + client + .delete('MedicationDispense/' + resource.id) + .then(result => { + consoleLog( + 'Successfully deleted MedicationDispense ' + resource.id + ' from EHR', + types.info + ); + console.log(result); + }) + .catch(e => { + console.log('Failed to delete MedicationDispense ' + resource.id); + console.log(e); + }); + }); + }) + .catch(e => { + console.log('Failed to retrieve list of MedicationDispense'); + console.log(e); + }); + }; const clearQuestionnaireResponses = ({ ehrUrl, defaultUser, access_token }, consoleLog) => - _event => { + () => { console.log( 'Clear QuestionnaireResponses from the EHR: ' + ehrUrl + ' for author ' + defaultUser ); @@ -47,7 +82,7 @@ const clearQuestionnaireResponses = const resetPims = ({ pimsUrl }, consoleLog) => - _event => { + () => { let url = new URL(pimsUrl); const resetUrl = url.origin + '/doctorOrders/api/deleteAll'; console.log('reset pims: ' + resetUrl); @@ -70,7 +105,7 @@ const resetPims = const resetRemsAdmin = ({ cdsUrl }, consoleLog) => - _event => { + () => { let url = new URL(cdsUrl); const resetUrl = url.origin + '/etasu/reset'; @@ -96,6 +131,11 @@ const resetHeaderDefinitions = [ key: 'clearQuestionnaireResponses', reset: clearQuestionnaireResponses }, + { + display: 'Clear EHR MedicationDispenses', + key: 'clearMedicationDispenses', + reset: clearMedicationDispenses + }, { display: 'Reset PIMS Database', key: 'resetPims', @@ -211,7 +251,7 @@ export default class SettingsBox extends Component { })} {resetHeaderDefinitions.map(({ key, display, reset }) => { return ( - + diff --git a/src/util/fhir.js b/src/util/fhir.js index d0f5eb0b..6c2ae3c9 100644 --- a/src/util/fhir.js +++ b/src/util/fhir.js @@ -1,3 +1,4 @@ + function fhir(resource, ehrUrl, patient, auth) { const headers = { 'Content-Type': 'application/json' @@ -62,4 +63,20 @@ function getDrugCodeFromMedicationRequest(medicationRequest) { return codeableConcept?.coding?.[0]; } -export { fhir, getAge, getDrugCodeableConceptFromMedicationRequest, getDrugCodeFromMedicationRequest }; +function createMedicationDispenseFromMedicationRequest(medicationRequest) { + console.log('createMedicationDispenseFromMedicationRequest'); + var medicationDispense = {}; + medicationDispense.resourceType = 'MedicationDispense'; + medicationDispense.id = medicationRequest?.id + '-dispense'; + medicationDispense.status = 'unknown'; + if (medicationRequest.medicationCodeableConcept) { + medicationDispense.medicationCodeableConcept = medicationRequest.medicationCodeableConcept; + } else if (medicationRequest.medicationReference) { + medicationDispense.medicationReference = medicationRequest.medicationReference; + } + medicationDispense.subject = medicationRequest.subject; + medicationDispense.authorizingPrescription = [ { 'reference': 'MedicationRequest/' + medicationRequest.id } ]; + return medicationDispense; +} + +export { fhir, getAge, getDrugCodeableConceptFromMedicationRequest, getDrugCodeFromMedicationRequest, createMedicationDispenseFromMedicationRequest };