Search in sources :

Example 1 with ImmunizationPerformerComponent

use of org.hl7.fhir.r4.model.Immunization.ImmunizationPerformerComponent in project openmrs-module-fhir2 by openmrs.

the class ImmunizationTranslatorImpl method toOpenmrsType.

@Override
public Obs toOpenmrsType(@Nonnull Obs openmrsImmunization, @Nonnull Immunization fhirImmunization) {
    if (openmrsImmunization == null) {
        return null;
    }
    if (fhirImmunization == null) {
        return openmrsImmunization;
    }
    Patient patient = patientReferenceTranslator.toOpenmrsType(fhirImmunization.getPatient());
    if (patient == null) {
        final String errMsg;
        if (fhirImmunization.getPatient().hasReference()) {
            errMsg = "Could not find patient matching " + fhirImmunization.getPatient().getReference();
        } else {
            errMsg = "No patient was specified for this request";
        }
        throw createImmunizationRequestValidationError(errMsg);
    }
    List<ImmunizationPerformerComponent> performers = fhirImmunization.getPerformer();
    Provider provider = null;
    if (performers.size() > 1) {
        throw createImmunizationRequestValidationError("More than one performer was specified. Only a single performer is currently supported for each immunization.");
    } else if (performers.size() == 1) {
        ImmunizationPerformerComponent performer = performers.get(0);
        if (performer != null && performer.hasActor()) {
            provider = practitionerReferenceTranslator.toOpenmrsType(performer.getActor());
        }
    }
    final Visit visit;
    if (fhirImmunization.hasEncounter()) {
        visit = visitReferenceTranslator.toOpenmrsType(fhirImmunization.getEncounter());
    } else {
        visit = null;
    }
    if (visit == null) {
        final String errMsg;
        if (fhirImmunization.getEncounter().hasReference()) {
            errMsg = "Could not find visit matching " + fhirImmunization.getEncounter().getReference();
        } else {
            errMsg = "No encounter was specified for this request";
        }
        throw createImmunizationRequestValidationError(errMsg);
    }
    Location location = visit.getLocation();
    if (fhirImmunization.hasLocation()) {
        Location recordedLocation = locationReferenceTranslator.toOpenmrsType(fhirImmunization.getLocation());
        if (recordedLocation != null) {
            location = recordedLocation;
        }
    }
    if (!patient.equals(visit.getPatient())) {
        throw createImmunizationRequestValidationError("The visit '" + visit.getUuid() + "' does not belong to patient '" + patient.getUuid() + "'.");
    }
    EncounterType encounterType = helper.getImmunizationsEncounterType();
    // taking the visit's most recent immunization encounter
    Optional<Encounter> existingEncounter = visit.getEncounters().stream().filter(e -> encounterType.equals(e.getEncounterType())).max(Comparator.comparing(Encounter::getEncounterDatetime));
    final Provider encounterProvider = provider;
    final Location finalLocation = location;
    Encounter encounter = existingEncounter.orElseGet(() -> {
        final EncounterRole encounterRole = helper.getAdministeringEncounterRole();
        final Encounter newEncounter = new Encounter();
        newEncounter.setVisit(visit);
        newEncounter.setLocation(finalLocation);
        newEncounter.setEncounterType(encounterType);
        newEncounter.setPatient(patient);
        if (encounterProvider != null) {
            newEncounter.setProvider(encounterRole, encounterProvider);
        }
        if (visit.getStopDatetime() != null) {
            newEncounter.setEncounterDatetime(visit.getStopDatetime());
        } else {
            newEncounter.setEncounterDatetime(openmrsImmunization.getObsDatetime());
        }
        return newEncounter;
    });
    openmrsImmunization.setPerson(patient);
    openmrsImmunization.setLocation(location);
    openmrsImmunization.setEncounter(encounter);
    openmrsImmunization.getGroupMembers().forEach(obs -> {
        obs.setPerson(patient);
        obs.setLocation(finalLocation);
        obs.setEncounter(encounter);
    });
    Map<String, Obs> members = helper.getObsMembersMap(openmrsImmunization);
    Coding coding = fhirImmunization.getVaccineCode().getCoding().stream().filter(code -> StringUtils.isEmpty(code.getSystem())).reduce((code1, code2) -> {
        throw createImmunizationRequestValidationError("Multiple system-less coding found for the immunization's vaccine: " + code1.getCode() + " and " + code2.getCode() + ". No unique system concept could be identified as the coded answer.");
    }).orElseThrow(() -> createImmunizationRequestValidationError("Could not find a valid coding could be identified for this immunization."));
    {
        Obs obs = members.get(CIEL_984);
        if (obs == null) {
            obs = helper.addNewObs(openmrsImmunization, CIEL_984);
            members.put(CIEL_984, obs);
            obs.setValueCoded(conceptService.getConceptByUuid(coding.getCode()));
        } else if (obs.getId() == null) {
            obs.setValueCoded(conceptService.getConceptByUuid(coding.getCode()));
        } else {
            Concept newValue = conceptService.getConceptByUuid(coding.getCode());
            Concept prevValue = obs.getValueCoded();
            if (!newValue.equals(prevValue)) {
                obs = helper.replaceObs(openmrsImmunization, obs);
                obs.setValueCoded(newValue);
            }
        }
    }
    if (!fhirImmunization.hasOccurrenceDateTimeType() || !fhirImmunization.getOccurrenceDateTimeType().hasValue()) {
        throw createImmunizationRequestValidationError("An Immunization must have a valid occurrenceDateTime value");
    }
    {
        Obs obs = members.get(CIEL_1410);
        if (obs == null) {
            obs = helper.addNewObs(openmrsImmunization, CIEL_1410);
            members.put(CIEL_1410, obs);
            obs.setValueDatetime(fhirImmunization.getOccurrenceDateTimeType().getValue());
        } else if (obs.getId() == null) {
            obs.setValueDatetime(fhirImmunization.getOccurrenceDateTimeType().getValue());
        } else {
            Date newValue = fhirImmunization.getOccurrenceDateTimeType().getValue();
            Date prevValue = obs.getValueDatetime();
            if (!newValue.equals(prevValue)) {
                obs = helper.replaceObs(openmrsImmunization, obs);
                obs.setValueDatetime(newValue);
            }
        }
    }
    if (fhirImmunization.hasProtocolApplied()) {
        if (fhirImmunization.getProtocolApplied().size() != 1) {
            throw createImmunizationRequestValidationError("Either no protocol applied was found or multiple protocols applied were found. " + "Only one protocol is currently supported for each immunization.");
        }
        ImmunizationProtocolAppliedComponent protocolApplied = fhirImmunization.getProtocolApplied().get(0);
        if (protocolApplied.hasDoseNumber()) {
            {
                Obs obs = members.get(CIEL_1418);
                if (obs == null) {
                    obs = helper.addNewObs(openmrsImmunization, CIEL_1418);
                    members.put(CIEL_1418, obs);
                    obs.setValueNumeric(protocolApplied.getDoseNumberPositiveIntType().getValue().doubleValue());
                } else if (obs.getId() == null) {
                    obs.setValueNumeric(protocolApplied.getDoseNumberPositiveIntType().getValue().doubleValue());
                } else {
                    double newValue = protocolApplied.getDoseNumberPositiveIntType().getValue().doubleValue();
                    Double updatedValue = obs.getValueNumeric();
                    if (updatedValue != null && newValue != updatedValue) {
                        obs = helper.replaceObs(openmrsImmunization, obs);
                        obs.setValueNumeric(newValue);
                    }
                }
            }
        }
    } else {
        openmrsImmunization.removeGroupMember(members.get(CIEL_1418));
    }
    if (fhirImmunization.hasManufacturer() && fhirImmunization.getManufacturer().hasDisplay()) {
        {
            Obs obs = members.get(CIEL_1419);
            if (obs == null) {
                obs = helper.addNewObs(openmrsImmunization, CIEL_1419);
                members.put(CIEL_1419, obs);
                obs.setValueText(fhirImmunization.getManufacturer().getDisplay());
            } else if (obs.getId() == null) {
                obs.setValueText(fhirImmunization.getManufacturer().getDisplay());
            } else {
                String newValue = fhirImmunization.getManufacturer().getDisplay();
                String prevValue = obs.getValueText();
                if (!newValue.equals(prevValue)) {
                    obs = helper.replaceObs(openmrsImmunization, obs);
                    obs.setValueText(newValue);
                }
            }
        }
    } else {
        openmrsImmunization.removeGroupMember(members.get(CIEL_1419));
    }
    if (fhirImmunization.hasLotNumber()) {
        {
            Obs obs = members.get(CIEL_1420);
            if (obs == null) {
                obs = helper.addNewObs(openmrsImmunization, CIEL_1420);
                members.put(CIEL_1420, obs);
                obs.setValueText(fhirImmunization.getLotNumber());
            } else if (obs.getId() == null) {
                obs.setValueText(fhirImmunization.getLotNumber());
            } else {
                String newValue = fhirImmunization.getLotNumber();
                String prevValue = obs.getValueText();
                if (!newValue.equals(prevValue)) {
                    obs = helper.replaceObs(openmrsImmunization, obs);
                    obs.setValueText(newValue);
                }
            }
        }
    } else {
        openmrsImmunization.removeGroupMember(members.get(CIEL_1420));
    }
    if (fhirImmunization.hasExpirationDate()) {
        {
            Obs obs = members.get(CIEL_165907);
            if (obs == null) {
                obs = helper.addNewObs(openmrsImmunization, CIEL_165907);
                members.put(CIEL_165907, obs);
                obs.setValueDate(fhirImmunization.getExpirationDate());
            } else if (obs.getId() == null) {
                obs.setValueDate(fhirImmunization.getExpirationDate());
            } else {
                Date newValue = fhirImmunization.getExpirationDate();
                Date prevValue = obs.getValueDate();
                if (!newValue.equals(prevValue)) {
                    obs = helper.replaceObs(openmrsImmunization, obs);
                    obs.setValueDate(newValue);
                }
            }
        }
    } else {
        openmrsImmunization.removeGroupMember(members.get(CIEL_165907));
    }
    return openmrsImmunization;
}
Also used : Setter(lombok.Setter) ImmunizationObsGroupHelper.createImmunizationRequestValidationError(org.openmrs.module.fhir2.api.util.ImmunizationObsGroupHelper.createImmunizationRequestValidationError) Date(java.util.Date) Visit(org.openmrs.Visit) Autowired(org.springframework.beans.factory.annotation.Autowired) ImmunizationPerformerComponent(org.hl7.fhir.r4.model.Immunization.ImmunizationPerformerComponent) Reference(org.hl7.fhir.r4.model.Reference) StringUtils(org.apache.commons.lang3.StringUtils) AccessLevel(lombok.AccessLevel) ImmunizationProtocolAppliedComponent(org.hl7.fhir.r4.model.Immunization.ImmunizationProtocolAppliedComponent) Location(org.openmrs.Location) ImmunizationObsGroupHelper(org.openmrs.module.fhir2.api.util.ImmunizationObsGroupHelper) ImmunizationStatus(org.hl7.fhir.r4.model.Immunization.ImmunizationStatus) Map(java.util.Map) ConceptService(org.openmrs.api.ConceptService) Obs(org.openmrs.Obs) Nonnull(javax.annotation.Nonnull) PractitionerReferenceTranslator(org.openmrs.module.fhir2.api.translators.PractitionerReferenceTranslator) ImmunizationTranslator(org.openmrs.module.fhir2.api.translators.ImmunizationTranslator) ImmutableSet(com.google.common.collect.ImmutableSet) Encounter(org.openmrs.Encounter) Iterator(java.util.Iterator) EncounterReferenceTranslator(org.openmrs.module.fhir2.api.translators.EncounterReferenceTranslator) ConceptTranslator(org.openmrs.module.fhir2.api.translators.ConceptTranslator) Set(java.util.Set) LocationReferenceTranslator(org.openmrs.module.fhir2.api.translators.LocationReferenceTranslator) List(java.util.List) Immunization(org.hl7.fhir.r4.model.Immunization) Component(org.springframework.stereotype.Component) Concept(org.openmrs.Concept) Provider(org.openmrs.Provider) EncounterType(org.openmrs.EncounterType) Coding(org.hl7.fhir.r4.model.Coding) PatientReferenceTranslator(org.openmrs.module.fhir2.api.translators.PatientReferenceTranslator) Optional(java.util.Optional) ObservationValueTranslator(org.openmrs.module.fhir2.api.translators.ObservationValueTranslator) PositiveIntType(org.hl7.fhir.r4.model.PositiveIntType) Comparator(java.util.Comparator) Collections(java.util.Collections) Patient(org.openmrs.Patient) EncounterRole(org.openmrs.EncounterRole) Concept(org.openmrs.Concept) Obs(org.openmrs.Obs) ImmunizationPerformerComponent(org.hl7.fhir.r4.model.Immunization.ImmunizationPerformerComponent) Visit(org.openmrs.Visit) Patient(org.openmrs.Patient) Date(java.util.Date) Provider(org.openmrs.Provider) Coding(org.hl7.fhir.r4.model.Coding) Encounter(org.openmrs.Encounter) EncounterRole(org.openmrs.EncounterRole) ImmunizationProtocolAppliedComponent(org.hl7.fhir.r4.model.Immunization.ImmunizationProtocolAppliedComponent) EncounterType(org.openmrs.EncounterType) Location(org.openmrs.Location)

