Search in sources :

Example 1 with DocumentReferenceContextComponent

use of org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent 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 2 with DocumentReferenceContextComponent

use of org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent in project nia-patient-switching-standard-adaptor by NHSDigital.

the class DocumentReferenceMapper method mapDocumentReference.

private DocumentReference mapDocumentReference(RCMRMT030101UK04NarrativeStatement narrativeStatement, RCMRMT030101UK04EhrComposition ehrComposition, Patient patient, RCMRMT030101UK04EhrExtract ehrExtract, List<Encounter> encounterList, Organization organization) {
    DocumentReference documentReference = new DocumentReference();
    var id = narrativeStatement.getReference().get(0).getReferredToExternalDocument().getId().getRoot();
    documentReference.addIdentifier(buildIdentifier(id, organization.getIdentifierFirstRep().getValue()));
    documentReference.setId(id);
    documentReference.getMeta().addProfile(META_PROFILE);
    documentReference.setStatus(DocumentReferenceStatus.CURRENT);
    documentReference.setType(getType(narrativeStatement));
    documentReference.setSubject(new Reference(patient));
    documentReference.setIndexedElement(getIndexed(ehrExtract));
    documentReference.setDescription(buildDescription(narrativeStatement));
    documentReference.setCustodian(new Reference(organization));
    getAuthor(narrativeStatement, ehrComposition).ifPresent(documentReference::addAuthor);
    if (narrativeStatement.hasAvailabilityTime() && narrativeStatement.getAvailabilityTime().hasValue()) {
        documentReference.setCreatedElement(DateFormatUtil.parseToDateTimeType(narrativeStatement.getAvailabilityTime().getValue()));
    }
    var encounterReference = encounterList.stream().filter(encounter -> encounter.getId().equals(ehrComposition.getId().getRoot())).findFirst().map(Reference::new);
    if (encounterReference.isPresent()) {
        DocumentReference.DocumentReferenceContextComponent documentReferenceContextComponent = new DocumentReference.DocumentReferenceContextComponent().setEncounter(encounterReference.get());
        documentReference.setContext(documentReferenceContextComponent);
    }
    setContentAttachments(documentReference, narrativeStatement);
    return documentReference;
}
Also used : ParticipantReferenceUtil.getParticipantReference(uk.nhs.adaptors.pss.translator.util.ParticipantReferenceUtil.getParticipantReference) Reference(org.hl7.fhir.dstu3.model.Reference) DocumentReference(org.hl7.fhir.dstu3.model.DocumentReference) DocumentReference(org.hl7.fhir.dstu3.model.DocumentReference)

Example 3 with DocumentReferenceContextComponent

use of org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent in project MobileAccessGateway by i4mi.

the class Iti65RequestConverter method processDocumentReference.

/**
 * ITI-65: process DocumentReference resource from Bundle
 * @param reference
 * @param entry
 */
