Search in sources :

Example 1 with PatientInfo

use of org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo in project ipf by oehf.

the class SourcePatientNamePIDTransformerTest method testToHL7EmptyName.

@Test
public void testToHL7EmptyName() {
    var patientInfo = new PatientInfo();
    patientInfo.getNames().add(new XcnName());
    var iterator = patientInfo.getHl7FieldIterator("PID-5");
    assertEquals("", iterator.next());
    assertFalse(iterator.hasNext());
}
Also used : XcnName(org.openehealth.ipf.commons.ihe.xds.core.metadata.XcnName) PatientInfo(org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo) Test(org.junit.jupiter.api.Test)

Example 2 with PatientInfo

use of org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo in project MobileAccessGateway by i4mi.

the class Iti67ResponseConverter method translateToFhir.

@Override
public List<DocumentReference> translateToFhir(QueryResponse input, Map<String, Object> parameters) {
    ArrayList<DocumentReference> list = new ArrayList<DocumentReference>();
    if (input != null && Status.SUCCESS.equals(input.getStatus())) {
        // process relationship association
        Map<String, List<DocumentReferenceRelatesToComponent>> relatesToMapping = new HashMap<String, List<DocumentReferenceRelatesToComponent>>();
        for (Association association : input.getAssociations()) {
            // Relationship type -> relatesTo.code code [1..1]
            // relationship reference -> relatesTo.target Reference(DocumentReference)
            String source = association.getSourceUuid();
            String target = association.getTargetUuid();
            AssociationType type = association.getAssociationType();
            DocumentReferenceRelatesToComponent relatesTo = new DocumentReferenceRelatesToComponent();
            if (type != null)
                switch(type) {
                    case APPEND:
                        relatesTo.setCode(DocumentRelationshipType.APPENDS);
                        break;
                    case REPLACE:
                        relatesTo.setCode(DocumentRelationshipType.REPLACES);
                        break;
                    case TRANSFORM:
                        relatesTo.setCode(DocumentRelationshipType.TRANSFORMS);
                        break;
                    case SIGNS:
                        relatesTo.setCode(DocumentRelationshipType.SIGNS);
                        break;
                }
            relatesTo.setTarget(new Reference().setReference("urn:oid:" + target));
            if (!relatesToMapping.containsKey(source))
                relatesToMapping.put(source, new ArrayList<DocumentReferenceRelatesToComponent>());
            relatesToMapping.get(source).add(relatesTo);
        }
        if (input.getDocumentEntries() != null) {
            for (DocumentEntry documentEntry : input.getDocumentEntries()) {
                DocumentReference documentReference = new DocumentReference();
                // FIXME do we need to cache this id in
                documentReference.setId(noUuidPrefix(documentEntry.getEntryUuid()));
                // relation to the DocumentManifest itself
                // for
                list.add(documentReference);
                // limitedMetadata -> meta.profile canonical [0..*]
                if (documentEntry.isLimitedMetadata()) {
                    documentReference.getMeta().addProfile("http://ihe.net/fhir/StructureDefinition/IHE_MHD_Query_Comprehensive_DocumentReference");
                } else {
                    documentReference.getMeta().addProfile("http://ihe.net/fhir/StructureDefinition/IHE_MHD_Comprehensive_DocumentManifest");
                }
                // uniqueId -> masterIdentifier Identifier [0..1] [1..1]
                if (documentEntry.getUniqueId() != null) {
                    documentReference.setMasterIdentifier((new Identifier().setValue("urn:oid:" + documentEntry.getUniqueId())));
                }
                // DocumentReference.identifier. use shall be ‘official’
                if (documentEntry.getEntryUuid() != null) {
                    documentReference.addIdentifier((new Identifier().setSystem("urn:ietf:rfc:3986").setValue(asUuid(documentEntry.getEntryUuid()))).setUse(IdentifierUse.OFFICIAL));
                }
                // Other status values are allowed but are not defined in this mapping to XDS.
                if (AvailabilityStatus.APPROVED.equals(documentEntry.getAvailabilityStatus())) {
                    documentReference.setStatus(DocumentReferenceStatus.CURRENT);
                }
                if (AvailabilityStatus.DEPRECATED.equals(documentEntry.getAvailabilityStatus())) {
                    documentReference.setStatus(DocumentReferenceStatus.SUPERSEDED);
                }
                // contentTypeCode -> type CodeableConcept [0..1]
                if (documentEntry.getTypeCode() != null) {
                    documentReference.setType(transform(documentEntry.getTypeCode()));
                }
                // classCode -> category CodeableConcept [0..*]
                if (documentEntry.getClassCode() != null) {
                    documentReference.addCategory((transform(documentEntry.getClassCode())));
                }
                // representing the XDS Affinity Domain Patient.
                if (documentEntry.getPatientId() != null) {
                    Identifiable patient = documentEntry.getPatientId();
                    documentReference.setSubject(transformPatient(patient));
                }
                // creationTime -> date instant [0..1]
                if (documentEntry.getCreationTime() != null) {
                    documentReference.setDate(Date.from(documentEntry.getCreationTime().getDateTime().toInstant()));
                }
                // PractitionerRole| Organization| Device| Patient| RelatedPerson) [0..*]
                if (documentEntry.getAuthors() != null) {
                    for (Author author : documentEntry.getAuthors()) {
                        documentReference.addAuthor(transformAuthor(author));
                    }
                }
                // legalAuthenticator -> authenticator Note 1
                // Reference(Practitioner|Practition erRole|Organization [0..1]
                Person person = documentEntry.getLegalAuthenticator();
                if (person != null) {
                    Practitioner practitioner = transformPractitioner(person);
                    documentReference.setAuthenticator((Reference) new Reference().setResource(practitioner));
                }
                // Relationship Association -> relatesTo [0..*]
                // [1..1]
                documentReference.setRelatesTo(relatesToMapping.get(documentEntry.getEntryUuid()));
                // title -> description string [0..1]
                if (documentEntry.getTitle() != null) {
                    documentReference.setDescription(documentEntry.getTitle().getValue());
                }
                // DocumentReference itself.
                if (documentEntry.getConfidentialityCodes() != null) {
                    documentReference.addSecurityLabel(transform(documentEntry.getConfidentialityCodes()));
                }
                DocumentReferenceContentComponent content = documentReference.addContent();
                Attachment attachment = new Attachment();
                content.setAttachment(attachment);
                // mimeType -> content.attachment.contentType [1..1] code [0..1]
                if (documentEntry.getMimeType() != null) {
                    attachment.setContentType(documentEntry.getMimeType());
                }
                // languageCode -> content.attachment.language code [0..1]
                if (documentEntry.getLanguageCode() != null) {
                    attachment.setLanguage(documentEntry.getLanguageCode());
                }
                // retrievable location of the document -> content.attachment.url uri
                // [0..1] [1..1
                // has to defined, for the PoC we define
                // $host:port/camel/$repositoryid/$uniqueid
                attachment.setUrl(config.getUriMagXdsRetrieve() + "?uniqueId=" + documentEntry.getUniqueId() + "&repositoryUniqueId=" + documentEntry.getRepositoryUniqueId());
                // size -> content.attachment.size integer [0..1] The size is calculated
                if (documentEntry.getSize() != null) {
                    attachment.setSize(documentEntry.getSize().intValue());
                }
                // on the data prior to base64 encoding, if the data is base64 encoded.
                if (documentEntry.getHash() != null) {
                    attachment.setHash(Hex.fromHex(documentEntry.getHash()));
                }
                // comments -> content.attachment.title string [0..1]
                if (documentEntry.getComments() != null) {
                    attachment.setTitle(documentEntry.getComments().getValue());
                }
                // TcreationTime -> content.attachment.creation dateTime [0..1]
                if (documentEntry.getCreationTime() != null) {
                    attachment.setCreation(Date.from(documentEntry.getCreationTime().getDateTime().toInstant()));
                }
                // formatCode -> content.format Coding [0..1]
                if (documentEntry.getFormatCode() != null) {
                    content.setFormat(transform(documentEntry.getFormatCode()).getCodingFirstRep());
                }
                DocumentReferenceContextComponent context = new DocumentReferenceContextComponent();
                documentReference.setContext(context);
                // referenceIdList -> context.encounter Reference(Encounter) [0..*] When
                // referenceIdList contains an encounter, and a FHIR Encounter is available, it
                // may be referenced.
                // Map to context.related
                List<ReferenceId> refIds = documentEntry.getReferenceIdList();
                if (refIds != null) {
                    for (ReferenceId refId : refIds) {
                        context.getRelated().add(transform(refId));
                    }
                }
                // eventCodeList -> context.event CodeableConcept [0..*]
                if (documentEntry.getEventCodeList() != null) {
                    documentReference.getContext().setEvent(transformMultiple(documentEntry.getEventCodeList()));
                }
                // serviceStartTime serviceStopTime -> context.period Period [0..1]
                if (documentEntry.getServiceStartTime() != null || documentEntry.getServiceStopTime() != null) {
                    Period period = new Period();
                    period.setStartElement(transform(documentEntry.getServiceStartTime()));
                    period.setEndElement(transform(documentEntry.getServiceStopTime()));
                    documentReference.getContext().setPeriod(period);
                }
                // [0..1]
                if (documentEntry.getHealthcareFacilityTypeCode() != null) {
                    context.setFacilityType(transform(documentEntry.getHealthcareFacilityTypeCode()));
                }
                // practiceSettingCode -> context.practiceSetting CodeableConcept [0..1]
                if (documentEntry.getPracticeSettingCode() != null) {
                    context.setPracticeSetting(transform(documentEntry.getPracticeSettingCode()));
                }
                // sourcePatientId and sourcePatientInfo -> context.sourcePatientInfo
                // Reference(Patient) [0..1] Contained Patient Resource with
                // Patient.identifier.use element set to ‘usual’.
                Identifiable sourcePatientId = documentEntry.getSourcePatientId();
                PatientInfo sourcePatientInfo = documentEntry.getSourcePatientInfo();
                Patient sourcePatient = new Patient();
                if (sourcePatientId != null) {
                    sourcePatient.addIdentifier((new Identifier().setSystem("urn:oid:" + sourcePatientId.getAssigningAuthority().getUniversalId()).setValue(sourcePatientId.getId())).setUse(IdentifierUse.OFFICIAL));
                }
                if (sourcePatientInfo != null) {
                    sourcePatient.setBirthDateElement(transformToDate(sourcePatientInfo.getDateOfBirth()));
                    String gender = sourcePatientInfo.getGender();
                    if (gender != null) {
                        switch(gender) {
                            case "F":
                                sourcePatient.setGender(Enumerations.AdministrativeGender.FEMALE);
                                break;
                            case "M":
                                sourcePatient.setGender(Enumerations.AdministrativeGender.MALE);
                                break;
                            case "U":
                                sourcePatient.setGender(Enumerations.AdministrativeGender.UNKNOWN);
                                break;
                            case "A":
                                sourcePatient.setGender(Enumerations.AdministrativeGender.OTHER);
                                break;
                        }
                    }
                    ListIterator<Name> names = sourcePatientInfo.getNames();
                    while (names.hasNext()) {
                        Name name = names.next();
                        sourcePatient.addName(transform(name));
                    }
                    ListIterator<Address> addresses = sourcePatientInfo.getAddresses();
                    while (addresses.hasNext()) {
                        Address address = addresses.next();
                        if (address != null)
                            sourcePatient.addAddress(transform(address));
                    }
                }
                if (sourcePatientId != null || sourcePatientInfo != null) {
                    context.getSourcePatientInfo().setResource(sourcePatient);
                }
            }
        }
    } else {
        processError(input);
    }
    return list;
}
Also used : DocumentReferenceRelatesToComponent(org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceRelatesToComponent) DocumentReferenceContextComponent(org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent) Address(org.openehealth.ipf.commons.ihe.xds.core.metadata.Address) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Attachment(org.hl7.fhir.r4.model.Attachment) PatientInfo(org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo) Name(org.openehealth.ipf.commons.ihe.xds.core.metadata.Name) Association(org.openehealth.ipf.commons.ihe.xds.core.metadata.Association) Identifier(org.hl7.fhir.r4.model.Identifier) ReferenceId(org.openehealth.ipf.commons.ihe.xds.core.metadata.ReferenceId) DocumentEntry(org.openehealth.ipf.commons.ihe.xds.core.metadata.DocumentEntry) ArrayList(java.util.ArrayList) List(java.util.List) DocumentReference(org.hl7.fhir.r4.model.DocumentReference) Reference(org.hl7.fhir.r4.model.Reference) DocumentReference(org.hl7.fhir.r4.model.DocumentReference) Period(org.hl7.fhir.r4.model.Period) Patient(org.hl7.fhir.r4.model.Patient) Identifiable(org.openehealth.ipf.commons.ihe.xds.core.metadata.Identifiable) Practitioner(org.hl7.fhir.r4.model.Practitioner) AssociationType(org.openehealth.ipf.commons.ihe.xds.core.metadata.AssociationType) Author(org.openehealth.ipf.commons.ihe.xds.core.metadata.Author) Person(org.openehealth.ipf.commons.ihe.xds.core.metadata.Person) DocumentReferenceContentComponent(org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContentComponent)

