← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 9615: Add ad-hoc aggregated reports in Tabular reports (WIP).

 

------------------------------------------------------------
revno: 9615
committer: Tran Chau <tran.hispvietnam@xxxxxxxxx>
branch nick: dhis2
timestamp: Sat 2013-01-26 14:07:27 +0700
message:
  Add ad-hoc aggregated reports in Tabular reports (WIP).
modified:
  dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GenerateAggregateReportAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GetAggregateReportAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js
  dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/index.html
  dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/i18n.vm
  dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/jsonTabularAggregateReport.vm


--
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-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java'
--- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java	2013-01-25 10:17:23 +0000
+++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java	2013-01-26 07:07:27 +0000
@@ -404,38 +404,13 @@
         grid.setTitle( programStage.getProgram().getDisplayName() );
         grid.setSubtitle( programStage.getDisplayName() );
 
+        // ---------------------------------------------------------------------
+        // Get SQL and build grid
+        // ---------------------------------------------------------------------
+
         // Type = 1
         if ( position == PatientAggregateReport.POSITION_ROW_ORGUNIT_COLUMN_PERIOD )
         {
-            // ---------------------------------------------------------------------
-            // Headers cols
-            // ---------------------------------------------------------------------
-
-            // grid.addHeader( new GridHeader( i18n.getString( "orgunit" ),
-            // false, true ) );
-            //
-            // for ( Period period : periods )
-            // {
-            // String periodName = "";
-            // if ( period.getPeriodType() != null )
-            // {
-            // periodName = format.formatPeriod( period );
-            // }
-            // else
-            // {
-            // String startDate = format.formatDate( period.getStartDate() );
-            // String endDate = format.formatDate( period.getEndDate() );
-            // periodName = startDate + " -> " + endDate;
-            // }
-            // grid.addHeader( new GridHeader( periodName, false, false ) );
-            // }
-            // grid.addHeader( new GridHeader( i18n.getString("total"), false,
-            // false ) );
-
-            // ---------------------------------------------------------------------
-            // Get SQL and build grid
-            // ---------------------------------------------------------------------
-
             sql = getAggregateReportSQL12( programStage, orgunitIds, facilityLB, filterSQL, deGroupBy, periods,
                 aggregateType, useCompletedEvents, format );
         }
@@ -453,104 +428,30 @@
         // Type = 3
         else if ( position == PatientAggregateReport.POSITION_ROW_ORGUNIT_ROW_PERIOD )
         {
-            // ---------------------------------------------------------------------
-            // Headers cols
-            // ---------------------------------------------------------------------
-            //
-            // grid.addHeader( new GridHeader( i18n.getString( "orgunit" ),
-            // false, true ) );
-            // grid.addHeader( new GridHeader( i18n.getString( "period" ),
-            // false, true ) );
-            // grid.addHeader( new GridHeader( i18n.getString( aggregateType ),
-            // false, false ) );
-            // grid.addHeader( new GridHeader( i18n.getString("total"), false,
-            // false ) );
-
-            // ---------------------------------------------------------------------
-            // Get SQL and build grid
-            // ---------------------------------------------------------------------
-
             sql = getAggregateReportSQL3( position, programStage, orgunitIds, facilityLB, filterSQL, deGroupBy,
                 periods, aggregateType, useCompletedEvents, format );
-
         }
         // Type = 4
         else if ( position == PatientAggregateReport.POSITION_ROW_PERIOD )
         {
-            // ---------------------------------------------------------------------
-            // Headers cols
-            // ---------------------------------------------------------------------
-
-            // grid.addHeader( new GridHeader( i18n.getString( "period" ),
-            // false, true ) );
-            // grid.addHeader( new GridHeader( i18n.getString( aggregateType ),
-            // false, false ) );
-            // grid.addHeader( new GridHeader( i18n.getString("total"), false,
-            // false ) );
-
-            // ---------------------------------------------------------------------
-            // Get SQL and build grid
-            // ---------------------------------------------------------------------
-
             sql = getAggregateReportSQL4( position, programStage, orgunitIds, facilityLB, filterSQL, deGroupBy,
                 periods, aggregateType, useCompletedEvents, format );
-
         }
         // type = 5
         else if ( position == PatientAggregateReport.POSITION_ROW_ORGUNIT )
         {
-            // ---------------------------------------------------------------------
-            // Headers cols
-            // ---------------------------------------------------------------------
-
-            // grid.addHeader( new GridHeader( i18n.getString( "orgunit" ),
-            // false, true ) );
-            // grid.addHeader( new GridHeader( i18n.getString( aggregateType ),
-            // false, false ) );
-            // grid.addHeader( new GridHeader( i18n.getString("total"), false,
-            // false ) );
-
-            // ---------------------------------------------------------------------
-            // Get SQL and build grid
-            // ---------------------------------------------------------------------
-
             List<Period> firstPeriod = new ArrayList<Period>();
             firstPeriod.add( periods.iterator().next() );
             sql = getAggregateReportSQL5( position, programStage, orgunitIds, facilityLB, filterSQL, deGroupBy, periods
                 .iterator().next(), aggregateType, useCompletedEvents, format );
-
         }
 
         // Type = 6 && With group-by
         else if ( (position == PatientAggregateReport.POSITION_ROW_PERIOD_COLUMN_DATA || position == PatientAggregateReport.POSITION_ROW_DATA_COLUMN_PERIOD)
             && deGroupBy != null )
         {
-
             deValues = dataElementService.getDataElement( deGroupBy ).getOptionSet().getOptions();
 
-            // ---------------------------------------------------------------------
-            // Headers cols
-            // ---------------------------------------------------------------------
-
-            // if ( position ==
-            // PatientAggregateReport.POSITION_ROW_PERIOD_COLUMN_DATA )
-            // {
-            // grid.addHeader( new GridHeader( i18n.getString( "period" ),
-            // false, true ) );
-            // for ( String deValue : deValues )
-            // {
-            // grid.addHeader( new GridHeader( deValue, false, false ) );
-            // }
-            // grid.addHeader( new GridHeader( i18n.getString("total"), false,
-            // false ) );
-            // }
-            // grid.addHeader( new GridHeader( i18n.getString("total"), false,
-            // false ) );
-
-            // ---------------------------------------------------------------------
-            // Get SQL and build grid
-            // ---------------------------------------------------------------------
-
             sql = getAggregateReportSQL6( programStage, orgunitIds.iterator().next(), facilityLB, filterSQL, deGroupBy,
                 deValues, periods, aggregateType, useCompletedEvents, format );
         }