Example 2 with ImmunizationPerformerComponent

use of org.hl7.fhir.r4.model.Immunization.ImmunizationPerformerComponent in project openmrs-module-fhir2 by openmrs.

the class ImmunizationTranslatorImpl method toFhirResource.

@Override
public Immunization toFhirResource(@Nonnull Obs openmrsImmunization) {
    if (openmrsImmunization == null) {
        return null;
    }
    Immunization immunization = new Immunization();
    immunization.setId(openmrsImmunization.getUuid());
    immunization.setStatus(ImmunizationStatus.COMPLETED);
    immunization.setPatient(patientReferenceTranslator.toFhirResource(new Patient(openmrsImmunization.getPerson())));
    immunization.setEncounter(visitReferenceTranslator.toFhirResource(openmrsImmunization.getEncounter().getVisit()));
    immunization.setPerformer(Collections.singletonList(new ImmunizationPerformerComponent(practitionerReferenceTranslator.toFhirResource(helper.getAdministeringProvider(openmrsImmunization)))));
    Map<String, Obs> members = helper.getObsMembersMap(openmrsImmunization);
    {
        Obs obs = members.get(CIEL_984);
        if (obs != null) {
            immunization.setVaccineCode(conceptTranslator.toFhirResource(obs.getValueCoded()));
        }
    }
    {
        Obs obs = members.get(CIEL_1410);
        if (obs != null) {
            immunization.setOccurrence(observationValueTranslator.toFhirResource(obs));
        }
    }
    {
        Obs obs = members.get(CIEL_1418);
        if (obs != null && obs.getValueNumeric() != null) {
            immunization.addProtocolApplied(new ImmunizationProtocolAppliedComponent(new PositiveIntType((long) obs.getValueNumeric().doubleValue())));
        }
    }
    {
        Obs obs = members.get(CIEL_1419);
        if (obs != null) {
            immunization.setManufacturer(new Reference().setDisplay(obs.getValueText()));
        }
    }
    {
        Obs obs = members.get(CIEL_1420);
        if (obs != null) {
            immunization.setLotNumber(members.get(CIEL_1420).getValueText());
        }
    }
    {
        Obs obs = members.get(CIEL_165907);
        if (obs != null) {
            immunization.setExpirationDate(obs.getValueDate());
        }
    }
    return immunization;
}
Also used : Obs(org.openmrs.Obs) Immunization(org.hl7.fhir.r4.model.Immunization) ImmunizationPerformerComponent(org.hl7.fhir.r4.model.Immunization.ImmunizationPerformerComponent) Reference(org.hl7.fhir.r4.model.Reference) Patient(org.openmrs.Patient) ImmunizationProtocolAppliedComponent(org.hl7.fhir.r4.model.Immunization.ImmunizationProtocolAppliedComponent) PositiveIntType(org.hl7.fhir.r4.model.PositiveIntType)

Aggregations

Immunization (org.hl7.fhir.r4.model.Immunization)2 ImmunizationPerformerComponent (org.hl7.fhir.r4.model.Immunization.ImmunizationPerformerComponent)2 ImmunizationProtocolAppliedComponent (org.hl7.fhir.r4.model.Immunization.ImmunizationProtocolAppliedComponent)2 PositiveIntType (org.hl7.fhir.r4.model.PositiveIntType)2 Reference (org.hl7.fhir.r4.model.Reference)2 Obs (org.openmrs.Obs)2 Patient (org.openmrs.Patient)2 ImmutableSet (com.google.common.collect.ImmutableSet)1 Collections (java.util.Collections)1 Comparator (java.util.Comparator)1 Date (java.util.Date)1 Iterator (java.util.Iterator)1 List (java.util.List)1 Map (java.util.Map)1 Optional (java.util.Optional)1 Set (java.util.Set)1 Nonnull (javax.annotation.Nonnull)1 AccessLevel (lombok.AccessLevel)1 Setter (lombok.Setter)1 StringUtils (org.apache.commons.lang3.StringUtils)1