Example 3 with PatientInfo

use of org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo in project MobileAccessGateway by i4mi.

the class Iti65RequestConverter method transformReferenceToPatientInfo.

/**
 * FHIR Reference to Patient -> XDS PatientInfo
 * @param ref
 * @param container
 * @return
 */
public PatientInfo transformReferenceToPatientInfo(Reference ref, DomainResource container) {
    if (ref == null)
        return null;
    if (!ref.hasReference())
        return null;
    List<Resource> resources = container.getContained();
    for (Resource resource : resources) {
        String targetRef = ref.getReference();
        if (targetRef.equals(resource.getId())) {
            Patient patient = ((Patient) resource);
            PatientInfo patientInfo = new PatientInfo();
            patientInfo.setDateOfBirth(timestampFromDate(patient.getBirthDateElement()));
            Enumerations.AdministrativeGender gender = patient.getGender();
            if (gender != null) {
                switch(gender) {
                    case MALE:
                        patientInfo.setGender("M");
                        break;
                    case FEMALE:
                        patientInfo.setGender("F");
                        break;
                    case OTHER:
                        patientInfo.setGender("A");
                        break;
                    default:
                        patientInfo.setGender("U");
                        break;
                }
            }
            for (HumanName name : patient.getName()) {
                patientInfo.getNames().add(transform(name));
            }
            for (Address address : patient.getAddress()) {
                patientInfo.getAddresses().add(transform(address));
            }
            for (Identifier id : patient.getIdentifier()) {
                patientInfo.getIds().add(transform(id));
            }
            return patientInfo;
        }
    }
    return null;
}
Also used : HumanName(org.hl7.fhir.r4.model.HumanName) Identifier(org.hl7.fhir.r4.model.Identifier) Address(org.hl7.fhir.r4.model.Address) Resource(org.hl7.fhir.r4.model.Resource) ListResource(org.hl7.fhir.r4.model.ListResource) DomainResource(org.hl7.fhir.r4.model.DomainResource) Patient(org.hl7.fhir.r4.model.Patient) PatientInfo(org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo) LocalizedString(org.openehealth.ipf.commons.ihe.xds.core.metadata.LocalizedString) Enumerations(org.hl7.fhir.r4.model.Enumerations)

