=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/Grid.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/Grid.java 2010-09-03 13:45:17 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/Grid.java 2010-09-04 06:30:08 +0000 @@ -74,6 +74,16 @@ * @param columnIndex the index of the column. */ List getColumn( int columnIndex ); + + /** + * Return the value at the given row index and the given column index. + * + * @param rowIndex the row index. + * @param columnIndex the column index. + * @return the column value. + * @throws IllegalArgumentException if the grid does not contain the requested row / column. + */ + String getValue( int rowIndex, int columnIndex ); /** * Adds a new column at the end of the grid. === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/PeriodService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/PeriodService.java 2010-07-25 09:58:51 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/PeriodService.java 2010-09-04 06:30:08 +0000 @@ -32,6 +32,7 @@ import java.util.List; import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.source.Source; /** @@ -241,6 +242,16 @@ */ List getPeriods( Period lastPeriod, int historyLength ); + /** + * Populates the name property of Period with the formatted name for the + * Periods in the given collection. + * + * @param periods the collection of Periods. + * @param format the I18nFormat. + * @return a collection of Periods. + */ + Collection namePeriods( Collection periods, I18nFormat format ); + // ------------------------------------------------------------------------- // PeriodType // ------------------------------------------------------------------------- === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationRuleService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationRuleService.java 2010-09-01 10:30:03 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationRuleService.java 2010-09-04 06:30:08 +0000 @@ -29,7 +29,9 @@ import java.util.Collection; import java.util.Date; +import java.util.List; +import org.hisp.dhis.common.Grid; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.period.Period; @@ -48,6 +50,12 @@ // ------------------------------------------------------------------------- /** + * Returns a Grid containing the percentage of aggregated violations. Periods + * are listed as columns and Sources are listed as rows. + */ + Grid getAggregateValidationResult( Collection results, List periods, List sources ); + + /** * Validates AggregatedDataValues. * * @param startDate the start date. === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationRuleStore.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationRuleStore.java 2010-08-30 13:04:39 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationRuleStore.java 2010-09-04 06:30:08 +0000 @@ -61,5 +61,19 @@ */ void updateValidationRule( ValidationRule validationRule ); + /** + * Returns all ValidationRules which are associated through their left or + * right side Expression with the given collection of DataElements. + * + * @param dataElements the collection of DataElements. + * @return a collection of ValidationRules. + */ Collection getValidationRulesByDataElements( Collection dataElements ); + + /** + * Returns the number of ValidationRules. + * + * @return the number of ValidationRules. + */ + Integer getNumberOfValidationRules(); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/DefaultPeriodService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/DefaultPeriodService.java 2010-07-25 09:58:51 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/DefaultPeriodService.java 2010-09-04 06:30:08 +0000 @@ -35,6 +35,7 @@ import java.util.List; import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.source.Source; import org.hisp.dhis.system.util.DateUtils; import org.hisp.dhis.system.util.Filter; @@ -231,6 +232,16 @@ return periods; } + public Collection namePeriods( Collection periods, I18nFormat format ) + { + for ( Period period : periods ) + { + period.setName( format.formatPeriod( period ) ); + } + + return periods; + } + // ------------------------------------------------------------------------- // PeriodType // ------------------------------------------------------------------------- === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/DefaultValidationRuleService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/DefaultValidationRuleService.java 2010-09-01 10:30:03 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/DefaultValidationRuleService.java 2010-09-04 06:30:08 +0000 @@ -32,9 +32,13 @@ import java.util.Collection; import java.util.Date; import java.util.HashSet; +import java.util.List; import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.hisp.dhis.common.GenericIdentifiableObjectStore; +import org.hisp.dhis.common.Grid; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementService; import org.hisp.dhis.dataset.DataSet; @@ -43,8 +47,11 @@ import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodService; import org.hisp.dhis.source.Source; +import org.hisp.dhis.system.grid.ListGrid; +import org.hisp.dhis.system.util.CompositeCounter; import org.hisp.dhis.system.util.Filter; import org.hisp.dhis.system.util.FilterUtils; +import org.hisp.dhis.system.util.MathUtils; import org.springframework.transaction.annotation.Transactional; /** @@ -56,6 +63,8 @@ public class DefaultValidationRuleService implements ValidationRuleService { + private static final Log log = LogFactory.getLog( DefaultValidationRuleService.class ); + // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- @@ -105,6 +114,43 @@ // ------------------------------------------------------------------------- // ValidationRule business logic // ------------------------------------------------------------------------- + + public Grid getAggregateValidationResult( Collection results, List periods, List sources ) + { + int number = validationRuleStore.getNumberOfValidationRules(); + + Grid grid = new ListGrid(); + + CompositeCounter counter = new CompositeCounter(); + + for ( ValidationResult result : results ) + { + counter.count( result.getPeriod(), result.getSource() ); + } + + grid.nextRow(); + grid.addValue( "" ); + + for ( Period period : periods ) + { + grid.addValue( period.getName() ); + } + + for ( Source source : sources ) + { + grid.nextRow(); + grid.addValue( source.getName() ); + + for ( Period period : periods ) + { + double percentage = (double) ( 100 * counter.getCount( period, source ) ) / number; + + grid.addValue( String.valueOf( MathUtils.getRounded( percentage, 1 ) ) ); + } + } + + return grid; + } public Collection validateAggregate( Date startDate, Date endDate, Collection sources ) { @@ -120,6 +166,8 @@ { validationViolations.addAll( validateInternal( period, source, validationRules, true ) ); } + + log.info( "Validated " + source ); } return validationViolations; @@ -145,6 +193,8 @@ { validationViolations.addAll( validateInternal( period, source, validationRules, true ) ); } + + log.info( "Validated " + source ); } return validationViolations; @@ -167,6 +217,8 @@ validationViolations.addAll( validateInternal( period, source, relevantRules, false ) ); } } + + log.info( "Validated " + source ); } return validationViolations; @@ -191,6 +243,8 @@ validationViolations.addAll( validateInternal( period, source, relevantRules, false ) ); } } + + log.info( "Validated " + source ); } return validationViolations; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/hibernate/HibernateValidationRuleStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/hibernate/HibernateValidationRuleStore.java 2010-08-30 13:04:39 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/hibernate/HibernateValidationRuleStore.java 2010-09-04 06:30:08 +0000 @@ -31,6 +31,7 @@ import java.util.HashSet; import java.util.Set; +import org.hibernate.Hibernate; import org.hibernate.Session; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.hibernate.HibernateGenericStore; @@ -102,8 +103,13 @@ hql = "select distinct v from ValidationRule v join v.rightSide rs join rs.dataElementsInExpression rsd where rsd.id in (:ids)"; - validationRules.addAll( sessionFactory.getCurrentSession().createQuery( hql ).setParameterList( "ids", ids ).list() ); + validationRules.addAll( getQuery( hql ).setParameterList( "ids", ids ).list() ); return validationRules; } + + public Integer getNumberOfValidationRules() + { + return (Integer) getSqlQuery( "select count(*) as no from validationrule" ).addScalar( "no", Hibernate.INTEGER ).uniqueResult(); + } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/validation/ValidationRuleServiceTest.java' --- dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/validation/ValidationRuleServiceTest.java 2010-09-01 07:28:01 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/validation/ValidationRuleServiceTest.java 2010-09-04 06:30:08 +0000 @@ -34,14 +34,17 @@ import static junit.framework.Assert.assertTrue; import static org.hisp.dhis.expression.Expression.SEPARATOR; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.amplecode.quick.BatchHandler; import org.amplecode.quick.BatchHandlerFactory; import org.hisp.dhis.DhisTest; import org.hisp.dhis.aggregation.AggregatedDataValue; +import org.hisp.dhis.common.Grid; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementCategoryCombo; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; @@ -243,7 +246,41 @@ // ---------------------------------------------------------------------- // Business logic tests // ---------------------------------------------------------------------- + + @Test + public void testGetAggregatedValidationResult() + { + validationRuleService.saveValidationRule( validationRuleA ); + validationRuleService.saveValidationRule( validationRuleB ); + validationRuleService.saveValidationRule( validationRuleC ); + validationRuleService.saveValidationRule( validationRuleD ); + List periods = new ArrayList(); + periods.add( periodA ); + periods.add( periodB ); + + List sources = new ArrayList(); + sources.add( sourceA ); + sources.add( sourceB ); + + Collection results = new HashSet(); + + results.add( new ValidationResult( periodA, sourceA, validationRuleA, 1, 1 ) ); + results.add( new ValidationResult( periodA, sourceA, validationRuleB, 1, 1 ) ); + results.add( new ValidationResult( periodA, sourceA, validationRuleC, 1, 1 ) ); + results.add( new ValidationResult( periodB, sourceB, validationRuleA, 1, 1 ) ); + results.add( new ValidationResult( periodB, sourceB, validationRuleB, 1, 1 ) ); + + Grid grid = validationRuleService.getAggregateValidationResult( results, periods, sources ); + + // First row is Periods, first column in each row is Source + + assertEquals( "75.0", grid.getValue( 1, 1 ) ); + assertEquals( "0.0", grid.getValue( 1, 2 ) ); + assertEquals( "0.0", grid.getValue( 2, 1 ) ); + assertEquals( "50.0", grid.getValue( 2, 2 ) ); + } + @Test public void testValidateAggregatedDateDateSources() { === modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/resources/META-INF/dhis/beans.xml 2010-08-31 05:47:11 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/resources/META-INF/dhis/beans.xml 2010-09-04 06:30:08 +0000 @@ -231,6 +231,10 @@ + + + + === modified file 'dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/patient/PatientStoreTest.java' --- dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/patient/PatientStoreTest.java 2010-09-01 08:32:05 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/patient/PatientStoreTest.java 2010-09-04 06:30:08 +0000 @@ -28,14 +28,13 @@ package org.hisp.dhis.patient; import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; +import static junit.framework.Assert.assertTrue; import org.hisp.dhis.DhisSpringTest; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.organisationunit.OrganisationUnitService; -import org.hisp.dhis.organisationunit.OrganisationUnitStore; import org.junit.Test; /** === modified file 'dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/hibernate/HibernateGenericStore.java' --- dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/hibernate/HibernateGenericStore.java 2010-05-18 17:59:04 +0000 +++ dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/hibernate/HibernateGenericStore.java 2010-09-04 06:30:08 +0000 @@ -32,6 +32,7 @@ import org.hibernate.Criteria; import org.hibernate.Query; +import org.hibernate.SQLQuery; import org.hibernate.SessionFactory; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; @@ -85,6 +86,17 @@ } /** + * Creates a SqlQuery. + * + * @param sql the sql query. + * @return a SqlQuery instance. + */ + protected final SQLQuery getSqlQuery( String sql ) + { + return sessionFactory.getCurrentSession().createSQLQuery( sql ); + } + + /** * Creates a Critera for the implementation Class type. * * @return a Criteria instance. === modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/grid/ListGrid.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/grid/ListGrid.java 2010-09-03 12:44:40 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/grid/ListGrid.java 2010-09-04 06:30:08 +0000 @@ -111,6 +111,16 @@ return column; } + public String getValue( int rowIndex, int columnIndex ) + { + if ( grid.size() < rowIndex || grid.get( rowIndex ) == null || grid.get( rowIndex ).size() < columnIndex ) + { + throw new IllegalArgumentException( "Grid does not contain the requested row / column" ); + } + + return grid.get( rowIndex ).get( columnIndex ); + } + public void addColumn( List columnValues ) { verifyGridState(); === added file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/CompositeCounter.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/CompositeCounter.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/CompositeCounter.java 2010-09-04 06:30:08 +0000 @@ -0,0 +1,66 @@ +package org.hisp.dhis.system.util; + +/* + * Copyright (c) 2004-2010, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @author Lars Helge Overland + */ +public class CompositeCounter + extends Counter +{ + private static final char SEPARATOR = '-'; + + public CompositeCounter() + { + super(); + } + + public int count( Object... objects ) + { + String key = getKey( objects ); + + return super.count( key ); + } + + public Integer getCount( Object... objects ) + { + return super.getCount( getKey( objects ) ); + } + + private String getKey( Object... objects ) + { + String key = ""; + + for ( Object o : objects ) + { + key += o.hashCode() + SEPARATOR; + } + + return key; + } +} === modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/Counter.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/Counter.java 2010-09-01 06:14:47 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/Counter.java 2010-09-04 06:30:08 +0000 @@ -63,6 +63,12 @@ public Integer getCount( T key ) { - return map != null ? map.get( key ) : null; + return map != null && map.containsKey( key ) ? map.get( key ) : 0; + } + + @Override + public String toString() + { + return "[" + map.toString() + "]"; } } === modified file 'dhis-2/dhis-web/dhis-web-validationrule/src/main/java/org/hisp/dhis/validationrule/action/RunValidationAction.java' --- dhis-2/dhis-web/dhis-web-validationrule/src/main/java/org/hisp/dhis/validationrule/action/RunValidationAction.java 2010-09-01 10:30:03 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/java/org/hisp/dhis/validationrule/action/RunValidationAction.java 2010-09-04 06:30:08 +0000 @@ -35,6 +35,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hisp.dhis.common.Grid; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.datamart.DataMartService; import org.hisp.dhis.i18n.I18nFormat; @@ -110,7 +111,7 @@ { this.periodService = periodService; } - + // ------------------------------------------------------------------------- // Input/output // ------------------------------------------------------------------------- @@ -153,6 +154,13 @@ return validationResults; } + private Grid aggregateResults; + + public Grid getAggregateResults() + { + return aggregateResults; + } + private boolean aggregate; public boolean isAggregate() @@ -182,14 +190,17 @@ if ( aggregate ) // Aggregate data source { - Collection organisationUnits = unit.getChildren(); + List organisationUnits = new ArrayList( unit.getChildren() ); + List periods = new ArrayList( periodService.namePeriods( + periodService.getPeriodsBetweenDates( format.parseDate( startDate ), format.parseDate( endDate ) ), format ) ); + + log.info( "Number of periods: " + periods.size() + ", number of organisation units: " + organisationUnits.size() ); + if ( doDataMart ) { log.info( "Generating datamart" ); - Collection periods = periodService.getPeriodsBetweenDates( format.parseDate( startDate ), format.parseDate( endDate ) ); - Collection dataElements = validationRuleService.getDataElementsInValidationRules(); dataMartService.export( getIdentifiers( DataElement.class, dataElements ), new HashSet(), @@ -212,6 +223,8 @@ validationResults = new ArrayList( validationRuleService.validateAggregate( format .parseDate( startDate ), format.parseDate( endDate ), organisationUnits, group ) ); } + + aggregateResults = validationRuleService.getAggregateValidationResult( validationResults, periods, organisationUnits ); } else // Captured data source { === modified file 'dhis-2/dhis-web/dhis-web-validationrule/src/main/resources/org/hisp/dhis/validationrule/i18n_module.properties' --- dhis-2/dhis-web/dhis-web-validationrule/src/main/resources/org/hisp/dhis/validationrule/i18n_module.properties 2010-09-01 10:30:03 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/resources/org/hisp/dhis/validationrule/i18n_module.properties 2010-09-04 06:30:08 +0000 @@ -175,4 +175,5 @@ captured_data_info = All children of the selected organisation unit will be included. get_updated_data = Get updated aggregated data use_existing_data = Use existing aggregated data -method = Method \ No newline at end of file +method = Method +see_statistics = See statistics \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/javascript/general.js' --- dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/javascript/general.js 2010-09-01 16:55:23 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/javascript/general.js 2010-09-04 06:30:08 +0000 @@ -55,6 +55,7 @@ return null; } + function getElementValue( parentElement, childElementName ) { var textNode = parentElement.getElementsByTagName( childElementName )[0].firstChild; === modified file 'dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/javascript/runValidation.js' --- dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/javascript/runValidation.js 2010-09-01 10:30:03 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/javascript/runValidation.js 2010-09-04 06:30:08 +0000 @@ -39,8 +39,7 @@ } else if ( type == 'input' ) { - document.getElementById( 'message' ).innerHTML = message; - document.getElementById( 'message' ).style.display = 'block'; + setMessage( message ); } } @@ -69,3 +68,22 @@ $( '#doDataMart' ).attr( 'disabled', 'disabled' ); } } + +function showAggregateResults() +{ + $( 'div#validationResults' ).hide(); + $( 'div#aggregateResults' ).show(); + var button = document.getElementById( "resultTypeButton" ); + button.onclick = function() { showValidationResults(); }; + button.value = "See validation"; +} + +function showValidationResults() +{ + $( 'div#aggregateResults' ).hide(); + $( 'div#validationResults' ).show(); + + var button = document.getElementById( "resultTypeButton" ); + button.onclick = function() { showAggregateResults(); }; + button.value = "See statistics"; +} === modified file 'dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/viewValidationResultForm.vm' --- dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/viewValidationResultForm.vm 2010-08-30 06:24:45 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/viewValidationResultForm.vm 2010-09-04 06:30:08 +0000 @@ -25,16 +25,18 @@ - + #if( $aggregate )#end -#if ( $mapValidationResults.keySet().size() == 0 ) +#if ( $validationResults.size() == 0 ) $i18n.getString( "validation_passed_successfully" ) #else +
+ @@ -78,4 +80,34 @@
+
+ + + #end