=== 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 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationRuleService.java 2015-02-09 17:46:40 +0000 @@ -30,9 +30,11 @@ import java.util.Collection; import java.util.Date; +import java.util.List; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; +import org.hisp.dhis.dataelement.DataElementOperand; import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.organisationunit.OrganisationUnit; @@ -94,6 +96,18 @@ */ void scheduledRun(); + /** + * Validate that missing data values have a corresponding comment, assuming + * that the given data set has the noValueRequiresComment property set to true. + * + * @param dataSet the data set. + * @param period the period. + * @param organisationUnit the organisation unit. + * @param attributeOptionCombo the attribute option combo. + * @return a list of operands representing missing comments. + */ + List validateRequiredComments( DataSet dataSet, Period period, OrganisationUnit organisationUnit, DataElementCategoryOptionCombo attributeOptionCombo ); + // ------------------------------------------------------------------------- // ValidationRule // ------------------------------------------------------------------------- === 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 2015-02-09 14:52:38 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/DefaultValidationRuleService.java 2015-02-09 17:46:40 +0000 @@ -41,11 +41,13 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hisp.dhis.common.GenericIdentifiableObjectStore; @@ -53,7 +55,9 @@ import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; import org.hisp.dhis.dataelement.DataElementCategoryService; +import org.hisp.dhis.dataelement.DataElementOperand; import org.hisp.dhis.dataset.DataSet; +import org.hisp.dhis.datavalue.DataValue; import org.hisp.dhis.datavalue.DataValueService; import org.hisp.dhis.expression.ExpressionService; import org.hisp.dhis.i18n.I18nFormat; @@ -280,6 +284,32 @@ systemSettingManager.saveSystemSetting( SystemSettingManager.KEY_LAST_MONITORING_RUN, thisRun ); } + + public List validateRequiredComments( DataSet dataSet, Period period, OrganisationUnit organisationUnit, DataElementCategoryOptionCombo attributeOptionCombo ) + { + List violations = new ArrayList<>(); + + if ( dataSet.isNoValueRequiresComment() ) + { + for ( DataElement de : dataSet.getDataElements() ) + { + for ( DataElementCategoryOptionCombo co : de.getCategoryCombo().getOptionCombos() ) + { + DataValue dv = dataValueService.getDataValue( de, period, organisationUnit, co, attributeOptionCombo ); + + boolean missingValue = dv == null || StringUtils.trimToNull( dv.getValue() ) == null; + boolean missingComment = dv == null || StringUtils.trimToNull( dv.getComment() ) == null; + + if ( missingValue && missingComment ) + { + violations.add( new DataElementOperand( de, co ) ); + } + } + } + } + + return violations; + } // ------------------------------------------------------------------------- // Supportive methods - scheduled run === modified file 'dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/ValidationAction.java' --- dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/ValidationAction.java 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/ValidationAction.java 2015-02-09 17:46:40 +0000 @@ -36,20 +36,14 @@ import java.util.Map; import java.util.TreeMap; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.apache.struts2.ServletActionContext; -import org.hisp.dhis.webapi.utils.InputUtils; import org.hisp.dhis.common.comparator.IdentifiableObjectNameComparator; import org.hisp.dhis.dataanalysis.DataAnalysisService; -import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; import org.hisp.dhis.dataelement.DataElementCategoryService; import org.hisp.dhis.dataelement.DataElementOperand; import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.dataset.DataSetService; -import org.hisp.dhis.datavalue.DataValue; -import org.hisp.dhis.datavalue.DataValueService; import org.hisp.dhis.datavalue.DeflatedDataValue; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.organisationunit.OrganisationUnitService; @@ -58,6 +52,7 @@ import org.hisp.dhis.period.PeriodType; import org.hisp.dhis.validation.ValidationResult; import org.hisp.dhis.validation.ValidationRuleService; +import org.hisp.dhis.webapi.utils.InputUtils; import org.springframework.beans.factory.annotation.Autowired; import com.opensymphony.xwork2.Action; @@ -69,8 +64,6 @@ public class ValidationAction implements Action { - private static final Log log = LogFactory.getLog( ValidationAction.class ); - // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- @@ -117,13 +110,6 @@ this.dataElementCategoryService = dataElementCategoryService; } - private DataValueService dataValueService; - - public void setDataValueService( DataValueService dataValueService ) - { - this.dataValueService = dataValueService; - } - @Autowired private InputUtils inputUtils; @@ -247,21 +233,22 @@ for ( OrganisationUnit organisationUnit : organisationUnits ) { - List values = outlierAnalysis( organisationUnit, dataSet, period ); + List values = new ArrayList<>( minMaxOutlierAnalysisService.analyse( getCollection( organisationUnit ), + dataSet.getDataElements(), getCollection( period ), null ) ); if ( !values.isEmpty() ) { dataValues.put( organisationUnit, values ); } - List results = validationRuleAnalysis( organisationUnit, dataSet, period, attributeOptionCombo ); + List results = new ArrayList<>( validationRuleService.validate( dataSet, period, organisationUnit, attributeOptionCombo ) ); if ( !results.isEmpty() ) { validationResults.put( organisationUnit, results ); } - List violations = noValueRequiresCommentAnalysis( organisationUnit, dataSet, period ); + List violations = validationRuleService.validateRequiredComments( dataSet, period, organisationUnit, attributeOptionCombo ); if ( !violations.isEmpty() ) { @@ -271,62 +258,4 @@ return dataValues.isEmpty() && validationResults.isEmpty() && commentViolations.isEmpty() ? SUCCESS : INPUT; } - - // ------------------------------------------------------------------------- - // Min-max and outlier analysis - // ------------------------------------------------------------------------- - - private List outlierAnalysis( OrganisationUnit organisationUnit, DataSet dataSet, Period period ) - { - List deflatedDataValues = new ArrayList<>( minMaxOutlierAnalysisService.analyse( getCollection( organisationUnit ), - dataSet.getDataElements(), getCollection( period ), null ) ); - - log.debug( "Number of outlier values: " + deflatedDataValues.size() ); - - return deflatedDataValues; - } - - // ------------------------------------------------------------------------- - // Validation rule analysis - // ------------------------------------------------------------------------- - - private List validationRuleAnalysis( OrganisationUnit organisationUnit, DataSet dataSet, Period period, DataElementCategoryOptionCombo attributeOptionCombo ) - { - List validationResults = new ArrayList<>( validationRuleService.validate( dataSet, period, organisationUnit, attributeOptionCombo ) ); - - log.debug( "Number of validation violations: " + validationResults.size() ); - - return validationResults; - } - - // ------------------------------------------------------------------------- - // No value requires comment analysis - // ------------------------------------------------------------------------- - - private List noValueRequiresCommentAnalysis( OrganisationUnit organisationUnit, DataSet dataSet, Period period ) - { - List violations = new ArrayList<>(); - - if ( !dataSet.isNoValueRequiresComment() ) - { - return violations; - } - - for ( DataElement de : dataSet.getDataElements() ) - { - for ( DataElementCategoryOptionCombo co : de.getCategoryCombo().getOptionCombos() ) - { - DataValue dv = dataValueService.getDataValue( de, period, organisationUnit, co ); - - if ( dv == null || DataValue.FALSE.equals( dv.getValue() ) ) - { - violations.add( new DataElementOperand( de, co ) ); - } - } - } - - log.info( "Number of missing comments: " + violations.size() ); - - return violations; - } } === modified file 'dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/META-INF/dhis/beans.xml 2014-12-04 06:39:46 +0000 +++ dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/META-INF/dhis/beans.xml 2015-02-09 17:46:40 +0000 @@ -63,7 +63,6 @@ -