← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 3558: Implemented support for indicators in dataset reports

 

------------------------------------------------------------
revno: 3558
committer: Lars Helge Overland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Tue 2011-05-10 12:59:59 +0200
message:
  Implemented support for indicators in dataset reports
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/datasetreport/DataSetReportService.java
  dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/datasetreport/impl/DefaultDataSetReportService.java
  dhis-2/dhis-web/dhis-web-reporting/src/main/java/org/hisp/dhis/reporting/dataset/action/GenerateCustomDataSetReportAction.java


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/datasetreport/DataSetReportService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/datasetreport/DataSetReportService.java	2011-04-01 11:19:55 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/datasetreport/DataSetReportService.java	2011-05-10 10:59:59 +0000
@@ -47,13 +47,25 @@
      * Generates a map with aggregated data values or regular data values (depending
      * on the selectedUnitOnly argument) mapped to a DataElemenet operand identifier.
      * 
-     * @param dataSet the DataSet containing the DataElement to include in the map.
+     * @param dataSet the DataSet.
      * @param unit the OrganisationUnit.
      * @param period the Period.
      * @param selectedUnitOnly whether to include aggregated or regular data in the map.
+     * @param format the I18nFormat.
      * @return a map.
      */
     Map<String, String> getAggregatedValueMap( DataSet dataSet, OrganisationUnit unit, Period period, boolean selectedUnitOnly, I18nFormat format );
+    
+    /**
+     * Generates a map with aggregated indicator values mapped to an Indicator identifier.
+     * 
+     * @param dataSet the DataSet.
+     * @param unit the OrganisationUnit.
+     * @param period the Period.
+     * @param format the I18nFormat.
+     * @return a map.
+     */
+    Map<Integer, String> getAggregatedIndicatorValueMap( DataSet dataSet, OrganisationUnit unit, Period period, I18nFormat format );
 
     /**
      * Puts in aggregated datavalues in the custom dataentry form and returns
@@ -64,7 +76,7 @@
      * @return data entry form HTML code populated with aggregated data in the
      *         input fields.
      */
