/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.web.dwr;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.PatientProgram;
import org.openmrs.PatientState;
import org.openmrs.Program;
import org.openmrs.ProgramWorkflow;
import org.openmrs.ProgramWorkflowState;
import org.openmrs.api.ProgramWorkflowService;
import org.openmrs.api.context.Context;
import org.openmrs.util.OpenmrsUtil;
public class DWRProgramWorkflowService {
protected final Log log = LogFactory.getLog(getClass());
DateFormat ymdDf = new SimpleDateFormat("yyyy-MM-dd");
public PatientProgramItem getPatientProgram(Integer patientProgramId) {
return new PatientProgramItem(Context.getProgramWorkflowService().getPatientProgram(patientProgramId));
}
public Vector<PatientStateItem> getPatientStates(Integer patientProgramId, Integer programWorkflowId) {
Vector<PatientStateItem> ret = new Vector<PatientStateItem>();
ProgramWorkflowService s = Context.getProgramWorkflowService();
PatientProgram p = s.getPatientProgram(patientProgramId);
ProgramWorkflow wf = p.getProgram().getWorkflow(programWorkflowId);
for (PatientState st : p.statesInWorkflow(wf, false))
ret.add(new PatientStateItem(st));
return ret;
}
public Vector<ListItem> getWorkflowsByProgram(Integer programId) {
Vector<ListItem> ret = new Vector<ListItem>();
Program program = Context.getProgramWorkflowService().getProgram(programId);
Set<ProgramWorkflow> workflows = program.getWorkflows();
if (workflows != null)
for (ProgramWorkflow wf : workflows) {
ListItem li = new ListItem();
li.setId(wf.getProgramWorkflowId());
li.setName(wf.getConcept().getName().getName());
li.setDescription(wf.getConcept().getDescription().getDescription());
ret.add(li);
}
return ret;
}
public Vector<ListItem> getStatesByWorkflow(Integer programWorkflowId) {
log.debug("In getStatesByWorkflow with workflowID of " + programWorkflowId);
Vector<ListItem> ret = new Vector<ListItem>();
ProgramWorkflow workflow = Context.getProgramWorkflowService().getWorkflow(programWorkflowId);
if (workflow != null) {
Set<ProgramWorkflowState> states = workflow.getSortedStates();
if (states != null) {
log.debug("Got states of size " + states.size());
for (ProgramWorkflowState state : states) {
ListItem li = new ListItem();
li.setId(state.getProgramWorkflowStateId());
li.setName(state.getConcept().getName(Context.getLocale(), false).getName());
ret.add(li);
}
} else {
log.debug("States was null - there seem to be no states associated with this workflow");
}
} else {
log.debug("Workflow was null, cannot get states");
}
if (ret != null)
log.debug("Returning ret of size " + ret.size());
else
log.debug("Returning null ret");
return ret;
}
/**
* Updates enrollment date and completion date for a PatientProgram. Compares @param
* enrollmentDateYmd with {@link PatientProgram#getDateEnrolled()} and compares @param
* completionDateYmd with {@link PatientProgram#getDateCompleted()} . At least one of these
* comparisons must return true in order to update the PatientProgram. In other words, if
* neither the @param enrollmentDateYmd or the @param completionDateYmd match with the persisted
* object, then the PatientProgram will not be updated. Also, if the enrollment date comes after
* the completion date, the PatientProgram will not be updated.
*
* @param patientProgramId
* @param enrollmentDateYmd
* @param completionDateYmd
* @throws ParseException
*/
public void updatePatientProgram(Integer patientProgramId, String enrollmentDateYmd, String completionDateYmd)
throws ParseException {
PatientProgram pp = Context.getProgramWorkflowService().getPatientProgram(patientProgramId);
Date dateEnrolled = null;
Date dateCompleted = null;
Date ppDateEnrolled = null;
Date ppDateCompleted = null;
// If persisted date enrolled is not null then parse to ymdDf format.
if (null != pp.getDateEnrolled()) {
String enrolled = ymdDf.format(pp.getDateEnrolled());
if (null != enrolled && enrolled.length() > 0)
ppDateEnrolled = ymdDf.parse(enrolled);
}
// If persisted date enrolled is not null then parse to ymdDf format.
if (null != pp.getDateCompleted()) {
String completed = ymdDf.format(pp.getDateCompleted());
if (null != completed && completed.length() > 0)
ppDateCompleted = ymdDf.parse(completed);
}
// Parse parameter dates to ymdDf format.
if (enrollmentDateYmd != null && enrollmentDateYmd.length() > 0)
dateEnrolled = ymdDf.parse(enrollmentDateYmd);
if (completionDateYmd != null && completionDateYmd.length() > 0)
dateCompleted = ymdDf.parse(completionDateYmd);
// If either either parameter and persisted instances
// of enrollment and completion dates are equal, then anyChange is true.
boolean anyChange = OpenmrsUtil.nullSafeEquals(dateEnrolled, ppDateEnrolled);
anyChange |= OpenmrsUtil.nullSafeEquals(dateCompleted, ppDateCompleted);
// Do not update if the enrollment date is after the completion date.
if (null != dateEnrolled && null != dateCompleted && dateCompleted.before(dateEnrolled)) {
anyChange = false;
}
if (anyChange) {
pp.setDateEnrolled(dateEnrolled);
pp.setDateCompleted(dateCompleted);
Context.getProgramWorkflowService().savePatientProgram(pp);
}
}
public void deletePatientProgram(Integer patientProgramId, String reason) {
PatientProgram p = Context.getProgramWorkflowService().getPatientProgram(patientProgramId);
Context.getProgramWorkflowService().voidPatientProgram(p, reason);
}
public Vector<ListItem> getPossibleNextStates(Integer patientProgramId, Integer programWorkflowId) {
Vector<ListItem> ret = new Vector<ListItem>();
PatientProgram pp = Context.getProgramWorkflowService().getPatientProgram(patientProgramId);
ProgramWorkflow pw = pp.getProgram().getWorkflow(programWorkflowId);
List<ProgramWorkflowState> states = pw.getPossibleNextStates(pp);
for (ProgramWorkflowState state : states) {
ListItem li = new ListItem();
li.setId(state.getProgramWorkflowStateId());
li.setName(state.getConcept().getName(Context.getLocale(), false).getName());
ret.add(li);
}
return ret;
}
public void changeToState(Integer patientProgramId, Integer programWorkflowId, Integer programWorkflowStateId,
String onDateDMY) throws ParseException {
ProgramWorkflowService s = Context.getProgramWorkflowService();
PatientProgram pp = s.getPatientProgram(patientProgramId);
ProgramWorkflowState st = pp.getProgram().getWorkflow(programWorkflowId).getState(programWorkflowStateId);
Date onDate = null;
if (onDateDMY != null && onDateDMY.length() > 0)
onDate = ymdDf.parse(onDateDMY);
pp.transitionToState(st, onDate);
s.savePatientProgram(pp);
}
public void voidLastState(Integer patientProgramId, Integer programWorkflowId, String voidReason) {
ProgramWorkflowService s = Context.getProgramWorkflowService();
PatientProgram pp = s.getPatientProgram(patientProgramId);
ProgramWorkflow wf = s.getWorkflow(programWorkflowId);
pp.voidLastState(wf, Context.getAuthenticatedUser(), new Date(), voidReason);
Context.getProgramWorkflowService().savePatientProgram(pp);
}
}