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.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;

import ca.uhn.fhir.model.dstu2.resource.Condition;
import ca.uhn.fhir.model.dstu2.resource.Encounter;
import ca.uhn.fhir.model.dstu2.resource.Practitioner;
import ca.uhn.fhir.model.primitive.DateTimeDt;
import ca.uhn.fhir.model.dstu2.composite.ResourceReferenceDt;
import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry;
import gov.va.med.pbm.ampl.constant.MockDataConstants;
import gov.va.med.pbm.ampl.model.Facility;
import gov.va.med.pbm.ampl.model.Problem;
import gov.va.med.pbm.ampl.model.Signature;
import gov.va.med.pbm.ampl.utility.DateUtility;
import gov.va.med.pbm.ampl.model.AuditHistory;
import gov.va.med.pbm.ampl.model.Comment;

/**
* The UnbundleProblem class marshals an {@link Problem} resource to a client readable JSON format.
*
* @author Pavani Mukthipudi
*/
public class UnbundleProblem {

private List<Entry> entries;
private String patientId;

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

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

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

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

Condition condition = (Condition) entry.getResource();
Encounter encounter = (Encounter) condition.getEncounter().getResource();

Signature signature = this.getSignature(condition);
Optional<DateTimeDt> optOnset = Optional.ofNullable((DateTimeDt) condition.getOnset());

problem.setAuditHistory(this.getAuditHistory());
problem.setCategory(condition.getCategory().getTextElement().getValue());
problem.setClinic(this.getFacility(encounter.getServiceProvider()).getName());
problem.setCodingSystem(MockDataConstants.NOT_MAPPED);
problem.setComments(this.getComments(condition));
problem.setCondition(condition.getCode().getCodingFirstRep().getDisplay());
problem.setDescription(condition.getNotes());
problem.setDiagnosis(condition.getStage().getSummary().getText());
problem.setDiagnosisCode(condition.getCode().getCodingFirstRep().getCode());
problem.setEnteredBy(MockDataConstants.NOT_MAPPED);
problem.setEntryDate(null);
problem.setExposures(new String[] { MockDataConstants.NOT_MAPPED });
problem.setFacility(this.getFacility(condition));
problem.setImmediacy(condition.getClinicalStatus());
problem.setLastUpdatedDate(null);
problem.setOnsetDate(
optOnset.isPresent() ? DateUtility.offsetDateTimeValueOf(optOnset.get().getValueAsString()) : null);
problem.setPatientId(patientId);
problem.setProvider(MockDataConstants.NOT_MAPPED);
problem.setRecordedBy(signature.getSignator());
problem.setRecordedDate(signature.getSignDate());
problem.setService(MockDataConstants.NOT_MAPPED);
// problem.setServiceConnected(true);
problem.setStatus(condition.getVerificationStatus());
problem.setVerified(condition.getEvidenceFirstRep().getCode().getText());

problemList.add(problem);
}

return problemList;
}

/**
* This method builds a {@link Comment} from a given {@link Condition}.
*
* @param condition {@link Condition}
* @return {@link Comment}
*/
private Collection<Comment> getComments(Condition condition) {
Collection<Comment> comments = new ArrayList<Comment>();
// TODO split FHIRs comment field into any number of comments

Comment comment = new Comment();
comment.setText(MockDataConstants.NOT_MAPPED);
comment.setSignature(this.getSignature(condition));

comments.add(comment);

return comments;
}

/**
* This method builds a {@link Signature} from a given {@link Condition}.
*
* @param condition {@link Condition}
* @return {@link Signature}
*/
private Signature getSignature(Condition condition) {
UnbundleSignature uSignature = new UnbundleSignature();

Optional<ResourceReferenceDt> optAsserter = Optional.of(condition.getAsserter());
Optional<OffsetDateTime> optDate = Optional.of(DateUtility.offsetDateTimeValueOf(condition.getDateRecorded()));

Signature signature = uSignature.getSignatureFromResourceReference(optAsserter, optDate);

return signature;
}

/**
* This method builds the facility from a {@link Condition}'s {@link Practitioner}.
*
* @param condition {@link Condition}
* @return {@link Facility}
*/
private Facility getFacility(Condition condition) {
Practitioner asserter = (Practitioner) condition.getAsserter().getResource();

return this.getFacility(asserter.getPractitionerRoleFirstRep().getManagingOrganization());
}

/**
* This method calls a {@UnbundleFacility}, providing a {@link ResourceReferenceDt}.
*
* @param resource {@link ResourceReferenceDt}
* @return {@link Facility}
*/
private Facility getFacility(ResourceReferenceDt resource) {
UnbundleFacility uFacility = new UnbundleFacility(resource);
Facility facility = uFacility.getResourceAsOrganization();

return facility;
}

/**
* This method builds the audit history.
*
* @return collection of {@link AuditHistory}
*/
private Collection<AuditHistory> getAuditHistory() {
// FIXME update params and query the repo for associated audit history
Collection<AuditHistory> auditHistoryList = new ArrayList<AuditHistory>();
AuditHistory auditHistory = new AuditHistory();
auditHistory.setFieldChanged(MockDataConstants.VERIFY_FHIR_ELEMENT);
auditHistoryList.add(auditHistory);

return auditHistoryList;
}
}