From c1c425972408436b16554c74f7a586dbad748c19 Mon Sep 17 00:00:00 2001 From: njorocs Date: Mon, 16 Dec 2024 18:19:52 +0300 Subject: [PATCH 1/2] MOH 717 workload (draft) --- .../kenyaemr/metadata/CommonMetadata.java | 14 +++++-- .../builder/common/MOH717ReportBuilder.java | 41 +++++++++++++++++-- .../library/moh717/Moh717CohortLibrary.java | 16 ++++++++ .../moh717/Moh717IndicatorLibrary.java | 7 ++++ .../resources/reports/.~lock.MOH_717.xls# | 1 + 5 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 omod/src/main/webapp/resources/reports/.~lock.MOH_717.xls# diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/metadata/CommonMetadata.java b/api/src/main/java/org/openmrs/module/kenyaemr/metadata/CommonMetadata.java index 8365e06d7..1bde12fb3 100755 --- a/api/src/main/java/org/openmrs/module/kenyaemr/metadata/CommonMetadata.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/metadata/CommonMetadata.java @@ -14,7 +14,6 @@ import org.openmrs.api.AdministrationService; import org.openmrs.api.context.Context; import org.openmrs.PersonAttributeType; -import org.openmrs.customdatatype.CustomDatatype; import org.openmrs.customdatatype.datatype.DateDatatype; import org.openmrs.module.idgen.validator.LuhnMod25IdentifierValidator; import org.openmrs.module.kenyaemr.EmrConstants; @@ -25,9 +24,6 @@ import org.springframework.stereotype.Component; import org.openmrs.customdatatype.datatype.FreeTextDatatype; -import org.openmrs.customdatatype.datatype.ConceptDatatype; - -import java.util.Date; import static org.openmrs.module.metadatadeploy.bundle.CoreConstructors.encounterType; import static org.openmrs.module.metadatadeploy.bundle.CoreConstructors.form; @@ -163,6 +159,11 @@ public static final class _Form { public static final String HEARING_SCREENING_CLINICAL_FORM = "270f388f-439f-476a-8919-8211f850d366"; public static final String NEUROLOGY_CLINICAL_FORM = "f97f2bf3-c26b-4adf-aacd-e09d720a14cd"; public static final String POST_MORTEM_CLINICAL_FORM = "016beec1-edff-4293-b3ed-817c7dddaa93"; + public static final String EAR_NOSE_THROAT_CLINICAL_FORM = "c5055956-c3bb-45f2-956f-82e114c57aa7"; + public static final String ORTHOPAEDIC_CLINICAL_FORM = "beec83df-6606-4019-8223-05a54a52f2b0"; + public static final String OCCUPATIONAL_THERAPY_CLINICAL_FORM = "062a24b5-728b-4639-8176-197e8f458490"; + public static final String OBSTETRIC_HISTORY_FORM = "d81e8157-317c-4041-9498-9d2318a1f2ed"; + public static final String OPHTHAMOLOGY_CLINICAL_FORM = "235900ff-4d4a-4575-9759-96f325f5e291"; } public static final class _OrderType { @@ -379,6 +380,11 @@ public void install() { install(form("Hearing Screening Clinical Form", "Form for Hearing screening clinical encounter", _EncounterType.HEARING_SCREENING, "1", _Form.HEARING_SCREENING_CLINICAL_FORM)); install(form("Neurology Clinical Form", "Form for Neurology clinical encounter", _EncounterType.NEUROLOGY, "1", _Form.NEUROLOGY_CLINICAL_FORM)); install(form("Post-Mortem Clinical Form", "Form for Morgue clinical encounter", _EncounterType.POST_MORTEM, "1", _Form.POST_MORTEM_CLINICAL_FORM)); + install(form("ENT Clinical Form", "Form for ENT clinical encounter", _EncounterType.CONSULTATION, "1", _Form.EAR_NOSE_THROAT_CLINICAL_FORM)); + install(form("Orthopaedic Clinical Form", "Form for Orthopaedic clinical encounter", _EncounterType.CONSULTATION, "1", _Form.ORTHOPAEDIC_CLINICAL_FORM)); + install(form("Occupational Therapy Clinical Form", "Form for Occupational therapy encounter", _EncounterType.CONSULTATION, "1", _Form.OCCUPATIONAL_THERAPY_CLINICAL_FORM)); + install(form("Obstetric History Form", "Form for Obstetric History", _EncounterType.CONSULTATION, "1", _Form.OBSTETRIC_HISTORY_FORM)); + install(form("Ophthamology Clinical Form", "Form for Ophthamology encounter ", _EncounterType.CONSULTATION, "1", _Form.OPHTHAMOLOGY_CLINICAL_FORM)); install(globalProperty(EmrConstants.GP_DEFAULT_LOCATION, "The facility for which this installation is configured", diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/MOH717ReportBuilder.java b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/MOH717ReportBuilder.java index 37193d393..9a5d5b37d 100644 --- a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/MOH717ReportBuilder.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/MOH717ReportBuilder.java @@ -13,6 +13,7 @@ import org.openmrs.module.kenyacore.report.ReportUtils; import org.openmrs.module.kenyacore.report.builder.AbstractReportBuilder; import org.openmrs.module.kenyacore.report.builder.Builds; +import org.openmrs.module.kenyaemr.metadata.CommonMetadata; import org.openmrs.module.kenyaemr.reporting.ColumnParameters; import org.openmrs.module.kenyaemr.reporting.EmrReportingUtils; import org.openmrs.module.kenyaemr.reporting.library.moh717.Moh717CohortLibrary; @@ -26,15 +27,12 @@ import org.openmrs.module.reporting.report.definition.ReportDefinition; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.openmrs.module.reporting.indicator.CohortIndicator; -import java.math.BigInteger; import java.util.Arrays; import java.util.Date; import java.util.List; import static org.openmrs.module.kenyacore.report.ReportUtils.map; -import static org.openmrs.module.kenyaemr.reporting.MohReportUtils.ReportAddonUtils.getGeneralOutPatientFilters; /** * Report builder for MOH717 @@ -50,6 +48,8 @@ public class MOH717ReportBuilder extends AbstractReportBuilder { private final Moh717IndicatorLibrary moh717IndicatorLibrary; + static final int NEW_VISIT = 164180, RE_ATT= 164142; + ColumnParameters femaleChildrenUnder5 = new ColumnParameters(null, "<5", "age=<5|gender=F"); ColumnParameters maleChildrenUnder5 = new ColumnParameters(null, "<5", "age=<5|gender=M"); ColumnParameters females5To59 = new ColumnParameters(null, "5-59, Female", "gender=F|age=5-59"); @@ -133,6 +133,41 @@ private DataSetDefinition moh717DatasetDefinition() { dsd.addColumn( "Number of Laboratory tests", "", ReportUtils.map(moh717IndicatorLibrary.laboratoryTests(), indParams), ""); dsd.addColumn("Number of Examinations (XRay & Imaging)", "", ReportUtils.map(moh717IndicatorLibrary.xrayAndImaging(), indParams), ""); + + // Special Clinics + dsd.addColumn( "ENT Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.EAR_NOSE_THROAT_CLINICAL_FORM, NEW_VISIT), indParams), ""); + dsd.addColumn( "ENT Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.EAR_NOSE_THROAT_CLINICAL_FORM, RE_ATT), indParams), ""); + dsd.addColumn( "Eye Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OPHTHAMOLOGY_CLINICAL_FORM,NEW_VISIT), indParams), ""); + dsd.addColumn( "Eye Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OPHTHAMOLOGY_CLINICAL_FORM,RE_ATT), indParams), ""); + // dsd.addColumn( "TB and Leprosy Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.,NEW_VISIT), indParams), ""); + // dsd.addColumn( "TB and Leprosy Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form., RE_ATT), indParams), ""); + // dsd.addColumn( "CCC Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String cccClinicUUID, NEW_VISIT), indParams), ""); + // dsd.addColumn( "CCC Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String cccClinicUUID, RE_ATT), indParams), ""); + dsd.addColumn( "Psychiatry Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.PSYCHIATRIC_FORM, NEW_VISIT), indParams), ""); + dsd.addColumn( "Psychiatry Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.PSYCHIATRIC_FORM, RE_ATT), indParams), ""); + dsd.addColumn( "Orthopaedic Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.ORTHOPAEDIC_CLINICAL_FORM,NEW_VISIT), indParams), ""); + dsd.addColumn( "Orthopaedic Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.ORTHOPAEDIC_CLINICAL_FORM, RE_ATT), indParams), ""); + dsd.addColumn( "Occupational Therapy Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OCCUPATIONAL_THERAPY_CLINICAL_FORM, NEW_VISIT), indParams), ""); + dsd.addColumn( "Occupational Therapy Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OCCUPATIONAL_THERAPY_CLINICAL_FORM, RE_ATT), indParams), ""); + dsd.addColumn( "Physiotherapy Therapy Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.PHYSIOTHERAPY_FORM, NEW_VISIT), indParams), ""); + dsd.addColumn( "Physiotherapy Therapy Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.PHYSIOTHERAPY_FORM, RE_ATT), indParams), ""); + // dsd.addColumn( "Medical Clinics (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String medicalClinicUUID, NEW_VISIT), indParams), ""); + // dsd.addColumn( "Medical Clinics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String medicalClinicUUID,RE_ATT), indParams), ""); + // dsd.addColumn( "Surgical Clinics (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String surgicalClinicUUID, NEW_VISIT), indParams), ""); + // dsd.addColumn( "Surgical Clinics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String surgicalClinicUUID, RE_ATT), indParams), ""); + // dsd.addColumn( "Paediatrics (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String paediatricsClinicUUID, NEW_VISIT), indParams), ""); + // dsd.addColumn( "Paediatrics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String paediatricsClinicUUID, RE_ATT), indParams), ""); + dsd.addColumn( "Obstetrics and Gynaecology (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OBSTETRIC_HISTORY_FORM,NEW_VISIT), indParams), ""); + dsd.addColumn( "Obstetrics and Gynaecology (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OBSTETRIC_HISTORY_FORM, RE_ATT), indParams), ""); + dsd.addColumn( "Nutrition Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.NUTRITION, NEW_VISIT), indParams), ""); + dsd.addColumn( "Nutrition Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.NUTRITION, RE_ATT), indParams), ""); + dsd.addColumn( "Oncology Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.ONCOLOGY_FORM, NEW_VISIT), indParams), ""); + dsd.addColumn( "Oncology Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.ONCOLOGY_FORM, RE_ATT), indParams), ""); + dsd.addColumn( "Renal Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.UROLOGY_CLINICAL_FORM,NEW_VISIT), indParams), ""); + dsd.addColumn( "Renal Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.UROLOGY_CLINICAL_FORM, RE_ATT), indParams), ""); + dsd.addColumn( "All other special Clinics (New)", "", ReportUtils.map(moh717IndicatorLibrary.otherSpecialClinics(,NEW_VISIT), indParams), ""); + dsd.addColumn( "All other special Clinics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.otherSpecialClinics(,RE_ATT), indParams), ""); + return dsd; } private DataSetDefinition totalAmountCollectedDatasetDefinition(){ diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717CohortLibrary.java b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717CohortLibrary.java index 2ed421231..e12685866 100644 --- a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717CohortLibrary.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717CohortLibrary.java @@ -218,6 +218,22 @@ public CohortDefinition xrayAndImaging() { sql.setQuery("select o.encounter_id from orders o where o.order_type_id = 4 and o.voided = 0 and date(o.date_activated) between date(:startDate) and date(:endDate);"); return sql; } + public CohortDefinition specialClinic(String clinicFormUUID, int visitType) { + SqlCohortDefinition sql = new SqlCohortDefinition(); + sql.setName("Special Clinic"); + sql.addParameter(new Parameter("startDate", "Start Date", Date.class)); + sql.addParameter(new Parameter("endDate", "End Date", Date.class)); + sql.setQuery(""); + return sql; + } + public CohortDefinition otherSpecialClinics(String clinicsFormUUIDS, int visitType) { + SqlCohortDefinition sql = new SqlCohortDefinition(); + sql.setName("Other Special Clinics"); + sql.addParameter(new Parameter("startDate", "Start Date", Date.class)); + sql.addParameter(new Parameter("endDate", "End Date", Date.class)); + sql.setQuery(""); + return sql; + } public CohortDefinition totalAmountCollected() { SqlCohortDefinition sql = new SqlCohortDefinition(); sql.setName("Total Amount Collected"); diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717IndicatorLibrary.java b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717IndicatorLibrary.java index 2d890d7d8..e79648712 100644 --- a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717IndicatorLibrary.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717IndicatorLibrary.java @@ -92,6 +92,13 @@ public CohortIndicator laboratoryTests() { public CohortIndicator xrayAndImaging() { return cohortIndicator("xrays and imaging", ReportUtils.map(moh717CohortLibrary.xrayAndImaging(), "startDate=${startDate},endDate=${endDate}")); } + + public CohortIndicator specialClinic(String clinicFormUUID, int visitType) { + return cohortIndicator("Special Clinics", ReportUtils.map(moh717CohortLibrary.specialClinic(clinicFormUUID,visitType), "startDate=${startDate},endDate=${endDate}")); + } + public CohortIndicator otherSpecialClinics(String clinicFormUUID, int visitType) { + return cohortIndicator("Other special clinic", ReportUtils.map(moh717CohortLibrary.otherSpecialClinics(clinicFormUUID, visitType), "startDate=${startDate},endDate=${endDate}")); + } public CohortIndicator totalAmountCollected() { return cohortIndicator("Total Amount Collected", ReportUtils.map(moh717CohortLibrary.totalAmountCollected(), "startDate=${startDate},endDate=${endDate}")); } diff --git a/omod/src/main/webapp/resources/reports/.~lock.MOH_717.xls# b/omod/src/main/webapp/resources/reports/.~lock.MOH_717.xls# new file mode 100644 index 000000000..a417235ed --- /dev/null +++ b/omod/src/main/webapp/resources/reports/.~lock.MOH_717.xls# @@ -0,0 +1 @@ +,steve,steve-Latitude-7440,16.12.2024 14:30,file:///home/steve/.config/libreoffice/4; \ No newline at end of file From d70fd35ab1c87c87a1957fabacabeadef8958c1c Mon Sep 17 00:00:00 2001 From: njorocs Date: Tue, 17 Dec 2024 21:00:17 +0300 Subject: [PATCH 2/2] Populated special clinics workload in MoH717. Moved MoH711, FMAPS MoH729 and MoH745 reports to EHR reports section. Added missing metadata for special clinics forms --- .../kenyaemr/metadata/CommonMetadata.java | 6 +++ .../builder/common/FmapReportBuilder.java | 2 +- .../builder/common/MOH717ReportBuilder.java | 44 +++++++++------ .../builder/common/Moh711ReportBuilder.java | 2 +- .../builder/common/Moh745ReportBuilder.java | 2 +- .../library/moh717/Moh717CohortLibrary.java | 51 +++++++++++++++++- .../moh717/Moh717IndicatorLibrary.java | 14 ++++- .../module/kenyaemr/util/EmrUtils.java | 15 ++++++ .../resources/content/kenyaemr.common.xml | 12 ++--- .../resources/reports/.~lock.MOH_717.xls# | 1 - .../main/webapp/resources/reports/MOH_717.xls | Bin 120320 -> 119296 bytes 11 files changed, 121 insertions(+), 28 deletions(-) delete mode 100644 omod/src/main/webapp/resources/reports/.~lock.MOH_717.xls# diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/metadata/CommonMetadata.java b/api/src/main/java/org/openmrs/module/kenyaemr/metadata/CommonMetadata.java index 1bde12fb3..dd241d929 100755 --- a/api/src/main/java/org/openmrs/module/kenyaemr/metadata/CommonMetadata.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/metadata/CommonMetadata.java @@ -164,6 +164,9 @@ public static final class _Form { public static final String OCCUPATIONAL_THERAPY_CLINICAL_FORM = "062a24b5-728b-4639-8176-197e8f458490"; public static final String OBSTETRIC_HISTORY_FORM = "d81e8157-317c-4041-9498-9d2318a1f2ed"; public static final String OPHTHAMOLOGY_CLINICAL_FORM = "235900ff-4d4a-4575-9759-96f325f5e291"; + public static final String FERTILITY_CLINICAL_FORM = "32e43fc9-6de3-48e3-aafe-3b92f167753d"; + public static final String CARDIOLOGY_CLINICAL_FORM = "998be6de-bd13-4136-ba0d-3f772139895f"; + public static final String GASTROENTEROLOGY_CLINICAL_FORM = "6b4fa553-f2b3-47d0-a4c5-fc11f38b0b24"; } public static final class _OrderType { @@ -385,6 +388,9 @@ public void install() { install(form("Occupational Therapy Clinical Form", "Form for Occupational therapy encounter", _EncounterType.CONSULTATION, "1", _Form.OCCUPATIONAL_THERAPY_CLINICAL_FORM)); install(form("Obstetric History Form", "Form for Obstetric History", _EncounterType.CONSULTATION, "1", _Form.OBSTETRIC_HISTORY_FORM)); install(form("Ophthamology Clinical Form", "Form for Ophthamology encounter ", _EncounterType.CONSULTATION, "1", _Form.OPHTHAMOLOGY_CLINICAL_FORM)); + install(form("Gastroenterology Clinical Form", "Form for Gastroenterology encounter ", _EncounterType.CONSULTATION, "1", _Form.GASTROENTEROLOGY_CLINICAL_FORM)); + install(form("Fertility Clinical Form", "Form for Fertility encounter ", _EncounterType.CONSULTATION, "1", _Form.FERTILITY_CLINICAL_FORM)); + install(form("Cardiology Clinical Form", "Form for Cardiology encounter ", _EncounterType.CONSULTATION, "1", _Form.CARDIOLOGY_CLINICAL_FORM)); install(globalProperty(EmrConstants.GP_DEFAULT_LOCATION, "The facility for which this installation is configured", diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/FmapReportBuilder.java b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/FmapReportBuilder.java index 12dc98fd5..e532e946d 100644 --- a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/FmapReportBuilder.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/FmapReportBuilder.java @@ -35,7 +35,7 @@ * FMAP MOH-729 Report */ @Component -@Builds({"kenyaemr.etl.common.report.fmap"}) +@Builds({"kenyaemr.ehrReports.report.fmap"}) public class FmapReportBuilder extends AbstractReportBuilder { protected static final Log log = LogFactory.getLog(FmapReportBuilder.class); diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/MOH717ReportBuilder.java b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/MOH717ReportBuilder.java index 9a5d5b37d..92bf1b315 100644 --- a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/MOH717ReportBuilder.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/MOH717ReportBuilder.java @@ -19,6 +19,7 @@ import org.openmrs.module.kenyaemr.reporting.library.moh717.Moh717CohortLibrary; import org.openmrs.module.kenyaemr.reporting.library.moh717.Moh717IndicatorLibrary; import org.openmrs.module.kenyaemr.reporting.library.shared.common.CommonDimensionLibrary; +import org.openmrs.module.kenyaemr.util.EmrUtils; import org.openmrs.module.reporting.dataset.definition.CohortIndicatorDataSetDefinition; import org.openmrs.module.reporting.dataset.definition.DataSetDefinition; import org.openmrs.module.reporting.dataset.definition.SqlDataSetDefinition; @@ -28,6 +29,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -48,7 +50,19 @@ public class MOH717ReportBuilder extends AbstractReportBuilder { private final Moh717IndicatorLibrary moh717IndicatorLibrary; - static final int NEW_VISIT = 164180, RE_ATT= 164142; + static final int NEW_VISIT = 164180, RE_ATT= 160530; + + static final ArrayList otherSpecialClinics = new ArrayList<>(Arrays.asList( + CommonMetadata._Form.NEUROLOGY_CLINICAL_FORM, + CommonMetadata._Form.DERMATOLOGY_CLINICAL_FORM, + CommonMetadata._Form.AUDIOLOGY_FORM, + CommonMetadata._Form.SPEECH_AND_LANGAUGE_THERAPY_CLINICAL_FORM, + CommonMetadata._Form.DIABETIC_CLINICAL_FORM, + CommonMetadata._Form.MAXILLOFACIAL_CLINICAL_FORM, + CommonMetadata._Form.GASTROENTEROLOGY_CLINICAL_FORM, + CommonMetadata._Form.CARDIOLOGY_CLINICAL_FORM, + CommonMetadata._Form.FERTILITY_CLINICAL_FORM + )); ColumnParameters femaleChildrenUnder5 = new ColumnParameters(null, "<5", "age=<5|gender=F"); ColumnParameters maleChildrenUnder5 = new ColumnParameters(null, "<5", "age=<5|gender=M"); @@ -139,10 +153,10 @@ private DataSetDefinition moh717DatasetDefinition() { dsd.addColumn( "ENT Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.EAR_NOSE_THROAT_CLINICAL_FORM, RE_ATT), indParams), ""); dsd.addColumn( "Eye Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OPHTHAMOLOGY_CLINICAL_FORM,NEW_VISIT), indParams), ""); dsd.addColumn( "Eye Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OPHTHAMOLOGY_CLINICAL_FORM,RE_ATT), indParams), ""); - // dsd.addColumn( "TB and Leprosy Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.,NEW_VISIT), indParams), ""); - // dsd.addColumn( "TB and Leprosy Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form., RE_ATT), indParams), ""); - // dsd.addColumn( "CCC Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String cccClinicUUID, NEW_VISIT), indParams), ""); - // dsd.addColumn( "CCC Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String cccClinicUUID, RE_ATT), indParams), ""); + dsd.addColumn( "TB and Leprosy Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.newOnTBClinic(), indParams), ""); + dsd.addColumn( "TB and Leprosy Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.revisitTBClinic(), indParams), ""); + dsd.addColumn( "CCC Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.newOnCCClinic(), indParams), ""); + dsd.addColumn( "CCC Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.revisitCCClinic(), indParams), ""); dsd.addColumn( "Psychiatry Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.PSYCHIATRIC_FORM, NEW_VISIT), indParams), ""); dsd.addColumn( "Psychiatry Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.PSYCHIATRIC_FORM, RE_ATT), indParams), ""); dsd.addColumn( "Orthopaedic Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.ORTHOPAEDIC_CLINICAL_FORM,NEW_VISIT), indParams), ""); @@ -151,22 +165,22 @@ private DataSetDefinition moh717DatasetDefinition() { dsd.addColumn( "Occupational Therapy Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OCCUPATIONAL_THERAPY_CLINICAL_FORM, RE_ATT), indParams), ""); dsd.addColumn( "Physiotherapy Therapy Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.PHYSIOTHERAPY_FORM, NEW_VISIT), indParams), ""); dsd.addColumn( "Physiotherapy Therapy Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.PHYSIOTHERAPY_FORM, RE_ATT), indParams), ""); - // dsd.addColumn( "Medical Clinics (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String medicalClinicUUID, NEW_VISIT), indParams), ""); - // dsd.addColumn( "Medical Clinics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String medicalClinicUUID,RE_ATT), indParams), ""); - // dsd.addColumn( "Surgical Clinics (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String surgicalClinicUUID, NEW_VISIT), indParams), ""); - // dsd.addColumn( "Surgical Clinics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String surgicalClinicUUID, RE_ATT), indParams), ""); - // dsd.addColumn( "Paediatrics (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String paediatricsClinicUUID, NEW_VISIT), indParams), ""); - // dsd.addColumn( "Paediatrics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(String paediatricsClinicUUID, RE_ATT), indParams), ""); - dsd.addColumn( "Obstetrics and Gynaecology (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OBSTETRIC_HISTORY_FORM,NEW_VISIT), indParams), ""); - dsd.addColumn( "Obstetrics and Gynaecology (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.OBSTETRIC_HISTORY_FORM, RE_ATT), indParams), ""); + dsd.addColumn( "Medical Clinics (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.MOPC_FORM, NEW_VISIT), indParams), ""); + dsd.addColumn( "Medical Clinics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.MOPC_FORM,RE_ATT), indParams), ""); + dsd.addColumn( "Surgical Clinics (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.SOPC_FORM, NEW_VISIT), indParams), ""); + dsd.addColumn( "Surgical Clinics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.SOPC_FORM, RE_ATT), indParams), ""); + dsd.addColumn( "Paediatrics (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.POPC_FORM, NEW_VISIT), indParams), ""); + dsd.addColumn( "Paediatrics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.POPC_FORM, RE_ATT), indParams), ""); + dsd.addColumn( "Obstetrics and Gynaecology (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.GOPC_FORM,NEW_VISIT), indParams), ""); + dsd.addColumn( "Obstetrics and Gynaecology (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.GOPC_FORM, RE_ATT), indParams), ""); dsd.addColumn( "Nutrition Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.NUTRITION, NEW_VISIT), indParams), ""); dsd.addColumn( "Nutrition Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.NUTRITION, RE_ATT), indParams), ""); dsd.addColumn( "Oncology Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.ONCOLOGY_FORM, NEW_VISIT), indParams), ""); dsd.addColumn( "Oncology Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.ONCOLOGY_FORM, RE_ATT), indParams), ""); dsd.addColumn( "Renal Clinic (New)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.UROLOGY_CLINICAL_FORM,NEW_VISIT), indParams), ""); dsd.addColumn( "Renal Clinic (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.specialClinic(CommonMetadata._Form.UROLOGY_CLINICAL_FORM, RE_ATT), indParams), ""); - dsd.addColumn( "All other special Clinics (New)", "", ReportUtils.map(moh717IndicatorLibrary.otherSpecialClinics(,NEW_VISIT), indParams), ""); - dsd.addColumn( "All other special Clinics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.otherSpecialClinics(,RE_ATT), indParams), ""); + dsd.addColumn( "All other special Clinics (New)", "", ReportUtils.map(moh717IndicatorLibrary.otherSpecialClinics(EmrUtils.formatListWithQuotes(otherSpecialClinics),NEW_VISIT), indParams), ""); + dsd.addColumn( "All other special Clinics (Re_Att)", "", ReportUtils.map(moh717IndicatorLibrary.otherSpecialClinics(EmrUtils.formatListWithQuotes(otherSpecialClinics),RE_ATT), indParams), ""); return dsd; } diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/Moh711ReportBuilder.java b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/Moh711ReportBuilder.java index cd64fc262..9251b78d6 100755 --- a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/Moh711ReportBuilder.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/Moh711ReportBuilder.java @@ -37,7 +37,7 @@ * MOH 711 report */ @Component -@Builds({"kenyaemr.common.report.moh711"}) +@Builds({"kenyaemr.ehrReports.report.moh711"}) public class Moh711ReportBuilder extends AbstractReportBuilder { protected static final Log log = LogFactory.getLog(Moh711ReportBuilder.class); diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/Moh745ReportBuilder.java b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/Moh745ReportBuilder.java index 9a5e30e58..56a28c6a8 100644 --- a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/Moh745ReportBuilder.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/builder/common/Moh745ReportBuilder.java @@ -46,7 +46,7 @@ * MOH 745 Report */ @Component -@Builds({"kenyaemr.common.report.moh745"}) +@Builds({"kenyaemr.ehrReports.report.moh745"}) public class Moh745ReportBuilder extends AbstractReportBuilder { protected static final Log log = LogFactory.getLog(Moh745ReportBuilder.class); diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717CohortLibrary.java b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717CohortLibrary.java index e12685866..2e040472d 100644 --- a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717CohortLibrary.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717CohortLibrary.java @@ -223,7 +223,7 @@ public CohortDefinition specialClinic(String clinicFormUUID, int visitType) { sql.setName("Special Clinic"); sql.addParameter(new Parameter("startDate", "Start Date", Date.class)); sql.addParameter(new Parameter("endDate", "End Date", Date.class)); - sql.setQuery(""); + sql.setQuery("select s.patient_id from kenyaemr_etl.etl_special_clinics s where s.special_clinic_form_uuid = '"+clinicFormUUID+"' and s.visit_type = "+visitType+" and s.visit_date between date(:startDate) and date(:endDate);"); return sql; } public CohortDefinition otherSpecialClinics(String clinicsFormUUIDS, int visitType) { @@ -231,7 +231,7 @@ public CohortDefinition otherSpecialClinics(String clinicsFormUUIDS, int visitTy sql.setName("Other Special Clinics"); sql.addParameter(new Parameter("startDate", "Start Date", Date.class)); sql.addParameter(new Parameter("endDate", "End Date", Date.class)); - sql.setQuery(""); + sql.setQuery("select s.patient_id from kenyaemr_etl.etl_special_clinics s where s.special_clinic_form_uuid in ("+clinicsFormUUIDS+") and s.visit_type = "+visitType+" and s.visit_date between date(:startDate) and date(:endDate);"); return sql; } public CohortDefinition totalAmountCollected() { @@ -243,6 +243,53 @@ public CohortDefinition totalAmountCollected() { "where date(transaction_date) between date(:startDate) and date(:endDate);"); return sql; } + + public CohortDefinition newOnTBClinic() { + SqlCohortDefinition sql = new SqlCohortDefinition(); + sql.setName("New on TB Clinic"); + sql.addParameter(new Parameter("startDate", "Start Date", Date.class)); + sql.addParameter(new Parameter("endDate", "End Date", Date.class)); + sql.setQuery("select e.patient_id from kenyaemr_etl.etl_tb_enrollment e where e.visit_date between date(:startDate) and date(:endDate);"); + return sql; + } + public CohortDefinition revisitTBClinic() { + SqlCohortDefinition sql = new SqlCohortDefinition(); + sql.setName("Revisiting TB Clinic"); + sql.addParameter(new Parameter("startDate", "Start Date", Date.class)); + sql.addParameter(new Parameter("endDate", "End Date", Date.class)); + sql.setQuery("select e.patient_id\n" + + "from kenyaemr_etl.etl_tb_enrollment e\n" + + " inner join (select f.patient_id, min(f.visit_date) as first_visit, max(f.visit_date) as latest_visit\n" + + " from kenyaemr_etl.etl_tb_follow_up_visit f\n" + + " group by f.patient_id) f on e.patient_id = f.patient_id\n" + + "where f.latest_visit between date(:startDate) and date(:endDate)\n" + + " and f.first_visit < date(:startDate)\n" + + " and e.visit_date < date(:startDate);"); + return sql; + } + public CohortDefinition newOnCCClinic() { + SqlCohortDefinition sql = new SqlCohortDefinition(); + sql.setName("New on CCC Clinic"); + sql.addParameter(new Parameter("startDate", "Start Date", Date.class)); + sql.addParameter(new Parameter("endDate", "End Date", Date.class)); + sql.setQuery("select e.patient_id from kenyaemr_etl.etl_hiv_enrollment e where e.patient_type = 164144 and e.visit_date between date(:startDate) and date(:endDate);"); + return sql; + } + public CohortDefinition revisitCCClinic() { + SqlCohortDefinition sql = new SqlCohortDefinition(); + sql.setName("Revisiting CCC Clinic"); + sql.addParameter(new Parameter("startDate", "Start Date", Date.class)); + sql.addParameter(new Parameter("endDate", "End Date", Date.class)); + sql.setQuery("select e.patient_id\n" + + "from kenyaemr_etl.etl_hiv_enrollment e\n" + + " inner join (select f.patient_id, min(f.visit_date) as first_visit, max(f.visit_date) as latest_visit\n" + + " from kenyaemr_etl.etl_patient_hiv_followup f\n" + + " group by f.patient_id) f on e.patient_id = f.patient_id\n" + + "where f.latest_visit between date(:startDate) and date(:endDate)\n" + + " and f.first_visit < date(:startDate)\n" + + " and e.visit_date < date(:startDate);"); + return sql; + } public CohortDefinition totalAmountReceived() { SqlCohortDefinition sql = new SqlCohortDefinition(); sql.setName("Total Amount Received"); diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717IndicatorLibrary.java b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717IndicatorLibrary.java index e79648712..a7bda000e 100644 --- a/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717IndicatorLibrary.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/reporting/library/moh717/Moh717IndicatorLibrary.java @@ -97,7 +97,19 @@ public CohortIndicator specialClinic(String clinicFormUUID, int visitType) { return cohortIndicator("Special Clinics", ReportUtils.map(moh717CohortLibrary.specialClinic(clinicFormUUID,visitType), "startDate=${startDate},endDate=${endDate}")); } public CohortIndicator otherSpecialClinics(String clinicFormUUID, int visitType) { - return cohortIndicator("Other special clinic", ReportUtils.map(moh717CohortLibrary.otherSpecialClinics(clinicFormUUID, visitType), "startDate=${startDate},endDate=${endDate}")); + return cohortIndicator("Other special clinics", ReportUtils.map(moh717CohortLibrary.otherSpecialClinics(clinicFormUUID, visitType), "startDate=${startDate},endDate=${endDate}")); + } + public CohortIndicator newOnTBClinic() { + return cohortIndicator("New on TB Clinic", ReportUtils.map(moh717CohortLibrary.newOnTBClinic(), "startDate=${startDate},endDate=${endDate}")); + } + public CohortIndicator revisitTBClinic() { + return cohortIndicator("Revisiting TB Clinic", ReportUtils.map(moh717CohortLibrary.revisitTBClinic(), "startDate=${startDate},endDate=${endDate}")); + } + public CohortIndicator newOnCCClinic() { + return cohortIndicator("New on CCC Clinic", ReportUtils.map(moh717CohortLibrary.newOnCCClinic(), "startDate=${startDate},endDate=${endDate}")); + } + public CohortIndicator revisitCCClinic() { + return cohortIndicator("Revisiting CCC Clinic", ReportUtils.map(moh717CohortLibrary.revisitCCClinic(), "startDate=${startDate},endDate=${endDate}")); } public CohortIndicator totalAmountCollected() { return cohortIndicator("Total Amount Collected", ReportUtils.map(moh717CohortLibrary.totalAmountCollected(), "startDate=${startDate},endDate=${endDate}")); diff --git a/api/src/main/java/org/openmrs/module/kenyaemr/util/EmrUtils.java b/api/src/main/java/org/openmrs/module/kenyaemr/util/EmrUtils.java index 3c2e2253c..8f4ad3922 100755 --- a/api/src/main/java/org/openmrs/module/kenyaemr/util/EmrUtils.java +++ b/api/src/main/java/org/openmrs/module/kenyaemr/util/EmrUtils.java @@ -52,6 +52,7 @@ import java.util.Date; import java.util.Iterator; import java.util.List; +import java.util.StringJoiner; /** * Miscellaneous utility methods @@ -363,4 +364,18 @@ public static Date getLatestAppointmentDateForService (Integer patientId, Intege return appointmentDate; } + /** + * Helper method that receives a List of Strings and returns a String + * of comma-separated and single-quoted input list elements + * @param list + * @return + */ + public static String formatListWithQuotes(ArrayList list) { + StringJoiner joiner = new StringJoiner(", "); + for (String value : list) { + joiner.add("'" + value + "'"); + } + return joiner.toString(); + } + } \ No newline at end of file diff --git a/api/src/main/resources/content/kenyaemr.common.xml b/api/src/main/resources/content/kenyaemr.common.xml index b9574436e..2a9e7e0fe 100644 --- a/api/src/main/resources/content/kenyaemr.common.xml +++ b/api/src/main/resources/content/kenyaemr.common.xml @@ -54,13 +54,11 @@ - - @@ -88,7 +86,6 @@ - @@ -106,6 +103,9 @@ + + + @@ -638,7 +638,7 @@ - + @@ -680,7 +680,7 @@ - + @@ -960,7 +960,7 @@ - + diff --git a/omod/src/main/webapp/resources/reports/.~lock.MOH_717.xls# b/omod/src/main/webapp/resources/reports/.~lock.MOH_717.xls# deleted file mode 100644 index a417235ed..000000000 --- a/omod/src/main/webapp/resources/reports/.~lock.MOH_717.xls# +++ /dev/null @@ -1 +0,0 @@ -,steve,steve-Latitude-7440,16.12.2024 14:30,file:///home/steve/.config/libreoffice/4; \ No newline at end of file diff --git a/omod/src/main/webapp/resources/reports/MOH_717.xls b/omod/src/main/webapp/resources/reports/MOH_717.xls index 6a903e8622b936621ebd2783f015e4a137a9d0f4..2d3c258a28feac22d7284ae3e6e10411a2049819 100644 GIT binary patch delta 21842 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 VZzeAMu5)Fi@8G__eb>p(_&>0P9;W~R delta 23374 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 KpZmPrtp5XE1CML~