=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceQueryParams.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceQueryParams.java 2014-04-18 09:52:56 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceQueryParams.java 2014-04-18 14:01:25 +0000 @@ -38,6 +38,7 @@ import org.hisp.dhis.common.OrganisationUnitSelectionMode; import org.hisp.dhis.common.QueryItem; import org.hisp.dhis.common.SetMap; +import org.hisp.dhis.event.EventStatus; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStatus; @@ -114,6 +115,21 @@ * Selection mode for the specified organisation units. */ private OrganisationUnitSelectionMode organisationUnitMode; + + /** + * Status of any events in the specified program. + */ + private EventStatus eventStatus; + + /** + * Start date for event for the given program. + */ + private Date eventStartDate; + + /** + * End date for event for the given program. + */ + private Date eventEndDate; /** * Indicates whether not to include meta data in the response. @@ -372,7 +388,7 @@ } /** - * Indicates whethert this params is of the given organisation unit mode. + * Indicates whether this params is of the given organisation unit mode. */ public boolean isOrganisationUnitMode( OrganisationUnitSelectionMode mode ) { @@ -380,6 +396,39 @@ } /** + * Indicates whether this params specifies an event status. + */ + public boolean hasEventStatus() + { + return eventStatus != null; + } + + /** + * Indicates whether the event status specified for the params is equal to + * the given event status. + */ + public boolean isEventStatus( EventStatus eventStatus ) + { + return this.eventStatus != null && this.eventStatus.equals( eventStatus ); + } + + /** + * Indicates whether this params specifies an event start date. + */ + public boolean hasEventStartDate() + { + return eventStartDate != null; + } + + /** + * Indicates whether this params specifies an event end date. + */ + public boolean hasEventEndDate() + { + return eventEndDate != null; + } + + /** * Indicates whether paging is enabled. */ public boolean isPaging() @@ -445,14 +494,14 @@ this.filters = filters; } - public OrganisationUnitSelectionMode getOrganisationUnitMode() + public Set getOrganisationUnits() { - return organisationUnitMode; + return organisationUnits; } - public void setOrganisationUnitMode( OrganisationUnitSelectionMode organisationUnitMode ) + public void setOrganisationUnits( Set organisationUnits ) { - this.organisationUnitMode = organisationUnitMode; + this.organisationUnits = organisationUnits; } public Program getProgram() @@ -515,14 +564,44 @@ this.trackedEntity = trackedEntity; } - public Set getOrganisationUnits() - { - return organisationUnits; - } - - public void setOrganisationUnits( Set organisationUnits ) - { - this.organisationUnits = organisationUnits; + public OrganisationUnitSelectionMode getOrganisationUnitMode() + { + return organisationUnitMode; + } + + public void setOrganisationUnitMode( OrganisationUnitSelectionMode organisationUnitMode ) + { + this.organisationUnitMode = organisationUnitMode; + } + + public EventStatus getEventStatus() + { + return eventStatus; + } + + public void setEventStatus( EventStatus eventStatus ) + { + this.eventStatus = eventStatus; + } + + public Date getEventStartDate() + { + return eventStartDate; + } + + public void setEventStartDate( Date eventStartDate ) + { + this.eventStartDate = eventStartDate; + } + + public Date getEventEndDate() + { + return eventEndDate; + } + + public void setEventEndDate( Date eventEndDate ) + { + this.eventEndDate = eventEndDate; } public boolean isSkipMeta() === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceService.java 2014-04-18 09:52:56 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceService.java 2014-04-18 14:01:25 +0000 @@ -36,6 +36,7 @@ import org.hisp.dhis.common.Grid; import org.hisp.dhis.common.IllegalQueryException; import org.hisp.dhis.common.OrganisationUnitSelectionMode; +import org.hisp.dhis.event.EventStatus; import org.hisp.dhis.i18n.I18n; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.organisationunit.OrganisationUnit; @@ -79,6 +80,9 @@ * @param programStartDate the start date for enrollment in the given Program. * @param programEndDate the end date for enrollment in the given Program. * @param trackedEntity the TrackedEntity uid. + * @param eventStatus the event status for the given Program. + * @param eventStartDate the event start date for the given Program. + * @param eventEndDate the event end date for the given Program. * @param skipMeta indicates whether to include meta data in the response. * @param page the page number. * @param pageSize the page size. @@ -86,7 +90,7 @@ */ TrackedEntityInstanceQueryParams getFromUrl( String query, Set attribute, Set filter, Set ou, OrganisationUnitSelectionMode ouMode, String program, ProgramStatus programStatus, Boolean followUp, Date programStartDate, Date programEndDate, - String trackedEntity, boolean skipMeta, Integer page, Integer pageSize ); + String trackedEntity, EventStatus eventStatus, Date eventStartDate, Date eventEndDate, boolean skipMeta, Integer page, Integer pageSize ); /** * Validates the given TrackedEntityInstanceQueryParams. The params is === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceService.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceService.java 2014-04-18 09:52:56 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceService.java 2014-04-18 14:01:25 +0000 @@ -56,6 +56,7 @@ import org.hisp.dhis.common.OrganisationUnitSelectionMode; import org.hisp.dhis.common.Pager; import org.hisp.dhis.common.QueryItem; +import org.hisp.dhis.event.EventStatus; import org.hisp.dhis.i18n.I18n; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.organisationunit.OrganisationUnit; @@ -305,6 +306,11 @@ violation = "Program must be defined when program end date is specified"; } + if ( params.hasEventStatus() && ( !params.hasEventStartDate() || !params.hasEventEndDate() ) ) + { + violation = "Event start and end date must be specified when event status is specified"; + } + if ( params.isOrQuery() && params.hasFilters() ) { violation = "Query cannot be specified together with filters"; @@ -331,7 +337,7 @@ @Override public TrackedEntityInstanceQueryParams getFromUrl( String query, Set attribute, Set filter, Set ou, OrganisationUnitSelectionMode ouMode, String program, ProgramStatus programStatus, Boolean followUp, Date programStartDate, Date programEndDate, - String trackedEntity, boolean skipMeta, Integer page, Integer pageSize ) + String trackedEntity, EventStatus eventStatus, Date eventStartDate, Date eventEndDate, boolean skipMeta, Integer page, Integer pageSize ) { TrackedEntityInstanceQueryParams params = new TrackedEntityInstanceQueryParams(); @@ -392,6 +398,9 @@ params.setProgramEndDate( programEndDate ); params.setTrackedEntity( te ); params.setOrganisationUnitMode( ouMode ); + params.setEventStatus( eventStatus ); + params.setEventStartDate( eventStartDate ); + params.setEventEndDate( eventEndDate ); params.setSkipMeta( skipMeta ); params.setPage( page ); params.setPageSize( pageSize ); === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityInstanceStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityInstanceStore.java 2014-04-18 10:14:28 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityInstanceStore.java 2014-04-18 14:01:25 +0000 @@ -45,6 +45,7 @@ import static org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams.ORG_UNIT_ID; import static org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams.TRACKED_ENTITY_ID; import static org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams.TRACKED_ENTITY_INSTANCE_ID; +import static org.hisp.dhis.program.ProgramStageInstance.SKIPPED_STATUS; import java.sql.ResultSet; import java.sql.SQLException; @@ -68,6 +69,7 @@ import org.hisp.dhis.common.QueryItem; import org.hisp.dhis.common.SetMap; import org.hisp.dhis.common.hibernate.HibernateIdentifiableObjectStore; +import org.hisp.dhis.event.EventStatus; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.jdbc.StatementBuilder; import org.hisp.dhis.organisationunit.OrganisationUnit; @@ -251,8 +253,8 @@ final String joinClause = item.hasFilter() ? "inner join" : "left join"; - sql += joinClause + - " trackedentityattributevalue as " + col + " " + "on " + col + ".trackedentityinstanceid = tei.trackedentityinstanceid " + + sql += joinClause + " " + + "trackedentityattributevalue as " + col + " " + "on " + col + ".trackedentityinstanceid = tei.trackedentityinstanceid " + "and " + col + ".trackedentityattributeid = " + item.getItem().getId() + " "; final String filter = statementBuilder.encode( item.getFilter(), false ); @@ -300,8 +302,17 @@ if ( params.hasProgram() ) { sql += hlp.whereAnd() + " exists (" + - "select trackedentityinstanceid " + - "from programinstance pi " + + "select pi.trackedentityinstanceid " + + "from programinstance pi "; + + if ( params.hasEventStatus() ) + { + sql += + "left join programstageinstance psi " + + "on pi.programinstanceid = psi.programinstanceid "; + } + + sql += "where pi.trackedentityinstanceid = tei.trackedentityinstanceid " + "and pi.programid = " + params.getProgram().getId() + " "; @@ -324,6 +335,11 @@ { sql += "and pi.enrollmentdate <= '" + getMediumDateString( params.getProgramEndDate() ) + "' "; } + + if ( params.hasEventStatus() ) + { + sql += getEventStatusWhereClause( params ); + } sql += ") "; } @@ -358,6 +374,37 @@ return sql; } + private String getEventStatusWhereClause( TrackedEntityInstanceQueryParams params ) + { + String start = getMediumDateString( params.getEventStartDate() ); + String end = getMediumDateString( params.getEventEndDate() ); + + String sql = StringUtils.EMPTY; + + if ( params.isEventStatus( EventStatus.COMPLETED ) ) + { + sql = "and psi.executiondate >= '" + start + "' and psi.executiondate <= '" + end + "' and psi.completed = true "; + } + else if ( params.isEventStatus( EventStatus.VISITED ) ) + { + sql = "and psi.executiondate >= '" + start + "' and psi.executiondate <= '" + end + "' and psi.completed = false "; + } + else if ( params.isEventStatus( EventStatus.FUTURE_VISIT ) ) + { + sql = "and psi.duedate >= '" + start + "' and psi.duedate <= '" + end + "' and psi.status is not null and date(now()) < date(psi.duedate) "; + } + else if ( params.isEventStatus( EventStatus.LATE_VISIT ) ) + { + sql = "and psi.duedate >= '" + start + "' and psi.duedate <= '" + end + "' and psi.status is not null and date(now()) > date(psi.duedate) "; + } + else if ( params.isEventStatus( EventStatus.SKIPPED ) ) + { + sql = "and psi.duedate >= '" + start + "' and psi.duedate <= '" + end + "' and psi.status = " + SKIPPED_STATUS + " "; + } + + return sql; + } + @Override @SuppressWarnings( "unchecked" ) public Collection getByOrgUnit( OrganisationUnit organisationUnit, Integer min, Integer max ) === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/eventreport/EventReportServiceTest.java' --- dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/eventreport/EventReportServiceTest.java 2014-04-13 13:14:11 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/eventreport/EventReportServiceTest.java 2014-04-18 14:01:25 +0000 @@ -52,9 +52,9 @@ @Override public void setUpTest() - {System.out.println("\n\n === \n 1 "); - prA = createProgram( 'A', null, null );System.out.println("\n\n === \n 2 "); - programService.addProgram( prA );System.out.println("\n\n === \n 3 "); + { + prA = createProgram( 'A', null, null ); + programService.addProgram( prA ); } @Test === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/event/TrackedEntityInstanceController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/event/TrackedEntityInstanceController.java 2014-04-18 09:52:56 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/event/TrackedEntityInstanceController.java 2014-04-18 14:01:25 +0000 @@ -52,6 +52,7 @@ import org.hisp.dhis.dxf2.importsummary.ImportSummaries; import org.hisp.dhis.dxf2.importsummary.ImportSummary; import org.hisp.dhis.dxf2.utils.JacksonUtils; +import org.hisp.dhis.event.EventStatus; import org.hisp.dhis.program.ProgramStatus; import org.hisp.dhis.system.grid.GridUtils; import org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams; @@ -111,6 +112,9 @@ @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date programStartDate, @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date programEndDate, @RequestParam(required=false) String trackedEntity, + @RequestParam(required=false) EventStatus eventStatus, + @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date eventStartDate, + @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date eventEndDate, @RequestParam(required=false) boolean skipMeta, @RequestParam(required=false) Integer page, @RequestParam(required=false) Integer pageSize, @@ -119,7 +123,8 @@ { Set orgUnits = new HashSet( ContextUtils.getQueryParamValues( ou ) ); TrackedEntityInstanceQueryParams params = instanceService.getFromUrl( query, attribute, filter, orgUnits, ouMode, - program, programStatus, followUp, programStartDate, programEndDate, trackedEntity, skipMeta, page, pageSize ); + program, programStatus, followUp, programStartDate, programEndDate, trackedEntity, + eventStatus, eventStartDate, eventEndDate, skipMeta, page, pageSize ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_JSON, CacheStrategy.NO_CACHE ); Grid grid = instanceService.getTrackedEntityInstances( params ); @@ -142,6 +147,9 @@ @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date programStartDate, @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date programEndDate, @RequestParam(required=false) String trackedEntity, + @RequestParam(required=false) EventStatus eventStatus, + @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date eventStartDate, + @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date eventEndDate, @RequestParam(required=false) boolean skipMeta, @RequestParam(required=false) Integer page, @RequestParam(required=false) Integer pageSize, @@ -150,7 +158,8 @@ { Set orgUnits = new HashSet( ContextUtils.getQueryParamValues( ou ) ); TrackedEntityInstanceQueryParams params = instanceService.getFromUrl( query, attribute, filter, orgUnits, ouMode, - program, programStatus, followUp, programStartDate, programEndDate, trackedEntity, skipMeta, page, pageSize ); + program, programStatus, followUp, programStartDate, programEndDate, trackedEntity, + eventStatus, eventStartDate, eventEndDate, skipMeta, page, pageSize ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_XML, CacheStrategy.NO_CACHE ); Grid grid = instanceService.getTrackedEntityInstances( params ); @@ -170,6 +179,9 @@ @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date programStartDate, @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date programEndDate, @RequestParam(required=false) String trackedEntity, + @RequestParam(required=false) EventStatus eventStatus, + @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date eventStartDate, + @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date eventEndDate, @RequestParam(required=false) boolean skipMeta, @RequestParam(required=false) Integer page, @RequestParam(required=false) Integer pageSize, @@ -178,7 +190,8 @@ { Set orgUnits = new HashSet( ContextUtils.getQueryParamValues( ou ) ); TrackedEntityInstanceQueryParams params = instanceService.getFromUrl( query, attribute, filter, orgUnits, ouMode, - program, programStatus, followUp, programStartDate, programEndDate, trackedEntity, skipMeta, page, pageSize ); + program, programStatus, followUp, programStartDate, programEndDate, trackedEntity, + eventStatus, eventStartDate, eventEndDate, skipMeta, page, pageSize ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_EXCEL, CacheStrategy.NO_CACHE ); Grid grid = instanceService.getTrackedEntityInstances( params ); @@ -198,6 +211,9 @@ @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date programStartDate, @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date programEndDate, @RequestParam(required=false) String trackedEntity, + @RequestParam(required=false) EventStatus eventStatus, + @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date eventStartDate, + @RequestParam(required=false) @DateTimeFormat( pattern = "yyyy-MM-dd" ) Date eventEndDate, @RequestParam(required=false) boolean skipMeta, @RequestParam(required=false) Integer page, @RequestParam(required=false) Integer pageSize, @@ -206,7 +222,8 @@ { Set orgUnits = new HashSet( ContextUtils.getQueryParamValues( ou ) ); TrackedEntityInstanceQueryParams params = instanceService.getFromUrl( query, attribute, filter, orgUnits, ouMode, - program, programStatus, followUp, programStartDate, programEndDate, trackedEntity, skipMeta, page, pageSize ); + program, programStatus, followUp, programStartDate, programEndDate, trackedEntity, + eventStatus, eventStartDate, eventEndDate, skipMeta, page, pageSize ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_CSV, CacheStrategy.NO_CACHE ); Grid grid = instanceService.getTrackedEntityInstances( params );