Search in sources :

Example 1 with PatientLinkComponent

use of org.hl7.fhir.r4.model.Patient.PatientLinkComponent in project hl7v2-fhir-converter by LinuxForHealth.

the class HL7MergeFHIRConversionTest method validateHappyPathADT_A34WithMRG.

// Test ADT_A34 with one MRG segment (the most it supports).
@Test
void validateHappyPathADT_A34WithMRG() {
    String hl7message = "MSH|^~\\&|SENDING_APPLICATION|SENDING_FACILITY|RECEIVING_APPLICATION|RECEIVING_FACILITY|||ADT^A34||P|2.3||||\r" + "EVN|A40|20110613122406637||01\r" + // Identifier value 234 with no system and no identifier type
    "PID|1||123^^^^MR||||||||||||||||||||||||||||||||||||\r" + // Identifier value 456 with no system and no identifier type
    "MRG|456||||||\r";
    // Convert hl7 message
    List<BundleEntryComponent> e = ResourceUtils.createFHIRBundleFromHL7MessageReturnEntryList(ftv, hl7message);
    // Find the patient resources in the FHIR bundle.
    List<Resource> patientResources = ResourceUtils.getResourceList(e, ResourceType.Patient);
    // There should be 2 - One for the PID segment and one for the MRG segment
    assertThat(patientResources).hasSize(2);
    // Get first patient and associated identifiers and id.
    Patient patientOne = PatientUtils.getPatientFromResource(patientResources.get(0));
    String patientOneId = patientOne.getId();
    List<Identifier> patientOneIdentifierList = patientOne.getIdentifier();
    // Get second patient and associated identifiers and id.
    Patient patientTwo = PatientUtils.getPatientFromResource(patientResources.get(1));
    String patientTwoId = patientTwo.getId();
    List<Identifier> patientTwoIdentifierList = patientTwo.getIdentifier();
    /*-----------Verify Patient One-----------*/
    // Verify patient one's identifier is set correctly (this is the patient build
    // from the PID segment)
    // 
    // "identifier":[
    // {
    // "type":{
    // "coding":[
    // {
    // "system":"http://terminology.hl7.org/CodeSystem/v2-0203",
    // "code":"MR",
    // "display":"Medical record number"
    // }
    // ]
    // },
    // "value":"123"
    // },
    // {
    // "use":"old",
    // "value":"456"
    // }
    // ]
    // Verify the patient has two identifiers
    assertThat(patientOneIdentifierList).hasSize(2);
    // Verify the identifier values are correct.
    assertThat(patientOneIdentifierList.get(0).getValue()).isEqualTo("123");
    assertThat(patientOneIdentifierList.get(1).getValue()).isEqualTo("456");
    // Verify the system values are not present
    assertThat(patientOneIdentifierList.get(0).getSystem()).isNull();
    assertThat(patientOneIdentifierList.get(1).getSystem()).isNull();
    // Verify the first identifier has no use field.
    assertThat(patientOneIdentifierList.get(0).getUse()).isNull();
    // Verify the second identifier is marked as old
    assertThat(patientOneIdentifierList.get(1).getUse()).isEqualTo(Identifier.IdentifierUse.OLD);
    // Verify identifier type is set correctly for the first identifier
    CodeableConcept patientOneIdentifierType = patientOneIdentifierList.get(0).getType();
    assertThat(patientOneIdentifierType.getCoding().get(0).getSystem()).isEqualTo("http://terminology.hl7.org/CodeSystem/v2-0203");
    assertThat(patientOneIdentifierType.getCoding().get(0).getDisplay()).isEqualTo("Medical record number");
    assertThat(patientOneIdentifierType.getCoding().get(0).getCode()).isEqualTo("MR");
    // Verify the identifier type for the second identifier is not present.
    assertThat(patientOneIdentifierList.get(1).getType().getCoding()).isEmpty();
    // Verify first patient has these fields
    // 
    // "active":true,
    // "link":[
    // {
    // "other":{
    // "reference":"Patient/expiringID-MRG"
    // },
    // "type":"replaces"
    // }
    // ]
    // The first patient should be active.
    assertThat(patientOne.getActive()).isTrue();
    // Verify link.other.reference references the MRG (2nd) patient with of a type of 'replaces'
    PatientLinkComponent linkOne = patientOne.getLink().get(0);
    assertThat(linkOne.getType()).isEqualTo(Patient.LinkType.REPLACES);
    assertThat(linkOne.getOther().getReference()).isEqualTo(patientTwoId);
    /*-----------Verify Patient Two-----------*/
    // Verify patient two's identifier is set correctly (this is the patient build
    // from the MRG segment)
    // 
    // "identifier":[
    // {
    // "use":"old",
    // "value":"456"
    // }
    // ]
    // Verify has only 1 identifier
    assertThat(patientTwoIdentifierList).hasSize(1);
    // Verify the identifier value is correct.
    assertThat(patientTwoIdentifierList.get(0).getValue()).isEqualTo("456");
    // Verify the system is not present
    assertThat(patientTwoIdentifierList.get(0).getSystem()).isNull();
    // Verify the identifier is marked as old
    assertThat(patientTwoIdentifierList.get(0).getUse()).isEqualTo(Identifier.IdentifierUse.OLD);
    // Verify identifier type is not present
    assertThat(patientTwoIdentifierList.get(0).getType().getCoding()).isEmpty();
    // Verify second patient has these fields.
    // "active":false,
    // "link":[
    // {
    // "other":{
    // "reference":"Patient/survivingID"
    // },
    // "type":"replaced-by"
    // }
    // ]
    // The second patient should NOT be active.
    assertThat(patientTwo.getActive()).isFalse();
    // We should have link.other.reference to the PID (1st) patient with a type of 'replaced-by'
    PatientLinkComponent linkTwo = patientTwo.getLink().get(0);
    assertThat(linkTwo.getType()).isEqualTo(Patient.LinkType.REPLACEDBY);
    assertThat(linkTwo.getOther().getReference()).isEqualTo(patientOneId);
    ;
}
Also used : BundleEntryComponent(org.hl7.fhir.r4.model.Bundle.BundleEntryComponent) Identifier(org.hl7.fhir.r4.model.Identifier) Resource(org.hl7.fhir.r4.model.Resource) Patient(org.hl7.fhir.r4.model.Patient) PatientLinkComponent(org.hl7.fhir.r4.model.Patient.PatientLinkComponent) CodeableConcept(org.hl7.fhir.r4.model.CodeableConcept) Test(org.junit.jupiter.api.Test)

