diff --git a/api/src/main/java/org/openmrs/module/commonreports/reports/DisbursementReportManager.java b/api/src/main/java/org/openmrs/module/commonreports/reports/DisbursementReportManager.java index 1d4c1e1e..2ccc823e 100644 --- a/api/src/main/java/org/openmrs/module/commonreports/reports/DisbursementReportManager.java +++ b/api/src/main/java/org/openmrs/module/commonreports/reports/DisbursementReportManager.java @@ -9,6 +9,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; + +import org.openmrs.Location; import org.openmrs.module.commonreports.ActivatedReportManager; import org.openmrs.module.initializer.api.InitializerService; import org.openmrs.module.reporting.common.DateUtil; @@ -62,11 +64,16 @@ private Parameter getEndDateParameter() { return new Parameter("endDate", "End Date", Date.class, null, DateUtil.parseDate(endDate, "yyyy-MM-dd")); } + private Parameter getLocationParameter() { + return new Parameter("locationList", "Visit Location", Location.class, List.class, null); + } + @Override public List<Parameter> getParameters() { List<Parameter> params = new ArrayList<Parameter>(); params.add(getStartDateParameter()); params.add(getEndDateParameter()); + params.add(getLocationParameter()); return params; } @@ -93,6 +100,7 @@ public ReportDefinition constructReportDefinition() { Map<String, Object> parameterMappings = new HashMap<String, Object>(); parameterMappings.put("startDate", "${startDate}"); parameterMappings.put("endDate", "${endDate}"); + parameterMappings.put("locationList", "${locationList}"); rd.addDataSetDefinition(getName(), sqlDsd, parameterMappings); diff --git a/api/src/main/resources/org/openmrs/module/commonreports/sql/disbursement.sql b/api/src/main/resources/org/openmrs/module/commonreports/sql/disbursement.sql index 09c53366..70ea0453 100644 --- a/api/src/main/resources/org/openmrs/module/commonreports/sql/disbursement.sql +++ b/api/src/main/resources/org/openmrs/module/commonreports/sql/disbursement.sql @@ -1,13 +1,14 @@ -- Patients aged 40 and above with NCD form filled out for the first time SELECT - 'Patients aged 40 and above with NCD form filled out for the first time' AS 'Indicator', + 'Registered patients aged 40 and above that have had their NCD screenign for the first time' AS 'Indicator', CAST(COUNT(DISTINCT p.person_id) AS CHAR) AS 'Value' FROM encounter e INNER JOIN person p ON e.patient_id = p.person_id WHERE - e.encounter_datetime > :startDate + e.location_id in (:locationList) + AND e.encounter_datetime > :startDate AND e.encounter_datetime < :endDate AND e.encounter_type = ( SELECT encounter_type_id @@ -30,14 +31,15 @@ UNION ALL -- Women aged 30 to 49 years with CCS form filled out for the first time SELECT - 'Women aged 30 to 49 years with CCS form filled out for the first time' AS 'Indicator', + 'Registered women aged 30 to 49 years that have had their CCS screening for the first time' AS 'Indicator', CAST(COUNT(DISTINCT p.person_id) AS CHAR) AS 'Value' FROM encounter e INNER JOIN person p ON e.patient_id = p.person_id WHERE - e.encounter_datetime > :startDate + e.location_id in (:locationList) + AND e.encounter_datetime > :startDate AND e.encounter_datetime < :endDate AND e.encounter_type = ( SELECT encounter_type_id @@ -60,7 +62,7 @@ UNION ALL -- 80% (of women aged 30 to 49 years with CCS form filled out for the first time) were VIA positive, and referred SELECT - '80% (of women aged 30 to 49 years with CCS form filled out for the first time) were VIA positive and referred' AS 'Indicator', + '80% (of registered patients with a Follow-up date) were given medication with at least a 3 weeks prescription' AS 'Indicator', CASE WHEN SUM(CASE WHEN o_v_p.value_coded = ( @@ -101,7 +103,8 @@ LEFT OUTER JOIN WHERE uuid LIKE '758b9dd8-b6d0-4ac2-b245-0e7bffb4693a' ) WHERE - e.encounter_datetime > :startDate + e.location_id in (:locationList) + AND e.encounter_datetime > :startDate AND e.encounter_datetime < :endDate AND e.encounter_type = ( SELECT encounter_type_id @@ -124,14 +127,10 @@ UNION ALL -- 80% have a Follow-up date and were given medication at least 3 weeks ago SELECT - '80% have a Follow-up date and were given medication at least 3 weeks ago' AS 'Indicator', + '80% (of registered women aged 30 to 49 years that have had their CCS screening for the first time) were VIA positive and referred' AS 'Indicator', CASE WHEN SUM(CASE - WHEN o_m.value_coded = ( - SELECT concept_id - FROM concept - WHERE uuid LIKE '1065AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - ) THEN 1 + WHEN medication_table.medication_duration_in_weeks >= 3 THEN 1 ELSE 0 END) >= 0.8 * COUNT(*) THEN 'Yes' ELSE 'No' @@ -147,21 +146,22 @@ INNER JOIN FROM concept WHERE uuid LIKE 'e9c145c1-f4e9-4c34-b237-da069939dc38' ) -INNER JOIN - obs o_m ON e.encounter_id = o_m.encounter_id - AND o_m.concept_id = ( - SELECT concept_id - FROM concept - WHERE uuid LIKE '805c3a0b-cd38-4ed6-b4f8-f3af0fc118ad' - ) - AND o_m.value_coded = ( - SELECT concept_id - FROM concept - WHERE uuid LIKE '1065AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - ) -WHERE +LEFT OUTER JOIN ( - (o_f.value_datetime >= :startDate AND o_f.value_datetime <= :endDate) - AND (o_m.obs_datetime < DATE_SUB(:endDate, INTERVAL 3 WEEK)) - OR (o_f.value_datetime >= :startDate AND o_f.value_datetime <= :endDate) - ); + SELECT + CASE + WHEN c.uuid LIKE '1072AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' THEN (d_o.duration / 7) + WHEN c.uuid LIKE '1073AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' THEN d_o.duration + ELSE 0 + END AS 'medication_duration_in_weeks', + o.encounter_id + FROM + drug_order d_o + INNER JOIN + orders o ON d_o.order_id = o.order_id + INNER JOIN + concept c ON d_o.duration_units = c.concept_id + ) medication_table ON medication_table.encounter_id = e.encounter_id +WHERE + e.location_id in (:locationList) + AND o_f.value_datetime BETWEEN :startDate AND :endDate diff --git a/api/src/test/java/org/openmrs/module/commonreports/reports/DisbursementReportManagerTest.java b/api/src/test/java/org/openmrs/module/commonreports/reports/DisbursementReportManagerTest.java index 4693dc47..5d8edc41 100644 --- a/api/src/test/java/org/openmrs/module/commonreports/reports/DisbursementReportManagerTest.java +++ b/api/src/test/java/org/openmrs/module/commonreports/reports/DisbursementReportManagerTest.java @@ -1,25 +1,16 @@ package org.openmrs.module.commonreports.reports; -import static java.math.BigDecimal.ONE; -import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.File; -import java.math.BigDecimal; -import java.util.HashMap; +import java.util.Collections; import java.util.Iterator; -import java.util.Map; -import java.util.Properties; - -import org.hibernate.cfg.Environment; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.openmrs.Cohort; import org.openmrs.api.ConceptService; +import org.openmrs.api.LocationService; import org.openmrs.module.initializer.Domain; import org.openmrs.module.initializer.api.InitializerService; import org.openmrs.module.initializer.api.loaders.Loader; @@ -32,7 +23,6 @@ import org.openmrs.module.reporting.report.definition.service.ReportDefinitionService; import org.openmrs.module.reporting.report.manager.ReportManagerUtil; import org.openmrs.module.reporting.report.service.ReportService; -import org.openmrs.test.BaseModuleContextSensitiveTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -47,6 +37,10 @@ public class DisbursementReportManagerTest extends BaseModuleContextSensitiveMys @Autowired private ReportDefinitionService rds; + @Autowired + @Qualifier("locationService") + private LocationService ls; + @Autowired @Qualifier("conceptService") private ConceptService cs; @@ -86,12 +80,12 @@ public void testReport() throws Exception { EvaluationContext context = new EvaluationContext(); context.addParameterValue("startDate", DateUtil.parseDate("2023-12-01", "yyyy-MM-dd")); context.addParameterValue("endDate", DateUtil.parseDate("2024-04-28", "yyyy-MM-dd")); + context.addParameterValue("locationList", Collections.singletonList(ls.getLocation(1))); // replay ReportDefinition rd = manager.constructReportDefinition(); ReportData data = rds.evaluate(rd, context); - getConnection().commit(); - + // verify boolean indicator1 = false; boolean indicator2 = false; @@ -101,22 +95,22 @@ public void testReport() throws Exception { for (Iterator<DataSetRow> itr = ds.iterator(); itr.hasNext();) { DataSetRow row = itr.next(); - if (row.getColumnValue("Indicator").equals("Patients aged 40 and above with NCD form filled out for the first time")) { + if (row.getColumnValue("Indicator").equals("Registered patients aged 40 and above that have had their NCD screenign for the first time")) { assertEquals("7", row.getColumnValue("Value")); indicator1 = true; } - if (row.getColumnValue("Indicator").equals("Women aged 30 to 49 years with CCS form filled out for the first time")) { + if (row.getColumnValue("Indicator").equals("Registered women aged 30 to 49 years that have had their CCS screening for the first time")) { assertEquals("8", row.getColumnValue("Value")); indicator2 = true; } - if (row.getColumnValue("Indicator").equals("80% (of women aged 30 to 49 years with CCS form filled out for the first time) had their first CCS screening, were VIA positive and referred")) { + if (row.getColumnValue("Indicator").equals("80% (of registered patients with a Follow-up date) were given medication with at least a 3 weeks prescription")) { assertEquals("Yes", row.getColumnValue("Value")); - indicator3 = true; - } - if (row.getColumnValue("Indicator").equals("80% have a Follow-up date and were given medication at least 3 weeks ago")) { - assertEquals("No", row.getColumnValue("Value")); indicator4 = true; } + if (row.getColumnValue("Indicator").equals("80% (of registered women aged 30 to 49 years that have had their CCS screening for the first time) were VIA positive and referred")) { + assertEquals("Yes", row.getColumnValue("Value")); + indicator3 = true; + } } assertTrue(indicator1 && indicator2 && indicator3 && indicator4); } diff --git a/api/src/test/resources/org/openmrs/module/commonreports/include/disbursementReportTestDataset.xml b/api/src/test/resources/org/openmrs/module/commonreports/include/disbursementReportTestDataset.xml index e61c2adf..2b7ed1d2 100644 --- a/api/src/test/resources/org/openmrs/module/commonreports/include/disbursementReportTestDataset.xml +++ b/api/src/test/resources/org/openmrs/module/commonreports/include/disbursementReportTestDataset.xml @@ -13,7 +13,11 @@ <concept concept_id="874" retired="false" datatype_id="4" class_id="11" is_set="false" creator="1" date_created="2023-07-26 16:18:27.0" changed_by="1" date_changed="2023-12-13 14:13:45.0" uuid="98f853f9-75e4-466a-845a-db7ae958d1a0"/> <concept concept_id="2379" retired="false" datatype_id="4" class_id="11" is_set="false" creator="1" date_created="2023-07-26 16:19:26.0" changed_by="1" date_changed="2023-12-13 14:15:38.0" uuid="da15c40f-e24b-4771-9986-d3ce5ca56b94"/> <concept concept_id="732" retired="false" datatype_id="6" class_id="11" is_set="false" creator="1" date_created="2023-07-26 16:18:20.0" changed_by="1" date_changed="2023-09-22 09:04:33.0" uuid="e9c145c1-f4e9-4c34-b237-da069939dc38"/> + <concept concept_id="337" retired="false" datatype_id="4" class_id="11" is_set="false" creator="1" date_created="2023-07-26 16:17:29.0" changed_by="2" date_changed="2023-07-26 16:17:29.0" uuid="1072AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"/> + <concept concept_id="336" retired="false" datatype_id="4" class_id="11" is_set="false" creator="1" date_created="2023-07-26 16:17:29.0" changed_by="2" date_changed="2023-07-26 16:17:29.0" uuid="1073AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"/> + <concept_name concept_name_id="1839" concept_id="337" name="Days" locale="en" locale_preferred="true" creator="1" date_created="2023-07-26 16:17:29.0" concept_name_type="FULLY_SPECIFIED" voided="false" uuid="1146BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"/> + <concept_name concept_name_id="1835" concept_id="336" name="Weeks" locale="en" locale_preferred="true" creator="1" date_created="2023-07-26 16:17:29.0" concept_name_type="FULLY_SPECIFIED" voided="false" uuid="1147BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"/> <concept_name concept_name_id="1316" concept_id="211" name="Yes" locale="en" locale_preferred="true" creator="1" date_created="2023-07-26 16:17:11.0" concept_name_type="FULLY_SPECIFIED" voided="false" date_voided="2023-09-22 09:03:53.0" uuid="1136BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"/> <concept_name concept_name_id="3418" concept_id="210" name="No" locale="en" locale_preferred="true" creator="1" date_created="2023-07-26 16:18:22.0" concept_name_type="FULLY_SPECIFIED" voided="false" uuid="e89934f3-dab4-3016-a2d4-746aee18722c"/> <concept_name concept_name_id="9989" concept_id="2381" name="VIA test results" locale="en" locale_preferred="true" creator="1" date_created="2023-07-26 16:19:26.0" concept_name_type="FULLY_SPECIFIED" voided="false" uuid="684047e0-f128-3231-a7f4-c2bd0e025661"/> @@ -143,4 +147,14 @@ <obs obs_id="75275" person_id="3549" concept_id="2381" encounter_id="2780" obs_datetime="2023-12-29 07:14:54.0" location_id="1" value_coded="45" creator="1" date_created="2023-12-29 07:14:54.0" voided="false" uuid="be936002-8553-42f0-9a11-6188155dbf4f" form_namespace_and_path="O3^VIATestResults~81"/> <obs obs_id="75276" person_id="3549" concept_id="2163" encounter_id="2780" obs_datetime="2023-12-29 07:14:54.0" location_id="1" value_coded="874" creator="1" date_created="2023-12-29 07:14:54.0" voided="false" uuid="345e5451-d59a-499f-a69f-1c9950773930" form_namespace_and_path="O3^referralSite~119"/> + + <orders order_id="101" order_type_id="2" concept_id="3" orderer="1" encounter_id="2683" date_activated="2023-12-26 02:16:35.0" order_reason_non_coded="122" creator="1" date_created="2023-12-28 08:29:32.0" voided="false" patient_id="3382" uuid="6a202cca-da9e-411b-9e55-5b0cd29e2cb1" urgency="ROUTINE" order_number="ORD-1" order_action="NEW" care_setting="1"/> + <orders order_id="102" order_type_id="2" concept_id="3" orderer="1" encounter_id="2684" date_activated="2023-12-27 08:02:58.0" auto_expire_date="2024-01-04 08:48:23.0" order_reason_non_coded="106/73" creator="1" date_created="2023-12-28 08:48:24.0" voided="false" patient_id="3390" uuid="33df56eb-0bac-47c8-8cf9-9ac95c68fcd0" urgency="ROUTINE" order_number="ORD-2" order_action="NEW" care_setting="1"/> + <orders order_id="103" order_type_id="2" concept_id="3" orderer="1" encounter_id="2738" date_activated="2023-12-28 10:10:43.0" auto_expire_date="2024-01-13 04:17:08.0" order_reason_non_coded="160/100" creator="1" date_created="2023-12-29 04:18:20.0" voided="false" patient_id="3496" uuid="11fe0aa3-b2b2-4d16-a001-70dffad669a7" urgency="ROUTINE" order_number="ORD-3" order_action="NEW" care_setting="1"/> + <orders order_id="104" order_type_id="2" concept_id="3" orderer="1" encounter_id="2787" date_activated="2023-12-29 09:10:13.0" auto_expire_date="2024-01-13 04:17:08.0" order_reason_non_coded="160/100" creator="1" date_created="2023-12-29 04:18:20.0" voided="false" patient_id="3568" uuid="fe0aa311-b2b2-4d16-a001-70fad669a7df" urgency="ROUTINE" order_number="ORD-3" order_action="NEW" care_setting="1"/> + + <drug_order order_id="101" drug_inventory_id="3" dose="100.0" as_needed="true" dosing_type="org.openmrs.SimpleDosingInstructions" quantity="0.0" num_refills="0" duration="40" duration_units="337" quantity_units="51" frequency="1" dispense_as_written="false"/> + <drug_order order_id="102" drug_inventory_id="2" dose="35.0" as_needed="false" dosing_type="org.openmrs.SimpleDosingInstructions" quantity="5.0" num_refills="7" duration="3" duration_units="336" quantity_units="51" frequency="1" dispense_as_written="false"/> + <drug_order order_id="103" drug_inventory_id="2" dose="50.0" as_needed="false" dosing_type="org.openmrs.SimpleDosingInstructions" quantity="30.0" num_refills="0" duration="23" duration_units="337" quantity_units="51" frequency="1" dispense_as_written="false"/> + <drug_order order_id="104" drug_inventory_id="3" dose="25.0" as_needed="false" dosing_type="org.openmrs.SimpleDosingInstructions" quantity="30.0" num_refills="0" duration="30" duration_units="337" quantity_units="51" frequency="1" dispense_as_written="false"/> </dataset>