-    String prepareReportContent( String dataEntryFormCode, Map<String, String> dataValues );
+    String prepareReportContent( String dataEntryFormCode, Map<String, String> dataValues, Map<Integer, String> indicatorValues );
     
     /**
      * Generates a Grid representing a data set report with all data elements

=== modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/datasetreport/impl/DefaultDataSetReportService.java'
--- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/datasetreport/impl/DefaultDataSetReportService.java	2011-05-10 09:48:46 +0000
+++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/datasetreport/impl/DefaultDataSetReportService.java	2011-05-10 10:59:59 +0000
@@ -42,6 +42,7 @@
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.hisp.dhis.aggregation.AggregatedDataValueService;
 import org.hisp.dhis.aggregation.AggregationService;
@@ -62,6 +63,7 @@
 import org.hisp.dhis.datavalue.DataValueService;
 import org.hisp.dhis.i18n.I18n;
 import org.hisp.dhis.i18n.I18nFormat;
+import org.hisp.dhis.indicator.Indicator;
 import org.hisp.dhis.options.SystemSettingManager;
 import org.hisp.dhis.organisationunit.OrganisationUnit;
 import org.hisp.dhis.period.Period;
@@ -77,6 +79,8 @@
 public class DefaultDataSetReportService
     implements DataSetReportService
 {
+    final Pattern INDICATOR_PATTERN = Pattern.compile( "indicatorid=\"(.*?)\"" );
+        
     private static final String NULL_REPLACEMENT = "";
     private static final String SEPARATOR = ":";
     private static final String DEFAULT_HEADER = "Value";
@@ -133,13 +137,11 @@
         
         FilterUtils.filter( dataElements, new AggregatableDataElementFilter() );
         
-        Map<String, String> map = new TreeMap<String,String>();            
+        Map<String, String> map = new TreeMap<String, String>();            
         
         for ( DataElement dataElement : dataElements )
         {
-            DataElementCategoryCombo categoryCombo = dataElement.getCategoryCombo();                                        
-            
-            for ( DataElementCategoryOptionCombo categoryOptionCombo : categoryCombo.getOptionCombos() )
+            for ( DataElementCategoryOptionCombo categoryOptionCombo : dataElement.getCategoryCombo().getOptionCombos() )
             {
                 String value;
                 
@@ -167,53 +169,78 @@
         return map;
     }
     
-    public String prepareReportContent( String dataEntryFormCode, Map<String, String> dataValues )
+    public Map<Integer, String> getAggregatedIndicatorValueMap( DataSet dataSet, OrganisationUnit unit, Period period, I18nFormat format )
+    {
+        String aggregationStrategy = (String) systemSettingManager.getSystemSetting( KEY_AGGREGATION_STRATEGY, DEFAULT_AGGREGATION_STRATEGY );
+        
+        Map<Integer, String> map = new TreeMap<Integer, String>();
+        
+        for ( Indicator indicator : dataSet.getIndicators() )
+        {
+            Double aggregatedValue = aggregationStrategy.equals( AGGREGATION_STRATEGY_REAL_TIME ) ? 
+                aggregationService.getAggregatedIndicatorValue( indicator, period.getStartDate(), period.getEndDate(), unit ) :
+                    aggregatedDataValueService.getAggregatedValue( indicator, period, unit );
+            
+            String value = format.formatValue( aggregatedValue );
+            
+            if ( value != null )
+            {
+                map.put( indicator.getId(), value );
+            }
+        }
+        
+        return map;
+    }
+    
+    public String prepareReportContent( String dataEntryFormCode, Map<String, String> dataValues, Map<Integer, String> indicatorValues )
     {        
         StringBuffer buffer = new StringBuffer();
 
-        Matcher matDataElement = INPUT_PATTERN.matcher( dataEntryFormCode );
+        Matcher inputMatcher = INPUT_PATTERN.matcher( dataEntryFormCode );
 
         // ---------------------------------------------------------------------
         // Iterate through all matching data element fields.
         // ---------------------------------------------------------------------
         
-        while ( matDataElement.find() )
+        while ( inputMatcher.find() )
         {       
             // -----------------------------------------------------------------
             // Get input HTML code
             // -----------------------------------------------------------------
             
-            String dataElementCode = matDataElement.group( 1 );
-            
-            Matcher matDataElementId = IDENTIFIER_PATTERN.matcher( dataElementCode );
-            
-            if ( matDataElementId.find() && matDataElementId.groupCount() > 0 )
-            {
-                int dataElementId = Integer.parseInt( matDataElementId.group( 1 ) );
-                int optionComboId = Integer.parseInt( matDataElementId.group( 2 ) ); 
-                
-               // --------------------------------------------------------------
-               // Find existing value of data element in data set and replace
-               // --------------------------------------------------------------               
-                
-                String dataElementValue = dataValues.get( dataElementId + SEPARATOR + optionComboId );               
-                
-                if ( dataElementValue == null )
-                {
-                    dataElementValue = NULL_REPLACEMENT;
-                }
-                        
-                dataElementCode = dataElementValue;
-                
-                matDataElement.appendReplacement( buffer, dataElementCode );
+            String inputHtml = inputMatcher.group( 1 );
+            
+            Matcher identifierMatcher = IDENTIFIER_PATTERN.matcher( inputHtml );
+            Matcher indicatorMatcher = INDICATOR_PATTERN.matcher( inputHtml );
+
+            // -----------------------------------------------------------------
+            // Find existing data or indicator value and replace input tag
+            // -----------------------------------------------------------------               
+             
+            if ( identifierMatcher.find() && identifierMatcher.groupCount() > 0 )
+            {
+                Integer dataElementId = Integer.parseInt( identifierMatcher.group( 1 ) );
+                Integer optionComboId = Integer.parseInt( identifierMatcher.group( 2 ) ); 
+                
+                String dataValue = dataValues.get( dataElementId + SEPARATOR + optionComboId );               
+                
+                dataValue = dataValue != null ? dataValue : NULL_REPLACEMENT;
+                
+                inputMatcher.appendReplacement( buffer, dataValue );
+            }
+            else if ( indicatorMatcher.find() && indicatorMatcher.groupCount() > 0 )
+            {
+                Integer indicatorId = Integer.parseInt( indicatorMatcher.group( 1 ) );
+                
+                String indicatorValue = indicatorValues.get( indicatorId );
+                
+                indicatorValue = indicatorValue != null ? indicatorValue : NULL_REPLACEMENT;
+                
+                inputMatcher.appendReplacement( buffer, indicatorValue );
             }
         }
 
-        // ---------------------------------------------------------------------
-        // Add remaining text 
-        // ---------------------------------------------------------------------          
-        
-        matDataElement.appendTail( buffer );
+        inputMatcher.appendTail( buffer );
         
         return buffer.toString();
     }

=== modified file 'dhis-2/dhis-web/dhis-web-reporting/src/main/java/org/hisp/dhis/reporting/dataset/action/GenerateCustomDataSetReportAction.java'
--- dhis-2/dhis-web/dhis-web-reporting/src/main/java/org/hisp/dhis/reporting/dataset/action/GenerateCustomDataSetReportAction.java	2011-03-20 13:57:42 +0000
+++ dhis-2/dhis-web/dhis-web-reporting/src/main/java/org/hisp/dhis/reporting/dataset/action/GenerateCustomDataSetReportAction.java	2011-05-10 10:59:59 +0000
@@ -134,10 +134,12 @@
         Map<String, String> aggregatedDataValueMap = dataSetReportService.getAggregatedValueMap( selectedDataSet, selectedOrgunit, selectedPeriod,
             selectedUnitOnly, format );
 
+        Map<Integer, String> aggregatedIndicatorMap = dataSetReportService.getAggregatedIndicatorValueMap( selectedDataSet, selectedOrgunit, selectedPeriod, format );
+        
         DataEntryForm dataEntryForm = selectedDataSet.getDataEntryForm();
 
         customDataEntryFormCode = dataSetReportService.prepareReportContent( dataEntryForm.getHtmlCode(),
-            aggregatedDataValueMap );
+            aggregatedDataValueMap, aggregatedIndicatorMap );
 
         reportingUnit = selectedOrgunit.getName();