private void processDocumentReference(DocumentReference reference, DocumentEntry entry) {
    entry.assignEntryUuid();
    reference.setId(entry.getEntryUuid());
    Identifier masterIdentifier = reference.getMasterIdentifier();
    entry.setUniqueId(noPrefix(masterIdentifier.getValue()));
    // limitedMetadata -> meta.profile canonical [0..*]
    // No action
    // availabilityStatus -> status code {DocumentReferenceStatus} [1..1]
    // approved -> status=current
    // deprecated -> status=superseded
    // Other status values are allowed but are not defined in this mapping to XDS.
    DocumentReferenceStatus status = reference.getStatus();
    switch(status) {
        case CURRENT:
            entry.setAvailabilityStatus(AvailabilityStatus.APPROVED);
            break;
        case SUPERSEDED:
            entry.setAvailabilityStatus(AvailabilityStatus.DEPRECATED);
            break;
        default:
            throw new InvalidRequestException("Unknown document status");
    }
    // contentTypeCode -> type CodeableConcept [0..1]
    CodeableConcept type = reference.getType();
    entry.setTypeCode(transform(type));
    // classCode -> category CodeableConcept [0..*]
    List<CodeableConcept> category = reference.getCategory();
    entry.setClassCode(transform(category));
    // patientId -> subject Reference(Patient| Practitioner| Group| Device) [0..1],
    Reference subject = reference.getSubject();
    entry.setPatientId(transformReferenceToIdentifiable(subject, reference));
    // creationTime -> date instant [0..1]
    entry.setCreationTime(timestampFromDate(reference.getDateElement()));
    // PractitionerRole| Organization| Device| Patient| RelatedPerson) [0..*]
    for (Reference authorRef : reference.getAuthor()) {
        entry.getAuthors().add(transformAuthor(authorRef, reference.getContained(), null));
    }
    if (reference.hasAuthenticator()) {
        Reference authenticatorRef = reference.getAuthenticator();
        Resource authenticator = findResource(authenticatorRef, reference.getContained());
        if (authenticator instanceof Practitioner) {
            entry.setLegalAuthenticator(transform((Practitioner) authenticator));
        } else if (authenticator instanceof PractitionerRole) {
            Practitioner practitioner = (Practitioner) findResource(((PractitionerRole) authenticator).getPractitioner(), reference.getContained());
            if (practitioner != null)
                entry.setLegalAuthenticator(transform(practitioner));
        } else
            throw new InvalidRequestException("No authenticator of type Organization supported.");
    }
    // title -> description string [0..1]
    String title = reference.getDescription();
    if (title != null)
        entry.setTitle(localizedString(title));
    // confidentialityCode -> securityLabel CodeableConcept [0..*] Note: This
    // is NOT the DocumentReference.meta, as that holds the meta tags for the
    // DocumentReference itself.
    List<CodeableConcept> securityLabels = reference.getSecurityLabel();
    transformCodeableConcepts(securityLabels, entry.getConfidentialityCodes());
    // mimeType -> content.attachment.contentType [1..1] code [0..1]
    DocumentReferenceContentComponent content = reference.getContentFirstRep();
    if (content == null)
        throw new InvalidRequestException("Missing content field in DocumentReference");
    Attachment attachment = content.getAttachment();
    if (attachment == null)
        throw new InvalidRequestException("Missing attachment field in DocumentReference");
    entry.setMimeType(attachment.getContentType());
    // languageCode -> content.attachment.language code [0..1]
    entry.setLanguageCode(attachment.getLanguage());
    // size -> content.attachment.size integer [0..1] The size is calculated
    if (attachment.hasSize())
        entry.setSize((long) attachment.getSize());
    // on the data prior to base64 encoding, if the data is base64 encoded.
    // hash -> content.attachment.hash string [0..1]
    byte[] hash = attachment.getHash();
    if (hash != null)
        entry.setHash(Hex.encodeHexString(hash));
    // comments -> content.attachment.title string [0..1]
    String comments = attachment.getTitle();
    if (comments != null)
        entry.setComments(localizedString(comments));
    // creationTime -> content.attachment.creation dateTime [0..1]
    if (attachment.hasCreation()) {
        if (entry.getCreationTime() == null)
            entry.setCreationTime(timestampFromDate(attachment.getCreationElement()));
        else if (!timestampFromDate(attachment.getCreationElement()).equals(entry.getCreationTime()))
            throw new InvalidRequestException("DocumentReference.date does not match attachment.creation element");
    }
    // formatCode -> content.format Coding [0..1]
    Coding coding = content.getFormat();
    entry.setFormatCode(transform(coding));
    DocumentReferenceContextComponent context = reference.getContext();
    // Instead: referenceIdList -> related.identifier
    for (Reference ref : context.getRelated()) {
        Identifiable refId = transformReferenceToIdentifiable(ref, reference);
        if (refId != null) {
            ReferenceId referenceId = new ReferenceId();
            referenceId.setAssigningAuthority(new CXiAssigningAuthority(null, refId.getAssigningAuthority().getUniversalId(), refId.getAssigningAuthority().getUniversalIdType()));
            referenceId.setId(refId.getId());
            entry.getReferenceIdList().add(referenceId);
        }
    }
    // Currently not mapped
    /*for (Reference encounterRef : context.getEncounter()) {
        	ReferenceId referenceId = new ReferenceId();
        	Identifiable id = transformReferenceToIdentifiable(encounterRef, reference);
        	if (id != null) {
        	  referenceId.setIdTypeCode(ReferenceId.ID_TYPE_ENCOUNTER_ID);        	
        	  referenceId.setId(id.getId());
        	  //referenceId.setAssigningAuthority(new CXiAid.getAssigningAuthority().getUniversalId());
			  entry.getReferenceIdList().add(referenceId );
        }*/
    // eventCodeList -> context.event CodeableConcept [0..*]
    List<CodeableConcept> events = context.getEvent();
    transformCodeableConcepts(events, entry.getEventCodeList());
    // serviceStartTime serviceStopTime -> context.period Period [0..1]
    Period period = context.getPeriod();
    if (period != null) {
        entry.setServiceStartTime(timestampFromDate(period.getStartElement()));
        entry.setServiceStopTime(timestampFromDate(period.getEndElement()));
    }
    // healthcareFacilityTypeCode -> context.facilityType CodeableConcept
    // [0..1]
    entry.setHealthcareFacilityTypeCode(transformCodeableConcept(context.getFacilityType()));
    // practiceSettingCode -> context.practiceSetting CodeableConcept [0..1]
    entry.setPracticeSettingCode(transformCodeableConcept(context.getPracticeSetting()));
    Extension originalRole = reference.getExtensionByUrl("http://fhir.ch/ig/ch-epr-mhealth/StructureDefinition/ch-ext-author-authorrole");
    if (originalRole != null) {
        if (originalRole.getValue() instanceof Coding) {
            Coding value = (Coding) originalRole.getValue();
            String system = noPrefix(value.getSystem());
            String code = value.getCode();
            entry.setExtraMetadata(Collections.singletonMap("urn:e-health-suisse:2020:originalProviderRole", Collections.singletonList(code + "^^^&" + system + "&ISO")));
        }
    }
    // Patient.identifier.use element set to ‘usual’.
    if (context.hasSourcePatientInfo()) {
        entry.setSourcePatientId(transformReferenceToIdentifiable(context.getSourcePatientInfo(), reference));
        entry.setSourcePatientInfo(transformReferenceToPatientInfo(context.getSourcePatientInfo(), reference));
    }
}
Also used : CXiAssigningAuthority(org.openehealth.ipf.commons.ihe.xds.core.metadata.CXiAssigningAuthority) DocumentReferenceContextComponent(org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent) Reference(org.hl7.fhir.r4.model.Reference) DocumentReference(org.hl7.fhir.r4.model.DocumentReference) Resource(org.hl7.fhir.r4.model.Resource) ListResource(org.hl7.fhir.r4.model.ListResource) DomainResource(org.hl7.fhir.r4.model.DomainResource) Period(org.hl7.fhir.r4.model.Period) Attachment(org.hl7.fhir.r4.model.Attachment) PractitionerRole(org.hl7.fhir.r4.model.PractitionerRole) LocalizedString(org.openehealth.ipf.commons.ihe.xds.core.metadata.LocalizedString) Identifiable(org.openehealth.ipf.commons.ihe.xds.core.metadata.Identifiable) Practitioner(org.hl7.fhir.r4.model.Practitioner) Extension(org.hl7.fhir.r4.model.Extension) Identifier(org.hl7.fhir.r4.model.Identifier) ReferenceId(org.openehealth.ipf.commons.ihe.xds.core.metadata.ReferenceId) Coding(org.hl7.fhir.r4.model.Coding) InvalidRequestException(ca.uhn.fhir.rest.server.exceptions.InvalidRequestException) DocumentReferenceStatus(org.hl7.fhir.r4.model.Enumerations.DocumentReferenceStatus) CodeableConcept(org.hl7.fhir.r4.model.CodeableConcept) DocumentReferenceContentComponent(org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContentComponent)

