throw new IllegalArgumentException("Cannot change to a blank state");
Patient patient = highestOnStack(Patient.class);
if (patient == null)
throw new IllegalArgumentException("Cannot change state without a patient");
Encounter encounter = highestOnStack(Encounter.class);
if (encounter == null)
throw new IllegalArgumentException("Cannot change state without an Encounter");
// fetch any existing patient program with a state from this workflow
PatientProgram patientProgram = HtmlFormEntryUtil.getPatientProgramByWorkflow(patient, state.getProgramWorkflow());
// if no existing patient program, see if a patient program for this program is already set to be created at part of this submission (HTML-416)
if (patientProgram == null) {
patientProgram = HtmlFormEntryUtil.getPatientProgramByProgram(patientProgramsToCreate, state.getProgramWorkflow().getProgram());
}
if (patientProgram == null) {
patientProgram = HtmlFormEntryUtil.getPatientProgramByProgram(patientProgramsToUpdate, state.getProgramWorkflow().getProgram());
}
// if patient program is still null, we need to create a new program
if (patientProgram == null) {
patientProgram = new PatientProgram();
patientProgram.setPatient(patient);
patientProgram.setProgram(state.getProgramWorkflow().getProgram());
patientProgram.setDateEnrolled(encounter.getEncounterDatetime());
// HACK: we need to set the date created, creator, and uuid here as a hack around a hibernate flushing issue
// (should be able to remove this once we move to Hibernate Interceptors instead of Spring AOP to set these parameters)
patientProgram.setDateCreated(new Date());
patientProgram.setCreator(Context.getAuthenticatedUser());
patientProgram.setUuid(UUID.randomUUID().toString());
}
for (PatientState patientState : patientProgram.statesInWorkflow(state.getProgramWorkflow(), false)) {
if (patientState.getActive(encounter.getEncounterDatetime())) {
if (patientState.getState().equals(state)) {
return;
}
}
}
PatientState previousState = null;
PatientState nextState = null;
PatientState newState = new PatientState();
newState.setPatientProgram(patientProgram);
newState.setState(state);
newState.setStartDate(encounter.getEncounterDatetime());
// HACK: we need to set the date created, creator, and uuid here as a hack around a hibernate flushing issue
// (should be able to remove this once we move to Hibernate Interceptors instead of Spring AOP to set these parameters)
newState.setDateCreated(new Date());
newState.setCreator(Context.getAuthenticatedUser());
newState.setUuid(UUID.randomUUID().toString());