Skip to content

Commit af5f373

Browse files
authored
Merge pull request #153 from mcode/medication-stu2
CancerRelatedMedication STU2 Updates
2 parents 6726497 + a495d77 commit af5f373

30 files changed

+608
-81
lines changed

config/csv.config.example.json

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,17 @@
5656
}
5757
},
5858
{
59-
"label": "cancerRelatedMedication",
60-
"type": "CSVCancerRelatedMedicationExtractor",
59+
"label": "cancerRelatedMedicationAdministration",
60+
"type": "CSVCancerRelatedMedicationAdministrationExtractor",
6161
"constructorArgs": {
62-
"filePath": "./data/cancer-related-medication-information.csv"
62+
"filePath": "./data/cancer-related-medication-administration-information.csv"
63+
}
64+
},
65+
{
66+
"label": "cancerRelatedMedicationRequest",
67+
"type": "CSVCancerRelatedMedicationRequestExtractor",
68+
"constructorArgs": {
69+
"filePath": "./data/cancer-related-medication-request-information.csv"
6370
}
6471
},
6572
{

docs/CSV_Templates.xlsx

100644100755
6.43 KB
Binary file not shown.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
mrn,requestId,code,codeSystem,displayText,treatmentReasonCode,treatmentReasonCodeSystem,treatmentReasonDisplayText,procedureIntent,status,intent,authoredOn,requesterId
2+
mrn-1,requestId-1,code,code-system,code-text,code,code-system,display-text,procedure-intent-code,status-code,intent-code,YYY-MM-DD,requesterId-1
3+
mrn-2,requestId-2,code,code-system,code-text,code,code-system,display-text,procedure-intent-code,status-code,intent-code,YYY-MM-DD,requesterId-2

src/client/MCODEClient.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ const { BaseClient } = require('./BaseClient');
22
const {
33
CSVAdverseEventExtractor,
44
CSVCancerDiseaseStatusExtractor,
5-
CSVCancerRelatedMedicationExtractor,
5+
CSVCancerRelatedMedicationAdministrationExtractor,
6+
CSVCancerRelatedMedicationRequestExtractor,
67
CSVClinicalTrialInformationExtractor,
78
CSVConditionExtractor,
89
CSVObservationExtractor,
@@ -30,7 +31,8 @@ class MCODEClient extends BaseClient {
3031
this.registerExtractors(
3132
CSVAdverseEventExtractor,
3233
CSVCancerDiseaseStatusExtractor,
33-
CSVCancerRelatedMedicationExtractor,
34+
CSVCancerRelatedMedicationAdministrationExtractor,
35+
CSVCancerRelatedMedicationRequestExtractor,
3436
CSVClinicalTrialInformationExtractor,
3537
CSVConditionExtractor,
3638
CSVObservationExtractor,
@@ -60,7 +62,8 @@ class MCODEClient extends BaseClient {
6062
{ type: 'CSVClinicalTrialInformationExtractor', dependencies: ['CSVPatientExtractor'] },
6163
{ type: 'CSVTreatmentPlanChangeExtractor', dependencies: ['CSVPatientExtractor'] },
6264
{ type: 'CSVStagingExtractor', dependencies: ['CSVPatientExtractor'] },
63-
{ type: 'CSVCancerRelatedMedicationExtractor', dependencies: ['CSVPatientExtractor'] },
65+
{ type: 'CSVCancerRelatedMedicationAdministrationExtractor', dependencies: ['CSVPatientExtractor'] },
66+
{ type: 'CSVCancerRelatedMedicationRequestExtractor', dependencies: ['CSVPatientExtractor'] },
6467
{ type: 'CSVProcedureExtractor', dependencies: ['CSVPatientExtractor'] },
6568
{ type: 'CSVObservationExtractor', dependencies: ['CSVPatientExtractor'] },
6669
{ type: 'CSVAdverseEventExtractor', dependencies: ['CSVPatientExtractor'] },

src/extractors/CSVCancerRelatedMedicationExtractor.js renamed to src/extractors/CSVCancerRelatedMedicationAdministrationExtractor.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const logger = require('../helpers/logger');
77

88

99
function formatData(medicationData, patientId) {
10-
logger.debug('Reformatting cancer-related medication data from CSV into template format');
10+
logger.debug('Reformatting cancer-related medication administration data from CSV into template format');
1111

1212
return medicationData.map((medication) => {
1313
const {
@@ -25,7 +25,7 @@ function formatData(medicationData, patientId) {
2525
} = medication;
2626

2727
if (!(code && codeSystem && status)) {
28-
throw new Error('The cancer-related medication is missing an expected element; code, code system, and status are all required values.');
28+
throw new Error('The cancer-related medication administration is missing an expected element; code, code system, and status are all required values.');
2929
}
3030

3131
return {
@@ -45,20 +45,20 @@ function formatData(medicationData, patientId) {
4545
});
4646
}
4747

48-
class CSVCancerRelatedMedicationExtractor extends BaseCSVExtractor {
48+
class CSVCancerRelatedMedicationAdministrationExtractor extends BaseCSVExtractor {
4949
constructor({ filePath, url }) {
5050
super({ filePath, url });
5151
}
5252

5353
async getMedicationData(mrn) {
54-
logger.debug('Getting Cancer Related Medication Data');
54+
logger.debug('Getting Cancer Related Medication Administration Data');
5555
return this.csvModule.get('mrn', mrn);
5656
}
5757

5858
async get({ mrn, context }) {
5959
const medicationData = await this.getMedicationData(mrn);
6060
if (medicationData.length === 0) {
61-
logger.warn('No medication data found for patient');
61+
logger.warn('No medication administration data found for patient');
6262
return getEmptyBundle();
6363
}
6464
const patientId = getPatientFromContext(context).id;
@@ -67,10 +67,10 @@ class CSVCancerRelatedMedicationExtractor extends BaseCSVExtractor {
6767
const formattedData = formatData(medicationData, patientId);
6868

6969
// Fill templates
70-
return generateMcodeResources('CancerRelatedMedication', formattedData);
70+
return generateMcodeResources('CancerRelatedMedicationAdministration', formattedData);
7171
}
7272
}
7373

7474
module.exports = {
75-
CSVCancerRelatedMedicationExtractor,
75+
CSVCancerRelatedMedicationAdministrationExtractor,
7676
};
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
const { BaseCSVExtractor } = require('./BaseCSVExtractor');
2+
const { generateMcodeResources } = require('../templates');
3+
const { getPatientFromContext } = require('../helpers/contextUtils');
4+
const { getEmptyBundle } = require('../helpers/fhirUtils');
5+
const { formatDateTime } = require('../helpers/dateUtils');
6+
const logger = require('../helpers/logger');
7+
8+
9+
function formatData(medicationData, patientId) {
10+
logger.debug('Reformatting cancer-related medication request data from CSV into template format');
11+
12+
return medicationData.map((medication) => {
13+
const {
14+
requestid: requestId,
15+
code,
16+
codesystem: codeSystem,
17+
displaytext: displayText,
18+
treatmentreasoncode: treatmentReasonCode,
19+
treatmentreasoncodesystem: treatmentReasonCodeSystem,
20+
treatmentreasondisplaytext: treatmentReasonDisplayText,
21+
procedureintent: procedureIntent,
22+
status,
23+
intent,
24+
authoredon: authoredOn,
25+
requesterid: requesterId,
26+
} = medication;
27+
28+
if (!(code && codeSystem && status && intent && requesterId && authoredOn)) {
29+
throw new Error('The cancer-related medication request is missing an expected element; code, code system, status, authoredOn, requesterId, and intent are all required values.');
30+
}
31+
32+
return {
33+
...(requestId && { id: requestId }),
34+
subjectId: patientId,
35+
code,
36+
codeSystem,
37+
displayText,
38+
treatmentReasonCode,
39+
treatmentReasonCodeSystem,
40+
treatmentReasonDisplayText,
41+
procedureIntent,
42+
status,
43+
intent,
44+
authoredOn: formatDateTime(authoredOn),
45+
requesterId,
46+
};
47+
});
48+
}
49+
50+
class CSVCancerRelatedMedicationRequestExtractor extends BaseCSVExtractor {
51+
constructor({ filePath, url }) {
52+
super({ filePath, url });
53+
}
54+
55+
async getMedicationData(mrn) {
56+
logger.debug('Getting Cancer Related Medication Request Data');
57+
return this.csvModule.get('mrn', mrn);
58+
}
59+
60+
async get({ mrn, context }) {
61+
const medicationData = await this.getMedicationData(mrn);
62+
if (medicationData.length === 0) {
63+
logger.warn('No medication request data found for patient');
64+
return getEmptyBundle();
65+
}
66+
const patientId = getPatientFromContext(context).id;
67+
68+
// Reformat data
69+
const formattedData = formatData(medicationData, patientId);
70+
71+
// Fill templates
72+
return generateMcodeResources('CancerRelatedMedicationRequest', formattedData);
73+
}
74+
}
75+
76+
module.exports = {
77+
CSVCancerRelatedMedicationRequestExtractor,
78+
};

src/extractors/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
const { BaseFHIRExtractor } = require('./BaseFHIRExtractor');
22
const { CSVAdverseEventExtractor } = require('./CSVAdverseEventExtractor');
33
const { CSVCancerDiseaseStatusExtractor } = require('./CSVCancerDiseaseStatusExtractor');
4-
const { CSVCancerRelatedMedicationExtractor } = require('./CSVCancerRelatedMedicationExtractor');
4+
const { CSVCancerRelatedMedicationAdministrationExtractor } = require('./CSVCancerRelatedMedicationAdministrationExtractor');
5+
const { CSVCancerRelatedMedicationRequestExtractor } = require('./CSVCancerRelatedMedicationRequestExtractor');
56
const { CSVClinicalTrialInformationExtractor } = require('./CSVClinicalTrialInformationExtractor');
67
const { CSVConditionExtractor } = require('./CSVConditionExtractor');
78
const { CSVObservationExtractor } = require('./CSVObservationExtractor');
@@ -27,7 +28,8 @@ module.exports = {
2728
BaseFHIRExtractor,
2829
CSVAdverseEventExtractor,
2930
CSVCancerDiseaseStatusExtractor,
30-
CSVCancerRelatedMedicationExtractor,
31+
CSVCancerRelatedMedicationAdministrationExtractor,
32+
CSVCancerRelatedMedicationRequestExtractor,
3133
CSVClinicalTrialInformationExtractor,
3234
CSVConditionExtractor,
3335
CSVObservationExtractor,

src/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ const {
1212
BaseFHIRExtractor,
1313
CSVAdverseEventExtractor,
1414
CSVCancerDiseaseStatusExtractor,
15-
CSVCancerRelatedMedicationExtractor,
15+
CSVCancerRelatedMedicationAdministrationExtractor,
16+
CSVCancerRelatedMedicationRequestExtractor,
1617
CSVClinicalTrialInformationExtractor,
1718
CSVConditionExtractor,
1819
CSVObservationExtractor,
@@ -85,7 +86,8 @@ module.exports = {
8586
BaseFHIRModule,
8687
CSVAdverseEventExtractor,
8788
CSVCancerDiseaseStatusExtractor,
88-
CSVCancerRelatedMedicationExtractor,
89+
CSVCancerRelatedMedicationAdministrationExtractor,
90+
CSVCancerRelatedMedicationRequestExtractor,
8991
CSVClinicalTrialInformationExtractor,
9092
CSVConditionExtractor,
9193
CSVFileModule,
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
const {
2-
coding,
32
dataAbsentReasonExtension,
43
extensionArr,
5-
reference,
64
valueX,
5+
medicationTemplate,
6+
subjectTemplate,
7+
treatmentReasonTemplate,
78
} = require('./snippets');
89
const { ifAllArgsObj } = require('../helpers/templateUtils');
910

@@ -14,21 +15,6 @@ function treatmentIntentTemplate({ treatmentIntent }) {
1415
};
1516
}
1617

17-
function medicationTemplate({ code, codeSystem, displayText }) {
18-
return {
19-
medicationCodeableConcept: {
20-
coding: [coding({ system: codeSystem, code, display: displayText }),
21-
],
22-
},
23-
};
24-
}
25-
26-
function subjectTemplate({ id }) {
27-
return {
28-
subject: reference({ id, resourceType: 'Patient' }),
29-
};
30-
}
31-
3218
function periodTemplate({ startDate, endDate }) {
3319
// If start and end date are not provided, indicate data absent with extension.
3420
if (!startDate && !endDate) {
@@ -45,19 +31,7 @@ function periodTemplate({ startDate, endDate }) {
4531
};
4632
}
4733

48-
function treatmentReasonTemplate({ treatmentReasonCode, treatmentReasonCodeSystem, treatmentReasonDisplayText }) {
49-
return {
50-
reasonCode: [
51-
{
52-
coding: [coding({ system: treatmentReasonCodeSystem, code: treatmentReasonCode, display: treatmentReasonDisplayText }),
53-
],
54-
},
55-
],
56-
};
57-
}
58-
59-
60-
function cancerRelatedMedicationTemplate({
34+
function cancerRelatedMedicationAdministrationTemplate({
6135
subjectId,
6236
id,
6337
code,
@@ -72,15 +46,15 @@ function cancerRelatedMedicationTemplate({
7246
status,
7347
}) {
7448
if (!(subjectId && code && codeSystem && status)) {
75-
throw Error('Trying to render a CancerRelatedMedicationTemplate, but a required argument is missing; ensure that subjectId, code, code system, and status are all present');
49+
throw Error('Trying to render a CancerRelatedMedicationAdministrationTemplate, but a required argument is missing; ensure that subjectId, code, code system, and status are all present');
7650
}
7751

7852
return {
79-
resourceType: 'MedicationStatement',
53+
resourceType: 'MedicationAdministration',
8054
id,
8155
meta: {
8256
profile: [
83-
'http://hl7.org/fhir/us/mcode/StructureDefinition/mcode-cancer-related-medication-statement',
57+
'http://hl7.org/fhir/us/mcode/StructureDefinition/mcode-cancer-related-medication-administration',
8458
],
8559
},
8660
...extensionArr(ifAllArgsObj(treatmentIntentTemplate)({ treatmentIntent })),
@@ -93,5 +67,5 @@ function cancerRelatedMedicationTemplate({
9367
}
9468

9569
module.exports = {
96-
cancerRelatedMedicationTemplate,
70+
cancerRelatedMedicationAdministrationTemplate,
9771
};

0 commit comments

Comments
 (0)