Example 4 with DocumentReferenceContextComponent

use of org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent in project synthea by synthetichealth.

the class FhirR4 method clinicalNote.

/**
 * Add a clinical note to the Bundle, which adds both a DocumentReference and a
 * DiagnosticReport.
 *
 * @param rand           Source of randomness to use when generating ids etc
 * @param personEntry    The Entry for the Person
 * @param bundle         Bundle to add the Report to
 * @param encounterEntry Current Encounter entry
 * @param clinicalNoteText The plain text contents of the note.
 * @param currentNote If this is the most current note.
 * @return The entry for the DocumentReference.
 */
private static BundleEntryComponent clinicalNote(RandomNumberGenerator rand, BundleEntryComponent personEntry, Bundle bundle, BundleEntryComponent encounterEntry, String clinicalNoteText, boolean currentNote) {
    // We'll need the encounter...
    org.hl7.fhir.r4.model.Encounter encounter = (org.hl7.fhir.r4.model.Encounter) encounterEntry.getResource();
    // Add a DiagnosticReport
    DiagnosticReport reportResource = new DiagnosticReport();
    if (USE_US_CORE_IG) {
        Meta meta = new Meta();
        meta.addProfile("http://hl7.org/fhir/us/core/StructureDefinition/us-core-diagnosticreport-note");
        reportResource.setMeta(meta);
    }
    reportResource.setStatus(DiagnosticReportStatus.FINAL);
    reportResource.addCategory(new CodeableConcept(new Coding(LOINC_URI, "34117-2", "History and physical note")));
    reportResource.getCategoryFirstRep().addCoding(new Coding(LOINC_URI, "51847-2", "Evaluation+Plan note"));
    reportResource.setCode(reportResource.getCategoryFirstRep());
    reportResource.setSubject(new Reference(personEntry.getFullUrl()));
    reportResource.setEncounter(new Reference(encounterEntry.getFullUrl()));
    reportResource.setEffective(encounter.getPeriod().getStartElement());
    reportResource.setIssued(encounter.getPeriod().getStart());
    if (encounter.hasParticipant()) {
        reportResource.addPerformer(encounter.getParticipantFirstRep().getIndividual());
    } else {
        reportResource.addPerformer(encounter.getServiceProvider());
    }
    reportResource.addPresentedForm().setContentType("text/plain; charset=utf-8").setData(clinicalNoteText.getBytes(java.nio.charset.StandardCharsets.UTF_8));
    newEntry(rand, bundle, reportResource);
    // Add a DocumentReference
    DocumentReference documentReference = new DocumentReference();
    if (USE_US_CORE_IG) {
        Meta meta = new Meta();
        meta.addProfile("http://hl7.org/fhir/us/core/StructureDefinition/us-core-documentreference");
        documentReference.setMeta(meta);
    }
    if (currentNote) {
        documentReference.setStatus(DocumentReferenceStatus.CURRENT);
    } else {
        documentReference.setStatus(DocumentReferenceStatus.SUPERSEDED);
    }
    documentReference.addIdentifier().setSystem("urn:ietf:rfc:3986").setValue("urn:uuid:" + reportResource.getId());
    documentReference.setType(reportResource.getCategoryFirstRep());
    documentReference.addCategory(new CodeableConcept(new Coding("http://hl7.org/fhir/us/core/CodeSystem/us-core-documentreference-category", "clinical-note", "Clinical Note")));
    documentReference.setSubject(new Reference(personEntry.getFullUrl()));
    documentReference.setDate(encounter.getPeriod().getStart());
    documentReference.addAuthor(reportResource.getPerformerFirstRep());
    documentReference.setCustodian(encounter.getServiceProvider());
    documentReference.addContent().setAttachment(reportResource.getPresentedFormFirstRep()).setFormat(new Coding("http://ihe.net/fhir/ValueSet/IHE.FormatCode.codesystem", "urn:ihe:iti:xds:2017:mimeTypeSufficient", "mimeType Sufficient"));
    documentReference.setContext(new DocumentReferenceContextComponent().addEncounter(reportResource.getEncounter()).setPeriod(encounter.getPeriod()));
    return newEntry(rand, bundle, documentReference);
}
Also used : Meta(org.hl7.fhir.r4.model.Meta) DocumentReferenceContextComponent(org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent) Reference(org.hl7.fhir.r4.model.Reference) DocumentReference(org.hl7.fhir.r4.model.DocumentReference) DiagnosticReport(org.hl7.fhir.r4.model.DiagnosticReport) Coding(org.hl7.fhir.r4.model.Coding) Encounter(org.mitre.synthea.world.concepts.HealthRecord.Encounter) DocumentReference(org.hl7.fhir.r4.model.DocumentReference) CodeableConcept(org.hl7.fhir.r4.model.CodeableConcept)

