=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/completeness/DataSetCompletenessService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/completeness/DataSetCompletenessService.java 2013-08-23 15:56:19 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/completeness/DataSetCompletenessService.java 2013-09-30 10:39:35 +0000 @@ -45,7 +45,7 @@ String ID = DataSetCompletenessService.class.getName(); Future exportDataSetCompleteness( Collection dataSets, Collection periods, - Collection units, int days ); + Collection units ); /** * Returns a Collection of DataSetCompletenessResults. The === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/DataSet.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/DataSet.java 2013-08-23 15:56:19 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/DataSet.java 2013-09-30 10:39:35 +0000 @@ -145,6 +145,11 @@ private int expiryDays; /** + * Days after period end to qualify for timely data submission + */ + private int timelyDays; + + /** * Indicating whether aggregation should be skipped. */ private boolean skipAggregation; @@ -604,6 +609,19 @@ @JsonProperty @JsonView( { DetailedView.class, ExportView.class } ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) + public int getTimelyDays() + { + return timelyDays; + } + + public void setTimelyDays( int timelyDays ) + { + this.timelyDays = timelyDays; + } + + @JsonProperty + @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public boolean isSkipAggregation() { return skipAggregation; @@ -729,8 +747,8 @@ public void setDataElementDecoration( boolean dataElementDecoration ) { this.dataElementDecoration = dataElementDecoration; - } - + } + @Override public void mergeWith( IdentifiableObject other ) { @@ -755,7 +773,7 @@ renderHorizontally = dataSet.isRenderHorizontally(); dataElementDecoration = dataSet.isDataElementDecoration(); - + removeAllDataElements(); for ( DataElement dataElement : dataSet.getDataElements() ) === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/setting/SystemSettingManager.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/setting/SystemSettingManager.java 2013-09-18 12:45:52 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/setting/SystemSettingManager.java 2013-09-30 10:39:35 +0000 @@ -57,7 +57,6 @@ final String KEY_REPORT_TEMPLATE_DIRECTORY = "reportTemplateDirectory"; final String KEY_GOOGLE_MAPS_API_KEY = "googleMapsAPIKey"; final String KEY_FACTOR_OF_DEVIATION = "factorDeviation"; - final String KEY_COMPLETENESS_OFFSET = "completenessOffset"; final String KEY_PATIENT_EXCEL_TEMPLATE_FILE_NAME = "patientExcelTemplateFileName"; final String KEY_DATAMART_TASK = "keyDataMartTask"; final String KEY_DATASETCOMPLETENESS_TASK = "keyDataSetCompletenessTask"; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java 2013-09-19 14:08:45 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java 2013-09-30 10:39:35 +0000 @@ -408,6 +408,10 @@ executeSql( "update dataset set expirydays = 0 where expirydays is null" ); executeSql( "update expression set nullifblank = true where nullifblank is null" ); + // move timelydays from system setting => dataset property + executeSql( "update dataset set timelydays = 15 where timelydays is null" ); + executeSql( "delete from systemsetting where name='completenessOffset'" ); + executeSql( "update reporttable set reportingmonth = false where reportingmonth is null" ); executeSql( "update reporttable set reportingbimonth = false where reportingbimonth is null" ); executeSql( "update reporttable set reportingquarter = false where reportingquarter is null" ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/dataset/hibernate/DataSet.hbm.xml' --- dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/dataset/hibernate/DataSet.hbm.xml 2013-08-29 18:09:46 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/dataset/hibernate/DataSet.hbm.xml 2013-09-30 10:39:35 +0000 @@ -72,6 +72,8 @@ + + dataSetIds = ConversionUtils.getIdentifiers( DataSet.class, dataSetService.getAllDataSets() ); Collection organisationUnitIds = ConversionUtils.getIdentifiers( OrganisationUnit.class, organisationUnitService.getAllOrganisationUnits() ); - + exportDataSetCompleteness( dataSetIds, periodIds, organisationUnitIds, id ); } - + @Transactional public void exportDataSetCompleteness( Collection dataSetIds, Collection periodIds, Collection organisationUnitIds, TaskId id ) { final int cpuCores = SystemUtils.getCpuCores(); - + Clock clock = new Clock().startClock().logTime( "Data completeness export process started, number of CPU cores: " + cpuCores + ", " + SystemUtils.getMemoryString() ); notifier.notify( id, "Completeness export process started" ); @@ -143,9 +141,6 @@ clock.logTime( "Dropped potential index" ); - int days = (Integer) systemSettingManager.getSystemSetting( KEY_COMPLETENESS_OFFSET, - DEFAULT_COMPLETENESS_OFFSET ); - completenessStore.deleteDataSetCompleteness( dataSetIds, periodIds, organisationUnitIds ); clock.logTime( "Deleted existing completeness data" ); @@ -158,18 +153,18 @@ dataSets = completenessStore.getDataSetsWithRegistrations( dataSets ); FilterUtils.filter( dataSets, new DataSetWithOrganisationUnitsFilter() ); - + List> organisationUnitPages = new PaginatedList( organisationUnits ).setNumberOfPages( cpuCores ).getPages(); - + List> futures = new ArrayList>(); - + for ( List organisationUnitPage : organisationUnitPages ) { - futures.add( completenessService.exportDataSetCompleteness( dataSets, periods, organisationUnitPage, days ) ); + futures.add( completenessService.exportDataSetCompleteness( dataSets, periods, organisationUnitPage ) ); } - + ConcurrentUtils.waitForCompletion( futures ); - + completenessStore.createIndex(); clock.logTime( "Created index" ); === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/completeness/impl/AbstractDataSetCompletenessService.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/completeness/impl/AbstractDataSetCompletenessService.java 2013-08-23 16:05:01 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/completeness/impl/AbstractDataSetCompletenessService.java 2013-09-30 10:39:35 +0000 @@ -28,16 +28,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import static org.hisp.dhis.setting.SystemSettingManager.DEFAULT_COMPLETENESS_OFFSET; -import static org.hisp.dhis.setting.SystemSettingManager.KEY_COMPLETENESS_OFFSET; -import static org.hisp.dhis.system.util.ConversionUtils.getIdentifiers; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.Future; - import org.amplecode.quick.BatchHandler; import org.amplecode.quick.BatchHandlerFactory; import org.apache.commons.collections.CollectionUtils; @@ -62,9 +52,16 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.Future; + +import static org.hisp.dhis.system.util.ConversionUtils.getIdentifiers; + /** * @author Lars Helge Overland - * @version $Id$ */ public abstract class AbstractDataSetCompletenessService implements DataSetCompletenessService @@ -95,7 +92,7 @@ { this.organisationUnitService = organisationUnitService; } - + private OrganisationUnitGroupService organisationUnitGroupService; public void setOrganisationUnitGroupService( OrganisationUnitGroupService organisationUnitGroupService ) @@ -130,7 +127,7 @@ { this.systemSettingManager = systemSettingManager; } - + // ------------------------------------------------------------------------- // DataSetCompletenessService implementation // ------------------------------------------------------------------------- @@ -141,8 +138,7 @@ protected abstract int getRegistrations( DataSet dataSet, Collection relevantSources, Collection periods ); - protected abstract int getRegistrationsOnTime( DataSet dataSet, Collection relevantSources, Collection periods, - int completenessOffset ); + protected abstract int getRegistrationsOnTime( DataSet dataSet, Collection relevantSources, Collection periods ); protected abstract int getSources( DataSet dataSet, Collection relevantSources, Period period ); @@ -152,18 +148,18 @@ @Async public Future exportDataSetCompleteness( Collection dataSets, Collection periods, - Collection units, int days ) - { + Collection units ) + { BatchHandler batchHandler = batchHandlerFactory .createBatchHandler( DataSetCompletenessResultBatchHandler.class ).init(); OrganisationUnitHierarchy hierarchy = organisationUnitService.getOrganisationUnitHierarchy(); hierarchy.prepareChildren( units ); - + for ( final DataSet dataSet : dataSets ) { int dataSetFrequencyOrder = dataSet.getPeriodType().getFrequencyOrder(); - + for ( final OrganisationUnit unit : units ) { Collection sources = hierarchy.getChildren( unit.getId() ); @@ -174,11 +170,10 @@ { if ( period.getPeriodType() != null && period.getPeriodType().getFrequencyOrder() >= dataSetFrequencyOrder ) { - final Collection periodsBetweenDates = + final Collection periodsBetweenDates = aggregationCache.getPeriodsBetweenDatesPeriodType( dataSet.getPeriodType(), period.getStartDate(), period.getEndDate() ); - - final DataSetCompletenessResult result = getDataSetCompleteness( period, - periodsBetweenDates, days, unit, relevantSources, dataSet ); + + final DataSetCompletenessResult result = getDataSetCompleteness( period, periodsBetweenDates, unit, relevantSources, dataSet ); if ( result.getSources() > 0 ) { @@ -192,20 +187,17 @@ batchHandler.flush(); aggregationCache.clearCache(); - + log.info( "Completeness export task done" ); - + return null; } - + @Transactional public Collection getDataSetCompleteness( int periodId, int organisationUnitId, Set groupIds ) { final Period period = periodService.getPeriod( periodId ); - int days = (Integer) systemSettingManager.getSystemSetting( KEY_COMPLETENESS_OFFSET, - DEFAULT_COMPLETENESS_OFFSET ); - final Collection children = organisationUnitService.getOrganisationUnitHierarchy().getChildren( organisationUnitId ); @@ -215,7 +207,7 @@ for ( final DataSet dataSet : dataSets ) { - final Collection periodsBetweenDates = getIdentifiers( Period.class, + final Collection periodsBetweenDates = getIdentifiers( Period.class, periodService.getPeriodsBetweenDates( dataSet.getPeriodType(), period.getStartDate(), period.getEndDate() ) ); final Collection relevantSources = getRelevantSources( dataSet, children, groupIds ); @@ -228,7 +220,7 @@ { result.setName( dataSet.getName() ); result.setRegistrations( getRegistrations( dataSet, relevantSources, periodsBetweenDates ) ); - result.setRegistrationsOnTime( getRegistrationsOnTime( dataSet, relevantSources, periodsBetweenDates, days ) ); + result.setRegistrationsOnTime( getRegistrationsOnTime( dataSet, relevantSources, periodsBetweenDates ) ); result.setDataSetId( dataSet.getId() ); result.setPeriodId( periodId ); @@ -248,12 +240,9 @@ final DataSet dataSet = dataSetService.getDataSet( dataSetId ); final Period period = periodService.getPeriod( periodId ); - + final Collection periodsBetweenDates = getIdentifiers( Period.class, periodService.getPeriodsBetweenDates( dataSet.getPeriodType(), period.getStartDate(), period.getEndDate() ) ); - int days = (Integer) systemSettingManager.getSystemSetting( KEY_COMPLETENESS_OFFSET, - DEFAULT_COMPLETENESS_OFFSET ); - final Collection results = new ArrayList(); for ( final Integer unitId : organisationUnitIds ) @@ -265,7 +254,7 @@ final Collection relevantSources = getRelevantSources( dataSet, children, groupIds ); - final DataSetCompletenessResult result = getDataSetCompleteness( period, periodsBetweenDates, days, unit, relevantSources, dataSet ); + final DataSetCompletenessResult result = getDataSetCompleteness( period, periodsBetweenDates, unit, relevantSources, dataSet ); if ( result.getSources() > 0 ) { @@ -302,7 +291,7 @@ // Supportive methods // ------------------------------------------------------------------------- - private DataSetCompletenessResult getDataSetCompleteness( Period period, Collection periodsBetweenDates, int completenessOffset, OrganisationUnit unit, + private DataSetCompletenessResult getDataSetCompleteness( Period period, Collection periodsBetweenDates, OrganisationUnit unit, Collection relevantSources, DataSet dataSet ) { final DataSetCompletenessResult result = new DataSetCompletenessResult(); @@ -313,7 +302,7 @@ if ( result.getSources() > 0 ) { result.setRegistrations( getRegistrations( dataSet, relevantSources, periodsBetweenDates ) ); - result.setRegistrationsOnTime( getRegistrationsOnTime( dataSet, relevantSources, periodsBetweenDates, completenessOffset ) ); + result.setRegistrationsOnTime( getRegistrationsOnTime( dataSet, relevantSources, periodsBetweenDates ) ); result.setDataSetId( dataSet.getId() ); result.setPeriodId( period.getId() ); @@ -324,7 +313,7 @@ return result; } - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") private Collection getRelevantSources( DataSet dataSet, Collection sources, Set groupIds ) { Collection dataSetSources = ConversionUtils.getIdentifiers( OrganisationUnit.class, @@ -339,7 +328,7 @@ dataSetSources.retainAll( ids ); } } - + return CollectionUtils.intersection( dataSetSources, sources ); } } === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/completeness/impl/CompulsoryDataSetCompletenessService.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/completeness/impl/CompulsoryDataSetCompletenessService.java 2013-08-23 16:05:01 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/completeness/impl/CompulsoryDataSetCompletenessService.java 2013-09-30 10:39:35 +0000 @@ -46,9 +46,9 @@ } @Override - public int getRegistrationsOnTime( DataSet dataSet, Collection relevantSources, Collection periods, int completenessOffset ) + public int getRegistrationsOnTime( DataSet dataSet, Collection relevantSources, Collection periods ) { - return completenessStore.getCompulsoryDataElementRegistrations( dataSet, relevantSources, periods, completenessOffset ); + return completenessStore.getCompulsoryDataElementRegistrations( dataSet, relevantSources, periods ); } @Override === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/completeness/impl/RegistrationDataSetCompletenessService.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/completeness/impl/RegistrationDataSetCompletenessService.java 2013-08-23 16:05:01 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/completeness/impl/RegistrationDataSetCompletenessService.java 2013-09-30 10:39:35 +0000 @@ -28,11 +28,11 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.util.Collection; - import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.period.Period; +import java.util.Collection; + /** * @author Lars Helge Overland */ @@ -46,9 +46,9 @@ } @Override - public int getRegistrationsOnTime( DataSet dataSet, Collection relevantSources, Collection periods, int completenessOffset ) + public int getRegistrationsOnTime( DataSet dataSet, Collection relevantSources, Collection periods ) { - return completenessStore.getCompleteDataSetRegistrations( dataSet, periods, relevantSources, completenessOffset ); + return completenessStore.getCompleteDataSetRegistrations( dataSet, periods, relevantSources ); } @Override === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-reporting/src/main/resources/META-INF/dhis/beans.xml 2013-09-16 11:22:02 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/resources/META-INF/dhis/beans.xml 2013-09-30 10:39:35 +0000 @@ -52,7 +52,7 @@ - + @@ -78,19 +78,20 @@ - - + + - + - + @@ -105,20 +106,20 @@ - + - + - + - + @@ -133,22 +134,23 @@ - + - + - + - - - - + + + + - + @@ -162,10 +164,10 @@ - - - - + + + + @@ -173,18 +175,18 @@ - - + + - + - + - + - - - + + + @@ -199,7 +201,8 @@ - + === modified file 'dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/interceptor/SystemSettingInterceptor.java' --- dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/interceptor/SystemSettingInterceptor.java 2013-09-26 18:17:41 +0000 +++ dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/interceptor/SystemSettingInterceptor.java 2013-09-30 10:39:35 +0000 @@ -93,7 +93,6 @@ map.put( KEY_START_MODULE, systemSettingManager.getSystemSetting( KEY_START_MODULE, DEFAULT_START_MODULE ) ); map.put( KEY_OMIT_INDICATORS_ZERO_NUMERATOR_DATAMART, systemSettingManager.getSystemSetting( KEY_OMIT_INDICATORS_ZERO_NUMERATOR_DATAMART, false ) ); map.put( KEY_FACTOR_OF_DEVIATION, systemSettingManager.getSystemSetting( KEY_FACTOR_OF_DEVIATION, DEFAULT_FACTOR_OF_DEVIATION ) ); - map.put( KEY_COMPLETENESS_OFFSET, systemSettingManager.getSystemSetting( KEY_COMPLETENESS_OFFSET, DEFAULT_COMPLETENESS_OFFSET ) ); map.put( KEY_PHONE_NUMBER_AREA_CODE, systemSettingManager.getSystemSetting( KEY_PHONE_NUMBER_AREA_CODE, "" ) ); map.put( KEY_MULTI_ORGANISATION_UNIT_FORMS, systemSettingManager.getSystemSetting( KEY_MULTI_ORGANISATION_UNIT_FORMS, false ) ); map.put( KEY_ACCOUNT_RECOVERY, systemSettingManager.getSystemSetting( KEY_ACCOUNT_RECOVERY, false ) ); === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/java/org/hisp/dhis/dataset/action/AddDataSetAction.java' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/java/org/hisp/dhis/dataset/action/AddDataSetAction.java 2013-08-23 16:05:01 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/java/org/hisp/dhis/dataset/action/AddDataSetAction.java 2013-09-30 10:39:35 +0000 @@ -129,6 +129,13 @@ this.expiryDays = expiryDays; } + private int timelyDays; + + public void setTimelyDays( int timelyDays ) + { + this.timelyDays = timelyDays; + } + private int notificationRecipients; public void setNotificationRecipients( int notificationRecipients ) @@ -240,6 +247,7 @@ DataSet dataSet = new DataSet( name, shortName, code, periodType ); dataSet.setExpiryDays( expiryDays ); + dataSet.setTimelyDays( timelyDays ); dataSet.setSkipAggregation( skipAggregation ); for ( String id : dataElementsSelectedList ) @@ -264,7 +272,7 @@ dataSet.setValidCompleteOnly( validCompleteOnly ); dataSet.setNotifyCompletingUser( notifyCompletingUser ); dataSet.setSkipOffline( skipOffline ); - dataSet.setDataElementDecoration( dataElementDecoration ); + dataSet.setDataElementDecoration( dataElementDecoration ); dataSet.setRenderAsTabs( renderAsTabs ); dataSet.setRenderHorizontally( renderHorizontally ); === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/java/org/hisp/dhis/dataset/action/UpdateDataSetAction.java' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/java/org/hisp/dhis/dataset/action/UpdateDataSetAction.java 2013-08-25 21:06:44 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/java/org/hisp/dhis/dataset/action/UpdateDataSetAction.java 2013-09-30 10:39:35 +0000 @@ -140,6 +140,13 @@ this.expiryDays = expiryDays; } + private int timelyDays; + + public void setTimelyDays( int timelyDays ) + { + this.timelyDays = timelyDays; + } + private int notificationRecipients; public void setNotificationRecipients( int notificationRecipients ) @@ -272,6 +279,7 @@ DataSet dataSet = dataSetService.getDataSet( dataSetId ); dataSet.setExpiryDays( expiryDays ); + dataSet.setTimelyDays( timelyDays ); dataSet.setSkipAggregation( skipAggregation ); if ( !( equalsNullSafe( name, dataSet.getName() ) && === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/resources/org/hisp/dhis/dataset/i18n_module.properties' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/resources/org/hisp/dhis/dataset/i18n_module.properties 2013-08-14 11:04:31 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/resources/org/hisp/dhis/dataset/i18n_module.properties 2013-09-30 10:39:35 +0000 @@ -82,6 +82,7 @@ grey_field=Grey field totals=Totals expiry_days=Expiry Days +timely_days=Days after period end to qualify for timely data submission insert_data_elements_totals_indicators=Insert data elements, totals and indicators style=Style comfortable=Comfortable === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/webapp/dhis-web-maintenance-dataset/addDataSet.vm' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/webapp/dhis-web-maintenance-dataset/addDataSet.vm 2013-08-25 20:18:18 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataset/src/main/webapp/dhis-web-maintenance-dataset/addDataSet.vm 2013-09-30 10:39:35 +0000 @@ -82,6 +82,10 @@ + + + + + + + + -
$i18n.getString( "days_after_period_timeliness" )
- -
- -
-
$i18n.getString( "phone_number_area_code" )