private void ensureProgramWorkflowIsSet(ProgramWorkflowState state, ProgramWorkflow workflow) { if (state.getProgramWorkflow() == null) { state.setProgramWorkflow(workflow); } else if (!state.getProgramWorkflow().equals(workflow)) { throw new APIException("ProgramWorkflow.error.contains.state", new Object[] { workflow.getProgram() }); } }
/** * Returns a Set<PatientState> of all recent {@link PatientState}s for each workflow of the * {@link PatientProgram} * * @return Set<PatientState> of all recent {@link PatientState}s for the {@link PatientProgram} */ public Set<PatientState> getMostRecentStateInEachWorkflow() { HashMap<ProgramWorkflow,PatientState> map = new HashMap<>(); for (PatientState state : getSortedStates()) { if (!state.isVoided()) { ProgramWorkflow workflow = state.getState().getProgramWorkflow(); map.put(workflow,state); } } Set<PatientState> ret = new HashSet<>(); for (Map.Entry<ProgramWorkflow, PatientState> entry : map.entrySet()) { ret.add(entry.getValue()); } return ret; }
/** * Returns a List<PatientState> of all {@link PatientState}s in the passed * {@link ProgramWorkflow} for the {@link PatientProgram} * * @param programWorkflow - The {@link ProgramWorkflow} to check * @param includeVoided - If true, return voided {@link PatientState}s in the returned * {@link List} * @return List<PatientState> of all {@link PatientState}s in the passed {@link ProgramWorkflow} * for the {@link PatientProgram} */ public List<PatientState> statesInWorkflow(ProgramWorkflow programWorkflow, boolean includeVoided) { List<PatientState> ret = new ArrayList<>(); for (PatientState st : getSortedStates()) { if (st.getState().getProgramWorkflow().equals(programWorkflow) && (includeVoided || !st.getVoided())) { ret.add(st); } } return ret; }
/** * Returns the current {@link PatientState} for the passed {@link ProgramWorkflow} within this * {@link PatientProgram}. * * @param programWorkflow The ProgramWorkflow whose current {@link PatientState} we want to * retrieve * @return PatientState The current {@link PatientState} for the passed {@link ProgramWorkflow} * within this {@link PatientProgram} */ public PatientState getCurrentState(ProgramWorkflow programWorkflow) { Date now = new Date(); PatientState currentState = null; for (PatientState state : getSortedStates()) { //states are sorted with the most current state at the last position if ((programWorkflow == null || state.getState().getProgramWorkflow().equals(programWorkflow)) && state.getActive(now)) { currentState = state; } } return currentState; }
/** * @see PatientProgramValidator#validate(Object,Errors) */ @Test public void validate_shouldPassForAValidProgram() { PatientProgram program = Context.getProgramWorkflowService().getPatientProgram(1); PatientState patientState = program.getStates().iterator().next(); patientState.getPatientProgram().transitionToState(patientState.getState().getProgramWorkflow().getState(4), new Date()); ValidateUtil.validate(program); }
PatientState lastState = getCurrentState(programWorkflowState.getProgramWorkflow()); if (lastState != null && onDate == null) { throw new IllegalArgumentException("You can't change from a non-null state without giving a change date"); && !programWorkflowState.getProgramWorkflow().isLegalTransition(lastState.getState(), programWorkflowState)) { throw new IllegalArgumentException("You can't change from state " + lastState.getState() + " to " + programWorkflowState);
@Override public ProgramWorkflow getParent(ProgramWorkflowState instance) { return instance.getProgramWorkflow(); }
/** * @see PatientProgramValidator#validate(Object,Errors) */ @Test public void validate_shouldFailIfAPatientIsInMultipleStatesInTheSameWorkFlow() { PatientProgram program = Context.getProgramWorkflowService().getPatientProgram(1); PatientState patientState = program.getStates().iterator().next(); patientState.getPatientProgram().transitionToState(patientState.getState().getProgramWorkflow().getState(4), new Date()); //make the closed state active patientState.setEndDate(null); BindException errors = new BindException(program, ""); new PatientProgramValidator().validate(program, errors); Assert.assertTrue(errors.hasFieldErrors("states")); }
/** * @see PatientProgramValidator#validate(Object,Errors) */ @Test public void validate_shouldPassForPatientStatesThatHaveTheSameStartDatesInTheSameWorkFlow() { PatientProgram program = Context.getProgramWorkflowService().getPatientProgram(1); PatientState patientState = program.getStates().iterator().next(); //add a new state by moving the patient to a another one ProgramWorkflowState nextState = patientState.getState().getProgramWorkflow().getState(4); patientState.getPatientProgram().transitionToState(nextState, patientState.getStartDate()); BindException errors = new BindException(program, ""); new PatientProgramValidator().validate(program, errors); Assert.assertEquals(false, errors.hasFieldErrors("states")); }
if (!patientState.getState().getProgramWorkflow().equals(workFlow)) { continue;
throw new FormEntryException("The program work flow state that matches '" + value + "' is not marked as initial"); } else if (!workflowsAndStates.add(state.getProgramWorkflow().getUuid())) { throw new FormEntryException("A patient cannot be in multiple states in the same workflow");
@Override protected void delete(PatientState delegate, String reason, RequestContext context) throws ResponseException { PatientProgram patientProgram = delegate.getPatientProgram(); PatientState lastPatientState = getLastPatientState(delegate.getState().getProgramWorkflow(), patientProgram); if (lastPatientState != null) { if (lastPatientState.getUuid().equals(delegate.getUuid())) { patientProgram.voidLastState(delegate.getState().getProgramWorkflow(), Context.getAuthenticatedUser(), null, null); Context.getProgramWorkflowService().savePatientProgram(patientProgram); } else { throw new ResourceDoesNotSupportOperationException("Only last state can be deleted"); } } }
@Override public ProgramWorkflowState save(ProgramWorkflowState delegate) { ProgramWorkflow workflow = delegate.getProgramWorkflow(); workflow.addState(delegate); Program program = workflow.getProgram(); program.addWorkflow(workflow); Context.getProgramWorkflowService().saveProgram(program); return delegate; }
if (state != null && state.getProgramWorkflow().equals(workflow)) { return state;
boolean foundState = false; for (PatientState patientState : eachPatientProgram.getStates()) { if (patientState.getState().getProgramWorkflow().equals(workflow)) { foundState = true;
private void enrollInProgram(String state, Date date) { ProgramWorkflowState workflowState = Context.getProgramWorkflowService().getStateByUuid(state); PatientProgram patientProgram = getPatientProgramByWorkflow(patient, workflowState.getProgramWorkflow(), date); if (patientProgram == null) { patientProgram = new PatientProgram(); patientProgram.setPatient(patient); patientProgram.setProgram(workflowState.getProgramWorkflow().getProgram()); patientProgram.setDateEnrolled(date); } Context.getProgramWorkflowService().savePatientProgram(patientProgram); }
private void transitionToState(String state, Date date) { ProgramWorkflowState workflowState = Context.getProgramWorkflowService().getStateByUuid(state); PatientProgram patientProgram = getPatientProgramByWorkflow(patient, workflowState.getProgramWorkflow(), date); if (patientProgram == null) { patientProgram = new PatientProgram(); patientProgram.setPatient(patient); patientProgram.setProgram(workflowState.getProgramWorkflow().getProgram()); patientProgram.setDateEnrolled(date); } patientProgram.transitionToState(workflowState, date); Context.getProgramWorkflowService().savePatientProgram(patientProgram); }
newState.getProgramWorkflow().getProgram(), session.getEncounter().getEncounterDatetime()); state.getProgramWorkflow().getProgram(), session.getEncounter().getEncounterDatetime());
/** * @param results * @param state * @return */ private PatientProgram getPatientProgramByWorkflow(Patient patient, ProgramWorkflow workflow, Date activeDate) { List<PatientProgram> patientPrograms = Context.getProgramWorkflowService().getPatientPrograms(patient, workflow.getProgram(), null, null, null, null, false); for (PatientProgram patientProgram : patientPrograms) { for (PatientState patientState : patientProgram.getStates()) { if (patientState.getState().getProgramWorkflow().equals(workflow)) { if (activeDate != null) { if (patientState.getActive(activeDate)) { return patientProgram; } } else { return patientProgram; } } } } return null; }
/** * @param results * @param state * @return */ private PatientProgram getPatientProgramByState(Patient patient, ProgramWorkflowState state, Date activeDate) { List<PatientProgram> patientPrograms = Context.getProgramWorkflowService().getPatientPrograms(patient, state.getProgramWorkflow().getProgram(), null, null, null, null, false); for (PatientProgram patientProgram : patientPrograms) { for (PatientState patientState : patientProgram.getStates()) { if (patientState.getState().equals(state)) { if (activeDate != null) { if (patientState.getActive(activeDate)) { return patientProgram; } } else { return patientProgram; } } } } return null; }