Example 5 with DocumentReferenceContextComponent

use of org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent in project summary-care-record-api by NHSDigital.

the class GetScrService method buildDocumentReference.

private DocumentReference buildDocumentReference(String nhsNumber, EventListQueryResponse response, Patient patient) {
    DocumentReference documentReference = new DocumentReference();
    documentReference.setId(randomUUID());
    documentReference.addSecurityLabel(new CodeableConcept(new Coding().setCode(response.getViewPermission().getFhirValue()).setSystem(ACS_SYSTEM)));
    documentReference.setStatus(CURRENT);
    documentReference.setType(GP_SUMMARY_SNOMED);
    documentReference.setSubject(new Reference(patient));
    DocumentReferenceContentComponent content = buildDocumentReferenceContent(nhsNumber, response.getLatestScrId());
    documentReference.addContent(content);
    documentReference.setMasterIdentifier(new Identifier().setValue(response.getLatestScrId()).setSystem(SCR_ID_SYSTEM));
    DocumentReferenceContextComponent context = new DocumentReferenceContextComponent();
    context.addEvent(GP_SUMMARY_SNOMED);
    documentReference.setContext(context);
    return documentReference;
}
Also used : Identifier(org.hl7.fhir.r4.model.Identifier) DocumentReferenceContextComponent(org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent) Coding(org.hl7.fhir.r4.model.Coding) Reference(org.hl7.fhir.r4.model.Reference) DocumentReference(org.hl7.fhir.r4.model.DocumentReference) DocumentReference(org.hl7.fhir.r4.model.DocumentReference) CodeableConcept(org.hl7.fhir.r4.model.CodeableConcept) DocumentReferenceContentComponent(org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContentComponent)