Example 2 with PatientLinkComponent

use of org.hl7.fhir.r4.model.Patient.PatientLinkComponent in project MobileAccessGateway by i4mi.

the class Iti93MergeRequestConverter method doMerge.

/**
 * merge request for ITI-93 transaction
 * @param header
 * @param entriesByReference
 * @return
 * @throws JAXBException
 */
public String doMerge(MessageHeader header, Map<String, BundleEntryComponent> entriesByReference) throws JAXBException {
    PRPAIN201304UV02Type resultMsg = new PRPAIN201304UV02Type();
    resultMsg.setITSVersion("XML_1.0");
    // String UUID.randomUUID().toString();
    resultMsg.setId(new II(config.getPixQueryOid(), uniqueId()));
    // Now
    resultMsg.setCreationTime(new TS(Timestamp.now().toHL7()));
    resultMsg.setProcessingCode(new CS("T", null, null));
    resultMsg.setProcessingModeCode(new CS("T", null, null));
    resultMsg.setInteractionId(new II("2.16.840.1.113883.1.18", "PRPA_IN201304UV02"));
    resultMsg.setAcceptAckCode(new CS("AL", null, null));
    MCCIMT000100UV01Receiver receiver = new MCCIMT000100UV01Receiver();
    resultMsg.addReceiver(receiver);
    receiver.setTypeCode(CommunicationFunctionType.RCV);
    MCCIMT000100UV01Device receiverDevice = new MCCIMT000100UV01Device();
    receiver.setDevice(receiverDevice);
    receiverDevice.setClassCode(EntityClassDevice.DEV);
    receiverDevice.setDeterminerCode(EntityDeterminer.INSTANCE);
    receiverDevice.setId(Collections.singletonList(new II(config.getPixReceiverOid(), null)));
    MCCIMT000100UV01Sender sender = new MCCIMT000100UV01Sender();
    resultMsg.setSender(sender);
    sender.setTypeCode(CommunicationFunctionType.SND);
    MCCIMT000100UV01Device senderDevice = new MCCIMT000100UV01Device();
    sender.setDevice(senderDevice);
    senderDevice.setClassCode(EntityClassDevice.DEV);
    senderDevice.setDeterminerCode(EntityDeterminer.INSTANCE);
    senderDevice.setId(Collections.singletonList(new II(config.getPixMySenderOid(), null)));
    PRPAIN201304UV02MFMIMT700701UV01ControlActProcess controlActProcess = new PRPAIN201304UV02MFMIMT700701UV01ControlActProcess();
    resultMsg.setControlActProcess(controlActProcess);
    // ???
    controlActProcess.setClassCode(ActClassControlAct.CACT);
    // ???
    controlActProcess.setMoodCode(XActMoodIntentEvent.EVN);
    // ???
    controlActProcess.setCode(new CD("PRPA_TE201304UV02", "2.16.840.1.113883.1.18", null));
    for (BundleEntryComponent entry : entriesByReference.values()) {
        // BundleEntryComponent entry = entriesByReference.get(ref.getReference());
        HTTPVerb method = entry.getRequest().getMethod();
        if (method == null)
            throw new InvalidRequestException("HTTP verb missing in Bundle for Patient resource.");
        Patient basePatient = (Patient) entry.getResource();
        Patient in = null;
        List<Patient> replaced = new ArrayList<Patient>();
        for (PatientLinkComponent linked : basePatient.getLink()) {
            if (linked.getType().equals(LinkType.REPLACEDBY)) {
                Reference other = linked.getOther();
                Patient otherPatient = findPatient(other, entriesByReference, basePatient);
                in = otherPatient;
                replaced.add(basePatient);
            } else if (linked.getType().equals(LinkType.REPLACES)) {
                Reference other = linked.getOther();
                Patient otherPatient = findPatient(other, entriesByReference, basePatient);
                in = basePatient;
                replaced.add(otherPatient);
            }
        }
        if (in == null || replaced.isEmpty())
            throw new InvalidRequestException("Cannot determine Patients to merge");
        PRPAIN201304UV02MFMIMT700701UV01Subject1 subject = new PRPAIN201304UV02MFMIMT700701UV01Subject1();
        controlActProcess.addSubject(subject);
        subject.setTypeCode("SUBJ");
        // ???
        subject.setContextConductionInd(false);
        PRPAIN201304UV02MFMIMT700701UV01RegistrationEvent registrationEvent = new PRPAIN201304UV02MFMIMT700701UV01RegistrationEvent();
        subject.setRegistrationEvent(registrationEvent);
        registrationEvent.setClassCode(ActClass.REG);
        registrationEvent.setMoodCode(ActMood.EVN);
        // ???
        registrationEvent.setStatusCode(new CS("active", null, null));
        List<MFMIMT700701UV01ReplacementOf> replacementOfList = new ArrayList<MFMIMT700701UV01ReplacementOf>();
        registrationEvent.setReplacementOf(replacementOfList);
        for (Patient replacedPatient : replaced) {
            MFMIMT700701UV01ReplacementOf replacementOf = new MFMIMT700701UV01ReplacementOf();
            MFMIMT700701UV01PriorRegistration priorRegistration = new MFMIMT700701UV01PriorRegistration();
            replacementOf.setPriorRegistration(priorRegistration);
            replacementOf.setTypeCode("RPLC");
            priorRegistration.setClassCode(ActClass.REG);
            priorRegistration.setMoodCode(ActMood.EVN);
            priorRegistration.setStatusCode(new CS("obsolete", null, null));
            MFMIMT700701UV01Subject3 subject1 = new MFMIMT700701UV01Subject3();
            priorRegistration.setSubject1(subject1);
            subject1.setTypeCode(ParticipationTargetSubject.SBJ);
            MFMIMT700701UV01PriorRegisteredRole priorRegisteredRole = new MFMIMT700701UV01PriorRegisteredRole();
            subject1.setPriorRegisteredRole(priorRegisteredRole);
            priorRegisteredRole.setClassCode("PAT");
            for (Identifier id : replacedPatient.getIdentifier()) {
                priorRegisteredRole.addId(patientIdentifier(id));
            }
            replacementOfList.add(replacementOf);
        }
        PRPAIN201304UV02MFMIMT700701UV01Subject2 subject1 = new PRPAIN201304UV02MFMIMT700701UV01Subject2();
        registrationEvent.setSubject1(subject1);
        subject1.setTypeCode(ParticipationTargetSubject.SBJ);
        PRPAMT201303UV02Patient patient = new PRPAMT201303UV02Patient();
        patient.setClassCode("PAT");
        subject1.setPatient(patient);
        PRPAMT201302UV02PatientStatusCode statusCode = new PRPAMT201302UV02PatientStatusCode("active", null, null);
        // ???
        patient.setStatusCode(statusCode);
        List<II> orgIds = new ArrayList<II>();
        Set<String> mainIds = new HashSet<String>();
        PRPAMT201303UV02Person patientPerson = new PRPAMT201303UV02Person();
        patientPerson.setClassCode(EntityClass.PSN);
        patientPerson.setDeterminerCode(EntityDeterminer.INSTANCE);
        patient.setPatientPerson(patientPerson);
        Organization managingOrg = getManagingOrganization(in, basePatient.getContained());
        for (Identifier id : managingOrg.getIdentifier()) {
            orgIds.add(new II(getScheme(id.getSystem()), null));
            mainIds.add(id.getSystem());
        }
        if (managingOrg == null)
            managingOrg = getManagingOrganization(basePatient, basePatient.getContained());
        if (managingOrg == null)
            throw new InvalidRequestException("Cannot determine managingOrganization");
        // TODO How is the correct mapping done?
        for (Identifier id : in.getIdentifier()) {
            PRPAMT201302UV02PatientId patientId = new PRPAMT201302UV02PatientId(getScheme(id.getSystem()), id.getValue());
            patient.addId(patientId);
        }
        for (HumanName name : in.getName()) {
            patientPerson.addName(transform(name));
        }
        COCTMT150003UV03Organization providerOrganization = new COCTMT150003UV03Organization();
        patient.setProviderOrganization(providerOrganization);
        providerOrganization.setClassCode(EntityClassOrganization.ORG);
        providerOrganization.setDeterminerCode(EntityDeterminer.INSTANCE);
        providerOrganization.setId(orgIds);
        ON name = null;
        if (managingOrg.hasName()) {
            name = new ON();
            name.setMixed(Collections.singletonList(managingOrg.getName()));
            providerOrganization.setName(Collections.singletonList(name));
        }
        COCTMT150003UV03ContactParty contactParty = new COCTMT150003UV03ContactParty();
        contactParty.setClassCode(RoleClassContact.CON);
        for (ContactPoint contactPoint : managingOrg.getTelecom()) {
            contactParty.addTelecom(transform(contactPoint));
        }
        if (managingOrg.hasAddress())
            contactParty.setAddr(new ArrayList<AD>());
        for (Address address : managingOrg.getAddress()) {
            contactParty.addAddr(transform(address));
        }
        if (managingOrg.hasContact()) {
            OrganizationContactComponent occ = managingOrg.getContactFirstRep();
            COCTMT150003UV03Person contactPerson = new COCTMT150003UV03Person();
            contactPerson.setClassCode(EntityClass.PSN);
            contactPerson.setDeterminerCode(EntityDeterminer.INSTANCE);
            if (occ.hasName())
                contactPerson.setName(Collections.singletonList(transform(occ.getName())));
            contactParty.setContactPerson(contactPerson);
        }
        providerOrganization.setContactParty(Collections.singletonList(contactParty));
        patientPerson.setBirthTime(transform(in.getBirthDateElement()));
        if (in.hasGender()) {
            switch(in.getGender()) {
                case MALE:
                    patientPerson.setAdministrativeGenderCode(new CE("M", "Male", "2.16.840.1.113883.12.1"));
                    break;
                case FEMALE:
                    patientPerson.setAdministrativeGenderCode(new CE("F", "Female", "2.16.840.1.113883.12.1"));
                    break;
                case OTHER:
                    patientPerson.setAdministrativeGenderCode(new CE("A", "Ambiguous", "2.16.840.1.113883.12.1"));
                    break;
                case UNKNOWN:
                    patientPerson.setAdministrativeGenderCode(new CE("U", "Unknown", "2.16.840.1.113883.12.1"));
                    break;
            }
        }
        if (in.hasAddress())
            patientPerson.setAddr(new ArrayList<AD>());
        for (Address address : in.getAddress()) {
            patientPerson.addAddr(transform(address));
        }
        for (ContactPoint contactPoint : in.getTelecom()) {
            patientPerson.addTelecom(transform(contactPoint));
        }
        if (in.hasDeceasedBooleanType()) {
            patientPerson.setDeceasedInd(new BL(in.getDeceasedBooleanType().getValue()));
        }
        if (in.hasDeceasedDateTimeType()) {
            patientPerson.setDeceasedTime(transform(in.getDeceasedDateTimeType()));
        }
        if (in.hasMultipleBirthBooleanType()) {
            patientPerson.setMultipleBirthInd(new BL(in.getMultipleBirthBooleanType().getValue()));
        }
        if (in.hasMultipleBirthIntegerType()) {
            patientPerson.setMultipleBirthOrderNumber(new INT(in.getMultipleBirthIntegerType().getValue()));
        }
        if (in.hasMaritalStatus()) {
            patientPerson.setMaritalStatusCode(transform(in.getMaritalStatus()));
        }
        if (in.hasCommunication()) {
            for (PatientCommunicationComponent pcc : in.getCommunication()) {
                PRPAMT201303UV02LanguageCommunication languageCommunication = new PRPAMT201303UV02LanguageCommunication();
                languageCommunication.setLanguageCode(transform(pcc.getLanguage()));
                if (pcc.hasPreferred())
                    languageCommunication.setPreferenceInd(new BL(pcc.getPreferred()));
                patientPerson.addLanguageCommunication(languageCommunication);
            }
        }
        MFMIMT700701UV01Custodian custodian = new MFMIMT700701UV01Custodian();
        registrationEvent.setCustodian(custodian);
        custodian.setTypeCode(ParticipationType.CST);
        COCTMT090003UV01AssignedEntity assignedEntity = new COCTMT090003UV01AssignedEntity();
        custodian.setAssignedEntity(assignedEntity);
        assignedEntity.setClassCode(RoleClassAssignedEntity.ASSIGNED);
        List<II> custIds = new ArrayList<II>();
        custIds.add(new II(getScheme(config.getCustodianOid()), null));
        assignedEntity.setId(custIds);
        // assignedEntity.setId(orgIds);
        COCTMT090003UV01Organization assignedOrganization = new COCTMT090003UV01Organization();
        assignedEntity.setAssignedOrganization(assignedOrganization);
        assignedOrganization.setClassCode(EntityClassOrganization.ORG);
        assignedOrganization.setDeterminerCode(EntityDeterminer.INSTANCE);
        if (managingOrg.hasName()) {
            ON onName = new ON();
            onName.setMixed(Collections.singletonList(managingOrg.getName()));
            assignedOrganization.setName(Collections.singletonList(onName));
        }
    }
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    HL7V3Transformer.marshallMessage(PRPAIN201304UV02Type.class, out, resultMsg);
    String outArray = new String(out.toByteArray());
    return outArray;
}
Also used : HTTPVerb(org.hl7.fhir.r4.model.Bundle.HTTPVerb) PRPAIN201304UV02MFMIMT700701UV01RegistrationEvent(net.ihe.gazelle.hl7v3.prpain201304UV02.PRPAIN201304UV02MFMIMT700701UV01RegistrationEvent) Address(org.hl7.fhir.r4.model.Address) ArrayList(java.util.ArrayList) PRPAMT201302UV02PatientId(net.ihe.gazelle.hl7v3.prpamt201302UV02.PRPAMT201302UV02PatientId) Identifier(org.hl7.fhir.r4.model.Identifier) InvalidRequestException(ca.uhn.fhir.rest.server.exceptions.InvalidRequestException) HashSet(java.util.HashSet) II(net.ihe.gazelle.hl7v3.datatypes.II) PRPAIN201304UV02Type(net.ihe.gazelle.hl7v3.prpain201304UV02.PRPAIN201304UV02Type) COCTMT090003UV01Organization(net.ihe.gazelle.hl7v3.coctmt090003UV01.COCTMT090003UV01Organization) PRPAMT201303UV02LanguageCommunication(net.ihe.gazelle.hl7v3.prpamt201303UV02.PRPAMT201303UV02LanguageCommunication) MFMIMT700701UV01PriorRegisteredRole(net.ihe.gazelle.hl7v3.mfmimt700701UV01.MFMIMT700701UV01PriorRegisteredRole) BundleEntryComponent(org.hl7.fhir.r4.model.Bundle.BundleEntryComponent) COCTMT150003UV03Person(net.ihe.gazelle.hl7v3.coctmt150003UV03.COCTMT150003UV03Person) OrganizationContactComponent(org.hl7.fhir.r4.model.Organization.OrganizationContactComponent) PRPAMT201302UV02PatientStatusCode(net.ihe.gazelle.hl7v3.prpamt201302UV02.PRPAMT201302UV02PatientStatusCode) PRPAMT201303UV02Person(net.ihe.gazelle.hl7v3.prpamt201303UV02.PRPAMT201303UV02Person) COCTMT090003UV01AssignedEntity(net.ihe.gazelle.hl7v3.coctmt090003UV01.COCTMT090003UV01AssignedEntity) MFMIMT700701UV01ReplacementOf(net.ihe.gazelle.hl7v3.mfmimt700701UV01.MFMIMT700701UV01ReplacementOf) MFMIMT700701UV01Custodian(net.ihe.gazelle.hl7v3.mfmimt700701UV01.MFMIMT700701UV01Custodian) MCCIMT000100UV01Receiver(net.ihe.gazelle.hl7v3.mccimt000100UV01.MCCIMT000100UV01Receiver) PRPAMT201303UV02Patient(net.ihe.gazelle.hl7v3.prpamt201303UV02.PRPAMT201303UV02Patient) COCTMT150003UV03Organization(net.ihe.gazelle.hl7v3.coctmt150003UV03.COCTMT150003UV03Organization) COCTMT090003UV01Organization(net.ihe.gazelle.hl7v3.coctmt090003UV01.COCTMT090003UV01Organization) EntityClassOrganization(net.ihe.gazelle.hl7v3.voc.EntityClassOrganization) Organization(org.hl7.fhir.r4.model.Organization) PatientLinkComponent(org.hl7.fhir.r4.model.Patient.PatientLinkComponent) BL(net.ihe.gazelle.hl7v3.datatypes.BL) MFMIMT700701UV01PriorRegistration(net.ihe.gazelle.hl7v3.mfmimt700701UV01.MFMIMT700701UV01PriorRegistration) INT(net.ihe.gazelle.hl7v3.datatypes.INT) HumanName(org.hl7.fhir.r4.model.HumanName) ContactPoint(org.hl7.fhir.r4.model.ContactPoint) PatientCommunicationComponent(org.hl7.fhir.r4.model.Patient.PatientCommunicationComponent) MCCIMT000100UV01Device(net.ihe.gazelle.hl7v3.mccimt000100UV01.MCCIMT000100UV01Device) ON(net.ihe.gazelle.hl7v3.datatypes.ON) CD(net.ihe.gazelle.hl7v3.datatypes.CD) CE(net.ihe.gazelle.hl7v3.datatypes.CE) Reference(org.hl7.fhir.r4.model.Reference) PRPAMT201301UV02Patient(net.ihe.gazelle.hl7v3.prpamt201301UV02.PRPAMT201301UV02Patient) PRPAMT201303UV02Patient(net.ihe.gazelle.hl7v3.prpamt201303UV02.PRPAMT201303UV02Patient) Patient(org.hl7.fhir.r4.model.Patient) PRPAMT201302UV02Patient(net.ihe.gazelle.hl7v3.prpamt201302UV02.PRPAMT201302UV02Patient) PRPAIN201304UV02MFMIMT700701UV01Subject2(net.ihe.gazelle.hl7v3.prpain201304UV02.PRPAIN201304UV02MFMIMT700701UV01Subject2) ByteArrayOutputStream(java.io.ByteArrayOutputStream) PRPAIN201304UV02MFMIMT700701UV01Subject1(net.ihe.gazelle.hl7v3.prpain201304UV02.PRPAIN201304UV02MFMIMT700701UV01Subject1) MCCIMT000100UV01Sender(net.ihe.gazelle.hl7v3.mccimt000100UV01.MCCIMT000100UV01Sender) CS(net.ihe.gazelle.hl7v3.datatypes.CS) MFMIMT700701UV01Subject3(net.ihe.gazelle.hl7v3.mfmimt700701UV01.MFMIMT700701UV01Subject3) COCTMT150003UV03ContactParty(net.ihe.gazelle.hl7v3.coctmt150003UV03.COCTMT150003UV03ContactParty) COCTMT150003UV03Organization(net.ihe.gazelle.hl7v3.coctmt150003UV03.COCTMT150003UV03Organization) TS(net.ihe.gazelle.hl7v3.datatypes.TS) PRPAIN201304UV02MFMIMT700701UV01ControlActProcess(net.ihe.gazelle.hl7v3.prpain201304UV02.PRPAIN201304UV02MFMIMT700701UV01ControlActProcess)

