Summary Table

Categories Total Count
PII 0
URL 0
DNS 0
EKL 0
IP 0
PORT 0
VsID 0
CF 0
AI 0
VPD 0
PL 0
Other 0

File Content

package gov.va.med.pbm.ampl.fhir.unmarshall.dstu2.unbundle;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Optional;

import ca.uhn.fhir.model.api.ExtensionDt;
import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry;
import ca.uhn.fhir.model.dstu2.resource.Condition;
import ca.uhn.fhir.model.dstu2.resource.Encounter;
import ca.uhn.fhir.model.dstu2.resource.Encounter.Location;
import ca.uhn.fhir.model.dstu2.resource.Encounter.Participant;
import ca.uhn.fhir.model.dstu2.resource.EpisodeOfCare;
import ca.uhn.fhir.model.dstu2.resource.ReferralRequest;
import gov.va.med.pbm.ampl.constant.MockDataConstants;
import gov.va.med.pbm.ampl.model.Consult;
import gov.va.med.pbm.ampl.model.Provider;
import gov.va.med.pbm.ampl.model.patientdemographics.Person;
import gov.va.med.pbm.ampl.utility.CollectionUtility;
import gov.va.med.pbm.ampl.utility.DateUtility;
import gov.va.med.pbm.ampl.utility.StringUtility;