Example 4 with PatientInfo

use of org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo in project ipf by oehf.

the class DateOfBirthPIDTransformerTest method testFromHL7.

@Test
public void testFromHL7() {
    var patientInfo = new PatientInfo();
    patientInfo.getHl7FieldIterator("PID-7").add("19800102030405-0100^sdf");
    var expected = ZonedDateTime.of(1980, 1, 2, 3, 4, 5, 0, ZoneId.of("-01:00"));
    assertEquals(new Timestamp(expected, Timestamp.Precision.SECOND), patientInfo.getDateOfBirth());
}
Also used : PatientInfo(org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo) Timestamp(org.openehealth.ipf.commons.ihe.xds.core.metadata.Timestamp) Test(org.junit.jupiter.api.Test)

Example 5 with PatientInfo

use of org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo in project ipf by oehf.

the class SourcePatientIdentifierPIDTransformerTest method testToHL7EmptyIds.

@Test
public void testToHL7EmptyIds() {
    var patientInfo = new PatientInfo();
    patientInfo.getIds().add(new Identifiable());
    patientInfo.getIds().add(new Identifiable());
    var iterator = patientInfo.getHl7FieldIterator("PID-3");
    assertEquals("", iterator.next());
    assertEquals("", iterator.next());
    assertFalse(iterator.hasNext());
}
Also used : PatientInfo(org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo) Identifiable(org.openehealth.ipf.commons.ihe.xds.core.metadata.Identifiable) Test(org.junit.jupiter.api.Test)

Aggregations

PatientInfo (org.openehealth.ipf.commons.ihe.xds.core.metadata.PatientInfo)6 Test (org.junit.jupiter.api.Test)4 Identifier (org.hl7.fhir.r4.model.Identifier)2 Patient (org.hl7.fhir.r4.model.Patient)2 Identifiable (org.openehealth.ipf.commons.ihe.xds.core.metadata.Identifiable)2 Name (org.openehealth.ipf.commons.ihe.xds.core.metadata.Name)2 XcnName (org.openehealth.ipf.commons.ihe.xds.core.metadata.XcnName)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Address (org.hl7.fhir.r4.model.Address)1 Attachment (org.hl7.fhir.r4.model.Attachment)1 DocumentReference (org.hl7.fhir.r4.model.DocumentReference)1 DocumentReferenceContentComponent (org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContentComponent)1 DocumentReferenceContextComponent (org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent)1 DocumentReferenceRelatesToComponent (org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceRelatesToComponent)1 DomainResource (org.hl7.fhir.r4.model.DomainResource)1 Enumerations (org.hl7.fhir.r4.model.Enumerations)1 HumanName (org.hl7.fhir.r4.model.HumanName)1 ListResource (org.hl7.fhir.r4.model.ListResource)1