Example 3 with PatientLinkComponent

use of org.hl7.fhir.r4.model.Patient.PatientLinkComponent in project hl7v2-fhir-converter by LinuxForHealth.

the class HL7MergeFHIRConversionTest method validateHappyPathADT_A40WithMRG.

// Test ADT_A40 with one MRG segment.
@Test
void validateHappyPathADT_A40WithMRG() {
    String hl7message = "MSH|^~\\&|REGADT|MCM|RSP1P8|MCM|200301051530|SEC|ADT^A40^ADT_A39|00000003|P|2.6\r" + "EVN|A40|200301051530\r" + // Identifier value MR1 with XYZ system and MR identifier type
    "PID|||MR1^^^XYZ^MR||\r" + // Identifier value MR2 with XYZ system and no identifier type
    "MRG|MR2^^^XYZ\r";
    // Convert hl7 message
    List<BundleEntryComponent> e = ResourceUtils.createFHIRBundleFromHL7MessageReturnEntryList(ftv, hl7message);
    // Find the patient resources in the FHIR bundle.
    List<Resource> patientResources = ResourceUtils.getResourceList(e, ResourceType.Patient);
    // There should be 2 - One for the PID segment and one for the MRG segment
    assertThat(patientResources).hasSize(2);
    // Get first patient and associated identifiers and id.
    Patient patientOne = PatientUtils.getPatientFromResource(patientResources.get(0));
    String patientOneId = patientOne.getId();
    List<Identifier> patientOneIdentifierList = patientOne.getIdentifier();
    // Get second patient and associated identifiers and id.
    Patient patientTwo = PatientUtils.getPatientFromResource(patientResources.get(1));
    String patientTwoId = patientTwo.getId();
    List<Identifier> patientTwoIdentifierList = patientTwo.getIdentifier();
    /*-----------Verify Patient One-----------*/
    // Verify the patient has two identifiers
    assertThat(patientOneIdentifierList).hasSize(2);
    // Verify the identifier values are correct
    assertThat(patientOneIdentifierList.get(0).getValue()).isEqualTo("MR1");
    assertThat(patientOneIdentifierList.get(1).getValue()).isEqualTo("MR2");
    // Verify the identifier systems are correct.
    assertThat(patientOneIdentifierList.get(0).getSystem()).isEqualTo("urn:id:XYZ");
    assertThat(patientOneIdentifierList.get(1).getSystem()).isEqualTo("urn:id:XYZ");
    // Verify the first identifier has no use field.
    assertThat(patientOneIdentifierList.get(0).getUse()).isNull();
    // Verify the second identifier is marked as old
    assertThat(patientOneIdentifierList.get(1).getUse()).isEqualTo(Identifier.IdentifierUse.OLD);
    // Verify identifier type is set correctly for the first identifier
    CodeableConcept patientOneIdentifierType = patientOneIdentifierList.get(0).getType();
    assertThat(patientOneIdentifierType.getCoding().get(0).getSystem()).isEqualTo("http://terminology.hl7.org/CodeSystem/v2-0203");
    assertThat(patientOneIdentifierType.getCoding().get(0).getDisplay()).isEqualTo("Medical record number");
    assertThat(patientOneIdentifierType.getCoding().get(0).getCode()).isEqualTo("MR");
    // Verify the identifier type for the second identifier is not present.
    assertThat(patientOneIdentifierList.get(1).getType().getCoding()).isEmpty();
    // The first patient should be active.
    assertThat(patientOne.getActive()).isTrue();
    // Verify link.other.reference references the MRG (2nd) patient with of a type of 'replaces'
    PatientLinkComponent linkOne = patientOne.getLink().get(0);
    assertThat(linkOne.getType()).isEqualTo(Patient.LinkType.REPLACES);
    assertThat(linkOne.getOther().getReference()).isEqualTo(patientTwoId);
    /*-----------Verify Patient Two-----------*/
    // Verify patient two has only 1 identifier
    assertThat(patientTwoIdentifierList).hasSize(1);
    // Verify the identifier value is correct.
    assertThat(patientTwoIdentifierList.get(0).getValue()).isEqualTo("MR2");
    // Verify the system is not present
    assertThat(patientTwoIdentifierList.get(0).getSystem()).isEqualTo("urn:id:XYZ");
    // Verify the identifier value is marked as old
    assertThat(patientTwoIdentifierList.get(0).getUse()).isEqualTo(Identifier.IdentifierUse.OLD);
    // Verify identifier type is not present
    assertThat(patientTwoIdentifierList.get(0).getType().getCoding()).isEmpty();
    // The second patient should NOT be active.
    assertThat(patientTwo.getActive()).isFalse();
    // We should have link.other.reference to the PID (1st) patient with a type of 'replaced-by'
    PatientLinkComponent linkTwo = patientTwo.getLink().get(0);
    assertThat(linkTwo.getType()).isEqualTo(Patient.LinkType.REPLACEDBY);
    assertThat(linkTwo.getOther().getReference()).isEqualTo(patientOneId);
}
Also used : BundleEntryComponent(org.hl7.fhir.r4.model.Bundle.BundleEntryComponent) Identifier(org.hl7.fhir.r4.model.Identifier) Resource(org.hl7.fhir.r4.model.Resource) Patient(org.hl7.fhir.r4.model.Patient) PatientLinkComponent(org.hl7.fhir.r4.model.Patient.PatientLinkComponent) CodeableConcept(org.hl7.fhir.r4.model.CodeableConcept) Test(org.junit.jupiter.api.Test)

