diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/VersionConvertor_10_40.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/VersionConvertor_10_40.java index 7662e0e98..431207402 100644 --- a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/VersionConvertor_10_40.java +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/VersionConvertor_10_40.java @@ -37,6 +37,7 @@ import org.hl7.fhir.convertors.conv10_40.ImplementationGuide10_40; import org.hl7.fhir.convertors.conv10_40.List10_40; import org.hl7.fhir.convertors.conv10_40.Location10_40; import org.hl7.fhir.convertors.conv10_40.MedicationDispense10_40; +import org.hl7.fhir.convertors.conv10_40.MedicationRequest10_40; import org.hl7.fhir.convertors.conv10_40.MedicationStatement10_40; import org.hl7.fhir.convertors.conv10_40.MessageHeader10_40; import org.hl7.fhir.convertors.conv10_40.NamingSystem10_40; @@ -3239,6 +3240,8 @@ public class VersionConvertor_10_40 { return MedicationDispense10_40.convertMedicationDispense((org.hl7.fhir.dstu2.model.MedicationDispense) src); if (src instanceof org.hl7.fhir.dstu2.model.MedicationStatement) return MedicationStatement10_40.convertMedicationStatement((org.hl7.fhir.dstu2.model.MedicationStatement) src); + if (src instanceof org.hl7.fhir.dstu2.model.MedicationOrder) + return MedicationRequest10_40.convertMedicationRequest((org.hl7.fhir.dstu2.model.MedicationOrder) src); if (src instanceof org.hl7.fhir.dstu2.model.MessageHeader) return MessageHeader10_40.convertMessageHeader((org.hl7.fhir.dstu2.model.MessageHeader) src); if (src instanceof org.hl7.fhir.dstu2.model.NamingSystem) diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv10_40/MedicationRequest10_40.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv10_40/MedicationRequest10_40.java new file mode 100644 index 000000000..25e745d33 --- /dev/null +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv10_40/MedicationRequest10_40.java @@ -0,0 +1,98 @@ +package org.hl7.fhir.convertors.conv10_40; + +import org.hl7.fhir.convertors.VersionConvertor_10_40; +import org.hl7.fhir.dstu2.model.MedicationOrder; +import org.hl7.fhir.dstu3.model.MedicationRequest; +import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.r4.model.Dosage; + +public class MedicationRequest10_40 { + public static org.hl7.fhir.r4.model.MedicationRequest convertMedicationRequest(org.hl7.fhir.dstu2.model.MedicationOrder src) throws FHIRException { + if (src == null) + return null; + org.hl7.fhir.r4.model.MedicationRequest tgt = new org.hl7.fhir.r4.model.MedicationRequest(); + VersionConvertor_10_40.copyDomainResource(src, tgt); + tgt.setIntent(org.hl7.fhir.r4.model.MedicationRequest.MedicationRequestIntent.ORDER); + for (org.hl7.fhir.dstu2.model.Identifier identifier : src.getIdentifier()) tgt.addIdentifier(VersionConvertor_10_40.convertIdentifier(identifier)); + if (src.hasDateWritten()) + tgt.setAuthoredOn(src.getDateWritten()); + if (src.hasStatus()) + tgt.setStatus(org.hl7.fhir.r4.model.MedicationRequest.MedicationRequestStatus.fromCode(src.getStatus().toCode())); + if (src.hasPatient()) + tgt.setSubject(VersionConvertor_10_40.convertReference(src.getPatient())); + if (src.hasPrescriber()) + tgt.setRequester(VersionConvertor_10_40.convertReference(src.getPrescriber())); + if (src.hasReasonCodeableConcept()) + tgt.addReasonCode(VersionConvertor_10_40.convertCodeableConcept(src.getReasonCodeableConcept())); + if (src.hasReasonReference()) + tgt.addReasonReference(VersionConvertor_10_40.convertReference((src.getReasonReference()))); + if (src.hasNote()) + tgt.addNote(new org.hl7.fhir.r4.model.Annotation(new org.hl7.fhir.r4.model.MarkdownType((src.getNote())))); + if (src.hasMedicationCodeableConcept()) + tgt.setMedication(VersionConvertor_10_40.convertCodeableConcept(src.getMedicationCodeableConcept())); + if (src.hasMedicationReference()) + tgt.setMedication(VersionConvertor_10_40.convertReference(src.getMedicationReference())); + for (MedicationOrder.MedicationOrderDosageInstructionComponent dosage : src.getDosageInstruction()) + tgt.addDosageInstruction(medDosageInstruction(dosage)); + if (src.hasDispenseRequest()) + tgt.setDispenseRequest(medDispenseRequest(src.getDispenseRequest())); + if (src.hasSubstitution()) + tgt.setSubstitution(medSubstitution(src.getSubstitution())); + if (src.hasPriorPrescription()) + tgt.setPriorPrescription(VersionConvertor_10_40.convertReference(src.getPriorPrescription())); + return tgt; + } + + private static org.hl7.fhir.r4.model.Dosage medDosageInstruction(org.hl7.fhir.dstu2.model.MedicationOrder.MedicationOrderDosageInstructionComponent src) { + if (src == null || src.isEmpty()) + return null; + org.hl7.fhir.r4.model.Dosage tgt = new org.hl7.fhir.r4.model.Dosage(); + if (src.hasText()) + tgt.setText(src.getText()); + if (src.hasAdditionalInstructions()) + tgt.addAdditionalInstruction(VersionConvertor_10_40.convertCodeableConcept(src.getAdditionalInstructions())); + if (src.hasTiming()) + tgt.setTiming(VersionConvertor_10_40.convertTiming(src.getTiming())); + if (src.hasAsNeeded()) + tgt.setAsNeeded(VersionConvertor_10_40.convertType(src.getAsNeeded())); + if (src.hasSiteCodeableConcept()) + tgt.setSite(VersionConvertor_10_40.convertCodeableConcept(src.getSiteCodeableConcept())); + if (src.hasRoute()) + tgt.setRoute(VersionConvertor_10_40.convertCodeableConcept(src.getRoute())); + if (src.hasMethod()) + tgt.setMethod(VersionConvertor_10_40.convertCodeableConcept(src.getMethod())); + Dosage.DosageDoseAndRateComponent dose_and_rate = new Dosage.DosageDoseAndRateComponent(); + if (src.hasDose()) + dose_and_rate.setDose(VersionConvertor_10_40.convertType(src.getDose())); + if (src.hasRate()) + dose_and_rate.setDose(VersionConvertor_10_40.convertType(src.getRate())); + tgt.addDoseAndRate(dose_and_rate); + if (src.hasMaxDosePerPeriod()) + tgt.setMaxDosePerPeriod(VersionConvertor_10_40.convertRatio(src.getMaxDosePerPeriod())); + return tgt; + } + + private static org.hl7.fhir.r4.model.MedicationRequest.MedicationRequestDispenseRequestComponent medDispenseRequest(org.hl7.fhir.dstu2.model.MedicationOrder.MedicationOrderDispenseRequestComponent src) { + if (src == null || src.isEmpty()) + return null; + org.hl7.fhir.r4.model.MedicationRequest.MedicationRequestDispenseRequestComponent tgt = new org.hl7.fhir.r4.model.MedicationRequest.MedicationRequestDispenseRequestComponent(); + if (src.hasValidityPeriod()) + tgt.setValidityPeriod(VersionConvertor_10_40.convertPeriod(src.getValidityPeriod())); + if (src.hasNumberOfRepeatsAllowed()) + tgt.setNumberOfRepeatsAllowed(src.getNumberOfRepeatsAllowed()); + if (src.hasQuantity()) + tgt.setQuantity(VersionConvertor_10_40.convertSimpleQuantity(src.getQuantity())); + if (src.hasExpectedSupplyDuration()) + tgt.setExpectedSupplyDuration(VersionConvertor_10_40.convertDuration(src.getExpectedSupplyDuration())); + return tgt; + } + + private static org.hl7.fhir.r4.model.MedicationRequest.MedicationRequestSubstitutionComponent medSubstitution(org.hl7.fhir.dstu2.model.MedicationOrder.MedicationOrderSubstitutionComponent src) { + if (src == null || src.isEmpty()) + return null; + org.hl7.fhir.r4.model.MedicationRequest.MedicationRequestSubstitutionComponent tgt = new org.hl7.fhir.r4.model.MedicationRequest.MedicationRequestSubstitutionComponent(); + if (src.hasReason()) + tgt.setReason(VersionConvertor_10_40.convertCodeableConcept(src.getReason())); + return tgt; + } +} diff --git a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv30_40/MedicationRequest30_40.java b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv30_40/MedicationRequest30_40.java index 03a47a3ac..a1e43f08b 100644 --- a/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv30_40/MedicationRequest30_40.java +++ b/org.hl7.fhir.convertors/src/main/java/org/hl7/fhir/convertors/conv30_40/MedicationRequest30_40.java @@ -43,8 +43,14 @@ public class MedicationRequest30_40 { tgt.setPriorPrescription(VersionConvertor_30_40.convertReference(src.getPriorPrescription())); for (org.hl7.fhir.dstu3.model.Reference t : src.getDetectedIssue()) tgt.addDetectedIssue(VersionConvertor_30_40.convertReference(t)); for (org.hl7.fhir.dstu3.model.Reference t : src.getEventHistory()) tgt.addEventHistory(VersionConvertor_30_40.convertReference(t)); - if (src.hasRequester() && src.getRequester().hasAgent()) { - tgt.setRequester(VersionConvertor_30_40.convertReference(src.getRequester().getAgent())); + if (src.hasRequester()) { + if (src.getRequester().hasAgent()) { + tgt.setRequester(VersionConvertor_30_40.convertReference(src.getRequester().getAgent())); + } + if (src.getRequester().hasOnBehalfOf()) { + tgt.addExtension("http://hl7.org/fhir/3.0/StructureDefinition/extension-MedicationRequest.requester.onBehalfOf", + VersionConvertor_30_40.convertReference(src.getRequester().getOnBehalfOf())); + } } return tgt; } diff --git a/org.hl7.fhir.convertors/src/test/java/org/hl7/fhir/convertors/conv10_40/MedicationRequest10_40Test.java b/org.hl7.fhir.convertors/src/test/java/org/hl7/fhir/convertors/conv10_40/MedicationRequest10_40Test.java new file mode 100644 index 000000000..2972bbf51 --- /dev/null +++ b/org.hl7.fhir.convertors/src/test/java/org/hl7/fhir/convertors/conv10_40/MedicationRequest10_40Test.java @@ -0,0 +1,31 @@ +package org.hl7.fhir.convertors.conv10_40; + +import org.hl7.fhir.convertors.VersionConvertorAdvisor40; +import org.hl7.fhir.convertors.VersionConvertor_10_40; +import org.hl7.fhir.convertors.misc.IGR2ConvertorAdvisor; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.InputStream; + +public class MedicationRequest10_40Test { + @Test + @DisplayName("Test 10_40 MedicationRequest conversion") + public void testMedicationRequestConversion() throws IOException { + InputStream dstu2_input = this.getClass().getResourceAsStream("/0_medication_request_10.json"); + InputStream r4_exepected_input = this.getClass().getResourceAsStream("/0_medication_request_40.json"); + + org.hl7.fhir.dstu2.model.MedicationOrder dstu2 = (org.hl7.fhir.dstu2.model.MedicationOrder) new org.hl7.fhir.dstu2.formats.JsonParser().parse(dstu2_input); + VersionConvertorAdvisor40 advisor = new IGR2ConvertorAdvisor(); + org.hl7.fhir.r4.model.Resource r4_actual = VersionConvertor_10_40.convertResource(dstu2, advisor); + + org.hl7.fhir.r4.formats.JsonParser r4_parser = new org.hl7.fhir.r4.formats.JsonParser(); + org.hl7.fhir.r4.model.Resource r4_expected = r4_parser.parse(r4_exepected_input); + + Assertions.assertTrue(r4_expected.equalsDeep(r4_actual), + "Failed comparing\n" + r4_parser.composeString(r4_actual) + "\nand\n" + r4_parser.composeString(r4_expected)); + } + +} diff --git a/org.hl7.fhir.convertors/src/test/resources/0_medication_request_10.json b/org.hl7.fhir.convertors/src/test/resources/0_medication_request_10.json new file mode 100644 index 000000000..15be241c9 --- /dev/null +++ b/org.hl7.fhir.convertors/src/test/resources/0_medication_request_10.json @@ -0,0 +1,37 @@ +{"resourceType": "MedicationOrder", + "dateWritten": "2016-11-13", + "status": "active", + "id": "T5YI1tCzs--JEvCICFbx8zgB", + "identifier": [{"use": "usual", + "system": "urn:oid:1.2.840.114350.1.13.0.1.7.2.798268", + "value": "988736"}, + {"use": "usual", + "system": "urn:oid:1.2.840.114350.1.13.0.1.7.3.798268.801", + "value": "988736:2150291843"}], + "patient": {"display": "Jason Argonaut", + "reference": "https://open-ic.epic.com/Argonaut/api/FHIR/DSTU2/Patient/Tbt3KuCY0B5PSrJvCu2j-PlK.aiHsu2xUjUM8bWpetXoB"}, + "prescriber": {"display": "Historical Provider, MD", + "reference": "https://open-ic.epic.com/Argonaut/api/FHIR/DSTU2/Practitioner/T-kmjPGEVPAmnBfmx56HsKgB"}, + "medicationReference": {"display": "amitriptyline 10 MG tablet", + "reference": "https://open-ic.epic.com/Argonaut/api/FHIR/DSTU2/Medication/T0eKLT7EB2ApMM8HCEURdMAB"}, + "dosageInstruction": [{"text": "Take 10 mg by mouth nightly.", + "asNeededBoolean": "False", + "route": {"text": "Oral", + "coding": [{"system": "urn:oid:1.2.840.114350.1.13.0.1.7.4.698288.330", + "code": "15", + "display": "Oral"}]}, + "method": {"text": "Take", + "coding": [{"system": "urn:oid:1.2.840.114350.1.13.0.1.7.4.798268.8600", + "code": "11", + "display": "Take"}]}, + "timing": {"repeat": {"frequency": 1, + "period": 1.0, + "periodUnits": "d", + "boundsPeriod": {"start": "2016-11-15T00:00:00Z", + "end": "2016-11-23T00:00:00Z"}}}, + "doseQuantity": {"value": 10.0, + "unit": "mg", + "code": "mg", + "system": "http://unitsofmeasure.org"}}], + "dispenseRequest": {"validityPeriod": {"start": "2016-11-15T00:00:00Z", + "end": "2016-11-23T00:00:00Z"}}} diff --git a/org.hl7.fhir.convertors/src/test/resources/0_medication_request_40.json b/org.hl7.fhir.convertors/src/test/resources/0_medication_request_40.json new file mode 100644 index 000000000..325b59a1a --- /dev/null +++ b/org.hl7.fhir.convertors/src/test/resources/0_medication_request_40.json @@ -0,0 +1,40 @@ +{"resourceType": "MedicationRequest", + "id": "T5YI1tCzs--JEvCICFbx8zgB", + "identifier": [{"use": "usual", + "system": "urn:oid:1.2.840.114350.1.13.0.1.7.2.798268", + "value": "988736"}, + {"use": "usual", + "system": "urn:oid:1.2.840.114350.1.13.0.1.7.3.798268.801", + "value": "988736:2150291843"}], + "status": "active", + "intent": "order", + "medicationReference": {"reference": "https://open-ic.epic.com/Argonaut/api/FHIR/DSTU2/Medication/T0eKLT7EB2ApMM8HCEURdMAB", + "display": "amitriptyline 10 MG tablet"}, + "subject": {"reference": "https://open-ic.epic.com/Argonaut/api/FHIR/DSTU2/Patient/Tbt3KuCY0B5PSrJvCu2j-PlK.aiHsu2xUjUM8bWpetXoB", + "display": "Jason Argonaut"}, + "authoredOn": "2016-11-13T00:00:00", + "requester": {"reference": "https://open-ic.epic.com/Argonaut/api/FHIR/DSTU2/Practitioner/T-kmjPGEVPAmnBfmx56HsKgB", + "display": "Historical Provider, MD"}, + "dosageInstruction": [{"text": "Take 10 mg by mouth nightly.", + "timing": {"repeat": {"boundsPeriod": {"start": "2016-11-15T00:00:00Z", + "end": "2016-11-23T00:00:00Z"}, + "count": 0, + "frequency": 1, + "frequencyMax": 0, + "period": 1.0, + "periodUnit": "d"}}, + "asNeededBoolean": "False", + "route": {"coding": [{"system": "urn:oid:1.2.840.114350.1.13.0.1.7.4.698288.330", + "code": "15", + "display": "Oral"}], + "text": "Oral"}, + "method": {"coding": [{"system": "urn:oid:1.2.840.114350.1.13.0.1.7.4.798268.8600", + "code": "11", + "display": "Take"}], + "text": "Take"}, + "doseAndRate": [{"doseQuantity": {"value": 10.0, + "unit": "mg", + "system": "http://unitsofmeasure.org", + "code": "mg"}}]}], + "dispenseRequest": {"validityPeriod": {"start": "2016-11-15T00:00:00Z", + "end": "2016-11-23T00:00:00Z"}}}