/** * 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.report; import static org.junit.Assert.assertNotNull; import java.io.StringWriter; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Test; import org.openmrs.Cohort; import org.openmrs.Program; import org.openmrs.api.ReportService; import org.openmrs.api.context.Context; import org.openmrs.report.impl.TsvReportRenderer; import org.openmrs.reporting.PatientCharacteristicFilter; import org.openmrs.reporting.PatientSearch; import org.openmrs.reporting.ProgramStatePatientFilter; import org.openmrs.test.BaseContextSensitiveTest; import org.openmrs.util.OpenmrsUtil; import org.simpleframework.xml.Serializer; /** * Test class that tries to run a portion of the Pepfar monthly report */ public class PepfarReportTest extends BaseContextSensitiveTest { Log log = LogFactory.getLog(getClass()); DateFormat ymd = new SimpleDateFormat("yyyy-MM-dd"); /** * Auto generated method comment * * @param params * @return * @throws ParseException */ Map<Parameter, Object> getUserEnteredParameters(Collection<Parameter> params) throws ParseException { Map<Parameter, Object> ret = new HashMap<Parameter, Object>(); if (params != null) for (Parameter p : params) { if (p.getName().equals("report.startDate")) ret.put(p, ymd.parse("2007-09-01")); else if (p.getName().equals("report.endDate")) ret.put(p, ymd.parse("2007-09-30")); } return ret; } /** * Auto generated method comment * * @throws Exception */ @Test public void shouldPepfarReport() throws Exception { initializeInMemoryDatabase(); executeDataSet("org/openmrs/report/include/PepfarReportTest.xml"); authenticate(); Cohort inputCohort = null; Parameter startDateParam = new Parameter("report.startDate", "Report Start Date", java.util.Date.class, null); Parameter endDateParam = new Parameter("report.endDate", "Report End Date", java.util.Date.class, null); log.info("Creating basic PatientSearches"); PatientSearch male = PatientSearch.createFilterSearch(PatientCharacteristicFilter.class); male.addArgument("gender", "m", String.class); PatientSearch female = PatientSearch.createFilterSearch(PatientCharacteristicFilter.class); female.addArgument("gender", "f", String.class); PatientSearch adult = PatientSearch.createFilterSearch(PatientCharacteristicFilter.class); adult.addArgument("minAge", "15", Integer.class); PatientSearch child = PatientSearch.createFilterSearch(PatientCharacteristicFilter.class); child.addArgument("maxAge", "15", Integer.class); Program hivProgram = Context.getProgramWorkflowService().getProgramByName("HIV PROGRAM"); if (hivProgram == null) { List<Program> programs = Context.getProgramWorkflowService().getAllPrograms(); for (Program p : programs) { hivProgram = p; } } assertNotNull(hivProgram); PatientSearch enrolledBeforeDate = PatientSearch.createFilterSearch(ProgramStatePatientFilter.class); enrolledBeforeDate.addArgument("program", hivProgram.getProgramId().toString(), Program.class); enrolledBeforeDate.addArgument("untilDate", "${report.startDate}", Date.class); //TODO should really be enrolledBeforeDate.addArgument("untilDate", "${date}", Date.class); /* PatientSearch enrolledBetweenDates = PatientSearch.createFilterSearch(ProgramStatePatientFilter.class); enrolledBetweenDates.addArgument("program", hivProgram.getProgramId().toString(), Program.class); enrolledBetweenDates.addArgument("sinceDate", "${fromDate}", Date.class); enrolledBetweenDates.addArgument("untilDate", "${toDate}", Date.class); Concept artDrugs = Context.getConceptService().getConceptByName("ANTIRETROVIRAL TREATMENT DRUGS"); PatientSearch artBeforeDate = PatientSearch.createFilterSearch(DrugOrderFilter.class); artBeforeDate.addArgument("anyOrAll", "ANY", PatientSetService.GroupMethod.class); artBeforeDate.addArgument("drugSets", artDrugs.getConceptId().toString(), Concept.class); artBeforeDate.addArgument("untilDate", "${date}", Date.class); PatientSearch artBetweenDates = PatientSearch.createFilterSearch(DrugOrderFilter.class); artBeforeDate.addArgument("anyOrAll", "ANY", PatientSetService.GroupMethod.class); artBeforeDate.addArgument("drugSets", artDrugs.getConceptId().toString(), Concept.class); artBeforeDate.addArgument("sinceDate", "${fromDate}", Date.class); artBeforeDate.addArgument("untilDate", "${toDate}", Date.class); */ log.info("Creating DataSets"); List<DataSetDefinition> dataSets = new ArrayList<DataSetDefinition>(); CohortDataSetDefinition dataSetDef = new CohortDataSetDefinition(); dataSetDef.setName("Cohorts"); dataSetDef.addStrategy("Cumulative ever enrolled before start of period", enrolledBeforeDate); dataSetDef.addStrategy("Male adults ever enrolled before start of period", PatientSearch .createCompositionSearch(new Object[] { male, "and", adult, "and", enrolledBeforeDate })); dataSetDef.addStrategy("Feale adults ever enrolled before start of period", PatientSearch .createCompositionSearch(new Object[] { female, "and", adult, "and", enrolledBeforeDate })); dataSetDef.addStrategy("Male children ever enrolled before start of period", PatientSearch .createCompositionSearch(new Object[] { male, "and", child, "and", enrolledBeforeDate })); dataSetDef.addStrategy("Female children ever enrolled before start of period", PatientSearch .createCompositionSearch(new Object[] { female, "and", child, "and", enrolledBeforeDate })); dataSets.add(dataSetDef); List<Parameter> parameters = new ArrayList<Parameter>(); parameters.add(startDateParam); parameters.add(endDateParam); log.info("Creating the ReportSchema"); ReportSchema schema = new ReportSchema(); schema.setReportSchemaId(123); schema.setName("Pepfar Report"); schema.setDescription("desc"); schema.setDataSetDefinitions(dataSets); schema.setReportParameters(parameters); // todo // set the xml file on the schema log.info("Creating EvaluationContext"); EvaluationContext evalContext = new EvaluationContext(); for (Map.Entry<Parameter, Object> e : getUserEnteredParameters(schema.getReportParameters()).entrySet()) { log.info("adding parameter value " + e.getKey()); evalContext.addParameterValue(e.getKey(), e.getValue()); } // TODO figure out about the non-top-level parameters // run the report ReportService rs = (ReportService) Context.getService(ReportService.class); ReportData data = rs.evaluate(schema, inputCohort, evalContext); Serializer serializer = OpenmrsUtil.getSerializer(); StringWriter writer = new StringWriter(); serializer.write(data, writer); //System.out.println("Serialized report:\n" + writer.toString()); TsvReportRenderer renderer = new TsvReportRenderer(); //System.out.println("Rendering results:"); //renderer.render(data, null, System.out); } }