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;
}
}