=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceService.java 2013-03-08 08:47:35 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceService.java 2013-03-11 16:07:20 +0000 @@ -133,4 +133,5 @@ int getOverDueEventCount( ProgramStage programStage, Collection orgunitIds, Date startDate, Date endDate ); + int averageNumberCompletedProgramInstance( Program program , Collection orgunitIds, Date startDate, Date endDate, Boolean completed ); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceStore.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceStore.java 2013-03-08 08:47:35 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceStore.java 2013-03-11 16:07:20 +0000 @@ -127,4 +127,7 @@ int getOverDueCount( ProgramStage programStage, Collection orgunitIds, Date startDate, Date endDate ); + int averageNumberCompleted( Program program, Collection orgunitIds, Date startDate, Date endDate, + Boolean completed ); + } === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java' --- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java 2013-03-09 05:42:33 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java 2013-03-11 16:07:20 +0000 @@ -363,16 +363,10 @@ // Average number of stages for complete programs - int stageCount = program.getProgramStages().size(); - int stageCompleted = getProgramStageInstanceCount( program, orgunitIds, startDate, endDate, true ); - double average = 0.0; - if ( total != 0 && stageCompleted != 0 ) - { - average = stageCompleted * 100 / (stageCount * total); - } + int stageCompleted = averageNumberCompletedProgramInstance( program, orgunitIds, startDate, endDate, true ); grid.addRow(); grid.addValue( i18n.getString( "average_number_of_stages_for_complete_programs" ) ); - grid.addValue( format.formatValue( average ) + "%" ); + grid.addValue( stageCompleted ); grid.addValue( "" ); grid.addValue( "" ); grid.addValue( "" ); @@ -417,7 +411,7 @@ grid.addValue( i18n.getString( "visits_overdue_percent" ) ); // Add values for stage details - + for ( ProgramStage programStage : program.getProgramStages() ) { grid.addRow(); @@ -425,22 +419,23 @@ // Visits scheduled (All) - int totalAll = this.getProgramStageInstanceCount( program, orgunitIds, startDate, endDate, null ); - grid.addValue( total ); + int totalAll = this.getProgramStageInstanceCount( programStage, orgunitIds, startDate, endDate, null ); + grid.addValue( totalAll ); // Visits done (#) = Incomplete + Complete stages. int totalCompletedEvent = this.getProgramStageInstanceCount( programStage, orgunitIds, startDate, endDate, true ); - int totalVisit = this.getProgramStageInstanceCount( programStage, orgunitIds, startDate, endDate, false ); - grid.addValue( totalCompletedEvent + totalVisit ); + int totalVisit = totalCompletedEvent + + this.getProgramStageInstanceCount( programStage, orgunitIds, startDate, endDate, false ); + grid.addValue( totalVisit ); // Visits done (%) double percent = 0.0; if ( totalAll != 0 ) { - percent = (totalCompletedEvent + totalVisit + 0.0) * 100 / totalAll; + percent = (totalVisit + 0.0) * 100 / totalAll; } grid.addValue( format.formatValue( percent ) + "%" ); @@ -470,7 +465,7 @@ } grid.addValue( format.formatValue( percent ) + "%" ); } - + return grid; } @@ -568,4 +563,10 @@ return programStageInstanceStore.getOverDueCount( programStage, orgunitIds, startDate, endDate ); } + @Override + public int averageNumberCompletedProgramInstance( Program program, Collection orgunitIds, Date startDate, + Date endDate, Boolean completed ) + { + return programStageInstanceStore.averageNumberCompleted( program, orgunitIds, startDate, endDate, completed ); + } } === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramInstanceStore.java' --- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramInstanceStore.java 2013-03-08 08:47:35 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramInstanceStore.java 2013-03-11 16:07:20 +0000 @@ -134,10 +134,13 @@ public Collection get( Program program, Collection orgunitIds, Date startDate, Date endDate, int min, int max ) { - return getCriteria( Restrictions.eq( "program", program ), Restrictions.isNull( "endDate" ), - Restrictions.ge( "enrollmentDate", startDate ), Restrictions.le( "enrollmentDate", endDate ) ) - .createAlias( "patient", "patient" ).createAlias( "patient.organisationUnit", "organisationUnit" ) - .add( Restrictions.in( "organisationUnit.id", orgunitIds ) ).addOrder( Order.asc( "patient.id" ) ) + return getCriteria( Restrictions.eq( "program", program ), + Restrictions.ge( "enrollmentDate", startDate ), + Restrictions.le( "enrollmentDate", endDate ) ) + .createAlias( "patient", "patient" ) + .createAlias( "patient.organisationUnit", "organisationUnit" ) + .add( Restrictions.in( "organisationUnit.id", orgunitIds ) ) + .addOrder( Order.asc( "patient.id" ) ) .setFirstResult( min ).setMaxResults( max ).list(); } === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java' --- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java 2013-03-11 07:15:42 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java 2013-03-11 16:07:20 +0000 @@ -804,7 +804,24 @@ if ( completed == null ) { - criteria.add( Restrictions.between( "dueDate", startDate, endDate ) ); + criteria.createAlias( "programInstance.patient", "patient" ); + criteria.createAlias( "patient.organisationUnit", "regOrgunit" ); + criteria.add( Restrictions.or( + Restrictions.and( Restrictions.eq( "completed", true ), + Restrictions.between( "executionDate", startDate, endDate ), + Restrictions.in( "organisationUnit.id", orgunitIds ) ), + Restrictions.and( Restrictions.eq( "completed", false ), + Restrictions.isNotNull( "executionDate" ), + Restrictions.between( "executionDate", startDate, endDate ), + Restrictions.in( "organisationUnit.id", orgunitIds ) ), + Restrictions.and( Restrictions.eq( "completed", false ), + Restrictions.isNull( "executionDate" ), + Restrictions.between( "dueDate", startDate, endDate ), + Restrictions.in( "regOrgunit.id", orgunitIds ) ), + Restrictions.and( Restrictions.eq( "status", ProgramStageInstance.SKIPPED_STATUS ), + Restrictions.between( "dueDate", startDate, endDate ), + Restrictions.in( "regOrgunit.id", orgunitIds ) ) + ) ); } else { @@ -1877,6 +1894,23 @@ return description; } + public int averageNumberCompleted( Program program, Collection orgunitIds, Date startDate, Date endDate, + Boolean completed ) + { + Criteria criteria = getCriteria(); + criteria.createAlias( "programInstance", "programInstance" ); + criteria.createAlias( "programStage", "programStage" ); + criteria.createAlias( "programInstance.patient", "patient" ); + criteria.add( Restrictions.eq( "programInstance.program", program ) ); + criteria.add( Restrictions.eq( "programInstance.completed", completed ) ); + criteria.add( Restrictions.in( "organisationUnit.id", orgunitIds ) ); + criteria.add( Restrictions.between( "executionDate", startDate, endDate ) ); + criteria.add( Restrictions.eq( "completed", true ) ); + + Number rs = (Number) criteria.setProjection( Projections.rowCount() ).uniqueResult(); + return rs != null ? rs.intValue() : 0; + } + // --------------------------------------------------------------------- // Get orgunitIds // ---------------------------------------------------------------------