Example 4 with PatientLinkComponent

use of org.hl7.fhir.r4.model.Patient.PatientLinkComponent in project hl7v2-fhir-converter by LinuxForHealth.

the class HL7MergeFHIRConversionTest method validateTwoMRGs.

// Tests ADT_A40 message with 2 MRG segments.
// Suppress warnings about too many assertions in a test.  Justification: creating a FHIR message is very costly; we need to check many asserts per creation for efficiency.
@java.lang.SuppressWarnings("squid:S5961")
@Test
void validateTwoMRGs() {
    String hl7message = "MSH|^~\\&|REGADT|MCM|RSP1P8|MCM|200301051530|SEC|ADT^A40^ADT_A39|00000003|P|2.6\r" + "EVN|A40|200301051530\r" + // Identifier value MR1 with XYZ system and MR identifier type
    "PID|||MR1^^^XYZ^MR|||||||||||||||\r" + // Identifier value MR1 with XYZ system and no identifier type
    "MRG|MR2^^^XYZ||\r" + // Identifier value MR1 with XYZ system and MR identifier type
    "PID|||MR3^^^XYZ|||||||||||||||\r" + // Identifier value MR1 with XYZ system and MR identifier type
    "MRG|MR4^^^XYZ^MR||\r";
    // Convert hl7 message
    List<BundleEntryComponent> e = ResourceUtils.createFHIRBundleFromHL7MessageReturnEntryList(ftv, hl7message);
    // Find the patient resources in the FHIR bundle.
    List<Resource> patientResources = ResourceUtils.getResourceList(e, ResourceType.Patient);
    // There should be 4 - One for each PID segment and one for each MRG segment
    assertThat(patientResources).hasSize(4);
    // Get first patient and associated identifiers and id.
    Patient patientOne = PatientUtils.getPatientFromResource(patientResources.get(0));
    String patientOneId = patientOne.getId();
    List<Identifier> patientOneIdentifierList = patientOne.getIdentifier();
    // Get second patient and associated identifiers and id.
    Patient patientTwo = PatientUtils.getPatientFromResource(patientResources.get(1));
    String patientTwoId = patientTwo.getId();
    List<Identifier> patientTwoIdentifierList = patientTwo.getIdentifier();
    // Get third patient and associated identifiers and id.
    Patient patientThree = PatientUtils.getPatientFromResource(patientResources.get(2));
    String patientThreeId = patientThree.getId();
    List<Identifier> patientThreeIdentifierList = patientThree.getIdentifier();
    // Get fourth patient and associated identifiers and id.
    Patient patientFour = PatientUtils.getPatientFromResource(patientResources.get(3));
    String patientFourId = patientFour.getId();
    List<Identifier> patientFourIdentifierList = patientFour.getIdentifier();
    /*-----------Verify Patient One-----------*/
    // Verify the patient has two identifiers
    assertThat(patientOneIdentifierList).hasSize(2);
    // Verify the identifier values
    assertThat(patientOneIdentifierList.get(0).getValue()).isEqualTo("MR1");
    assertThat(patientOneIdentifierList.get(1).getValue()).isEqualTo("MR2");
    // Verify the identifier systems are correct.
    assertThat(patientOneIdentifierList.get(0).getSystem()).isEqualTo("urn:id:XYZ");
    assertThat(patientOneIdentifierList.get(1).getSystem()).isEqualTo("urn:id:XYZ");
    // Verify the second identifier is marked as old
    assertThat(patientOneIdentifierList.get(1).getUse()).isEqualTo(Identifier.IdentifierUse.OLD);
    // Verify identifier type is set correctly for the first identifier
    CodeableConcept patientOneIdentifierType = patientOneIdentifierList.get(0).getType();
    assertThat(patientOneIdentifierType.getCoding().get(0).getSystem()).isEqualTo("http://terminology.hl7.org/CodeSystem/v2-0203");
    assertThat(patientOneIdentifierType.getCoding().get(0).getDisplay()).isEqualTo("Medical record number");
    assertThat(patientOneIdentifierType.getCoding().get(0).getCode()).isEqualTo("MR");
    // Verify the identifier type for the second identifier is not present.
    assertThat(patientOneIdentifierList.get(1).getType().getCoding()).isEmpty();
    // The first patient should be active.
    assertThat(patientOne.getActive()).isTrue();
    // Verify link.other.reference references the MRG (2nd) patient with of a type of 'replaces'
    PatientLinkComponent linkOne = patientOne.getLink().get(0);
    assertThat(linkOne.getType()).isEqualTo(Patient.LinkType.REPLACES);
    assertThat(linkOne.getOther().getReference()).isEqualTo(patientTwoId);
    /*-----------Verify Patient Two-----------*/
    // Verify patient two has only 1 identifier
    assertThat(patientTwoIdentifierList).hasSize(1);
    // Verify the patient two identifier value
    assertThat(patientTwoIdentifierList.get(0).getValue()).isEqualTo("MR2");
    // Verify the system is not present
    assertThat(patientTwoIdentifierList.get(0).getSystem()).isEqualTo("urn:id:XYZ");
    // Verify the patient two identifier value is marked as old
    assertThat(patientTwoIdentifierList.get(0).getUse()).isEqualTo(Identifier.IdentifierUse.OLD);
    // Verify identifier type is not present
    assertThat(patientTwoIdentifierList.get(0).getType().getCoding()).isEmpty();
    // The second patient should NOT be active.
    assertThat(patientTwo.getActive()).isFalse();
    // We should have link.other.reference to the PID (1st) patient with a type of 'replaced-by'
    PatientLinkComponent linkTwo = patientTwo.getLink().get(0);
    assertThat(linkTwo.getType()).isEqualTo(Patient.LinkType.REPLACEDBY);
    assertThat(linkTwo.getOther().getReference()).isEqualTo(patientOneId);
    /*-----------Verify Patient Three-----------*/
    // Verify the patient has two identifiers
    assertThat(patientThreeIdentifierList).hasSize(2);
    // Verify the identifier values
    assertThat(patientThreeIdentifierList.get(0).getValue()).isEqualTo("MR3");
    assertThat(patientThreeIdentifierList.get(1).getValue()).isEqualTo("MR4");
    // Verify the identifier systems are correct.
    assertThat(patientThreeIdentifierList.get(0).getSystem()).isEqualTo("urn:id:XYZ");
    assertThat(patientThreeIdentifierList.get(1).getSystem()).isEqualTo("urn:id:XYZ");
    // Verify the second identifier is marked as old
    assertThat(patientThreeIdentifierList.get(1).getUse()).isEqualTo(Identifier.IdentifierUse.OLD);
    // Verify identifier type is not present for the first identifier
    assertThat(patientThreeIdentifierList.get(0).getType().getCoding()).isEmpty();
    // Verify identifier type is set correctly for the second identifier
    CodeableConcept patientThreeIdentifierTwoType = patientThreeIdentifierList.get(1).getType();
    assertThat(patientThreeIdentifierTwoType.getCoding().get(0).getSystem()).isEqualTo("http://terminology.hl7.org/CodeSystem/v2-0203");
    assertThat(patientThreeIdentifierTwoType.getCoding().get(0).getDisplay()).isEqualTo("Medical record number");
    assertThat(patientThreeIdentifierTwoType.getCoding().get(0).getCode()).isEqualTo("MR");
    // The first patient should be active.
    assertThat(patientThree.getActive()).isTrue();
    // Verify link.other.reference references the MRG (2nd) patient with of a type of 'replaces'
    PatientLinkComponent linkThree = patientThree.getLink().get(0);
    assertThat(linkThree.getType()).isEqualTo(Patient.LinkType.REPLACES);
    assertThat(linkThree.getOther().getReference()).isEqualTo(patientFourId);
    /*-----------Verify Patient Four-----------*/
    // Verify patient has only 1 identifier
    assertThat(patientFourIdentifierList).hasSize(1);
    // Verify the identifier value
    assertThat(patientFourIdentifierList.get(0).getValue()).isEqualTo("MR4");
    // Verify the system is not present
    assertThat(patientFourIdentifierList.get(0).getSystem()).isEqualTo("urn:id:XYZ");
    // Verify the identifier is marked as old
    assertThat(patientFourIdentifierList.get(0).getUse()).isEqualTo(Identifier.IdentifierUse.OLD);
    // Verify identifier type is set correctly
    CodeableConcept patientFourIdentifierType = patientFourIdentifierList.get(0).getType();
    assertThat(patientFourIdentifierType.getCoding().get(0).getSystem()).isEqualTo("http://terminology.hl7.org/CodeSystem/v2-0203");
    assertThat(patientFourIdentifierType.getCoding().get(0).getDisplay()).isEqualTo("Medical record number");
    assertThat(patientFourIdentifierType.getCoding().get(0).getCode()).isEqualTo("MR");
    // The second patient should NOT be active.
    assertThat(patientFour.getActive()).isFalse();
    // We should have link.other.reference to the PID (1st) patient with a type of 'replaced-by'
    PatientLinkComponent linkFour = patientFour.getLink().get(0);
    assertThat(linkFour.getType()).isEqualTo(Patient.LinkType.REPLACEDBY);
    assertThat(linkFour.getOther().getReference()).isEqualTo(patientThreeId);
}
Also used : BundleEntryComponent(org.hl7.fhir.r4.model.Bundle.BundleEntryComponent) Identifier(org.hl7.fhir.r4.model.Identifier) Resource(org.hl7.fhir.r4.model.Resource) Patient(org.hl7.fhir.r4.model.Patient) PatientLinkComponent(org.hl7.fhir.r4.model.Patient.PatientLinkComponent) CodeableConcept(org.hl7.fhir.r4.model.CodeableConcept) Test(org.junit.jupiter.api.Test)

