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.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import ca.uhn.fhir.model.api.IDatatype;
import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry;
import ca.uhn.fhir.model.dstu2.resource.Patient;
import gov.va.med.pbm.ampl.constant.MockDataConstants;
import gov.va.med.pbm.ampl.model.Consult;
import gov.va.med.pbm.ampl.model.Facility;
import gov.va.med.pbm.ampl.model.address.ConfidentialAddress;
import gov.va.med.pbm.ampl.model.address.PermanentAddress;
import gov.va.med.pbm.ampl.model.address.TemporaryAddress;
import gov.va.med.pbm.ampl.model.patientdemographics.PatientDetails;
import gov.va.med.pbm.ampl.model.patientdemographics.PatientDisability;
import gov.va.med.pbm.ampl.model.patientdemographics.PatientEligibility;
import gov.va.med.pbm.ampl.utility.DateUtility;

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

private List<Entry> entries;

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

/**
* This method saves the bundled entries into a collection of {@link PatientDetails}.
*
* @param consults collection of {@link Consult}
* @return collection of {@link PatientDetails}
*/
public Collection<PatientDetails> getEntries(Collection<Consult> consults) {
Collection<PatientDetails> patientDetailsCollection = new ArrayList<PatientDetails>();

// Iterate over each entry to filter out the desired patient details
for (Entry entry : entries) {
PatientDetails patientDetails = new PatientDetails();

Patient patient = (Patient) entry.getResource();

Optional<IDatatype> optDeceased = Optional.ofNullable(patient.getDeceased());

UnbundleAddress unbundleAddress = new UnbundleAddress(patient.getAddress());
ConfidentialAddress confidentialAddress = unbundleAddress.getAddressAsConfidential();
PermanentAddress permanentAddress = unbundleAddress.getAddressAsPermanent();
TemporaryAddress temporaryAddress = unbundleAddress.getAddressAsTemporary();
// TODO Emergency/NOK contact needed
UnbundlePerson emergencyPriContact = new UnbundlePerson(patient.getCareProvider());
UnbundlePerson emergencySecContact = new UnbundlePerson(patient.getCareProvider());
UnbundlePerson nokPriContact = new UnbundlePerson(patient.getCareProvider());
UnbundlePerson nokSecContact = new UnbundlePerson(patient.getCareProvider());
UnbundleContact contact = new UnbundleContact(patient.getContact());
UnbundleMilitaryService militaryService = new UnbundleMilitaryService();
UnbundlePatientCareTeam unbundlePatientCareTeam = new UnbundlePatientCareTeam();
UnbundleLanguage unbundleLanguage = new UnbundleLanguage();
UnbundleIdentifier identifier = new UnbundleIdentifier(patient.getIdentifier());


patientDetails.setDateOfDeath(
optDeceased.isPresent() ? DateUtility.offsetDateTimeValueOf(optDeceased.get().toString()) : null);
patientDetails.setDfn(identifier.getIdentifier("MPIID"));
patientDetails.setDob(DateUtility.offsetDateTimeValueOf(patient.getBirthDateElement().getValueAsString()));
patientDetails.setFullName(patient.getNameFirstRep().getNameAsSingleString());
patientDetails.setGender(patient.getGender());
patientDetails.setPatientId(identifier.getIdentifier("MPIID"));
patientDetails.setSsn(identifier.getIdentifier("MRN"));

// PatientDetails fields
patientDetails.setConfidentialAddress(confidentialAddress);
patientDetails.setContactDetails(contact.getFirstContact());
patientDetails.setDisabilities(this.getPatientDisabilities()); // TODO Extension method
patientDetails.setEligibility(this.getPatientEligibility()); // TODO Extension method
patientDetails.setEmergencyContactPrimary(emergencyPriContact.getResourceAsPerson());
patientDetails.setEmergencyContactSecondary(emergencySecContact.getResourceAsPerson());
patientDetails.setEmergencyResponse(MockDataConstants.NOT_MAPPED);
patientDetails.setLanguages(unbundleLanguage.getLanguages()); // TODO
patientDetails.setMilitaryService(militaryService.getMilitaryService());
patientDetails.setNextOfKinPrimary(nokPriContact.getResourceAsPerson());
patientDetails.setNextOfKinSecondary(nokSecContact.getResourceAsPerson());
patientDetails.setOneVaStatus(MockDataConstants.NOT_MAPPED); // not in GAP Analysis
patientDetails.setPatientCareTeams(unbundlePatientCareTeam.getPatientCareTeams());
patientDetails.setPermanentAddress(permanentAddress);

if (!consults.isEmpty()) {
Collection<Facility> facilities = new ArrayList<>();

Map<Facility, List<Consult>> map = consults.stream().collect(Collectors.groupingBy(Consult::getFacility));

Facility[] aFacilities = map.keySet().toArray(new Facility[facilities.size()]);

patientDetails.setRemoteSitesVisited(aFacilities);
patientDetails.setSite(aFacilities[0]);
}

patientDetails.setTemporaryAddress(temporaryAddress);

patientDetailsCollection.add(patientDetails);
}

return patientDetailsCollection;
}

/**
* This method marshals resources into a {@link PatientDisability} array.
*
* @return array of {@link PatientDisability}
*/
private PatientDisability[] getPatientDisabilities() {
// TODO Update parameters
Collection<PatientDisability> disabilities = new ArrayList<PatientDisability>();
PatientDisability disability = new PatientDisability();
disability.setRatedDisability(MockDataConstants.NOT_MAPPED);
disability.setIsServiceConnected(false);
disability.setDisabilityPercentage(0.0);

disabilities.add(disability);

return disabilities.toArray(new PatientDisability[disabilities.size()]);
}

/**
* This method marshals the patient eligibility information from FHIR to API format.
*
* @return {@link PatientEligibility}
*/
private PatientEligibility getPatientEligibility() {

PatientEligibility eligibility = new PatientEligibility();

eligibility.setCode(MockDataConstants.NOT_MAPPED);
eligibility.setStatus(MockDataConstants.NOT_MAPPED);
eligibility.setServiceConnected(false);
eligibility.setServiceConnectedPercentage(0.0);
eligibility.setRxPatientStatus(MockDataConstants.NOT_MAPPED);
// eligibility.setCombatVetEndDate(); // TODO
eligibility.setUnemployable(MockDataConstants.NOT_MAPPED);
eligibility.setPermanentTotalDisabled(MockDataConstants.NOT_MAPPED);
eligibility.setCurrentMeansTestStatus(MockDataConstants.NOT_MAPPED);
eligibility.setMedCopayExemptionStatus(MockDataConstants.NOT_MAPPED);

return eligibility;
}
}