=== 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 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DefaultDataApprovalService.java 2015-02-20 07:42:23 +0000 @@ -203,6 +203,13 @@ DataApproval d = dataApprovalStore.getDataApproval( da.getDataApprovalLevel(), da.getDataSet(), da.getPeriod(), da.getOrganisationUnit(), da.getAttributeOptionCombo() ); + if ( d == null ) + { + log.warn( "unapproveData: approval not found at " + da ); + + throw new DataMayNotBeAcceptedException(); + } + dataApprovalStore.deleteDataApproval( d ); } @@ -255,6 +262,13 @@ DataApproval d = dataApprovalStore.getDataApproval( da.getDataApprovalLevel(), da.getDataSet(), da.getPeriod(), da.getOrganisationUnit(), da.getAttributeOptionCombo() ); + if ( d == null ) + { + log.warn( "acceptData: approval not found at " + da ); + + throw new DataMayNotBeAcceptedException(); + } + d.setAccepted( true ); dataApprovalStore.updateDataApproval( d ); @@ -307,6 +321,13 @@ DataApproval d = dataApprovalStore.getDataApproval( da.getDataApprovalLevel(), da.getDataSet(), da.getPeriod(), da.getOrganisationUnit(), da.getAttributeOptionCombo() ); + if ( d == null ) + { + log.warn( "unacceptData: approval not found at " + da ); + + throw new DataMayNotBeAcceptedException(); + } + d.setAccepted( false ); dataApprovalStore.updateDataApproval( d ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/hibernate/HibernateDataApprovalStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/hibernate/HibernateDataApprovalStore.java 2015-02-19 09:18:17 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/hibernate/HibernateDataApprovalStore.java 2015-02-20 07:42:23 +0000 @@ -369,20 +369,20 @@ readyBelowSubquery + " as ready_below, " + approvedAboveSubquery + " as approved_above " + "from ( " + // subquery to get combinations of organisation unit and category option combo - "select distinct cocco.categoryoptioncomboid, ccoc.categorycomboid, o.organisationunitid " + + "select distinct cocco.categoryoptioncomboid, ccoc.categorycomboid, coalesce(coo.organisationunitid, o.organisationunitid) as organisationunitid " + "from categoryoptioncombos_categoryoptions cocco " + "join categorycombos_optioncombos ccoc on ccoc.categoryoptioncomboid = cocco.categoryoptioncomboid and ccoc.categorycomboid in (" + categoryComboIds + ") " + "join dataelementcategoryoption co on co.categoryoptionid = cocco.categoryoptionid " + "and (co.startdate is null or co.startdate <= '" + maxDate + "') and (co.enddate is null or co.enddate >= '" + minDate + "') " + "join _orgunitstructure o on " + orgUnitJoinOn + " " + "left join categoryoption_organisationunits coo on coo.categoryoptionid = co.categoryoptionid " + - "left join _orgunitstructure ous on ous.idlevel" + orgUnitLevel + "= o.organisationunitid and ous.organisationunitid = coo.organisationunitid " + + "left join _orgunitstructure ous on ous.idlevel" + orgUnitLevel + " = o.organisationunitid and ous.organisationunitid = coo.organisationunitid " + joinAncestors + "left join dataelementcategoryoptionusergroupaccesses couga on couga.categoryoptionid = cocco.categoryoptionid " + "left join usergroupaccess uga on uga.usergroupaccessid = couga.usergroupaccessid " + "left join usergroupmembers ugm on ugm.usergroupid = uga.usergroupid " + "where ( coo.categoryoptionid is null or ous.organisationunitid is not null " + testAncestors + ") " + - ( isSuperUser || user == null ? "" : "and ( ugm.userid = " + user.getId() + " or co.userid = " + user.getId() + + ( isSuperUser || user == null ? "" : "and ( ugm.userid = " + user.getId() + " or co.userid = " + user.getId() + " " + "or co.publicaccess is null or left(co.publicaccess, 1) = 'r' ) " ) + ( attributeOptionCombo == null ? "" : "and cocco.categoryoptioncomboid = " + attributeOptionCombo.getId() + " " ) + ") as a";