Aggregations

DocumentReference (org.hl7.fhir.r4.model.DocumentReference)4 DocumentReferenceContextComponent (org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContextComponent)4 Reference (org.hl7.fhir.r4.model.Reference)4 CodeableConcept (org.hl7.fhir.r4.model.CodeableConcept)3 Coding (org.hl7.fhir.r4.model.Coding)3 DocumentReferenceContentComponent (org.hl7.fhir.r4.model.DocumentReference.DocumentReferenceContentComponent)3 Identifier (org.hl7.fhir.r4.model.Identifier)3 Attachment (org.hl7.fhir.r4.model.Attachment)2 Period (org.hl7.fhir.r4.model.Period)2 Practitioner (org.hl7.fhir.r4.model.Practitioner)2 Identifiable (org.openehealth.ipf.commons.ihe.xds.core.metadata.Identifiable)2 ReferenceId (org.openehealth.ipf.commons.ihe.xds.core.metadata.ReferenceId)2 InvalidRequestException (ca.uhn.fhir.rest.server.exceptions.InvalidRequestException)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 DocumentReference (org.hl7.fhir.dstu3.model.DocumentReference)1 DocumentReferenceContentComponent (org.hl7.fhir.dstu3.model.DocumentReference.DocumentReferenceContentComponent)1 DocumentReferenceContextComponent (org.hl7.fhir.dstu3.model.DocumentReference.DocumentReferenceContextComponent)1 Reference (org.hl7.fhir.dstu3.model.Reference)1