/**
* The UnbundleConsult class marshals an {@link Encounter} resource to a client readable JSON format.
*
* @author Ian Meinert
*/
public class UnbundleConsult {

private List<Entry> entries;
private String patientId;

/**
* Overloaded constructor accepting a collection of {@link Entry}.
*
* @param patientId the patientId
* @param entries {@link Entry}
*/
public UnbundleConsult(String patientId, List<Entry> entries) {
this.patientId = patientId;
this.entries = entries;
}

/**
* This method queries the FHIR server for patients.
*
* @return collection of {@link Consult}
*/
public final Collection<Consult> getEntries() {
Collection<Consult> consults = new ArrayList<Consult>();

// Iterate over each entry to filter out the desired progress notes
for (Entry entry : entries) {
Consult consult = new Consult();

if(!entry.getResource().getClass().equals(Encounter.class)) {
continue;
}

Encounter encounter = (Encounter) entry.getResource();

ReferralRequest referralRequest = getReferralRequest(encounter);
EpisodeOfCare episodeOfCare = getEpisodeOfCare(encounter);
Condition eocCondition = getEocCondition(episodeOfCare);
Participant participant = encounter.getParticipantFirstRep();
UnbundlePerson activityPerson = new UnbundlePerson(participant.getIndividual());
UnbundlePerson recipientPerson = new UnbundlePerson(referralRequest.getRecipient());
UnbundleFacility unbundledFacility = new UnbundleFacility(encounter.getServiceProvider());
Person activityPractitioner = activityPerson.getPractitionerAsPerson();
Person recipientPractitioner = recipientPerson.getResourceAsPerson();

Optional<ReferralRequest> optRequester = Optional
.ofNullable((ReferralRequest) referralRequest.getRequester().getResource());
Location location = (Location) encounter.getLocationFirstRep().getLocation().getResource();

Optional<Location> plannedLocation = encounter.getLocation().stream()
.filter(l -> "planned".equals(StringUtility.clearNull(l.getStatus()).toLowerCase(Locale.ENGLISH))).findFirst();

consult.setActivity(encounter.getTypeFirstRep().getText());

// set these values to null to prevent a default value being returned to the client
consult.setEncounterStartDateTime(!Optional.ofNullable(participant.getPeriod().getStart()).isPresent() ? null
: DateUtility.offsetDateTimeValueOf(participant.getPeriod().getStartElement().getValueAsString()));
consult.setEncounterEndDateTime(!Optional.ofNullable(participant.getPeriod().getEnd()).isPresent() ? null
: DateUtility.offsetDateTimeValueOf(participant.getPeriod().getEndElement().getValueAsString()));
consult.setRequestDate(!Optional.ofNullable(referralRequest.getDate()).isPresent() ? null
: DateUtility.offsetDateTimeValueOf(referralRequest.getDateElement().getValueAsString()));
// TODO find mapping for activityDateTime
consult.setActivityDateTime(!Optional.ofNullable(participant.getPeriod().getStart()).isPresent() ? null
: DateUtility.offsetDateTimeValueOf(participant.getPeriod().getStartElement().getValueAsString()));

consult.setActivityEnteredBy(participant.getTypeFirstRep().getText());
consult.setAttention(recipientPractitioner.getName());
consult.setClinicallyIndicatedDate(!Optional.ofNullable(referralRequest.getDate()).isPresent() ? null
: DateUtility.offsetDateTimeValueOf(referralRequest.getDate()));
consult.setClinicalProcedure(encounter.getReasonFirstRep().getText());
consult.setFacility(unbundledFacility.getResourceAsOrganization());
consult.setFromService(referralRequest.getRequester().getDisplay().toString());
consult.setEncounterType(encounter.getClassElement());
consult.setLastAction(encounter.getStatusHistoryFirstRep().getStatus());
consult.setOrderableItem(MockDataConstants.NOT_MAPPED); // FIXME FHIR Extension
consult.setPatientLocation(MockDataConstants.VERIFY_FHIR_ELEMENT); // FIXME Where is this mapped?
consult.setPatientId(patientId);
Provider provider = new Provider();
provider.setName(
!Optional.ofNullable(activityPractitioner).isPresent() ? new String() : activityPractitioner.getName());
consult.setPersonResponsibleForActivity(provider);

consult.setPlaceOfConsultation(
!Optional.ofNullable(location).isPresent() ? new String() : location.getLocation().getDisplay().getValue());
consult.setProcedureConsult(referralRequest.getServiceRequestedFirstRep().getText());

if (!encounter.getAllUndeclaredExtensions().isEmpty()) {
Optional<ExtensionDt> optProvDx = Optional
.of(encounter.getAllUndeclaredExtensions().stream().findFirst().get());

/** This is a 3 part ^ delim array */
if (optProvDx.isPresent()) {
String[] dxArray = { "code", "name", "system" };
String[] provDxarray = optProvDx.get().getValue().toString().split("^");

if (provDxarray.length == dxArray.length) {
consult.setProvisionalDiagnosisCode(provDxarray[0]);
consult.setProvisionalDiagnosis(provDxarray[1]);
consult.setProvisionalDiagnosisSystem(provDxarray[2]);
}
}
}

consult.setProvisionalDiagnosisDate(!Optional.ofNullable(getIndication(encounter)).isPresent() ? null
: DateUtility.offsetDateTimeValueOf(getIndication(encounter).getDateRecorded()));
consult.setReportText(referralRequest.getDescription());

if (optRequester.isPresent()) {
consult.setRequestDate(DateUtility.offsetDateTimeValueOf(optRequester.get().getDate()));
consult.setRequestReason(optRequester.get().getReason().getText());

provider = new Provider();
provider.setName(optRequester.get().getResourceName());
consult.setRequestingProvider(provider);
}

consult.setWardLocation(MockDataConstants.VERIFY_FHIR_ELEMENT); // FIXME Where is this mapped?
consult.setRoomAndBed(MockDataConstants.VERIFY_FHIR_ELEMENT); // FIXME Where is this mapped?
consult.setSignificantFindings(eocCondition.getCode().getText());
consult.setStatus(encounter.getStatus());

consult.setToService(
plannedLocation.isPresent() ? plannedLocation.get().getLocation().getDisplay().toString() : new String());

consult.setUrgency(encounter.getPriority().getText());

consults.add(consult);
}

return consults;
}

/**
* This method marshals a string value into a ReferralRequest object.
*
* @param encounter the encounter
* @return ReferralRequest affiliated with patient
*/
private ReferralRequest getReferralRequest(Encounter encounter) {
ReferralRequest request = new ReferralRequest();

if (!CollectionUtility.isNullOrEmpty(encounter.getIncomingReferral())) {
request = (ReferralRequest) encounter.getIncomingReferral().stream().findFirst().get().getResource();
}

return request;
}

/**
* This method marshals the a string value into a EpisodeOfCare object.
*
* @param encounter the encounter
* @return EpisodeOfCare affiliated with patient
*/
private EpisodeOfCare getEpisodeOfCare(Encounter encounter) {
EpisodeOfCare request = new EpisodeOfCare();

if (!CollectionUtility.isNullOrEmpty(encounter.getEpisodeOfCare())) {
request = (EpisodeOfCare) encounter.getEpisodeOfCare().stream().findFirst().get().getResource();
}

return request;
}

/**
* This method marshals a string value into a Condition object.
*
* @param encounter the encounter
* @return Condition affiliated with patient
*/
private Condition getIndication(Encounter encounter) {
Condition request = null;

if (!CollectionUtility.isNullOrEmpty(encounter.getIndication())) {
request = (Condition) encounter.getIndication().stream().findFirst().get().getResource();
}

return request;
}

/**
* This method marshals the a string value into a Condition object.
*
* @param episodeOfCare the episodeOfCare
* @return Condition affiliated with patient
*/
private Condition getEocCondition(EpisodeOfCare episodeOfCare) {
Condition request = new Condition();

if (!CollectionUtility.isNullOrEmpty(episodeOfCare.getCondition())) {
request = (Condition) episodeOfCare.getCondition().stream().findFirst().get().getResource();
}

return request;
}
}