@@ -559,25 +460,6 @@
         else if ( (position == PatientAggregateReport.POSITION_ROW_PERIOD_COLUMN_DATA || position == PatientAggregateReport.POSITION_ROW_DATA_COLUMN_PERIOD)
             && deGroupBy == null )
         {
-            // ---------------------------------------------------------------------
-            // Headers cols
-            // ---------------------------------------------------------------------
-
-            // if ( position ==
-            // PatientAggregateReport.POSITION_ROW_PERIOD_COLUMN_DATA )
-            // {
-            // grid.addHeader( new GridHeader( i18n.getString( "period" ),
-            // false, true ) );
-            // grid.addHeader( new GridHeader( i18n.getString( aggregateType ),
-            // false, false ) );
-            // }
-            // grid.addHeader( new GridHeader( i18n.getString("total"), false,
-            // false ) );
-
-            // ---------------------------------------------------------------------
-            // Get SQL and build grid
-            // ---------------------------------------------------------------------
-
             sql = getAggregateReportSQL6WithoutGroup( programStage, orgunitIds.iterator().next(), facilityLB,
                 filterSQL, deGroupBy, periods, aggregateType, useCompletedEvents, format );
         }
@@ -588,56 +470,14 @@
         {
             deValues = dataElementService.getDataElement( deGroupBy ).getOptionSet().getOptions();
 
-            // ---------------------------------------------------------------------
-            // Headers cols
-            // ---------------------------------------------------------------------
-
-            // if ( position ==
-            // PatientAggregateReport.POSITION_ROW_ORGUNIT_COLUMN_DATA )
-            // {
-            // grid.addHeader( new GridHeader( i18n.getString( "orgunit" ),
-            // false, true ) );
-            //
-            // for ( String deValue : deValues )
-            // {
-            // grid.addHeader( new GridHeader( deValue, false, false ) );
-            // }
-            // }
-            // grid.addHeader( new GridHeader( i18n.getString("total"), false,
-            // false ) );
-
-            // ---------------------------------------------------------------------
-            // Get SQL and build grid
-            // ---------------------------------------------------------------------
-
             sql = getAggregateReportSQL7( programStage, orgunitIds, facilityLB, filterSQL, deGroupBy, deValues, periods
                 .iterator().next(), aggregateType, useCompletedEvents, format );
-
         }
 
         // Type = 7 && NOT group-by
         else if ( (position == PatientAggregateReport.POSITION_ROW_ORGUNIT_COLUMN_DATA || position == PatientAggregateReport.POSITION_ROW_DATA_COLUMN_ORGUNIT)
             && deGroupBy == null )
         {
-            // ---------------------------------------------------------------------
-            // Headers cols
-            // ---------------------------------------------------------------------
-
-            // if ( position ==
-            // PatientAggregateReport.POSITION_ROW_ORGUNIT_COLUMN_DATA )
-            // {
-            // grid.addHeader( new GridHeader( i18n.getString( "orgunit" ),
-            // false, true ) );
-            // grid.addHeader( new GridHeader( i18n.getString( aggregateType ),
-            // false, false ) );
-            // }
-            // grid.addHeader( new GridHeader( i18n.getString("total"), false,
-            // false ) );
-
-            // ---------------------------------------------------------------------
-            // Get SQL and build grid
-            // ---------------------------------------------------------------------
-
             sql = getAggregateReportSQL7WithoutGroup( programStage, orgunitIds, facilityLB, filterSQL, periods
                 .iterator().next(), aggregateType, useCompletedEvents, format );
 
@@ -646,28 +486,13 @@
         // type = 8 && With group-by
         else if ( position == PatientAggregateReport.POSITION_ROW_DATA )
         {
-            // ---------------------------------------------------------------------
-            // Headers cols
-            // ---------------------------------------------------------------------
-
-            // grid.addHeader( new GridHeader( i18n.getString( "data_element" ),
-            // false, true ) );
-            // grid.addHeader( new GridHeader( i18n.getString( aggregateType ),
-            // false, false ) );
-            // grid.addHeader( new GridHeader( i18n.getString("total"), false,
-            // false ) );
-
-            // ---------------------------------------------------------------------
-            // Get SQL and build grid
-            // ---------------------------------------------------------------------
-
             sql = getAggregateReportSQL8( programStage, orgunitIds, facilityLB, filterSQL, deGroupBy, periods
                 .iterator().next(), aggregateType, limit, useCompletedEvents, format );
         }
 
         SqlRowSet rowSet = jdbcTemplate.queryForRowSet( sql );
 
-        // Type != 2
+        // Type ==2 && ==9 && ==10
         if ( position == PatientAggregateReport.POSITION_ROW_PERIOD_COLUMN_ORGUNIT
             || position == PatientAggregateReport.POSITION_ROW_DATA_COLUMN_PERIOD
             || position == PatientAggregateReport.POSITION_ROW_DATA_COLUMN_ORGUNIT )
@@ -934,8 +759,7 @@
     }
 
     /**
-     * Generate SQL statement for 3 report type - Aggregate report Position
-     * Orgunit Rows - Period Rows - Data Filter
+     * Aggregate report Position Orgunit Rows - Period Rows - Data Filter
      * 
      **/
     private String getAggregateReportSQL3( int position, ProgramStage programStage, Collection<Integer> roots,
@@ -964,7 +788,7 @@
 
                 sql += "( SELECT ";
                 sql += "( SELECT ou.name FROM organisationunit ou WHERE organisationunitid=" + root + " ) as orgunit, ";
-                sql += "'" + periodName + "' , ";
+                sql += "'" + periodName + "' as period, ";
 
                 sql += " ( SELECT " + aggregateType + "(pdv_1.value)   ";
                 sql += "FROM ";
@@ -1027,7 +851,7 @@
                 }
 
                 sql += "( SELECT ";
