=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/expression/Operator.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/expression/Operator.java 2016-01-04 02:27:49 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/expression/Operator.java 2016-03-07 14:52:03 +0000 @@ -37,7 +37,8 @@ greater_than_or_equal_to( ">=" ), less_than( "<" ), less_than_or_equal_to( "<=" ), - compulsory_pair( "[Compulsory pair]" ); + compulsory_pair( "[Compulsory pair]"), + exclusive_pair( "[Exclusive pair]" ); private final String mathematicalOperator; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/ValidatorThread.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/ValidatorThread.java 2016-01-13 12:54:38 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/validation/ValidatorThread.java 2016-03-07 14:52:03 +0000 @@ -142,7 +142,8 @@ periodTypeX, periodTypes, lastUpdatedMap, sourceDataElements ); if ( !leftSideValues.isEmpty() - || Operator.compulsory_pair.equals( rule.getOperator() ) ) + || Operator.compulsory_pair.equals( rule.getOperator() ) + || Operator.exclusive_pair.equals( rule.getOperator() )) { Map rightSideValues = getRuleExpressionValueMap( rule.getRightSide(), currentValueMap, incompleteValuesMap, sourceX.getSource(), @@ -150,11 +151,13 @@ sourceDataElements ); if ( !rightSideValues.isEmpty() - || Operator.compulsory_pair.equals( rule.getOperator() ) ) + || Operator.compulsory_pair.equals( rule.getOperator() ) + || Operator.compulsory_pair.equals( rule.getOperator() )) { Set attributeOptionCombos = leftSideValues.keySet(); - if ( Operator.compulsory_pair.equals( rule.getOperator() ) ) + if ( Operator.compulsory_pair.equals( rule.getOperator() ) || + Operator.exclusive_pair.equals( rule.getOperator() ) ) { attributeOptionCombos = new HashSet<>( attributeOptionCombos ); attributeOptionCombos.addAll( rightSideValues.keySet() ); @@ -171,6 +174,10 @@ violation = (leftSide != null && rightSide == null) || (leftSide == null && rightSide != null); } + else if ( Operator.exclusive_pair.equals( rule.getOperator() ) ) + { + violation = ( leftSide != null && rightSide != null ); + } else if ( leftSide != null && rightSide != null ) { violation = !expressionIsTrue( leftSide, rule.getOperator(), === 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 2015-12-08 21:44:36 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/resources/org/hisp/dhis/validationrule/i18n_module.properties 2016-03-07 14:52:03 +0000 @@ -129,6 +129,7 @@ skip_for_missing_values=Skip for missing values select_parameters=Select parameters compulsory_pair=Compulsory pair +exclusive_pair=Exclusive pair visible_in_validation_alerts=visible in validation alerts tip=Tip use=use === modified file 'dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/addValidationRuleForm.vm' --- dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/addValidationRuleForm.vm 2015-12-25 09:55:06 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/addValidationRuleForm.vm 2016-03-07 14:52:03 +0000 @@ -79,6 +79,7 @@ + === 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 2015-12-25 09:55:06 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/javascript/general.js 2016-03-07 14:52:03 +0000 @@ -115,6 +115,10 @@ { return i18n_compulsory_pair; } + else if ( operator == "exclusive_pair" ) + { + return i18n_exclusive_pair; + } return null; } === modified file 'dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/javascript/validationRule.js' --- dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/javascript/validationRule.js 2015-12-25 09:55:06 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/javascript/validationRule.js 2016-03-07 14:52:03 +0000 @@ -7,6 +7,7 @@ hideById('annualSampleCountTR'); showById('compulsory_pair'); + showById('exclusive_pair'); } else { showById('organisationUnitLevelTR'); @@ -14,10 +15,11 @@ showById('annualSampleCountTR'); var op = document.getElementById('operator'); - if( 'compulsory_pair' == op.value ) { + if( 'compulsory_pair' == op.value || 'exclusive_pair' == op.value ) { showById('select_operator'); op.selectedIndex = 0; } hideById('compulsory_pair'); + hideById('exclusive_pair'); } } === modified file 'dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/updateValidationRuleForm.vm' --- dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/updateValidationRuleForm.vm 2015-12-25 09:55:06 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/updateValidationRuleForm.vm 2016-03-07 14:52:03 +0000 @@ -87,6 +87,7 @@ + === modified file 'dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/validationRule.vm' --- dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/validationRule.vm 2015-12-25 09:55:06 +0000 +++ dhis-2/dhis-web/dhis-web-validationrule/src/main/webapp/dhis-web-validationrule/validationRule.vm 2016-03-07 14:52:03 +0000 @@ -44,6 +44,7 @@ var i18n_less_than = '$i18n.getString( "less_than" )'; var i18n_less_than_or_equal_to = '$i18n.getString( "less_than_or_equal_to" )'; var i18n_compulsory_pair = '$i18n.getString( "compulsory_pair" )'; + var i18n_exclusive_pair = '$i18n.getString( "exclusive_pair" )';

$encoder.htmlEncode( $i18n.getString( "validation_rule_management" ) ) #openHelp( "validationRule" )