=== 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-11-04 06:00:38 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceService.java 2013-11-19 03:45:56 +0000 @@ -238,7 +238,7 @@ int getOverDueEventCount( ProgramStage programStage, Collection orgunitIds, Date startDate, Date endDate ); /** - * Get the number of program instances completed + * Get the number of program instances completed, includes all program stage instances were completed * * @param program Program * @param orgunitIds The ids of orgunits where the events happened @@ -330,8 +330,10 @@ * @param program Single event without registration * @param executionDate Report date of the event * @param organisationUnit Orgunit where the event happens + * + * @return ProgramStageInstance ProgramStageInstance object */ - void createProgramStageInstance( Patient patient, Program program, Date executionDate, + ProgramStageInstance createProgramStageInstance( Patient patient, Program program, Date executionDate, OrganisationUnit organisationUnit ); } === 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-11-04 06:00:38 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java 2013-11-19 03:45:56 +0000 @@ -528,7 +528,7 @@ { Collection messageConversations = new HashSet(); - Collection reminders = programStageInstance.getProgramStage().getPatientReminders(); + Collection reminders = programStageInstance.getProgramStage().getPatientReminders(); for ( PatientReminder rm : reminders ) { if ( rm != null @@ -616,7 +616,7 @@ * registration. */ @Override - public void createProgramStageInstance( Patient patient, Program program, Date executionDate, + public ProgramStageInstance createProgramStageInstance( Patient patient, Program program, Date executionDate, OrganisationUnit organisationUnit ) { ProgramStage programStage = null; @@ -670,6 +670,8 @@ programStageInstance.setOrganisationUnit( organisationUnit ); addProgramStageInstance( programStageInstance ); + + return programStageInstance; } // ------------------------------------------------------------------------- === 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-11-04 06:00:38 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java 2013-11-19 03:45:56 +0000 @@ -127,7 +127,6 @@ return getQuery( hql ).setEntity( "patient", patient ).setBoolean( "completed", completed ).list(); } - @Override public void removeEmptyEvents( ProgramStage programStage, OrganisationUnit organisationUnit ) { @@ -484,7 +483,8 @@ { criteria.add( Restrictions.not( Restrictions.in( "programInstance", programInstances ) ) ); } - +System.out.println("\n\n\n ............. \n programInstances : " + programInstances.iterator().next().getProgram().getName() ); +System.out.println("\n\n\n ............. \n stageInstances : " + programInstances.iterator().next().getProgramStageInstances() ); Number rs = (Number) criteria.setProjection( Projections.rowCount() ).uniqueResult(); return rs != null ? rs.intValue() : 0; } @@ -507,7 +507,7 @@ private String sendMessageToPatientSql() { return "select psi.programstageinstanceid, p.phonenumber, prm.templatemessage, p.name, org.name as orgunitName " - + ",pg.name as programName, ps.name as programStageName, psi.duedate,(DATE(now()) - DATE(psi.duedate) ) as days_since_due_date " + + ",pg.name as programName, ps.name as programStageName, psi.duedate,(now() - psi.duedate ) as days_since_due_date " + "from patient p INNER JOIN programinstance pi " + " ON p.patientid=pi.patientid " + " INNER JOIN programstageinstance psi " @@ -520,13 +520,13 @@ + " ON org.organisationunitid = p.organisationunitid " + " INNER JOIN patientreminder prm " + " ON prm.programstageid = ps.programstageid " - + "WHERE pi.status=" + + " WHERE pi.status=" + ProgramInstance.STATUS_ACTIVE + " and p.phonenumber is not NULL and p.phonenumber != '' " + " and prm.templatemessage is not NULL and prm.templatemessage != '' " + " and pg.type=1 and prm.daysallowedsendmessage is not null " + " and psi.executiondate is null " - + " and ( DATE(now()) - DATE(psi.duedate) ) = prm.daysallowedsendmessage " + + " and ( now() - psi.duedate ) = prm.daysallowedsendmessage " + " and prm.whentosend is null and prm.sendto = " + PatientReminder.SEND_TO_PATIENT; } @@ -534,7 +534,7 @@ { return "SELECT psi.programstageinstanceid, uif.phonenumber, prm.templatemessage, p.name, org.name as orgunitName, " + "pg.name as programName, ps.name as programStageName, psi.duedate, " - + " (DATE(now()) - DATE(psi.duedate) ) as days_since_due_date " + + " (now() - psi.duedate ) as days_since_due_date " + " FROM patient p INNER JOIN programinstance pi " + " ON p.patientid=pi.patientid " + " INNER JOIN programstageinstance psi " @@ -557,7 +557,7 @@ + " and prm.templatemessage is not NULL and prm.templatemessage != '' " + " and pg.type=1 and prm.daysallowedsendmessage is not null " + " and psi.executiondate is null " - + " and ( DATE(now()) - DATE(psi.duedate) ) = prm.daysallowedsendmessage " + + " and ( now() - psi.duedate ) = prm.daysallowedsendmessage " + " and prm.whentosend is null and prm.sendto = " + PatientReminder.SEND_TO_HEALTH_WORKER; } @@ -565,7 +565,7 @@ { return "select psi.programstageinstanceid, ou.phonenumber, prm.templatemessage, p.name, org.name as orgunitName, " + "pg.name as programName, ps.name as programStageName, psi.duedate," - + "(DATE(now()) - DATE(psi.duedate) ) as days_since_due_date " + + "(now() - psi.duedate) as days_since_due_date " + " from patient p INNER JOIN programinstance pi " + " ON p.patientid=pi.patientid " + " INNER JOIN programstageinstance psi " @@ -586,7 +586,7 @@ + " and prm.templatemessage is not NULL and prm.templatemessage != '' " + " and pg.type=1 and prm.daysallowedsendmessage is not null " + " and psi.executiondate is null " - + " and ( DATE(now()) - DATE(psi.duedate) ) = prm.daysallowedsendmessage " + + " and (now() - psi.duedate ) = prm.daysallowedsendmessage " + " and prm.whentosend is null and prm.sendto = " + +PatientReminder.SEND_TO_ORGUGNIT_REGISTERED; } @@ -595,7 +595,7 @@ { return "select psi.programstageinstanceid, uif.phonenumber,prm.templatemessage, p.name, org.name as orgunitName ," + " pg.name as programName, ps.name as programStageName, psi.duedate, " - + "(DATE(now()) - DATE(psi.duedate) ) as days_since_due_date " + + "(now() - psi.duedate ) as days_since_due_date " + " from patient p INNER JOIN programinstance pi " + " ON p.patientid=pi.patientid " + " INNER JOIN programstageinstance psi " @@ -618,7 +618,7 @@ + " and prm.templatemessage is not NULL and prm.templatemessage != '' " + " and pg.type=1 and prm.daysallowedsendmessage is not null " + " and psi.executiondate is null " - + " and ( DATE(now()) - DATE(psi.duedate) ) = prm.daysallowedsendmessage " + + " and ( now() - psi.duedate ) = prm.daysallowedsendmessage " + " and prm.whentosend is null and prm.sendto = " + PatientReminder.SEND_TO_ALL_USERS_IN_ORGUGNIT_REGISTERED; } @@ -627,7 +627,7 @@ { return "select psi.programstageinstanceid, uif.phonenumber,prm.templatemessage, p.name, org.name as orgunitName ," + " pg.name as programName, ps.name as programStageName, psi.duedate, " - + "(DATE(now()) - DATE(psi.duedate) ) as days_since_due_date " + + "(now() - psi.duedate) as days_since_due_date " + " from patient p INNER JOIN programinstance pi " + " ON p.patientid=pi.patientid " + " INNER JOIN programstageinstance psi " @@ -650,7 +650,7 @@ + " and prm.templatemessage is not NULL and prm.templatemessage != '' " + " and pg.type=1 and prm.daysallowedsendmessage is not null " + " and psi.executiondate is not null " - + " and ( DATE(now()) - DATE(psi.duedate) ) = prm.daysallowedsendmessage " + + " and ( now() - psi.duedate ) = prm.daysallowedsendmessage " + " and prm.whentosend is null " + " and prm.sendto = " + PatientReminder.SEND_TO_USER_GROUP; } } \ No newline at end of file === modified file 'dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/patient/PatientReminderServiceTest.java' --- dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/patient/PatientReminderServiceTest.java 2013-11-13 04:19:10 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/patient/PatientReminderServiceTest.java 2013-11-19 03:45:56 +0000 @@ -106,6 +106,7 @@ OrganisationUnit organisationUnit = createOrganisationUnit( 'A' ); organisationUnitService.addOrganisationUnit( organisationUnit ); + Set orgUnits = new HashSet(); orgUnits.add( organisationUnit ); === modified file 'dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramInstanceServiceTest.java' --- dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramInstanceServiceTest.java 2013-11-14 09:51:24 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramInstanceServiceTest.java 2013-11-19 03:45:56 +0000 @@ -39,6 +39,7 @@ import java.util.Set; import org.hisp.dhis.DhisSpringTest; +import org.hisp.dhis.message.MessageConversation; import org.hisp.dhis.mock.MockI18nFormat; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.organisationunit.OrganisationUnitService; @@ -76,9 +77,9 @@ @Autowired private ProgramStageService programStageService; - + @Autowired - private SmsConfigurationManager smsConfigurationManager; + private SmsConfigurationManager smsConfigurationManager; private Date incidenDate; @@ -107,10 +108,10 @@ private Collection orgunitIds; private MockI18nFormat mockFormat; - + @Autowired JdbcTemplate jdbcTemplate; - + @Override public void setUpTest() { @@ -127,24 +128,23 @@ orgunitIds.add( idB ); programA = createProgram( 'A', new HashSet(), organisationUnitA ); - + PatientReminder patientReminderA = new PatientReminder( "A", 0, "Test program message template " + PatientReminder.TEMPLATE_MESSSAGE_PATIENT_NAME, PatientReminder.ENROLLEMENT_DATE_TO_COMPARE, PatientReminder.SEND_TO_PATIENT, null, PatientReminder.MESSAGE_TYPE_BOTH ); - + PatientReminder patientReminderB = new PatientReminder( "B", 0, "Test program message template " + PatientReminder.TEMPLATE_MESSSAGE_PATIENT_NAME, PatientReminder.ENROLLEMENT_DATE_TO_COMPARE, PatientReminder.SEND_TO_PATIENT, PatientReminder.SEND_WHEN_TO_C0MPLETED_EVENT, PatientReminder.MESSAGE_TYPE_BOTH ); - + Set patientReminders = new HashSet(); patientReminders.add( patientReminderA ); patientReminders.add( patientReminderB ); programA.setPatientReminders( patientReminders ); - - programService.addProgram( programA ); - - + + programService.addProgram( programA ); + ProgramStage stageA = new ProgramStage( "StageA", programA ); programStageService.saveProgramStage( stageA ); @@ -566,13 +566,13 @@ this.createSMSConfiguration(); SmsConfiguration smsConfiguration = new SmsConfiguration(); smsConfiguration.setEnabled( true ); - + programInstanceService.addProgramInstance( programInstanceB ); - Collection outboundSmsList = programInstanceService.sendMessages( programInstanceA, + Collection messages = programInstanceService.sendMessageConversations( programInstanceA, PatientReminder.SEND_WHEN_TO_C0MPLETED_EVENT, mockFormat ); - assertEquals( 1, outboundSmsList.size() ); - assertEquals( "Test program message template NameA", outboundSmsList.iterator().next().getMessage() ); + assertEquals( 1, messages.size() ); + assertEquals( "Test program message template NameA", messages.iterator().next().getMessages().get( 0 ).getText() ); } @Test @@ -619,20 +619,21 @@ assertEquals( ProgramInstance.STATUS_CANCELLED, programInstanceService.getProgramInstance( idA ).getStatus() ); assertEquals( ProgramInstance.STATUS_CANCELLED, programInstanceService.getProgramInstance( idD ).getStatus() ); } - - private void createSMSConfiguration() { + + private void createSMSConfiguration() + { BulkSmsGatewayConfig bulkGatewayConfig = new BulkSmsGatewayConfig(); bulkGatewayConfig.setName( "bulksms" ); bulkGatewayConfig.setPassword( "bulk" ); bulkGatewayConfig.setUsername( "bulk" ); bulkGatewayConfig.setRegion( "uk" ); bulkGatewayConfig.setDefault( true ); - + SmsConfiguration smsConfig = new SmsConfiguration(); smsConfig.setPollingInterval( 3000 ); smsConfig.getGateways().add( bulkGatewayConfig ); smsConfig.setEnabled( true ); smsConfigurationManager.updateSmsConfiguration( smsConfig ); - + } } === modified file 'dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramStageDataElementServiceTest.java' --- dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramStageDataElementServiceTest.java 2013-11-15 04:35:36 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramStageDataElementServiceTest.java 2013-11-19 03:45:56 +0000 @@ -118,16 +118,12 @@ dataElementService.addDataElement( dataElementB ); stageDataElementA = new ProgramStageDataElement( stageA, dataElementA, false, 1 ); - programStageDataElementService.addProgramStageDataElement( stageDataElementA ); stageDataElementB = new ProgramStageDataElement( stageA, dataElementB, false, 2 ); - programStageDataElementService.addProgramStageDataElement( stageDataElementB ); stageDataElementC = new ProgramStageDataElement( stageB, dataElementA, false, 1 ); - programStageDataElementService.addProgramStageDataElement( stageDataElementA ); stageDataElementD = new ProgramStageDataElement( stageB, dataElementB, false, 2 ); - programStageDataElementService.addProgramStageDataElement( stageDataElementB ); } @Test === added file 'dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramStageInstanceServiceTest.java' --- dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramStageInstanceServiceTest.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramStageInstanceServiceTest.java 2013-11-19 03:45:56 +0000 @@ -0,0 +1,621 @@ +/* + * Copyright (c) 2004-2013, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.hisp.dhis.program; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.hisp.dhis.DhisSpringTest; +import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.dataelement.DataElementService; +import org.hisp.dhis.dataentryform.DataEntryFormService; +import org.hisp.dhis.message.MessageConversation; +import org.hisp.dhis.mock.MockI18nFormat; +import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.organisationunit.OrganisationUnitService; +import org.hisp.dhis.patient.Patient; +import org.hisp.dhis.patient.PatientReminder; +import org.hisp.dhis.patient.PatientService; +import org.hisp.dhis.period.PeriodType; +import org.hisp.dhis.sms.config.BulkSmsGatewayConfig; +import org.hisp.dhis.sms.config.SmsConfiguration; +import org.hisp.dhis.sms.config.SmsConfigurationManager; +import org.hisp.dhis.sms.outbound.OutboundSms; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Chau Thu Tran + * + * @version $ ProgramStageInstanceServiceTest.java Nov 14, 2013 4:22:27 PM $ + */ +public class ProgramStageInstanceServiceTest + extends DhisSpringTest +{ + @Autowired + private ProgramStageInstanceService programStageInstanceService; + + @Autowired + private ProgramStageDataElementStore programStageDataElementStore; + + @Autowired + private OrganisationUnitService organisationUnitService; + + @Autowired + private DataElementService dataElementService; + + @Autowired + private ProgramService programService; + + @Autowired + private DataEntryFormService dataEntryFormService; + + @Autowired + private ProgramStageService programStageService; + + @Autowired + private PatientService patientService; + + @Autowired + private ProgramInstanceService programInstanceService; + + @Autowired + private SmsConfigurationManager smsConfigurationManager; + + private OrganisationUnit organisationUnitA; + + private OrganisationUnit organisationUnitB; + + private int orgunitAId; + + private int orgunitBId; + + private ProgramStage stageA; + + private ProgramStage stageB; + + private ProgramStage stageC; + + private ProgramStage stageD; + + private DataElement dataElementA; + + private DataElement dataElementB; + + private ProgramStageDataElement stageDataElementA; + + private ProgramStageDataElement stageDataElementB; + + private ProgramStageDataElement stageDataElementC; + + private ProgramStageDataElement stageDataElementD; + + private Date incidenDate; + + private Date enrollmentDate; + + private ProgramInstance programInstanceA; + + private ProgramInstance programInstanceB; + + private ProgramStageInstance programStageInstanceA; + + private ProgramStageInstance programStageInstanceB; + + private ProgramStageInstance programStageInstanceC; + + private ProgramStageInstance programStageInstanceD1; + + private ProgramStageInstance programStageInstanceD2; + + private Patient patientA; + + private Patient patientB; + + private Program programA; + + private MockI18nFormat mockFormat; + + @Override + public void setUpTest() + { + mockFormat = new MockI18nFormat(); + + organisationUnitA = createOrganisationUnit( 'A' ); + orgunitAId = organisationUnitService.addOrganisationUnit( organisationUnitA ); + + organisationUnitB = createOrganisationUnit( 'B' ); + orgunitBId = organisationUnitService.addOrganisationUnit( organisationUnitB ); + + patientA = createPatient( 'A', organisationUnitA ); + patientService.savePatient( patientA ); + + patientB = createPatient( 'B', organisationUnitB ); + patientService.savePatient( patientB ); + + /** + * Program A + */ + programA = createProgram( 'A', new HashSet(), organisationUnitA ); + programService.addProgram( programA ); + + stageA = new ProgramStage( "A", programA ); + + PatientReminder patientReminderA = new PatientReminder( "A", 0, "Test program stage message template " + + PatientReminder.TEMPLATE_MESSSAGE_PATIENT_NAME, PatientReminder.DUE_DATE_TO_COMPARE, + PatientReminder.SEND_TO_PATIENT, null, PatientReminder.MESSAGE_TYPE_BOTH ); + + PatientReminder patientReminderB = new PatientReminder( "B", 0, "Test program stage message template " + + PatientReminder.TEMPLATE_MESSSAGE_PATIENT_NAME, PatientReminder.DUE_DATE_TO_COMPARE, + PatientReminder.SEND_TO_PATIENT, PatientReminder.SEND_WHEN_TO_C0MPLETED_EVENT, + PatientReminder.MESSAGE_TYPE_BOTH ); + + Set patientReminders = new HashSet(); + patientReminders.add( patientReminderA ); + patientReminders.add( patientReminderB ); + stageA.setPatientReminders( patientReminders ); + + programStageService.saveProgramStage( stageA ); + + stageB = new ProgramStage( "B", programA ); + PatientReminder patientReminderC = new PatientReminder( "C", 0, "Test program stage message template " + + PatientReminder.TEMPLATE_MESSSAGE_PATIENT_NAME, PatientReminder.DUE_DATE_TO_COMPARE, + PatientReminder.SEND_TO_PATIENT, PatientReminder.SEND_WHEN_TO_C0MPLETED_EVENT, + PatientReminder.MESSAGE_TYPE_BOTH ); + + patientReminders = new HashSet(); + patientReminders.add( patientReminderC ); + stageB.setPatientReminders( patientReminders ); + programStageService.saveProgramStage( stageB ); + + Set programStages = new HashSet(); + programStages.add( stageA ); + programStages.add( stageB ); + programA.setProgramStages( programStages ); + programService.updateProgram( programA ); + + dataElementA = createDataElement( 'A' ); + dataElementB = createDataElement( 'B' ); + + dataElementService.addDataElement( dataElementA ); + dataElementService.addDataElement( dataElementB ); + + stageDataElementA = new ProgramStageDataElement( stageA, dataElementA, false, 1 ); + stageDataElementB = new ProgramStageDataElement( stageA, dataElementB, false, 2 ); + stageDataElementC = new ProgramStageDataElement( stageB, dataElementA, false, 1 ); + stageDataElementD = new ProgramStageDataElement( stageB, dataElementB, false, 2 ); + + programStageDataElementStore.save( stageDataElementA ); + programStageDataElementStore.save( stageDataElementB ); + programStageDataElementStore.save( stageDataElementC ); + programStageDataElementStore.save( stageDataElementD ); + + /** + * Program B + */ + + Program programB = createProgram( 'B', new HashSet(), organisationUnitB ); + programService.addProgram( programB ); + + stageC = new ProgramStage( "C", programB ); + programStageService.saveProgramStage( stageC ); + + stageD = new ProgramStage( "D", programB ); + stageC.setIrregular( true ); + programStageService.saveProgramStage( stageD ); + + programStages = new HashSet(); + programStages.add( stageC ); + programStages.add( stageD ); + programB.setProgramStages( programStages ); + programService.updateProgram( programB ); + + /** + * Program Instance and Program Stage Instance + */ + + Calendar calIncident = Calendar.getInstance(); + PeriodType.clearTimeOfDay( calIncident ); + calIncident.add( Calendar.DATE, -70 ); + incidenDate = calIncident.getTime(); + + Calendar calEnrollment = Calendar.getInstance(); + PeriodType.clearTimeOfDay( calEnrollment ); + enrollmentDate = calEnrollment.getTime(); + + programInstanceA = new ProgramInstance( enrollmentDate, incidenDate, patientA, programA ); + programInstanceA.setUid( "UID-PIA" ); + programInstanceService.addProgramInstance( programInstanceA ); + + programInstanceB = new ProgramInstance( enrollmentDate, incidenDate, patientB, programB ); + programInstanceService.addProgramInstance( programInstanceB ); + + programStageInstanceA = new ProgramStageInstance( programInstanceA, stageA ); + programStageInstanceA.setDueDate( enrollmentDate ); + programStageInstanceA.setUid( "UID-A" ); + + programStageInstanceB = new ProgramStageInstance( programInstanceA, stageB ); + programStageInstanceB.setDueDate( enrollmentDate ); + programStageInstanceB.setUid( "UID-B" ); + + programStageInstanceC = new ProgramStageInstance( programInstanceB, stageC ); + programStageInstanceC.setDueDate( enrollmentDate ); + programStageInstanceC.setUid( "UID-C" ); + + programStageInstanceD1 = new ProgramStageInstance( programInstanceB, stageD ); + programStageInstanceD1.setDueDate( enrollmentDate ); + programStageInstanceD1.setUid( "UID-D1" ); + + programStageInstanceD2 = new ProgramStageInstance( programInstanceB, stageD ); + programStageInstanceD2.setDueDate( enrollmentDate ); + programStageInstanceD2.setUid( "UID-D2" ); + } + + @Test + public void testAddProgramStageInstance() + { + int idA = programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + int idB = programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + + assertNotNull( programStageInstanceService.getProgramStageInstance( idA ) ); + assertNotNull( programStageInstanceService.getProgramStageInstance( idB ) ); + } + + @Test + public void testDeleteProgramStageInstance() + { + int idA = programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + int idB = programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + + assertNotNull( programStageInstanceService.getProgramStageInstance( idA ) ); + assertNotNull( programStageInstanceService.getProgramStageInstance( idB ) ); + + programStageInstanceService.deleteProgramStageInstance( programStageInstanceA ); + + assertNull( programStageInstanceService.getProgramStageInstance( idA ) ); + assertNotNull( programStageInstanceService.getProgramStageInstance( idB ) ); + + programStageInstanceService.deleteProgramStageInstance( programStageInstanceB ); + + assertNull( programStageInstanceService.getProgramStageInstance( idA ) ); + assertNull( programStageInstanceService.getProgramStageInstance( idB ) ); + } + + @Test + public void testUpdateProgramStageInstance() + { + int idA = programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + + assertNotNull( programStageInstanceService.getProgramStageInstance( idA ) ); + + programStageInstanceA.setName( "B" ); + programStageInstanceService.updateProgramStageInstance( programStageInstanceA ); + + assertEquals( "B", programStageInstanceService.getProgramStageInstance( idA ).getName() ); + } + + @Test + public void testGetProgramStageInstanceById() + { + int idA = programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + int idB = programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + + assertEquals( programStageInstanceA, programStageInstanceService.getProgramStageInstance( idA ) ); + assertEquals( programStageInstanceB, programStageInstanceService.getProgramStageInstance( idB ) ); + } + + @Test + public void testGetProgramStageInstanceByUid() + { + int idA = programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + int idB = programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + + assertEquals( programStageInstanceA, programStageInstanceService.getProgramStageInstance( idA ) ); + assertEquals( programStageInstanceB, programStageInstanceService.getProgramStageInstance( idB ) ); + + assertEquals( programStageInstanceA, programStageInstanceService.getProgramStageInstance( "UID-A" ) ); + assertEquals( programStageInstanceB, programStageInstanceService.getProgramStageInstance( "UID-B" ) ); + } + + @Test + public void testGetProgramStageInstanceByProgramInstanceStage() + { + programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + + ProgramStageInstance programStageInstance = programStageInstanceService.getProgramStageInstance( + programInstanceA, stageA ); + assertEquals( programStageInstanceA, programStageInstance ); + + programStageInstance = programStageInstanceService.getProgramStageInstance( programInstanceA, stageB ); + assertEquals( programStageInstanceB, programStageInstance ); + } + + @Test + public void testGetProgramStageInstanceListByProgramInstanceStage() + { + programStageInstanceService.addProgramStageInstance( programStageInstanceD1 ); + programStageInstanceService.addProgramStageInstance( programStageInstanceD2 ); + + Collection stageInstances = programStageInstanceService.getProgramStageInstances( + programInstanceB, stageD ); + assertEquals( 2, stageInstances.size() ); + assertTrue( stageInstances.contains( programStageInstanceD1 ) ); + assertTrue( stageInstances.contains( programStageInstanceD2 ) ); + } + + @Test + public void testGetProgramStageInstancesByInstanceListComplete() + { + programStageInstanceA.setCompleted( true ); + programStageInstanceB.setCompleted( false ); + programStageInstanceC.setCompleted( true ); + programStageInstanceD1.setCompleted( false ); + + programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + programStageInstanceService.addProgramStageInstance( programStageInstanceC ); + programStageInstanceService.addProgramStageInstance( programStageInstanceD1 ); + + Collection programInstances = new HashSet(); + programInstances.add( programInstanceA ); + programInstances.add( programInstanceB ); + + Collection stageInstances = programStageInstanceService.getProgramStageInstances( + programInstances, true ); + assertEquals( 2, stageInstances.size() ); + assertTrue( stageInstances.contains( programStageInstanceA ) ); + assertTrue( stageInstances.contains( programStageInstanceC ) ); + + stageInstances = programStageInstanceService.getProgramStageInstances( programInstances, false ); + assertEquals( 2, stageInstances.size() ); + assertTrue( stageInstances.contains( programStageInstanceB ) ); + assertTrue( stageInstances.contains( programStageInstanceD1 ) ); + } + + @Test + public void testStatusProgramStageInstances() + { + programStageInstanceA.setCompleted( true ); + programStageInstanceC.setStatus( ProgramStageInstance.SKIPPED_STATUS ); + + int idA = programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + int idB = programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + int idC = programStageInstanceService.addProgramStageInstance( programStageInstanceC ); + int idD = programStageInstanceService.addProgramStageInstance( programStageInstanceD1 ); + + Collection programStageInstances = new HashSet(); + programStageInstances.add( programStageInstanceA ); + programStageInstances.add( programStageInstanceB ); + programStageInstances.add( programStageInstanceC ); + programStageInstances.add( programStageInstanceD1 ); + + Map expectedMap = new HashMap(); + expectedMap.put( idA, ProgramStageInstance.COMPLETED_STATUS ); + expectedMap.put( idB, ProgramStageInstance.FUTURE_VISIT_STATUS ); + expectedMap.put( idC, ProgramStageInstance.SKIPPED_STATUS ); + expectedMap.put( idD, ProgramStageInstance.FUTURE_VISIT_STATUS ); + + Map actualMap = programStageInstanceService + .statusProgramStageInstances( programStageInstances ); + assertEquals( expectedMap, actualMap ); + } + + @Test + public void testGetProgramStageInstancesByPatientStatus() + { + programStageInstanceA.setCompleted( true ); + programStageInstanceB.setCompleted( false ); + programStageInstanceC.setCompleted( true ); + programStageInstanceD1.setCompleted( true ); + + programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + programStageInstanceService.addProgramStageInstance( programStageInstanceC ); + programStageInstanceService.addProgramStageInstance( programStageInstanceD1 ); + + List stageInstances = programStageInstanceService.getProgramStageInstances( patientA, + true ); + assertEquals( 1, stageInstances.size() ); + assertTrue( stageInstances.contains( programStageInstanceA ) ); + + stageInstances = programStageInstanceService.getProgramStageInstances( patientA, false ); + assertEquals( 1, stageInstances.size() ); + assertTrue( stageInstances.contains( programStageInstanceB ) ); + } + + @Test + public void testUpdateProgramStageInstances() + { + int idA = programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + int idB = programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + + OutboundSms outboundSms = new OutboundSms(); + Collection programStageInstances = new HashSet(); + programStageInstances.add( idA ); + programStageInstances.add( idB ); + + programStageInstanceService.updateProgramStageInstances( programStageInstances, outboundSms ); + assertTrue( programStageInstanceService.getProgramStageInstance( idA ).getOutboundSms().contains( outboundSms ) ); + assertTrue( programStageInstanceService.getProgramStageInstance( idB ).getOutboundSms().contains( outboundSms ) ); + } + + @Test + public void testGetProgramStageInstancesByOuPeriodProgram() + { + programStageInstanceA.setExecutionDate( enrollmentDate ); + programStageInstanceA.setOrganisationUnit( organisationUnitA ); + programStageInstanceB.setExecutionDate( enrollmentDate ); + programStageInstanceB.setOrganisationUnit( organisationUnitB ); + + programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + + Collection orgunitIds = new HashSet(); + orgunitIds.add( orgunitAId ); + orgunitIds.add( orgunitBId ); + + Collection result = programStageInstanceService.getProgramStageInstances( programA, + orgunitIds, incidenDate, enrollmentDate, false ); + + assertEquals( 2, result.size() ); + assertTrue( result.contains( programStageInstanceA ) ); + assertTrue( result.contains( programStageInstanceB ) ); + } + + @Test + public void testGetOverDueEventCount() + { + Calendar cal = Calendar.getInstance(); + PeriodType.clearTimeOfDay( cal ); + cal.add( Calendar.DATE, -1 ); + Date date = cal.getTime(); + + programStageInstanceA.setDueDate( date ); + programStageInstanceB.setDueDate( date ); + + programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + + Collection orgunitIds = new HashSet(); + orgunitIds.add( orgunitAId ); + orgunitIds.add( orgunitBId ); + + int count = programStageInstanceService.getOverDueEventCount( stageA, orgunitIds, incidenDate, enrollmentDate ); + assertEquals( 1, count ); + } + + @Test + public void testGetOrganisationUnitIds() + { + programStageInstanceA.setExecutionDate( enrollmentDate ); + programStageInstanceA.setOrganisationUnit( organisationUnitA ); + programStageInstanceB.setExecutionDate( enrollmentDate ); + programStageInstanceB.setOrganisationUnit( organisationUnitB ); + + programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + + Collection orgunitIds = programStageInstanceService.getOrganisationUnitIds( incidenDate, + enrollmentDate ); + assertEquals( 2, orgunitIds.size() ); + assertTrue( orgunitIds.contains( orgunitAId ) ); + assertTrue( orgunitIds.contains( orgunitBId ) ); + } + + @Test + public void testSendMessages() + { + createSMSConfiguration(); + + programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + + Collection outboundSmsList = programStageInstanceService.sendMessages( programStageInstanceA, + PatientReminder.SEND_WHEN_TO_C0MPLETED_EVENT, mockFormat ); + assertEquals( 1, outboundSmsList.size() ); + assertEquals( "Test program stage message template NameA", outboundSmsList.iterator().next().getMessage() ); + } + + @Test + public void testSendMessageConversations() + { + programStageInstanceService.addProgramStageInstance( programStageInstanceB ); + + Collection messages = programStageInstanceService.sendMessageConversations( + programStageInstanceA, PatientReminder.SEND_WHEN_TO_C0MPLETED_EVENT, mockFormat ); + assertEquals( 1, messages.size() ); + assertEquals( "Test program stage message template NameA", messages.iterator().next().getMessages().get( 0 ) + .getText() ); + } + + @Test + public void testCompleteProgramStageInstance() + { + this.createSMSConfiguration(); + SmsConfiguration smsConfiguration = new SmsConfiguration(); + smsConfiguration.setEnabled( true ); + + int idA = programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + + programStageInstanceService.completeProgramStageInstance( programStageInstanceA, mockFormat ); + assertEquals( true, programStageInstanceService.getProgramStageInstance( idA ).isCompleted() ); + } + + @Test + public void testSetExecutionDate() + { + int idA = programStageInstanceService.addProgramStageInstance( programStageInstanceA ); + + programStageInstanceService.setExecutionDate( programStageInstanceA, enrollmentDate, organisationUnitA ); + + ProgramStageInstance programStageInstance = programStageInstanceService.getProgramStageInstance( idA ); + assertEquals( enrollmentDate, programStageInstance.getExecutionDate() ); + assertEquals( organisationUnitA, programStageInstance.getOrganisationUnit() ); + } + + @Test + public void testCreateProgramStageInstance() + { + programA.setType( Program.SINGLE_EVENT_WITHOUT_REGISTRATION ); + programService.updateProgram( programA ); + + ProgramStageInstance programStageInstance = programStageInstanceService.createProgramStageInstance( patientA, + programA, enrollmentDate, organisationUnitA ); + + assertNotNull( programStageInstanceService.getProgramStageInstance( programStageInstance.getUid() ) ); + } + + private void createSMSConfiguration() + { + BulkSmsGatewayConfig bulkGatewayConfig = new BulkSmsGatewayConfig(); + bulkGatewayConfig.setName( "bulksms" ); + bulkGatewayConfig.setPassword( "bulk" ); + bulkGatewayConfig.setUsername( "bulk" ); + bulkGatewayConfig.setRegion( "uk" ); + bulkGatewayConfig.setDefault( true ); + + SmsConfiguration smsConfig = new SmsConfiguration(); + smsConfig.setPollingInterval( 3000 ); + smsConfig.getGateways().add( bulkGatewayConfig ); + smsConfig.setEnabled( true ); + smsConfigurationManager.updateSmsConfiguration( smsConfig ); + + } + +} \ No newline at end of file === added file 'dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramStageInstanceStoreTest.java' --- dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramStageInstanceStoreTest.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/test/java/org/hisp/dhis/program/ProgramStageInstanceStoreTest.java 2013-11-19 03:45:56 +0000 @@ -0,0 +1,410 @@ +/* + * Copyright (c) 2004-2013, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.hisp.dhis.program; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.hisp.dhis.DhisSpringTest; +import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.dataelement.DataElementService; +import org.hisp.dhis.dataentryform.DataEntryFormService; +import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.organisationunit.OrganisationUnitService; +import org.hisp.dhis.patient.Patient; +import org.hisp.dhis.patient.PatientReminder; +import org.hisp.dhis.patient.PatientService; +import org.hisp.dhis.period.PeriodType; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Chau Thu Tran + * + * @version $ ProgramStageInstanceStoreTest.java Nov 14, 2013 4:22:27 PM $ + */ +public class ProgramStageInstanceStoreTest + extends DhisSpringTest +{ + @Autowired + private ProgramStageInstanceStore programStageInstanceStore; + + @Autowired + private ProgramStageDataElementStore programStageDataElementStore; + + @Autowired + private OrganisationUnitService organisationUnitService; + + @Autowired + private DataElementService dataElementService; + + @Autowired + private ProgramService programService; + + @Autowired + private DataEntryFormService dataEntryFormService; + + @Autowired + private ProgramStageService programStageService; + + @Autowired + private PatientService patientService; + + @Autowired + private ProgramInstanceService programInstanceService; + + private OrganisationUnit organisationUnitA; + + private OrganisationUnit organisationUnitB; + + private int orgunitAId; + + private int orgunitBId; + + private ProgramStage stageA; + + private ProgramStage stageB; + + private ProgramStage stageC; + + private ProgramStage stageD; + + private DataElement dataElementA; + + private DataElement dataElementB; + + private ProgramStageDataElement stageDataElementA; + + private ProgramStageDataElement stageDataElementB; + + private ProgramStageDataElement stageDataElementC; + + private ProgramStageDataElement stageDataElementD; + + private Date incidenDate; + + private Date enrollmentDate; + + private ProgramInstance programInstanceA; + + private ProgramInstance programInstanceB; + + private ProgramStageInstance programStageInstanceA; + + private ProgramStageInstance programStageInstanceB; + + private ProgramStageInstance programStageInstanceC; + + private ProgramStageInstance programStageInstanceD1; + + private ProgramStageInstance programStageInstanceD2; + + private Patient patientA; + + private Patient patientB; + + private Program programA; + + @Override + public void setUpTest() + { + organisationUnitA = createOrganisationUnit( 'A' ); + orgunitAId = organisationUnitService.addOrganisationUnit( organisationUnitA ); + + organisationUnitB = createOrganisationUnit( 'B' ); + orgunitBId = organisationUnitService.addOrganisationUnit( organisationUnitB ); + + patientA = createPatient( 'A', organisationUnitA ); + patientService.savePatient( patientA ); + + patientB = createPatient( 'B', organisationUnitB ); + patientService.savePatient( patientB ); + + /** + * Program A + */ + programA = createProgram( 'A', new HashSet(), organisationUnitA ); + programService.addProgram( programA ); + + stageA = new ProgramStage( "A", programA ); + + PatientReminder patientReminderA = new PatientReminder( "A", 0, "Test program stage message template " + + PatientReminder.TEMPLATE_MESSSAGE_PATIENT_NAME, PatientReminder.DUE_DATE_TO_COMPARE, + PatientReminder.SEND_TO_PATIENT, null, PatientReminder.MESSAGE_TYPE_BOTH ); + + PatientReminder patientReminderB = new PatientReminder( "B", 0, "Test program stage message template " + + PatientReminder.TEMPLATE_MESSSAGE_PATIENT_NAME, PatientReminder.DUE_DATE_TO_COMPARE, + PatientReminder.SEND_TO_PATIENT, PatientReminder.SEND_WHEN_TO_C0MPLETED_EVENT, + PatientReminder.MESSAGE_TYPE_BOTH ); + + Set patientReminders = new HashSet(); + patientReminders.add( patientReminderA ); + patientReminders.add( patientReminderB ); + stageA.setPatientReminders( patientReminders ); + + programStageService.saveProgramStage( stageA ); + + stageB = new ProgramStage( "B", programA ); + PatientReminder patientReminderC = new PatientReminder( "C", 0, "Test program stage message template " + + PatientReminder.TEMPLATE_MESSSAGE_PATIENT_NAME, PatientReminder.DUE_DATE_TO_COMPARE, + PatientReminder.SEND_TO_PATIENT, PatientReminder.SEND_WHEN_TO_C0MPLETED_EVENT, + PatientReminder.MESSAGE_TYPE_BOTH ); + + patientReminders = new HashSet(); + patientReminders.add( patientReminderC ); + stageB.setPatientReminders( patientReminders ); + programStageService.saveProgramStage( stageB ); + + Set programStages = new HashSet(); + programStages.add( stageA ); + programStages.add( stageB ); + programA.setProgramStages( programStages ); + programService.updateProgram( programA ); + + dataElementA = createDataElement( 'A' ); + dataElementB = createDataElement( 'B' ); + + dataElementService.addDataElement( dataElementA ); + dataElementService.addDataElement( dataElementB ); + + stageDataElementA = new ProgramStageDataElement( stageA, dataElementA, false, 1 ); + stageDataElementB = new ProgramStageDataElement( stageA, dataElementB, false, 2 ); + stageDataElementC = new ProgramStageDataElement( stageB, dataElementA, false, 1 ); + stageDataElementD = new ProgramStageDataElement( stageB, dataElementB, false, 2 ); + + programStageDataElementStore.save( stageDataElementA ); + programStageDataElementStore.save( stageDataElementB ); + programStageDataElementStore.save( stageDataElementC ); + programStageDataElementStore.save( stageDataElementD ); + + /** + * Program B + */ + + Program programB = createProgram( 'B', new HashSet(), organisationUnitB ); + programService.addProgram( programB ); + + stageC = new ProgramStage( "C", programB ); + programStageService.saveProgramStage( stageC ); + + stageD = new ProgramStage( "D", programB ); + stageC.setIrregular( true ); + programStageService.saveProgramStage( stageD ); + + programStages = new HashSet(); + programStages.add( stageC ); + programStages.add( stageD ); + programB.setProgramStages( programStages ); + programService.updateProgram( programB ); + + /** + * Program Instance and Program Stage Instance + */ + + Calendar calIncident = Calendar.getInstance(); + PeriodType.clearTimeOfDay( calIncident ); + calIncident.add( Calendar.DATE, -70 ); + incidenDate = calIncident.getTime(); + + Calendar calEnrollment = Calendar.getInstance(); + PeriodType.clearTimeOfDay( calEnrollment ); + enrollmentDate = calEnrollment.getTime(); + + programInstanceA = new ProgramInstance( enrollmentDate, incidenDate, patientA, programA ); + programInstanceA.setUid( "UID-PIA" ); + programInstanceService.addProgramInstance( programInstanceA ); + + programInstanceB = new ProgramInstance( enrollmentDate, incidenDate, patientB, programB ); + programInstanceService.addProgramInstance( programInstanceB ); + + programStageInstanceA = new ProgramStageInstance( programInstanceA, stageA ); + programStageInstanceA.setDueDate( enrollmentDate ); + programStageInstanceA.setUid( "UID-A" ); + + programStageInstanceB = new ProgramStageInstance( programInstanceA, stageB ); + programStageInstanceB.setDueDate( enrollmentDate ); + programStageInstanceB.setUid( "UID-B" ); + + programStageInstanceC = new ProgramStageInstance( programInstanceB, stageC ); + programStageInstanceC.setDueDate( enrollmentDate ); + programStageInstanceC.setUid( "UID-C" ); + + programStageInstanceD1 = new ProgramStageInstance( programInstanceB, stageD ); + programStageInstanceD1.setDueDate( enrollmentDate ); + programStageInstanceD1.setUid( "UID-D1" ); + + programStageInstanceD2 = new ProgramStageInstance( programInstanceB, stageD ); + programStageInstanceD2.setDueDate( enrollmentDate ); + programStageInstanceD2.setUid( "UID-D2" ); + } + + @Test + public void testGetProgramStageInstanceByProgramInstanceStage() + { + programStageInstanceStore.save( programStageInstanceA ); + programStageInstanceStore.save( programStageInstanceB ); + + ProgramStageInstance programStageInstance = programStageInstanceStore.get( programInstanceA, stageA ); + assertEquals( programStageInstanceA, programStageInstance ); + + programStageInstance = programStageInstanceStore.get( programInstanceA, stageB ); + assertEquals( programStageInstanceB, programStageInstance ); + } + + @Test + public void testGetProgramStageInstanceListByProgramInstanceStage() + { + programStageInstanceStore.save( programStageInstanceD1 ); + programStageInstanceStore.save( programStageInstanceD2 ); + + Collection stageInstances = programStageInstanceStore.getAll( programInstanceB, stageD ); + assertEquals( 2, stageInstances.size() ); + assertTrue( stageInstances.contains( programStageInstanceD1 ) ); + assertTrue( stageInstances.contains( programStageInstanceD2 ) ); + } + + @Test + public void testGetProgramStageInstancesByInstanceListComplete() + { + programStageInstanceA.setCompleted( true ); + programStageInstanceB.setCompleted( false ); + programStageInstanceC.setCompleted( true ); + programStageInstanceD1.setCompleted( false ); + + programStageInstanceStore.save( programStageInstanceA ); + programStageInstanceStore.save( programStageInstanceB ); + programStageInstanceStore.save( programStageInstanceC ); + programStageInstanceStore.save( programStageInstanceD1 ); + + Collection programInstances = new HashSet(); + programInstances.add( programInstanceA ); + programInstances.add( programInstanceB ); + + Collection stageInstances = programStageInstanceStore.get( programInstances, true ); + assertEquals( 2, stageInstances.size() ); + assertTrue( stageInstances.contains( programStageInstanceA ) ); + assertTrue( stageInstances.contains( programStageInstanceC ) ); + + stageInstances = programStageInstanceStore.get( programInstances, false ); + assertEquals( 2, stageInstances.size() ); + assertTrue( stageInstances.contains( programStageInstanceB ) ); + assertTrue( stageInstances.contains( programStageInstanceD1 ) ); + } + + @Test + public void testGetProgramStageInstancesByPatientStatus() + { + programStageInstanceA.setCompleted( true ); + programStageInstanceB.setCompleted( false ); + programStageInstanceC.setCompleted( true ); + programStageInstanceD1.setCompleted( true ); + + programStageInstanceStore.save( programStageInstanceA ); + programStageInstanceStore.save( programStageInstanceB ); + programStageInstanceStore.save( programStageInstanceC ); + programStageInstanceStore.save( programStageInstanceD1 ); + + List stageInstances = programStageInstanceStore.get( patientA, true ); + assertEquals( 1, stageInstances.size() ); + assertTrue( stageInstances.contains( programStageInstanceA ) ); + + stageInstances = programStageInstanceStore.get( patientA, false ); + assertEquals( 1, stageInstances.size() ); + assertTrue( stageInstances.contains( programStageInstanceB ) ); + } + + @Test + public void testGetProgramStageInstancesByOuPeriodProgram() + { + programStageInstanceA.setExecutionDate( enrollmentDate ); + programStageInstanceA.setOrganisationUnit( organisationUnitA ); + programStageInstanceB.setExecutionDate( enrollmentDate ); + programStageInstanceB.setOrganisationUnit( organisationUnitB ); + + programStageInstanceStore.save( programStageInstanceA ); + programStageInstanceStore.save( programStageInstanceB ); + + Collection orgunitIds = new HashSet(); + orgunitIds.add( orgunitAId ); + orgunitIds.add( orgunitBId ); + + Collection result = programStageInstanceStore.get( programA, orgunitIds, incidenDate, + enrollmentDate, false ); + + assertEquals( 2, result.size() ); + assertTrue( result.contains( programStageInstanceA ) ); + assertTrue( result.contains( programStageInstanceB ) ); + } + + @Test + public void testGetOverDueEventCount() + { + Calendar cal = Calendar.getInstance(); + PeriodType.clearTimeOfDay( cal ); + cal.add( Calendar.DATE, -1 ); + Date date = cal.getTime(); + + programStageInstanceA.setDueDate( date ); + programStageInstanceB.setDueDate( date ); + + programStageInstanceStore.save( programStageInstanceA ); + programStageInstanceStore.save( programStageInstanceB ); + + Collection orgunitIds = new HashSet(); + orgunitIds.add( orgunitAId ); + orgunitIds.add( orgunitBId ); + + int count = programStageInstanceStore.getOverDueCount( stageA, orgunitIds, incidenDate, enrollmentDate ); + assertEquals( 1, count ); + } + + @Test + public void testGetOrganisationUnitIds() + { + programStageInstanceA.setExecutionDate( enrollmentDate ); + programStageInstanceA.setOrganisationUnit( organisationUnitA ); + programStageInstanceB.setExecutionDate( enrollmentDate ); + programStageInstanceB.setOrganisationUnit( organisationUnitB ); + + programStageInstanceStore.save( programStageInstanceA ); + programStageInstanceStore.save( programStageInstanceB ); + + Collection orgunitIds = programStageInstanceStore.getOrgunitIds( incidenDate, enrollmentDate ); + assertEquals( 2, orgunitIds.size() ); + assertTrue( orgunitIds.contains( orgunitAId ) ); + assertTrue( orgunitIds.contains( orgunitBId ) ); + } + +} \ No newline at end of file