-                sql += "'" + periodName + "' , ";
+                sql += "'" + periodName + "' as period, ";
 
                 sql += " ( SELECT " + aggregateType + "(pdv_1.value)   ";
                 sql += "FROM ";
@@ -1049,7 +873,7 @@
                 }
                 sql += "     psi_1.executiondate >= '" + startDate + "' AND ";
                 sql += "     psi_1.executiondate <= '" + endDate + "' ";
-                sql += filterSQL + " ) ) ";
+                sql += filterSQL + " )  as " + aggregateType + ") ";
                 sql += " UNION ";
             }
         }
@@ -1098,7 +922,7 @@
             {
                 sql += " AND psi_1.completed = true ";
             }
-            sql += " )  ) ";
+            sql += " ) as " + aggregateType + "  ) ";
             sql += " UNION ";
         }
 
@@ -1135,7 +959,7 @@
                 periodName = startDate + " -> " + endDate;
             }
 
-            sql += "(SELECT '" + periodName + "', ";
+            sql += "(SELECT '" + periodName + "' as period, ";
             for ( String deValue : deValues )
             {
                 sql += "(SELECT " + aggregateType + "(value)  ";
@@ -1199,7 +1023,7 @@
                 periodName = startDate + " -> " + endDate;
             }
 
-            sql += "(SELECT '" + periodName + "', ";
+            sql += "(SELECT '" + periodName + "' as period, ";
 
             sql += "(SELECT " + aggregateType + "(value)  ";
             sql += "FROM programstageinstance psi_1 JOIN patientdatavalue pdv_1 ";
@@ -1273,7 +1097,7 @@
                 sql += "   WHERE programstageinstanceid=psi_1.programstageinstanceid AND ";
                 sql += "     dataelementid= pdv_1.dataelementid AND ";
                 sql += "     dataelementid=" + deGroupBy + "  ) = '" + deValue + "' ";
-                sql += ") as \"" + aggregateType + "\",";
+                sql += ") as \"" + deValue + "\",";
             }
 
             sql = sql.substring( 0, sql.length() - 1 ) + " ) ";
@@ -1409,7 +1233,7 @@
             for ( int i = 2; i <= cols; i++ )
             {
                 grid.addRow();
-                column.add( rowSet.getMetaData().getColumnLabel( i ) );
+                column.add( i18n.getString( rowSet.getMetaData().getColumnLabel( i ) ) );
             }
             grid.addRow();
             column.add( i18n.getString( "total" ) );
@@ -1512,7 +1336,7 @@
         // Create column with Total column
         for ( int i = 1; i <= cols; i++ )
         {
-            grid.addHeader( new GridHeader( rs.getMetaData().getColumnLabel( i ), false, false ) );
+            grid.addHeader( new GridHeader( i18n.getString( rs.getMetaData().getColumnLabel( i ) ), false, false ) );
         }
         grid.addHeader( new GridHeader( i18n.getString( "total" ), false, false ) );
 

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GenerateAggregateReportAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GenerateAggregateReportAction.java	2013-01-22 06:42:20 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GenerateAggregateReportAction.java	2013-01-26 07:07:27 +0000
@@ -136,11 +136,11 @@
         this.deFilters = deFilters;
     }
 
