/** * 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 {@link ProgramWorkflowState} whose Concept matches the passed concept * * @param concept the Concept to match * @return Returns a {@link ProgramWorkflowState} whose {@link Concept} matches the passed * <code>concept</code> */ public ProgramWorkflowState getState(Concept concept) { for (ProgramWorkflowState s : getStates()) { if (s.getConcept().equals(concept)) { return s; } } return null; }
/** * Check whether it is allowable to transition from <code>fromState</code> to * <code>toState</code>. * * @param fromState {@link ProgramWorkflowState} to check transition from * @param toState {@link ProgramWorkflowState} to check transition to * @return boolean true if it is allowable to transition from <code>fromState</code> to * <code>toState</code> */ public boolean isLegalTransition(ProgramWorkflowState fromState, ProgramWorkflowState toState) { // If there's no current state then we need tom move into an initial state if (fromState == null) { return toState.getInitial(); } // Does not allow patient to move into the same state return !fromState.equals(toState); }
/** @see Object#toString() */ @Override public String toString() { return "State " + getConcept().getName() + " initial=" + getInitial() + " terminal=" + getTerminal(); }
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() }); } }
program.addWorkflow(workflow); ProgramWorkflowState state1 = new ProgramWorkflowState(); state1.setConcept(cs.getConcept(5)); state1.setInitial(true); state1.setTerminal(false); workflow.addState(state1); ProgramWorkflowState state2 = new ProgramWorkflowState(); state2.setConcept(cs.getConcept(6)); state2.setInitial(false); state2.setTerminal(true); workflow.addState(state2); names.add(s.getConcept().getName().getName());
String label = state.getConcept().getName().getName(); if (tagParams.getStateLabels() != null) { label = tagParams.getStateLabels().get(i); if (state.isRetired()) { continue; String label = state.getConcept().getName().getName(); states.put(label, state); if (Boolean.FALSE.equals(state.getInitial())) { it.remove(); widget.setInitialValue(state.getValue().getUuid()); } else if (tagParams.getType().equals("checkbox")) { widget = new CheckboxWidget(state.getKey(), state.getValue().getUuid()); } else { SingleOptionWidget singleOption; boolean select = state.getValue().equals(currentState); singleOption.addOption(new Option(state.getKey(), state.getValue().getUuid(), select)); if (currentState.getUuid().equals(((CheckboxWidget) widget).getValue())) { widget.setInitialValue(currentState.getUuid()); widget.setInitialValue(currentState.getUuid());
PatientProgram patientProgram = HtmlFormEntryUtil.getPatientProgramByWorkflow(patient, state.getProgramWorkflow()); patientProgram = HtmlFormEntryUtil.getPatientProgramByProgram(patientProgramsToCreate, state.getProgramWorkflow().getProgram()); patientProgram = HtmlFormEntryUtil.getPatientProgramByProgram(patientProgramsToUpdate, state.getProgramWorkflow().getProgram()); patientProgram = new PatientProgram(); patientProgram.setPatient(patient); patientProgram.setProgram(state.getProgramWorkflow().getProgram()); patientProgram.setDateEnrolled(encounter.getEncounterDatetime()); for (PatientState patientState : patientProgram.statesInWorkflow(state.getProgramWorkflow(), false)) { if (patientState.getActive(encounter.getEncounterDatetime())) { if (patientState.getState().equals(state)) { return; sortedStates.addAll(patientProgram.statesInWorkflow(state.getProgramWorkflow(), false)); for (PatientState currentState : sortedStates) {
/** * Sets states to PatientProgram. * * @param instance * @param states */ @PropertySetter("states") public static void setStates(PatientProgram instance, List<PatientState> patientStates) { sortPatientStatesBasedOnStartDate(patientStates); if (!patientStates.isEmpty()) { for (PatientState patientState : patientStates) { PatientState existingState = getMatchingPatientState(patientState, instance.getStates()); if (existingState == null) { Date onDate = patientState.getStartDate() == null ? new Date() : patientState.getStartDate(); instance.transitionToState( Context.getProgramWorkflowService().getStateByUuid(patientState.getState().getUuid()), onDate); } } } }
if (!patientState.getState().getProgramWorkflow().equals(workFlow)) { continue; errors.rejectValue("states", "PatientState.error.endDateCannotBeBeforeStartDate"); return; } else if (statesAndStartDates.contains(patientState.getState().getUuid() + "" + patientState.getStartDate())) { statesAndStartDates.add(patientState.getState().getUuid() + "" + patientState.getStartDate());
if (state != null && state.getProgramWorkflow().equals(workflow)) { return state; if (concept != null) { for (ProgramWorkflowState s : workflow.getStates(false)) { if (s.getConcept().equals(concept)) { return s;
@Test public void transitionToDate_shouldSetEndDateOfNewStateToNullIfProgramNotCompleted() throws Exception { //given PatientProgram program = new PatientProgram(); program.setDateEnrolled(new Date()); ProgramWorkflow workflow = new ProgramWorkflow(); ProgramWorkflowState workflowState = new ProgramWorkflowState(); workflowState.setTerminal(false); workflowState.setProgramWorkflow(workflow); //when program.transitionToState(workflowState, new Date()); //then Assert.assertTrue(program.getStates().size() == 1); Assert.assertNull(program.getStates().iterator().next().getEndDate()); }
Concept state1Concept = new Concept(); state1Concept.addName(state1ConceptName); ProgramWorkflowState state1 = new ProgramWorkflowState(); state1.setConcept(state1Concept); program.addState(state1); Concept state2Concept = new Concept(); state2Concept.addName(state2ConceptName); ProgramWorkflowState state2 = new ProgramWorkflowState(); state2.setConcept(state2Concept); program.addState(state2); for (ProgramWorkflowState state : sortedStates) { if (x == 1) { Assert.assertEquals("Group 2", state.getConcept().getName(Context.getLocale()).getName()); } else if (x == 2) { Assert.assertEquals("Group 10", state.getConcept().getName(Context.getLocale()).getName()); } else { Assert.fail("Wha?!");
program.setDateCompleted(new Date()); ProgramWorkflow workflow = new ProgramWorkflow(); ProgramWorkflowState workflowState = new ProgramWorkflowState(); workflowState.setProgramWorkflow(workflow);
throw new FormEntryException("Cannot find a program work flow state " + errorMsgPart + " that matches '" + value + "'"); } else if (!state.getInitial()) { 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");
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); if (programWorkflowState.getTerminal()) { setDateCompleted(onDate);
/** * @since 1.5 * @see org.openmrs.OpenmrsObject#getId() */ @Override public Integer getId() { return getProgramWorkflowStateId(); }
@Override public void validateDefaultRepresentation() throws Exception { super.validateDefaultRepresentation(); assertPropEquals("description", getObject().getDescription()); assertPropEquals("retired", getObject().getRetired()); assertPropPresent("concept"); }
/** * Adds a new {@link ProgramWorkflowState} to this ProgramWorkflow * * @param state - the {@link ProgramWorkflowState} to add */ public void addState(ProgramWorkflowState state) { state.setProgramWorkflow(this); getStates().add(state); }
/** * Returns a Set<{@link ProgramWorkflowState}> including all non-retired ProgramWorkflowStates * and all retired ProgramWorkflowStates in this ProgramWorkflow if <code>includeRetired</code> * is true * * @param includeRetired - if false, returns only non-retired {@link ProgramWorkflowState} * objects in this ProgramWorkflow * @return Set<ProgramWorkflowState> - all ProgramWorkflowStates matching input parameters */ public Set<ProgramWorkflowState> getStates(boolean includeRetired) { Set<ProgramWorkflowState> ret = new HashSet<>(); for (ProgramWorkflowState s : getStates()) { if (includeRetired || !s.getRetired()) { ret.add(s); } } return ret; }