Aggregations

BundleEntryComponent (org.hl7.fhir.r4.model.Bundle.BundleEntryComponent)4 Identifier (org.hl7.fhir.r4.model.Identifier)4 Patient (org.hl7.fhir.r4.model.Patient)4 PatientLinkComponent (org.hl7.fhir.r4.model.Patient.PatientLinkComponent)4 CodeableConcept (org.hl7.fhir.r4.model.CodeableConcept)3 Resource (org.hl7.fhir.r4.model.Resource)3 Test (org.junit.jupiter.api.Test)3 InvalidRequestException (ca.uhn.fhir.rest.server.exceptions.InvalidRequestException)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1 COCTMT090003UV01AssignedEntity (net.ihe.gazelle.hl7v3.coctmt090003UV01.COCTMT090003UV01AssignedEntity)1 COCTMT090003UV01Organization (net.ihe.gazelle.hl7v3.coctmt090003UV01.COCTMT090003UV01Organization)1 COCTMT150003UV03ContactParty (net.ihe.gazelle.hl7v3.coctmt150003UV03.COCTMT150003UV03ContactParty)1 COCTMT150003UV03Organization (net.ihe.gazelle.hl7v3.coctmt150003UV03.COCTMT150003UV03Organization)1 COCTMT150003UV03Person (net.ihe.gazelle.hl7v3.coctmt150003UV03.COCTMT150003UV03Person)1 BL (net.ihe.gazelle.hl7v3.datatypes.BL)1 CD (net.ihe.gazelle.hl7v3.datatypes.CD)1 CE (net.ihe.gazelle.hl7v3.datatypes.CE)1 CS (net.ihe.gazelle.hl7v3.datatypes.CS)1