-    private Collection<String> periodIds = new HashSet<String>();
+    private Collection<String> fixedPeriods = new HashSet<String>();
 
-    public void setPeriodIds( Collection<String> periodIds )
+    public void setFixedPeriods( Collection<String> fixedPeriods )
     {
-        this.periodIds = periodIds;
+        this.fixedPeriods = fixedPeriods;
     }
 
     private Collection<String> relativePeriods = new HashSet<String>();
@@ -287,7 +287,7 @@
         }
 
         // Fixed periods
-        for ( String periodId : periodIds )
+        for ( String periodId : fixedPeriods )
         {
             periods.add( PeriodType.getPeriodFromIsoString( periodId ) );
         }

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GetAggregateReportAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GetAggregateReportAction.java	2013-01-16 08:41:28 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GetAggregateReportAction.java	2013-01-26 07:07:27 +0000
@@ -27,13 +27,17 @@
 
 package org.hisp.dhis.caseentry.action.report;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.List;
 
 import org.hisp.dhis.dataelement.DataElement;
 import org.hisp.dhis.dataelement.DataElementService;
+import org.hisp.dhis.i18n.I18nFormat;
 import org.hisp.dhis.patientreport.PatientAggregateReport;
 import org.hisp.dhis.patientreport.PatientAggregateReportService;
+import org.hisp.dhis.period.PeriodType;
 
 import com.opensymphony.xwork2.Action;
 
@@ -63,6 +67,13 @@
         this.dataElementService = dataElementService;
     }
 
+    private I18nFormat format;
+
+    public void setFormat( I18nFormat format )
+    {
+        this.format = format;
+    }
+
     // -------------------------------------------------------------------------
     // Input && Output
     // -------------------------------------------------------------------------
@@ -88,6 +99,13 @@
         return selectedDataElements;
     }
 
+    private List<String> fixedPeriodNames = new ArrayList<String>();
+
+    public List<String> getFixedPeriodNames()
+    {
+        return fixedPeriodNames;
+    }
+
     // -------------------------------------------------------------------------
     // Action implementation
     // -------------------------------------------------------------------------
