=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalService.java 2014-03-31 20:44:51 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalService.java 2014-04-20 00:18:20 +0000 @@ -88,10 +88,10 @@ * @param dataElementCategoryOptions Selected category options (if any). * @return the data approval status. */ - public DataApprovalStatus getDataApprovalStatus( DataSet dataSet, Period period, - OrganisationUnit organisationUnit, - Set categoryOptionGroups, - Set dataElementCategoryOptions ); + DataApprovalStatus getDataApprovalStatus( DataSet dataSet, Period period, + OrganisationUnit organisationUnit, + Set categoryOptionGroups, + Set dataElementCategoryOptions ); /** * Returns the data approval status for a given data set, period, @@ -105,8 +105,8 @@ * @return the data approval status. */ DataApprovalPermissions getDataApprovalPermissions( DataSet dataSet, Period period, - OrganisationUnit organisationUnit, - DataElementCategoryOptionCombo attributeOptionCombo ); + OrganisationUnit organisationUnit, + DataElementCategoryOptionCombo attributeOptionCombo ); /** * Returns the data approval permissions and status for a given data set, @@ -121,10 +121,10 @@ * @param dataElementCategoryOptions Selected category options (if any). * @return the data approval permissions (including status.) */ - public DataApprovalPermissions getDataApprovalPermissions( DataSet dataSet, Period period, - OrganisationUnit organisationUnit, - Set categoryOptionGroups, - Set dataElementCategoryOptions ); + DataApprovalPermissions getDataApprovalPermissions( DataSet dataSet, Period period, + OrganisationUnit organisationUnit, + Set categoryOptionGroups, + Set dataElementCategoryOptions ); /** * Accepts an approval. This action is optional, and is usually done === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DataApprovalSelection.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DataApprovalSelection.java 2014-04-14 06:52:39 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DataApprovalSelection.java 2014-04-20 00:18:20 +0000 @@ -52,7 +52,7 @@ /** * This package-private class is used by the data approval service to * describe selected data from a data set, such as could appear in a data set - * report, and to determine its data approval status. + * report or data approval report, to determine its data approval status. *

* The entire reason for this class is to make the code more readable. * The use of instance variables greatly reduces the need to pass parameters @@ -102,7 +102,7 @@ private Map> selectionGroups = null; - private List matchingApprovalLevels; + private List allApprovalLevels; private List> categoryOptionGroupsByLevel; @@ -165,29 +165,22 @@ organisationUnit.getLevel() : organisationUnitService.getLevelOfOrganisationUnit( organisationUnit.getUid() ); - log.info( logSelection() + " starting." ); + log.debug( logSelection() + " starting." ); if ( !dataSet.isApproveData() ) { - log.info( logSelection() + " returning UNAPPROVABLE (dataSet not marked for approval)" ); - - return STATUS_UNAPPROVABLE; - } - - findMatchingApprovalLevels(); - - if ( matchingApprovalLevels.size() == 0 ) - { - log.info( logSelection() + " returning UNAPPROVABLE (no matching approval levels)" ); - - return STATUS_UNAPPROVABLE; - } + log.debug( logSelection() + " returning UNAPPROVABLE (dataSet not marked for approval)" ); + + return STATUS_UNAPPROVABLE; + } + + findCategoryOptionGroupsByLevel(); findThisLevel(); if ( lowerIndex == 0 ) { - log.info( logSelection() + " returning UNAPPROVABLE because org unit is above all approval levels" ); + log.debug( logSelection() + " returning UNAPPROVABLE because org unit is above all approval levels" ); return STATUS_UNAPPROVABLE; } @@ -200,7 +193,7 @@ } else { - log.info( logSelection() + " returning UNAPPROVABLE (period type too short)" ); + log.debug( logSelection() + " returning UNAPPROVABLE (period type too short)" ); return STATUS_UNAPPROVABLE; } @@ -212,7 +205,7 @@ DataApprovalStatus status = new DataApprovalStatus( state, dataApproval, dataApprovalLevel ); - log.info( logSelection() + " returning " + state.name() ); + log.debug( logSelection() + " returning " + state.name() ); return status; } @@ -249,7 +242,7 @@ return "getDataApprovalStatus( " + dataSet.getName() + ", " + period.getPeriodType().getName() + ":" + period.getShortName() + ", " + organisationUnit.getName() + " (level " + organisationUnitLevel + "), " - + ( categoryOptionGroupsString.isEmpty() ? "null" : ( "[" + categoryOptionGroupsString + "]" ) ) + " )" + + ( categoryOptionGroupsString.isEmpty() ? "null" : ( "[" + categoryOptionGroupsString + "]" ) ) + ", " + ( categoryOptionsString.isEmpty() ? "null" : ( "[" + categoryOptionsString + "]" ) ) + " )"; } @@ -360,19 +353,19 @@ { if ( isApprovedAtThisOrHigherLevel() ) { - log.info( "getState() - approved at this or higher level " + foundThisOrHigherIndex + ", this index is " + thisIndex ); + log.debug( "getState() - approved at this or higher level " + foundThisOrHigherIndex + ", this index is " + thisIndex ); if ( foundThisOrHigherIndex == thisIndex ) { if ( dataApproval.isAccepted() ) { - log.info( "getState() - accepted here." ); + log.debug( "getState() - accepted here." ); return DataApprovalState.ACCEPTED_HERE; } else { - log.info( "getState() - approved here." ); + log.debug( "getState() - approved here." ); return DataApprovalState.APPROVED_HERE; } @@ -380,13 +373,13 @@ if ( dataApproval.isAccepted() ) { - log.info( "getState() - accepted for a wider selection of category options, or at higher level." ); + log.debug( "getState() - accepted for a wider selection of category options, or at higher level." ); return DataApprovalState.ACCEPTED_ELSEWHERE; } else { - log.info( "getState() - approved for a wider selection of category options, or at higher level." ); + log.debug( "getState() - approved for a wider selection of category options, or at higher level." ); return DataApprovalState.APPROVED_ELSEWHERE; } @@ -398,61 +391,60 @@ { if ( !unapprovedBelow ) { - log.info( "getState() - unapproved ready." ); + log.debug( "getState() - unapproved ready." ); - dataApprovalLevel = matchingApprovalLevels.get( thisIndex ); + dataApprovalLevel = allApprovalLevels.get( thisIndex ); return DataApprovalState.UNAPPROVED_READY; } - log.info( "getState() - waiting." ); + log.debug( "getState() - waiting." ); return DataApprovalState.UNAPPROVED_WAITING; } if ( dataSetAssignedAtOrBelowLevel ) { - log.info( "getState() - waiting for higher-level approval at a higher level for data at or below this level." ); + log.debug( "getState() - waiting for higher-level approval at a higher level for data at or below this level." ); return DataApprovalState.UNAPPROVED_ELSEWHERE; } - log.info( "getState() - unapprovable because not approvable at level or below, and no dataset assignment." ); + log.debug( "getState() - unapprovable because not approvable at level or below, and no dataset assignment." ); return DataApprovalState.UNAPPROVABLE; } /** - * Find approval levels that apply to this selection, based on the - * approval level's category option groups. Approval levels without - * category option groups always apply. Approval levels with category - * option groups only apply if the category option group contains - * category options that apply to the selected data. + * Compares the approval levels with the data selection, to determine how + * the data selection might be approved at each levels. *

- * For each matching approval level, also remember the category - * option groups (if any) that apply to this data selection and - * match this level's category option group set. + * This is done for each level by finding the category option groups + * (if any) that satisfy both of these: + *

    + *
  • Fall under the category option group set for this level
  • + *
  • Describe the data selection
  • + *
+ * For levels with a category option group set, the data selection may be + * approved at that level only if the level's category option group set + * contains a category option group under which the data falls. */ - private void findMatchingApprovalLevels() + private void findCategoryOptionGroupsByLevel() { - matchingApprovalLevels = new ArrayList(); + allApprovalLevels = dataApprovalLevelService.getAllDataApprovalLevels(); categoryOptionGroupsByLevel = new ArrayList>(); - List allDataApprovalLevels = dataApprovalLevelService.getAllDataApprovalLevels(); - - if ( allDataApprovalLevels != null ) + if ( allApprovalLevels != null ) { - for ( DataApprovalLevel level : allDataApprovalLevels ) + for ( DataApprovalLevel level : allApprovalLevels ) { if ( level.getCategoryOptionGroupSet() == null ) { - log.info( "findMatchingApprovalLevels() adding org unit level " - + level.getOrgUnitLevel() + log.debug( "findCategoryOptionGroupsByLevel() found level " + level.getLevel() + + " org unit level " + level.getOrgUnitLevel() + " with no category option groups." ); - matchingApprovalLevels.add( level ); - categoryOptionGroupsByLevel.add ( null ); } else @@ -461,29 +453,22 @@ Set groups = selectionGroups.get( level.getCategoryOptionGroupSet() ); - if ( groups != null ) - { - matchingApprovalLevels.add( level ); - - categoryOptionGroupsByLevel.add ( groups ); - } + categoryOptionGroupsByLevel.add ( groups ); } } } - - log.info( "findMatchingApprovalLevels() " + allDataApprovalLevels.size() + " -> " + matchingApprovalLevels.size() ); } /** * Initializes the selection groups if they have not yet been initialized. * This is a "lazy" operation that is only done if we find approval * levels that contain category option group sets we need to compare with. - * + *

* selectionGroups are constructed by finding all the category option groups * (COGs) that contain COG and/or category options of the selection. The * selectionGroup map is indexed by category option group set (COGS). For * each COGS, it contains all the COGs that describe the data selection. - * + *

* We will then use this information when we encounter an approval level * with a COGS. The selectionGroups map will tell us which COGs, if any, * from the selected data set apply to the COGS of the approval level. @@ -502,7 +487,7 @@ { addDataGroup( group.getGroupSet(), group ); - log.info( "initSelectionGroups() adding categoryOptionGroupSet " + log.debug( "initSelectionGroups() adding categoryOptionGroupSet " + group.getGroupSet().getName() + ", group " + group.getName() ); } @@ -516,7 +501,7 @@ if ( log.isInfoEnabled() ) { - log.info("initSelectionGroups() returning " + selectionGroups.size() + " group sets:"); + log.debug("initSelectionGroups() returning " + selectionGroups.size() + " group sets:"); for ( Map.Entry> entry : selectionGroups.entrySet() ) { @@ -529,7 +514,7 @@ s += ": " + group.getName(); } - log.info( "Group set " + entry.getKey().getName() + " (" + + entry.getValue().size() + ")" + s ); + log.debug( "Group set " + entry.getKey().getName() + " (" + + entry.getValue().size() + ")" + s ); } } } @@ -552,7 +537,7 @@ s += (s.isEmpty() ? "" : ", ") + option.getName(); } - log.info( "addDataGroups() looking for options " + s ); + log.debug( "addDataGroups() looking for options " + s ); } Collection allGroups = categoryService.getAllCategoryOptionGroups(); @@ -568,17 +553,17 @@ s += (s.isEmpty() ? "" : ", ") + option.getName(); } - log.info( "addDataGroups() looking in group " + group.getName() + ", options " + s ); + log.debug( "addDataGroups() looking in group " + group.getName() + ", options " + s ); } if ( group.getGroupSet() != null && CollectionUtils.containsAny( group.getMembers(), dataElementCategoryOptions ) ) { addDataGroup( group.getGroupSet(), group ); - log.info( "addDataGroups(): Adding " + group.getGroupSet().getName() + ", " + group.getName() ); + log.debug( "addDataGroups(): Adding " + group.getGroupSet().getName() + ", " + group.getName() ); } - else log.info( "addDataGroups(): Not adding " + group.getName() + " (group set " + else log.debug( "addDataGroups(): Not adding " + group.getName() + " (group set " + ( group.getGroupSet() == null ? "null" : group.getGroupSet().getName() ) + ")" ); } } @@ -611,49 +596,27 @@ */ private void findThisLevel() { - log.info( "findThisLevel() - matchingApprovalLevels.size() = " + matchingApprovalLevels.size() ); - - for ( int i = matchingApprovalLevels.size() - 1; i >= 0; i-- ) - { - log.info( "findThisLevel() - testing index " + i - + " org level " + organisationUnitLevel - + " approval level " + matchingApprovalLevels.get( i ).getOrgUnitLevel() ); - - if ( organisationUnitLevel == matchingApprovalLevels.get( i ).getOrgUnitLevel() ) - { - if ( approvableAtLevel( i ) ) - { - thisIndex = i; - } - else - { - thisIndex = INDEX_NOT_FOUND; - } - - thisOrHigherIndex = i; - lowerIndex = i + 1; - - log.info( "findThisLevel() - approvable at " + thisIndex ); - - return; - } - else if ( organisationUnitLevel > matchingApprovalLevels.get( i ).getOrgUnitLevel() ) - { - thisIndex = INDEX_NOT_FOUND; - thisOrHigherIndex = i; - lowerIndex = i+1; - - log.info( "findThisLevel() - org lower than level, thisOrHigher=" + thisOrHigherIndex + ", lower=" + lowerIndex ); - - return; - } - } - thisIndex = INDEX_NOT_FOUND; + thisOrHigherIndex = INDEX_NOT_FOUND; + lowerIndex = 0; - log.info( "findThisLevel() - org higher than all levels, thisOrHigher=" + thisOrHigherIndex + ", lower=" + lowerIndex ); + for ( int i = 0; i < allApprovalLevels.size() && organisationUnitLevel >= allApprovalLevels.get( i ).getOrgUnitLevel(); i++ ) + { + thisOrHigherIndex = i; + + lowerIndex = i + 1; + + if ( approvableAtLevel( i ) ) + { + thisIndex = i; + + break; + } + } + + log.debug( "findThisLevel() - returning thisOrHigher=" + thisOrHigherIndex + ", this=" + thisIndex + ", lower=" + lowerIndex ); } /** @@ -663,13 +626,13 @@ * at index i. The job of this method is to determine whether the selected * category option groups and/or category options (if any) are compatible * with the category option group set (if any) defined for this level. - * + *

* If any category options were specified, then the data is not approvable * at any level. - * + *

* If the level contains no category option group set, then the selection * must contain no category option group. - * + *

* If the level contains a category option group set, then the selection * must contain one (only) category option group. (Previous logic has * determined that if this is the case, the group will be a member of @@ -680,18 +643,56 @@ */ private boolean approvableAtLevel( int i ) { + DataApprovalLevel level = allApprovalLevels.get( i ); + + if ( organisationUnitLevel != level.getOrgUnitLevel() ) + { + log.debug( "approvableAtLevel( " + i + " ) = false: org unit level " + organisationUnitLevel + " not at approval org unit level " + level.getOrgUnitLevel() ); + + return false; + } + if ( dataElementCategoryOptions != null && dataElementCategoryOptions.size() != 0 ) { + log.debug( "approvableAtLevel( " + i + " ) = false: selection category options present." ); + return false; } - if ( matchingApprovalLevels.get( i ).getCategoryOptionGroupSet() == null ) + if ( level.getCategoryOptionGroupSet() == null ) { - return ( categoryOptionGroups == null || categoryOptionGroups.size() == 0 ); + if ( categoryOptionGroups == null || categoryOptionGroups.size() == 0 ) + { + log.debug( "approvableAtLevel( " + i + " ) = true: no COG in selection or COGS in level." ); + + return true; + } + else + { + log.debug( "approvableAtLevel( " + i + " ) = false: COG in selection but no COGS in level." ); + + return false; + } } else { - return ( categoryOptionGroups.size() == 1 ); + if ( categoryOptionGroups != null && categoryOptionGroups.size() == 1 + && categoryOptionGroups.iterator().next().getGroupSet() == level.getCategoryOptionGroupSet() ) + { + log.debug( "approvableAtLevel( " + i + " ) = true: COG in selection is a member of COGS in level." ); + + return true; + } + else + { + log.debug( "approvableAtLevel( " + i + " ) = false: COGS in level, " + + ( categoryOptionGroups == null ? "no COG(s) in selection" : + ( categoryOptionGroups.size() ) + " COG(s) in selection" + + ( categoryOptionGroups.size() != 1 ? "" : + ( " selected COG: " + categoryOptionGroups.iterator().next().getGroupSet().getName() ) ) ) ); + + return false; + } } } @@ -713,11 +714,11 @@ for (int i = thisOrHigherIndex; i >= 0; i-- ) { - while ( orgLevel > matchingApprovalLevels.get( i ).getOrgUnitLevel() ) + while ( orgLevel > allApprovalLevels.get( i ).getOrgUnitLevel() ) { - log.info( "isApprovedAtHigherLevel() moving up from " + orgUnit.getName() + " " + orgLevel - + " to " + orgUnit.getParent().getName() + " " + ( orgLevel - 1 ) + " towards " - + matchingApprovalLevels.get( i ).getOrgUnitLevel() ); + log.debug( "isApprovedAtHigherLevel() moving up from " + orgUnit.getName() + "(" + orgLevel + + ") to " + orgUnit.getParent().getName() + "(" + ( orgLevel - 1 ) + ") towards org unit level " + + allApprovalLevels.get( i ).getOrgUnitLevel() ); orgUnit = orgUnit.getParent(); @@ -732,27 +733,27 @@ dataApproval = da; - dataApprovalLevel = matchingApprovalLevels.get ( i ); + dataApprovalLevel = allApprovalLevels.get ( i ); - log.info( "isApprovedAtHigherLevel() found approval at level " + dataApprovalLevel.getLevel() ); + log.debug( "isApprovedAtHigherLevel() found approval at level " + dataApprovalLevel.getLevel() ); // (Keep looping to see if selection is also approved at a higher level.) } } } - log.info( "isApprovedAtHigherLevel() returning " + ( foundThisOrHigherIndex >= 0 ) ); + log.debug( "isApprovedAtHigherLevel() returning " + ( foundThisOrHigherIndex >= 0 ) ); return ( foundThisOrHigherIndex >= 0 ); } /** * Is this data selection approved at the given level index, for the - * given organisation unit and category option group(s)? + * given organisation unit? * - * @param index (matching) approval level index at which to test - * @param orgUnit organisation unit to tes. - * @return true if approved, otherwise false. + * @param index (matching) approval level index at which to test. + * @param orgUnit organisation unit to test. + * @return DataApproval if approved, otherwise null. */ private DataApproval getDataApproval( int index, OrganisationUnit orgUnit ) { @@ -762,7 +763,7 @@ { DataApproval d = dataApprovalStore.getDataApproval( dataSet, period, orgUnit, null ); - log.info("getDataApproval( " + orgUnit.getName() + " ) = " + ( d != null ) + " (no groups)" ); + log.debug("getDataApproval( " + orgUnit.getName() + " ) = " + ( d != null ) + " (no groups)" ); return d; } @@ -771,7 +772,7 @@ { DataApproval d = dataApprovalStore.getDataApproval( dataSet, period, orgUnit, group ); - log.info("getDataApproval( " + orgUnit.getName() + " ) = " + ( d != null ) + " (group: " + group.getName() + ")" ); + log.debug("getDataApproval( " + orgUnit.getName() + " ) = " + ( d != null ) + " (group: " + group.getName() + ")" ); if ( d != null ) { @@ -779,7 +780,7 @@ } } - log.info("getDataApproval( " + orgUnit.getName() + " ) = false (none of " + groups.size() + " groups matched)" ); + log.debug("getDataApproval( " + orgUnit.getName() + " ) = false (none of " + groups.size() + " groups matched)" ); return null; } @@ -810,9 +811,9 @@ dataSetAssignedAtOrBelowLevel = true; } - if ( lowerIndex < matchingApprovalLevels.size() ) + if ( lowerIndex < allApprovalLevels.size() ) { - if ( orgUnitLevel == matchingApprovalLevels.get( lowerIndex ).getLevel() ) + if ( orgUnitLevel == allApprovalLevels.get( lowerIndex ).getLevel() ) { log.info( "isUnapprovedBelow() orgUnit level " + orgUnitLevel + " matches approval level." ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DefaultDataApprovalService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DefaultDataApprovalService.java 2014-04-14 07:02:03 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DefaultDataApprovalService.java 2014-04-20 00:18:20 +0000 @@ -188,7 +188,7 @@ DataApprovalPermissions permissions = new DataApprovalPermissions(); - log.info( "getDataApprovalPermissions() getting permissions." ); + log.debug( "getDataApprovalPermissions() getting permissions." ); permissions.setDataApprovalStatus( status ); @@ -214,7 +214,7 @@ } } - log.info( "Returning permissions for " + organisationUnit.getName() + log.debug( "Returning permissions for " + organisationUnit.getName() + " " + status.getDataApprovalState().name() + " may approve = " + permissions.isMayApprove() + " may unapprove = " + permissions.isMayUnapprove() @@ -259,7 +259,7 @@ warnNotPermitted( dataApproval, "unaccept", mayAcceptOrUnaccept( dataApproval.getOrganisationUnit() ) ); } } - + // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- @@ -303,7 +303,7 @@ if ( mayApprove && user.getOrganisationUnits().contains( organisationUnit ) ) { - log.info( "mayApprove = true because organisation unit " + organisationUnit.getName() + log.debug( "mayApprove = true because organisation unit " + organisationUnit.getName() + " is assigned to user and user may approve at same level." ); return true; @@ -314,14 +314,14 @@ if ( mayApproveAtLowerLevels && CollectionUtils.containsAny( user.getOrganisationUnits(), organisationUnit.getAncestors() ) ) { - log.info( "mayApprove = true because organisation unit " + organisationUnit.getName() + log.debug( "mayApprove = true because organisation unit " + organisationUnit.getName() + " is under user and user may approve at lower levels." ); return true; } } - log.info( "mayApprove = false for organisation unit " + organisationUnit.getName() ); + log.debug( "mayApprove = false for organisation unit " + organisationUnit.getName() ); return false; } @@ -351,13 +351,13 @@ { if ( !accepted || mayAcceptOrUnaccept( organisationUnit ) ) { - log.info( "mayUnapprove = true for organisation unit " + organisationUnit.getName() ); + log.debug( "mayUnapprove = true for organisation unit " + organisationUnit.getName() ); return true; } } - log.info( "mayUnapprove = false for organisation unit " + organisationUnit.getName() ); + log.debug( "mayUnapprove = false for organisation unit " + organisationUnit.getName() ); return false; } @@ -380,16 +380,16 @@ if ( mayAcceptAtLowerLevels && CollectionUtils.containsAny( user.getOrganisationUnits(), organisationUnit.getAncestors() ) ) { - log.info( "User may accept or unaccept for organisation unit " + organisationUnit.getName() ); + log.debug( "User may accept or unaccept for organisation unit " + organisationUnit.getName() ); return true; } } - log.info( "User with AUTH_ACCEPT_LOWER_LEVELS " + user.getUserCredentials().isAuthorized( DataApproval.AUTH_ACCEPT_LOWER_LEVELS ) + log.debug( "User with AUTH_ACCEPT_LOWER_LEVELS " + user.getUserCredentials().isAuthorized( DataApproval.AUTH_ACCEPT_LOWER_LEVELS ) + " with " + user.getOrganisationUnits().size() + " org units" + " may not accept or unaccept for organisation unit " + organisationUnit.getName() - + " with " + organisationUnit.getAncestors().size() + " ancestors."); + + " with " + organisationUnit.getAncestors().size() + " ancestors." ); return false; } @@ -407,11 +407,11 @@ */ private boolean isAuthorizedToUnapprove( OrganisationUnit organisationUnit ) { - log.info( "isAuthorizedToUnapprove( " + organisationUnit.getName() + ")" ); + log.debug( "isAuthorizedToUnapprove( " + organisationUnit.getName() + ")" ); if ( mayApprove( organisationUnit ) ) { - log.info( "User may unapprove at " + organisationUnit.getName() ); + log.debug( "User may unapprove at " + organisationUnit.getName() ); return true; } @@ -420,13 +420,13 @@ { if ( mayApprove( ancestor ) ) { - log.info( "User may unapprove at " + ancestor.getName() ); + log.debug( "User may unapprove at " + ancestor.getName() ); return true; } } - log.info( "User may not unapprove at " + organisationUnit.getName() ); + log.debug( "User may not unapprove at " + organisationUnit.getName() ); return false; } @@ -458,7 +458,7 @@ if ( !mayOperate ) { - warning += " but couldn't " + operation; + warning += " but couldn't " + operation + " for " + dataApproval.getOrganisationUnit().getName(); } log.warn( warning + "." ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalServiceTest.java' --- dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalServiceTest.java 2014-04-10 17:52:41 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalServiceTest.java 2014-04-20 00:18:20 +0000 @@ -131,21 +131,11 @@ private DataApprovalLevel level4; - private DataApprovalLevel level1A; - - private DataApprovalLevel level2A; - - private DataApprovalLevel level3A; - - private DataApprovalLevel level4A; - - private DataApprovalLevel level1B; - - private DataApprovalLevel level2B; - - private DataApprovalLevel level3B; - - private DataApprovalLevel level4B; + private DataApprovalLevel level1ABCD; + + private DataApprovalLevel level1EFGH; + + private DataApprovalLevel level2ABCD; private User userA; @@ -205,17 +195,17 @@ private DataElementCategoryCombo categoryComboA; - private CategoryOptionGroup groupA; - - private CategoryOptionGroup groupB; - - private CategoryOptionGroup groupC; - - private CategoryOptionGroup groupD; - - private CategoryOptionGroupSet groupSetA; - - private CategoryOptionGroupSet groupSetB; + private CategoryOptionGroup groupAB; + + private CategoryOptionGroup groupCD; + + private CategoryOptionGroup groupEF; + + private CategoryOptionGroup groupGH; + + private CategoryOptionGroupSet groupSetABCD; + + private CategoryOptionGroupSet groupSetEFGH; // ------------------------------------------------------------------------- // Set up/tear down @@ -282,10 +272,10 @@ organisationUnitService.addOrganisationUnit( organisationUnitE ); organisationUnitService.addOrganisationUnit( organisationUnitF ); - level1 = new DataApprovalLevel( "1", 1, null ); - level2 = new DataApprovalLevel( "2", 2, null ); - level3 = new DataApprovalLevel( "3", 3, null ); - level4 = new DataApprovalLevel( "4", 4, null ); + level1 = new DataApprovalLevel( "level1", 1, null ); + level2 = new DataApprovalLevel( "level2", 2, null ); + level3 = new DataApprovalLevel( "level3", 3, null ); + level4 = new DataApprovalLevel( "level4", 4, null ); userA = createUser( 'A' ); userB = createUser( 'B' ); @@ -362,35 +352,30 @@ categoryService.addDataElementCategoryOptionCombo( optionComboO ); categoryService.addDataElementCategoryOptionCombo( optionComboP ); - groupA = createCategoryOptionGroup( 'A', optionA, optionB ); - groupB = createCategoryOptionGroup( 'B', optionC, optionD ); - groupC = createCategoryOptionGroup( 'C', optionE, optionF ); - groupD = createCategoryOptionGroup( 'D', optionG, optionH ); - - categoryService.saveCategoryOptionGroup( groupA ); - categoryService.saveCategoryOptionGroup( groupB ); - categoryService.saveCategoryOptionGroup( groupC ); - categoryService.saveCategoryOptionGroup( groupD ); - - groupSetA = new CategoryOptionGroupSet( "GroupSetA" ); - groupSetB = new CategoryOptionGroupSet( "GroupSetB" ); - - categoryService.saveCategoryOptionGroupSet( groupSetA ); - categoryService.saveCategoryOptionGroupSet( groupSetB ); - - groupSetA.addCategoryOptionGroup( groupA ); - groupSetA.addCategoryOptionGroup( groupB ); - groupSetB.addCategoryOptionGroup( groupC ); - groupSetB.addCategoryOptionGroup( groupD ); - - level1A = new DataApprovalLevel( "1A", 1, groupSetA ); - level1B = new DataApprovalLevel( "1B",1, groupSetB ); - level2A = new DataApprovalLevel( "2A", 2, groupSetA ); - level2B = new DataApprovalLevel( "2B", 2, groupSetB ); - level3A = new DataApprovalLevel( "3A", 3, groupSetA ); - level3B = new DataApprovalLevel( "3B", 3, groupSetB ); - level4A = new DataApprovalLevel( "4A", 4, groupSetA ); - level4B = new DataApprovalLevel( "4B", 4, groupSetB ); + groupAB = createCategoryOptionGroup( 'A', optionA, optionB ); + groupCD = createCategoryOptionGroup( 'C', optionC, optionD ); + groupEF = createCategoryOptionGroup( 'E', optionE, optionF ); + groupGH = createCategoryOptionGroup( 'G', optionG, optionH ); + + categoryService.saveCategoryOptionGroup( groupAB ); + categoryService.saveCategoryOptionGroup( groupCD ); + categoryService.saveCategoryOptionGroup( groupEF ); + categoryService.saveCategoryOptionGroup( groupGH ); + + groupSetABCD = new CategoryOptionGroupSet( "GroupSetABCD" ); + groupSetEFGH = new CategoryOptionGroupSet( "GroupSetEFGH" ); + + categoryService.saveCategoryOptionGroupSet( groupSetABCD ); + categoryService.saveCategoryOptionGroupSet( groupSetEFGH ); + + groupSetABCD.addCategoryOptionGroup( groupAB ); + groupSetABCD.addCategoryOptionGroup( groupCD ); + groupSetEFGH.addCategoryOptionGroup( groupEF ); + groupSetEFGH.addCategoryOptionGroup( groupGH ); + + level1ABCD = new DataApprovalLevel( "level1ABCD", 1, groupSetABCD ); + level1EFGH = new DataApprovalLevel( "level1EFGH", 1, groupSetEFGH ); + level2ABCD = new DataApprovalLevel( "level2ABCD", 2, groupSetABCD ); } // ------------------------------------------------------------------------- @@ -1067,7 +1052,7 @@ // --------------------------------------------------------------------- @Test - public void testAddAndGetDataApprovalWithCategories() throws Exception + public void testApprovalStateWithCategories() throws Exception { setUpCategories(); @@ -1075,8 +1060,8 @@ units.add( organisationUnitA ); createUserAndInjectSecurityContext( units, false, DataApproval.AUTH_APPROVE, DataApproval.AUTH_APPROVE_LOWER_LEVELS, AUTH_APPR_LEVEL ); - Set groupASet = new HashSet(); - groupASet.add ( groupA ); + Set groupABSet = new HashSet(); + groupABSet.add( groupAB ); dataSetA.setApproveData( true ); @@ -1087,13 +1072,13 @@ Date date = new Date(); // - // Group set A -> Groups A,B - // Group set B -> Groups C,D + // Group set ABCD -> Groups AB,CD + // Group set EFGH -> Groups EF,GH // - // Group A -> Options A,B - // Group B -> Options C,D - // Group C -> Options E,F - // Group D -> Options G,H + // Group AB -> Options A,B + // Group CD -> Options C,D + // Group EF -> Options E,F + // Group GH -> Options G,H // // Category A -> Options A,B,C,D // Category B -> Options E,F,G,H @@ -1110,19 +1095,19 @@ // Option combo J -> Options C,F -> Groups B,D // Option combo K -> Options C,G -> Groups B,D - assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalState() ); - assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalState() ); - assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitC, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupABSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupABSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitC, groupABSet, NO_OPTIONS ).getDataApprovalState() ); assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalState() ); assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboA ).getDataApprovalState() ); assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitC, optionComboA ).getDataApprovalState() ); - dataApprovalLevelService.addDataApprovalLevel( level2A ); + dataApprovalLevelService.addDataApprovalLevel( level2ABCD ); - assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalState() ); - assertEquals( DataApprovalState.UNAPPROVED_READY, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalState() ); - assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitC, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupABSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_READY, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupABSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitC, groupABSet, NO_OPTIONS ).getDataApprovalState() ); assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalState() ); assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboB ).getDataApprovalState() ); @@ -1132,11 +1117,11 @@ assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboJ ).getDataApprovalState() ); assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitC, optionComboK ).getDataApprovalState() ); - dataApprovalService.addDataApproval( new DataApproval( level2A, dataSetA, periodA, organisationUnitB, groupA, NOT_ACCEPTED, date, userA ) ); + dataApprovalService.addDataApproval( new DataApproval( level2ABCD, dataSetA, periodA, organisationUnitB, groupAB, NOT_ACCEPTED, date, userA ) ); - assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalState() ); - assertEquals( DataApprovalState.APPROVED_HERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalState() ); - assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitC, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupABSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_HERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupABSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitC, groupABSet, NO_OPTIONS ).getDataApprovalState() ); assertEquals( DataApprovalState.UNAPPROVABLE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalState() ); assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboB ).getDataApprovalState() ); @@ -1146,4 +1131,159 @@ assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboJ ).getDataApprovalState() ); assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitC, optionComboK ).getDataApprovalState() ); } + + @Test + public void testApprovalLevelWithCategories() throws Exception + { + setUpCategories(); + + dataSetA.setApproveData( true ); + + organisationUnitA.addDataSet( dataSetA ); + organisationUnitB.addDataSet( dataSetA ); + + Set groupASet = new HashSet(); + groupASet.add( groupAB ); // GroupA is a member of DataSetA + + Set groupBSet = new HashSet(); + groupBSet.add ( groupCD ); + + Set groupCSet = new HashSet(); + groupCSet.add ( groupEF ); + + Set groupXSet = new HashSet(); + groupXSet.add ( groupAB ); + groupXSet.add( groupEF ); + + Set units = new HashSet(); + units.add( organisationUnitA ); + createUserAndInjectSecurityContext( units, false, DataApproval.AUTH_APPROVE, DataApproval.AUTH_APPROVE_LOWER_LEVELS, AUTH_APPR_LEVEL ); + + Date date = new Date(); + + DataApproval dab = new DataApproval( level1EFGH, dataSetA, periodA, organisationUnitA, groupCD, NOT_ACCEPTED, date, userA ); + + dataApprovalLevelService.addDataApprovalLevel( level1EFGH ); + dataApprovalService.addDataApproval( dab ); + + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, NO_GROUPS, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupBSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_READY, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupCSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupXSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalState() ); + + assertEquals( level1EFGH, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupCSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, NO_GROUPS, NO_OPTIONS ).getDataApprovalLevel() ); + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalLevel() ); + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupBSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupXSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalLevel() ); + + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, NO_GROUPS, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupBSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupCSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupXSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboA ).getDataApprovalState() ); + + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, NO_GROUPS, NO_OPTIONS ).getDataApprovalLevel() ); + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalLevel() ); + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupBSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupCSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupXSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertNull( dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboA ).getDataApprovalLevel() ); + + dataApprovalLevelService.addDataApprovalLevel( level1ABCD ); + dataApprovalService.addDataApproval( new DataApproval( level1ABCD, dataSetA, periodA, organisationUnitA, groupAB, NOT_ACCEPTED, date, userA ) ); + + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, NO_GROUPS, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_HERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_HERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupBSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_READY, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupCSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupXSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalState() ); + + assertEquals( null, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, NO_GROUPS, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupBSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1EFGH, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupCSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupXSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalLevel() ); + + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, NO_GROUPS, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupBSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupCSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupXSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboA ).getDataApprovalState() ); + + assertEquals( null, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, NO_GROUPS, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupBSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( null, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupCSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupXSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboA ).getDataApprovalLevel() ); + + dataApprovalService.deleteDataApproval( dab ); + + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, NO_GROUPS, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_HERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_WAITING, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupBSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_READY, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupCSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupXSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalState() ); + + assertEquals( null, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, NO_GROUPS, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( null, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupBSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1EFGH, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupCSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupXSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalLevel() ); + + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, NO_GROUPS, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupBSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.UNAPPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupCSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupXSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboA ).getDataApprovalState() ); + + assertEquals( null, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, NO_GROUPS, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( null, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupBSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( null, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupCSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupXSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1ABCD, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboA ).getDataApprovalLevel() ); + + dataApprovalLevelService.addDataApprovalLevel( level1 ); + dataApprovalService.addDataApproval( new DataApproval( level1, dataSetA, periodA, organisationUnitA, NO_GROUP, NOT_ACCEPTED, date, userA ) ); + + assertEquals( DataApprovalState.APPROVED_HERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, NO_GROUPS, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupBSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupCSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupXSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalState() ); + + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, NO_GROUPS, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupASet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupBSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupCSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, groupXSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitA, optionComboA ).getDataApprovalLevel() ); + + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, NO_GROUPS, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupBSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupCSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupXSet, NO_OPTIONS ).getDataApprovalState() ); + assertEquals( DataApprovalState.APPROVED_ELSEWHERE, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboA ).getDataApprovalState() ); + + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, NO_GROUPS, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupASet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupBSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupCSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, groupXSet, NO_OPTIONS ).getDataApprovalLevel() ); + assertEquals( level1, dataApprovalService.getDataApprovalStatus( dataSetA, periodA, organisationUnitB, optionComboA ).getDataApprovalLevel() ); + } }