/** * 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.reporting; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.openmrs.Cohort; import org.openmrs.Program; import org.openmrs.ProgramWorkflow; import org.openmrs.ProgramWorkflowState; import org.openmrs.api.PatientSetService; import org.openmrs.api.context.Context; import org.openmrs.report.EvaluationContext; import org.openmrs.util.OpenmrsUtil; /** * @deprecated see reportingcompatibility module */ @Deprecated public class ProgramStatePatientFilter extends CachingPatientFilter { private Program program; private List<ProgramWorkflowState> stateList; private Integer withinLastDays; private Integer withinLastMonths; private Integer untilDaysAgo; private Integer untilMonthsAgo; private Date sinceDate; private Date untilDate; public ProgramStatePatientFilter() { } @Override public String getCacheKey() { StringBuilder sb = new StringBuilder(); sb.append(getClass().getName()).append("."); if (getProgram() != null) sb.append(getProgram().getProgramId()); sb.append("."); sb.append( OpenmrsUtil.fromDateHelper(null, withinLastDays, withinLastMonths, untilDaysAgo, untilMonthsAgo, sinceDate, untilDate)).append("."); sb.append( OpenmrsUtil.toDateHelper(null, withinLastDays, withinLastMonths, untilDaysAgo, untilMonthsAgo, sinceDate, untilDate)).append("."); if (getStateList() != null) for (ProgramWorkflowState s : getStateList()) sb.append(s.getProgramWorkflowStateId()).append(","); return sb.toString(); } public String getDescription() { StringBuilder ret = new StringBuilder(); //boolean currentlyCase = withinLastDays != null && withinLastDays == 0 // && (withinLastMonths == null || withinLastMonths == 0); ret.append("Patients in program "); if (getProgram() != null) { if (getProgram().getConcept() == null) ret.append(" <CONCEPT> "); else { ret.append(getConceptName(program.getConcept()) + " "); } } if (stateList != null && stateList.size() > 0) { Map<ProgramWorkflow, Set<ProgramWorkflowState>> map = new HashMap<ProgramWorkflow, Set<ProgramWorkflowState>>(); for (ProgramWorkflowState state : stateList) { ProgramWorkflow workflow = state.getProgramWorkflow(); OpenmrsUtil.addToSetMap(map, workflow, state); } boolean first = true; for (Map.Entry<ProgramWorkflow, Set<ProgramWorkflowState>> e : map.entrySet()) { ret.append(first ? "with " : "or "); first = false; try { ret.append(e.getKey().getConcept().getName().getName()); } catch (NullPointerException ex) { ret.append("CONCEPT?"); } if (e.getValue().size() == 1) ret.append(" of " + e.getValue().iterator().next().getConcept().getName().getName()); else { ret.append(" in [ "); for (Iterator<ProgramWorkflowState> i = e.getValue().iterator(); i.hasNext();) { ret.append(i.next().getConcept().getName().getName()); if (i.hasNext()) ret.append(" , "); } ret.append(" ]"); } } } if (withinLastMonths != null || withinLastDays != null) { ret.append("within the last "); if (withinLastMonths != null) ret.append(withinLastMonths + " month(s) "); if (withinLastDays != null) ret.append(withinLastDays + " day(s) "); } // TODO untilDaysAgo untilMonthsAgo if (sinceDate != null) ret.append("on or after " + Context.getDateFormat().format(sinceDate) + " "); if (untilDate != null) ret.append("on or before " + Context.getDateFormat().format(untilDate) + " "); return ret.toString(); } @Override public Cohort filterImpl(EvaluationContext context) { PatientSetService service = Context.getPatientSetService(); return service.getPatientsByProgramAndState(program, stateList, fromDateHelper(), toDateHelper()); } public boolean isReadyToRun() { return true; } private Date fromDateHelper() { Date ret = null; if (withinLastDays != null || withinLastMonths != null) { Calendar gc = Calendar.getInstance(); if (withinLastDays != null) gc.add(Calendar.DAY_OF_MONTH, -withinLastDays); if (withinLastMonths != null) gc.add(Calendar.MONTH, -withinLastMonths); ret = gc.getTime(); } if (sinceDate != null && (ret == null || sinceDate.after(ret))) ret = sinceDate; return ret; } private Date toDateHelper() { Date ret = null; if (untilDaysAgo != null || untilMonthsAgo != null) { Calendar gc = Calendar.getInstance(); if (untilDaysAgo != null) gc.add(Calendar.DAY_OF_MONTH, -untilDaysAgo); if (untilMonthsAgo != null) gc.add(Calendar.MONTH, -untilMonthsAgo); ret = gc.getTime(); } if (untilDate != null && (ret == null || untilDate.before(ret))) ret = untilDate; return ret; } // getters and setters public Program getProgram() { return program; } public void setProgram(Program program) { this.program = program; } public Date getSinceDate() { return sinceDate; } public void setSinceDate(Date sinceDate) { this.sinceDate = sinceDate; } public List<ProgramWorkflowState> getStateList() { return stateList; } public void setStateList(List<ProgramWorkflowState> stateList) { this.stateList = stateList; } public Date getUntilDate() { return untilDate; } public void setUntilDate(Date untilDate) { this.untilDate = untilDate; } public Integer getUntilDaysAgo() { return untilDaysAgo; } public void setUntilDaysAgo(Integer untilDaysAgo) { this.untilDaysAgo = untilDaysAgo; } public Integer getUntilMonthsAgo() { return untilMonthsAgo; } public void setUntilMonthsAgo(Integer untilMonthsAgo) { this.untilMonthsAgo = untilMonthsAgo; } public Integer getWithinLastDays() { return withinLastDays; } public void setWithinLastDays(Integer withinLastDays) { this.withinLastDays = withinLastDays; } public Integer getWithinLastMonths() { return withinLastMonths; } public void setWithinLastMonths(Integer withinLastMonths) { this.withinLastMonths = withinLastMonths; } }