@@ -98,6 +116,11 @@
     {
         aggregateReport = aggregateReportService.getPatientAggregateReport( id );
 
+        for ( String fixedPeriodId : aggregateReport.getFixedPeriods() )
+        {
+            fixedPeriodNames.add( format.formatPeriod( PeriodType.getPeriodFromIsoString( fixedPeriodId ) ) );
+        }
+
         for ( String deFilter : aggregateReport.getFilterValues() )
         {
             int id = Integer.parseInt( deFilter.split( "_" )[0] );

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js	2013-01-24 04:56:43 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js	2013-01-26 07:07:27 +0000
@@ -57,6 +57,7 @@
 			aggregatefavorite_save: 'saveAggregateReport.action',
             aggregatefavorite_delete: 'deleteAggregateReport.action',
 			generateaggregatereport_get: 'generateAggregateReport.action',
+			username_dataelement_get: 'getUsernameList.action',
 			redirect: 'index.action'
         },
         params: {
@@ -237,6 +238,18 @@
 		getCmp: function(q) {
             return TR.viewport.query(q)[0];
         },
+		list:{
+			addOptionToList: function( list, optionValue, optionText ){
+				var option = document.createElement( "option" );
+				option.value = optionValue;
+				option.text = optionText;
+				option.setAttribute('selected',true)
+				list.add( option, null );
+			},
+			clearList: function( list ) {
+				list.options.length = 0;
+			}
+		},
         getUrlParam: function(s) {
             var output = '';
             var href = window.location.href;
@@ -378,7 +391,6 @@
 				}
 			},
 			addFilterField: function( p, id, name, valueType ){
-				var xtype = TR.value.covertXType(valueType);
 				var panelid = 'p_' + id;
 				var idx = 0;
 				var subPanel = Ext.getCmp(panelid);
@@ -410,7 +422,7 @@
 					width:(TR.conf.layout.west_fieldset_width - TR.conf.layout.west_width_subtractor) / 2 - 60
 				};
 				items[1] = this.createOperatorField(valueType, fieldid);
-				items[2] = this.createFilterField( xtype, fieldid );
+				items[2] = this.createFilterField( valueType, fieldid );
 				if( idx == 0 ){
 					items[3] = this.addFieldBtn( panelid, id, name, valueType, idx );
 				}
@@ -437,13 +449,18 @@
 				params.editable = false;
 				params.value = '=';
 				
-				if(valueType == 'string' || valueType == 'trueOnly' 
-					|| valueType == 'bool' || valueType == 'list' ){
+				if(valueType == 'string' || valueType == 'list' || valueType == 'username' ){
 					params.store = new Ext.data.ArrayStore({
 						fields: ['value','name'],
 						data: [ ['=','='],['like',TR.i18n.like],['in',TR.i18n.in] ]
 					});
 				}
+				else if( valueType == 'trueOnly' || valueType == 'bool' ){
+					params.store = new Ext.data.ArrayStore({
+						fields: ['value','name'],
+						data: [ ['=','='] ]
+					});
+				}
 				else
 				{
 					params.store = new Ext.data.ArrayStore({
@@ -459,8 +476,9 @@
 				
 				return params;
 			},
-			createFilterField: function( xtype, id ){
+			createFilterField: function( valueType, id ){
 				var params = {};
+				var xtype = TR.value.covertXType(valueType);
 				params.xtype = xtype;
 				params.id = 'filter_' + id;
 				params.cls = 'tr-textfield-alt1';
@@ -471,41 +489,73 @@
 				{
 					params.format = TR.i18n.format_date;
 				}
-				else if( xtype == 'bool')
-				{
-					params.queryMode = 'local';
-					params.editable = false;
-					params.valueField = 'value';
-					params.displayField = 'name';
-					params.selectOnFocus = true;
-					params.store = new Ext.data.ArrayStore({
-						fields: ['value', 'name'],
-						data: [['true', TR.i18n.true_value], ['false', TR.i18n.false_value]]
-					});
-				}
 				else if( xtype == 'combobox' )
 				{
 					var deId = id.split('_')[1];
 					params.typeAhead = true;
 					params.forceSelection = true;
-					params.queryMode = 'remote';
-					params.valueField = 'o';
-					params.displayField = 'o';
-					params.multiSelect = true;
-					params.delimiter = ';';
-					params.store = Ext.create('Ext.data.Store', {
-						fields: ['o'],
-						data:[],
-						proxy: {
-							type: 'ajax',
-							url: TR.conf.finals.ajax.path_commons + TR.conf.finals.ajax.suggested_dataelement_get,
-							extraParams:{id: deId},
-							reader: {
-								type: 'json',
-								root: 'options'
-							}
-						}
-					});		
+					if( valueType == 'bool')
+					{
+						params.queryMode = 'local';
+						params.valueField = 'value';
+						params.displayField = 'name';
+						params.editable = false;
+						params.value = 'true';
+						params.store = new Ext.data.ArrayStore({
+							fields: ['value', 'name'],
+							data: [['true', TR.i18n.yes], 
+								['false', TR.i18n.no]]
+						});
+					}
+					else if( valueType == 'trueOnly')
+					{
+						params.queryMode = 'local';
+						params.valueField = 'value';
+						params.displayField = 'name';
+						params.editable = false;
+						params.value = 'true';
+						params.store = new Ext.data.ArrayStore({
+							fields: ['value', 'name'],
+							data: [['true', TR.i18n.yes]]
+						});
+					}
+					else if(valueType=='username'){
+						params.queryMode = 'remote';
+						params.valueField = 'u';
+						params.displayField = 'u';
+						params.store = Ext.create('Ext.data.Store', {
+							fields: ['u'],
+							data:[],
+							proxy: {
+								type: 'ajax',
+								url: TR.conf.finals.ajax.path_commons + TR.conf.finals.ajax.username_dataelement_get,
+								reader: {
+									type: 'json',
+									root: 'usernames'
+								}
+							}
+						});
+					}
+					else{
+						params.queryMode = 'remote';
+						params.valueField = 'o';
+						params.displayField = 'o';
+						params.multiSelect = true;
+						params.delimiter = ';';
+						params.store = Ext.create('Ext.data.Store', {
+							fields: ['o'],
+							data:[],
+							proxy: {
+								type: 'ajax',
+								url: TR.conf.finals.ajax.path_commons + TR.conf.finals.ajax.suggested_dataelement_get,
+								extraParams:{id: deId},
+								reader: {
+									type: 'json',
+									root: 'options'
+								}
+							}
+						});
+					}					
 				}
 				return params;
 			},
@@ -721,7 +771,7 @@
             addToStorage: function(s, records) {
                 s.each( function(r) {
                     if (!s.storage[r.data.id]) {
-                        s.storage[r.data.id] = {id: r.data.id, name: TR.util.string.getEncodedString(r.data.name), parent: s.parent};
+                        s.storage[r.data.id] = {id: r.data.id, name: TR.util.string.getEncodedString(r.data.name), parent: s.parent, compulsory: r.data.compulsory, valueType: r.data.valueType};
                     }
                 });
                 if (records) {
@@ -1106,12 +1156,15 @@
 								
 								// Fixed periods
 								
+								var periods = [];
 								for (var i = 0; i < f.fixedPeriods.length; i++) {
-									// var cmp = Ext.getCmp('');
-									// if (cmp) {
-									//	cmp.setValue(fixedPeriods);
-									// } 
+									periods[i]={
+										id: f.fixedPeriods[i],
+										name: f.fixedPeriodNames[i]
+									};
 								}
+								TR.store.fixedperiod.selected.loadData(periods);
+																
 								
 								// Orgunits
 								
@@ -1400,7 +1453,7 @@
 			}
 			else
 			{
-				this.aggregateReport.generate( type, isSorted );
+				this.aggregateReport.generate( type );
 			}
 		},
 		filterReport: function() {
@@ -1418,16 +1471,16 @@
 			{
 				return this.caseBasedReport.getParams(isSorted);
 			}
-			return this.aggregateReport.getParams(isSorted);
+			return this.aggregateReport.getParams();
 		},
 		getURLParams: function( type, isSorted ){
 			if(Ext.getCmp('reportTypeGroup').getValue().reportType=='true')
 			{
-				return this.caseBasedReport.getURLParams(type, isSorted );
+				return this.caseBasedReport.getURLParams( type, isSorted );
 			}
 			else
 			{
-				return this.aggregateReport.getURLParams(type, isSorted );
+				return this.aggregateReport.getURLParams( type );
 			}
 		},
 		paramChanged: function() {
@@ -1744,7 +1797,7 @@
 		},
 		
 		aggregateReport: {
-			generate: function( type, isSorted ) {
+			generate: function( type ) {
 				// Validation
 				if( !TR.state.aggregateReport.validation.objects() )
 				{
@@ -1755,7 +1808,10 @@
 				// Export to XLS 
 				if( type)
 				{
-					window.location.href = url + "?type="+ type + "&" + TR.state.aggregateReport.getURLParams(isSorted );
+					TR.state.aggregateReport.getURLParams();
+  				    var exportForm = document.getElementById('exportForm');
+					exportForm.action = url + "?type=" + type;
+					exportForm.submit();
 				}
 				// Show report on grid
 				else
@@ -1765,32 +1821,27 @@
 						url: url,
 						method: "POST",
 						scope: this,
-						params: this.getParams(isSorted),
+						params: this.getParams(),
 						success: function(r) {
 							var json = Ext.JSON.decode(r.responseText);
 							if(json.message!=""){
 								TR.util.notification.error(TR.i18n.error, json.message);
 							}
 							else{
-								if( isSorted ){
-									TR.store.datatable.loadData(TR.value.values,false);
-								}
-								else{
-									TR.value.columns = json.columns;
-									TR.value.values = json.items;
-									// Get fields
-									var fields = [];
-									for( var index=0; index < TR.value.columns.length; index++ )
-									{
-										fields[index] = 'col' + index;
-									}
-									TR.value.fields = fields;
-									
-									// Set data for grid
-									TR.store.getDataTableStore();
-									TR.datatable.getDataTable();
-									TR.datatable.hidePagingBar();
-								}
+								TR.value.columns = json.columns;
+								TR.value.values = json.items;
+								// Get fields
+								var fields = [];
+								for( var index=0; index < TR.value.columns.length; index++ )
+								{
+									fields[index] = 'col' + index;
+								}
+								TR.value.fields = fields;
+								
+								// Set data for grid
+								TR.store.getDataTableStore();
+								TR.datatable.getDataTable();
+								TR.datatable.hidePagingBar();
 							}
 							TR.util.mask.hideMask();
 						}
@@ -1861,7 +1912,7 @@
 				}
 				return '';
 			},
-			getParams: function( isSorted ) {
+			getParams: function() {
 				var p = {};
 				p.programStageId = TR.cmp.params.programStage.getValue();
 				p.aggregateType = Ext.getCmp('aggregateType').getValue().aggregateType;
@@ -1945,29 +1996,41 @@
 				
 				return p;
 			},
-			getURLParams: function(isSorted) {
-				var p = "";
-				
-				p += "programStageId=" + TR.cmp.params.programStage.getValue();
-				p += "&aggregateType=" + Ext.getCmp('aggregateType').getValue().aggregateType;
+			getURLParams: function() {
+				document.getElementById('programStageId').value = TR.cmp.params.programStage.getValue();
+				document.getElementById('aggregateType').value = Ext.getCmp('aggregateType').getValue().aggregateType;
+				document.getElementById('userOrganisationUnit').value = Ext.getCmp('userOrgunit').getValue();
+				document.getElementById('userOrganisationUnitChildren').value = Ext.getCmp('userOrgunitChildren').getValue();
+				document.getElementById('facilityLB').value = TR.cmp.settings.facilityLB.getValue();
+				document.getElementById('position').value = TR.state.aggregateReport.getPosition();
+				document.getElementById('useCompletedEvents').value = Ext.getCmp('completedEventsOpt').getValue();
+				if( Ext.getCmp('dataElementGroupByCbx').getValue() != null 
+					&& Ext.getCmp('dataElementGroupByCbx').getValue() != '' ){
+					document.getElementById('deGroupBy').value = Ext.getCmp('dataElementGroupByCbx').getValue().split('_')[1];
+				}
+				else{
+					document.getElementById('deGroupBy').value = "";
+				}
+				if( Ext.getCmp('limitOption').getValue() != null 
+					&& Ext.getCmp('limitOption').getValue() != '' ){
+					document.getElementById('limitRecords').value = Ext.getCmp('limitOption').getValue();
+				}
+				else{
+					document.getElementById('limitRecords').value = "";
+				}
 				
 				// orgunits
 				
-				// p.orgunitIds = TR.state.orgunitIds;
-				p += "&orgunitIds=" + TR.state.orgunitIds;
-								
-				p += "&userOrganisationUnit=" + TR.cmp.aggregateFavorite.userorganisationunit.getValue();
-				p += "&userOrganisationUnitChildren=" + TR.cmp.aggregateFavorite.userorganisationunitchildren.getValue();
-				
-				p += "&limitRecords=" + Ext.getCmp('limitOption').getValue();
-				
-				var position = TR.state.aggregateReport.getPosition();
-				if( Ext.getCmp('dataElementGroupByCbx').getValue() != null ){
-					p += "&deGroupBy=" + Ext.getCmp('dataElementGroupByCbx').getValue().split('_')[1];
+				var orgunitIdList = document.getElementById('orgunitIds');
+				TR.util.list.clearList(orgunitIdList);
+				for( var i in TR.state.orgunitIds){
+					TR.util.list.addOptionToList(orgunitIdList, TR.state.orgunitIds[i], '');
 				}
 				
 				// Filter values
 				
+				var deFiltersList = document.getElementById('deFilters');
+				TR.util.list.clearList(deFiltersList);
 				TR.cmp.params.dataelement.selected.store.each( function(r) {
 					var valueType = r.data.valueType;
 					var deId = r.data.id;
@@ -1983,50 +2046,50 @@
 						if( valueType == 'list' )
 						{
 							var filterValues = filterValue.split(";");
-							filter +=" (";
+							filter +="(";
 							for(var i=0;i<filterValues.length;i++)
 							{
 								filter += "'"+ filterValues[i] +"',";
 							}
-							filter = filter.substr(0,filter.length - 1) + " ) ";
+							filter = filter.substr(0,filter.length - 1) + ")";
 						}
 						else 
 						{
 							filter += "'" + filterValue + "'";
 						}
-						p += "&deFilters=" + filter;
+						TR.util.list.addOptionToList(deFiltersList, filter, '');
 					}
 				});
 				
 				// Period range
 				
+				var startDateList = document.getElementById('startDates');
+				var endDateList = document.getElementById('endDates');
+				TR.util.list.clearList(startDateList);
+				TR.util.list.clearList(endDateList);
 				TR.store.dateRange.data.each( function(r) {
-					p += "&startDates=" + r.data.startDate;
-					p += "&endDates=" + r.data.endDate;
+					TR.util.list.addOptionToList(startDateList, r.data.startDate, '');
+					TR.util.list.addOptionToList(endDateList, r.data.endDate, '');
 				});
 				
 				// Fixed periods
 				
-				p.fixedPeriods = [];
+				var fixedPeriodList = document.getElementById('fixedPeriods');
+				TR.util.list.clearList(fixedPeriodList);
 				TR.cmp.params.fixedperiod.selected.store.each( function(r) {
-					p += "&fixedPeriods=" + r.data.id;
+					TR.util.list.addOptionToList(fixedPeriodList, r.data.id, '');
 				});
 				
 				// Relative periods
 				
+				var relativePeriodSelect = document.getElementById('relativePeriods');
+				TR.util.list.clearList(relativePeriodSelect);
 				var relativePeriodList = TR.cmp.params.relativeperiod.checkbox;
-				p.relativePeriods = [];
 				Ext.Array.each(relativePeriodList, function(item) {
 					if(item.getValue() && !item.hidden){
-						p += "&relativePeriods=" + item.paramName;
+						TR.util.list.addOptionToList(relativePeriodSelect, item.paramName, '');
 					}
 				});
-				
-				p += "&facilityLB=" + TR.cmp.settings.facilityLB.getValue();
-				p += "&position=" + position;
-				p += "&useCompletedEvents=" + Ext.getCmp('completedEventsOpt').getValue();
-				
-				return p;
 			},
 			getFilterValueByColumn: function( colname ) {
 				
@@ -2168,7 +2231,7 @@
 			{
 				return 'boolean';
 			}
-			if( type == 'combo')
+			if( type == 'combo' || type == 'username' )
 			{
 				return 'list';
 			}
@@ -2184,7 +2247,7 @@
 			{
 				return 'numberfield';
 			}
-			if( type == 'combo' || type == 'list' || type == 'trueOnly' )
+			if( type == 'combo' || type == 'list' || type == 'username' || type == 'trueOnly' || type=='bool' )
 			{
 				return 'combobox';
 			}
@@ -3622,7 +3685,7 @@
 														var orgunitid = treePanel.getSelectionModel().getSelection()[0].data.localid;
 														if(orgunitid==0){
 															for( var i in TR.init.system.rootnodes){
-																 TR.state.orgunitIds.push( TR.init.system.rootnodes[i].id );
+																 TR.state.orgunitIds.push( TR.init.system.rootnodes[i].localid );
 															}
 														}
 														else{

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/index.html'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/index.html	2013-01-09 09:45:30 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/index.html	2013-01-26 07:07:27 +0000
@@ -6,8 +6,26 @@
 </head>
 
 <body>
+	<form id="exportForm" name='exportForm' method="post">
+        <input type="hidden" id="programStageId" name='programStageId' >
+		<input type="hidden" id="aggregateType" name='aggregateType' >
+		<select multiple id="deFilters" name="deFilters" class="hidden"></select>
+		<select multiple id="endDates" name="endDates" class="hidden"></select>
+		<select multiple id="fixedPeriods" name="fixedPeriods" class="hidden"></select>
+		<select multiple id="relativePeriods" name="relativePeriods" class="hidden"></select>
+		<select multiple id="orgunitIds" name="orgunitIds" class="hidden" ></select>
+		<input type="hidden" id="userOrganisationUnit" name="userOrganisationUnit" >
+		<input type="hidden" id="userOrganisationUnitChildren" name="userOrganisationUnitChildren">
+		<input type="hidden" id="limitRecords" name="limitRecords">
+		<input type="hidden" id="deGroupBy" name="deGroupBy" >
+		<input type="hidden" id="facilityLB" name="facilityLB" >
+		<input type="hidden" id="position" name="position" >
+		<input type="hidden" id="useCompletedEvents" name="useCompletedEvents" >
+		<select multiple id="startDates" name="startDates" class="hidden"></select>
+    </form>
+	
     <script type="text/javascript">TR = {};</script>
-    <script type="text/javascript" src="i18n.action"></script>
+	<script type="text/javascript" src="i18n.action"></script>
     <script type="text/javascript" src="../../dhis-web-commons/javascripts/ext/ext-all.js"></script>
 	<script type="text/javascript" src="../../dhis-web-commons/javascripts/periodTypeNoDep.js"></script>
     <script type="text/javascript" src="app.js"></script>

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/i18n.vm'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/i18n.vm	2013-01-25 08:32:01 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/i18n.vm	2013-01-26 07:07:27 +0000
@@ -86,8 +86,8 @@
 deleting:'$encoder.jsEscape($i18n.getString( 'deleting' ) , "'")',
 saving:'$encoder.jsEscape($i18n.getString( 'saving' ) , "'")',
 renaming:'$encoder.jsEscape($i18n.getString( 'renaming' ) , "'")',
-true_value:'$encoder.jsEscape($i18n.getString( 'true_value' ) , "'")',
-false_value:'$encoder.jsEscape($i18n.getString( 'false_value' ) , "'")',
+yes:'$encoder.jsEscape($i18n.getString( 'yes' ) , "'")',
+no:'$encoder.jsEscape($i18n.getString( 'no' ) , "'")',
 value_is_invalid:'$encoder.jsEscape($i18n.getString( 'value_is_invalid' ) , "'")',
 value_is_valid:'$encoder.jsEscape($i18n.getString( 'value_is_valid' ) , "'")',
 em_no_program_stage: '$encoder.jsEscape($i18n.getString( 'em_no_program_stage' ) , "'")',

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/jsonTabularAggregateReport.vm'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/jsonTabularAggregateReport.vm	2013-01-23 10:27:28 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/jsonTabularAggregateReport.vm	2013-01-26 07:07:27 +0000
@@ -12,7 +12,7 @@
 		#end
 	"type": "${programStage.program.type}",
 	"programStageId": "${programStage.id}",
-	"programStageName": "${programStage.displayName}",
+	"programStageName": "$!encoder.jsonEncode( ${programStage.displayName} )",
 	"startDates": [
 		#set( $size = ${aggregateReport.startDates.size()} )
 		#foreach( $startDate in $!aggregateReport.startDates )
@@ -37,9 +37,16 @@
 	],
 	"fixedPeriods": [
 		#set( $size = $aggregateReport.fixedPeriods.size() )
-		#set( $relativePeriods = ${aggregateReport.fixedPeriods} )
+		#set( $fixedPeriods = ${aggregateReport.fixedPeriods} )
 		#foreach( ${fixedPeriod} in $!{fixedPeriods} )
-			'$fixedPeriod'
+			"$fixedPeriod"
+			#if( $velocityCount < $size ),#end
+		#end
+	],
+	"fixedPeriodNames":[
+		#set( $size = $fixedPeriodNames.size() )
+		#foreach( $fixedPeriodName in $!fixedPeriodNames )
+			"$!encoder.jsonEncode( $fixedPeriodName )"
 			#if( $velocityCount < $size ),#end
 		#end
 	],
@@ -59,7 +66,7 @@
 		#set( $size = $aggregateReport.filterValues.size() )
 		#set( $filterValues = ${aggregateReport.filterValues} )
 		#foreach( ${filterValue} in $!{filterValues} )
-			"$filterValue"
+			"$!encoder.jsonEncode( $filterValue )"
 			#if( $velocityCount < $size ),#end
 		#end
 	],
@@ -68,7 +75,7 @@
 		#foreach( ${dataElement} in $!{selectedDataElements} )
 			{
 				"id": "de_${dataElement.id}",
-				"name": "${dataElement.name}",
+				"name": "$!encoder.jsonEncode( ${dataElement.name} )",
 				"compulsory": "${dataElement.compulsory}",
 				"valueType": #if( $dataElement.optionSet )
 								"list"
@@ -82,7 +89,7 @@
 	"facilityLB": "${aggregateReport.facilityLB}",
 	"limitRecords": "$!aggregateReport.limitRecords",
 	"position": "${aggregateReport.position}",
-	"deGroupBy": "$!aggregateReport.deGroupBy.id",
+	"deGroupBy": #if($!aggregateReport.deGroupBy) "de_$!aggregateReport.deGroupBy.id" #else "" #end,
 	"aggregateType": "${aggregateReport.aggregateType}",
 	"useCompletedEvents": "$!aggregateReport.useCompletedEvents",
 	"userOrganisationUnit": "$!aggregateReport.userOrganisationUnit",