=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/AbstractCalendar.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/AbstractCalendar.java 2014-04-29 07:28:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/AbstractCalendar.java 2014-05-12 09:56:39 +0000 @@ -144,6 +144,24 @@ } @Override + public DateInterval toInterval( DateIntervalType type ) + { + return toInterval( today(), type ); + } + + @Override + public DateInterval toInterval( DateUnit dateUnit, DateIntervalType type ) + { + return toInterval( dateUnit, type, 0, 1 ); + } + + @Override + public DateInterval toInterval( DateIntervalType type, int offset, int length ) + { + return toInterval( today(), type, offset, length ); + } + + @Override public DateUnit today() { DateTime dateTime = DateTime.now( ISOChronology.getInstance() ); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/Calendar.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/Calendar.java 2014-04-29 07:28:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/Calendar.java 2014-05-12 09:56:39 +0000 @@ -118,12 +118,42 @@ /** * Gets interval of type based on DateUnit * @param dateUnit DateUnit representing local year, month, day + * @param type Interval type to get + * @param offset Offset to start at, can be negative of positive + * @param length How many periods to asks for, i.e. type = MONTH, length = 2, two months + * @return Interval for interval type based on dateUnit + * @see DateIntervalType + */ + DateInterval toInterval( DateUnit dateUnit, DateIntervalType type, int offset, int length ); + + /** + * Gets interval of type based on DateUnit using default options, 0 for offset, 1 for length + * @param dateUnit DateUnit representing local year, month, day + * @param type Interval type to get * @return Interval for interval type based on dateUnit * @see DateIntervalType */ DateInterval toInterval( DateUnit dateUnit, DateIntervalType type ); /** + * Gets interval of type based on today's date + * @param type Interval type to get + * @return Interval for interval type based on dateUnit + * @see DateIntervalType + */ + DateInterval toInterval( DateIntervalType type ); + + /** + * Gets interval of type based on today's date + * @param type Interval type to get + * @param offset Offset to start at, can be negative of positive + * @param length How many periods to asks for, i.e. type = MONTH, length = 2, two months + * @return Interval for interval type based on dateUnit + * @see DateIntervalType + */ + DateInterval toInterval( DateIntervalType type, int offset, int length ); + + /** * Gets current date as local DateUnit * @return Today date as local DateUnit */ @@ -221,4 +251,68 @@ * @see http://en.wikipedia.org/wiki/Internationalization_and_localization */ String shortNameOfDay( int day ); + + /** + * Returns a new dateUnit with specified number of days added + * @param dateUnit DateUnit representing local year, month, day + * @param days Days to add + * @return dateUnit + days + */ + DateUnit plusDays( DateUnit dateUnit, int days ); + + /** + * Returns a new dateUnit with specified number of days subtracted + * @param dateUnit DateUnit representing local year, month, day + * @param days Days to subtract + * @return dateUnit - days + */ + DateUnit minusDays( DateUnit dateUnit, int days ); + + /** + * Returns a new dateUnit with specified number of weeks added + * @param dateUnit DateUnit representing local year, month, day + * @param weeks Weeks to add + * @return dateUnit + weeks + */ + DateUnit plusWeeks( DateUnit dateUnit, int weeks ); + + /** + * Returns a new dateUnit with specified number of weeks subtracted + * @param dateUnit DateUnit representing local year, month, day + * @param weeks Weeks to subtract + * @return dateUnit - weeks + */ + DateUnit minusWeeks( DateUnit dateUnit, int weeks ); + + /** + * Returns a new dateUnit with specified number of months added + * @param dateUnit DateUnit representing local year, month, day + * @param months Months to add + * @return dateUnit + months + */ + DateUnit plusMonths( DateUnit dateUnit, int months ); + + /** + * Returns a new dateUnit with specified number of months subtracted + * @param dateUnit DateUnit representing local year, month, day + * @param months Months to subtract + * @return dateUnit - months + */ + DateUnit minusMonths( DateUnit dateUnit, int months ); + + /** + * Returns a new dateUnit with specified number of years added + * @param dateUnit DateUnit representing local year, month, day + * @param years Years to add + * @return dateUnit + years + */ + DateUnit plusYears( DateUnit dateUnit, int years ); + + /** + * Returns a new dateUnit with specified number of years subtracted + * @param dateUnit DateUnit representing local year, month, day + * @param years Years to subtract + * @return dateUnit - years + */ + DateUnit minusYears( DateUnit dateUnit, int years ); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/ChronologyBasedCalendar.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/ChronologyBasedCalendar.java 2014-04-27 02:45:02 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/ChronologyBasedCalendar.java 2014-05-12 09:56:39 +0000 @@ -62,51 +62,121 @@ } @Override - public DateInterval toInterval( DateUnit dateUnit, DateIntervalType type ) + public DateInterval toInterval( DateUnit dateUnit, DateIntervalType type, int offset, int length ) { switch ( type ) { case ISO8601_YEAR: - return toYearIsoInterval( dateUnit ); + return toYearIsoInterval( dateUnit, offset, length ); case ISO8601_MONTH: - return toMonthIsoInterval( dateUnit ); + return toMonthIsoInterval( dateUnit, offset, length ); case ISO8601_WEEK: - return toWeekIsoInterval( dateUnit ); + return toWeekIsoInterval( dateUnit, offset, length ); + case ISO8601_DAY: + return toDayIsoInterval( dateUnit, offset, length ); } return null; } - private DateInterval toYearIsoInterval( DateUnit dateUnit ) - { - DateUnit from = new DateUnit( dateUnit.getYear(), 1, 1 ); - DateUnit to = new DateUnit( dateUnit.getYear(), monthsInYear(), daysInMonth( dateUnit.getYear(), monthsInYear() ) ); - - from.setDayOfWeek( isoWeekday( from ) ); - to.setDayOfWeek( isoWeekday( to ) ); - - return new DateInterval( from, to, DateIntervalType.ISO8601_YEAR ); - } - - private DateInterval toMonthIsoInterval( DateUnit dateUnit ) - { - DateUnit from = new DateUnit( dateUnit.getYear(), dateUnit.getMonth(), 1 ); - DateUnit to = new DateUnit( dateUnit.getYear(), dateUnit.getMonth(), daysInMonth( dateUnit.getYear(), dateUnit.getMonth() ) ); - - from.setDayOfWeek( isoWeekday( from ) ); - to.setDayOfWeek( isoWeekday( to ) ); - - return new DateInterval( from, to, DateIntervalType.ISO8601_MONTH ); - } - - private DateInterval toWeekIsoInterval( DateUnit dateUnit ) - { - DateTime dateTime = new DateTime( dateUnit.getYear(), dateUnit.getMonth(), dateUnit.getDay(), 0, 0, chronology ); - - DateTime from = dateTime.weekOfWeekyear().toInterval().getStart(); - DateTime to = dateTime.weekOfWeekyear().toInterval().getEnd().minusDays( 1 ); - - return new DateInterval( DateUnit.fromDateTime( from ), DateUnit.fromDateTime( to ), DateIntervalType.ISO8601_WEEK ); + private DateInterval toYearIsoInterval( DateUnit dateUnit, int offset, int length ) + { + DateTime from = dateUnit.toDateTime( chronology ); + + if ( offset > 0 ) + { + from = from.plusYears( offset ); + } + else if ( offset < 0 ) + { + from = from.minusYears( -offset ); + } + + DateTime to = new DateTime( from ).plusYears( length ).minusDays( 1 ); + + DateUnit fromDateUnit = DateUnit.fromDateTime( from ); + DateUnit toDateUnit = DateUnit.fromDateTime( to ); + + fromDateUnit.setDayOfWeek( isoWeekday( fromDateUnit ) ); + toDateUnit.setDayOfWeek( isoWeekday( toDateUnit ) ); + + return new DateInterval( toIso( fromDateUnit ), toIso( toDateUnit ), + DateIntervalType.ISO8601_YEAR ); + } + + private DateInterval toMonthIsoInterval( DateUnit dateUnit, int offset, int length ) + { + DateTime from = dateUnit.toDateTime( chronology ); + + if ( offset > 0 ) + { + from = from.plusMonths( offset ); + } + else if ( offset < 0 ) + { + from = from.minusMonths( -offset ); + } + + DateTime to = new DateTime( from ).plusMonths( length ).minusDays( 1 ); + + DateUnit fromDateUnit = DateUnit.fromDateTime( from ); + DateUnit toDateUnit = DateUnit.fromDateTime( to ); + + fromDateUnit.setDayOfWeek( isoWeekday( fromDateUnit ) ); + toDateUnit.setDayOfWeek( isoWeekday( toDateUnit ) ); + + return new DateInterval( toIso( fromDateUnit ), toIso( toDateUnit ), + DateIntervalType.ISO8601_MONTH ); + } + + private DateInterval toWeekIsoInterval( DateUnit dateUnit, int offset, int length ) + { + DateTime from = dateUnit.toDateTime( chronology ); + + if ( offset > 0 ) + { + from = from.plusWeeks( offset ); + } + else if ( offset < 0 ) + { + from = from.minusWeeks( -offset ); + } + + DateTime to = new DateTime( from ).plusWeeks( length ).minusDays( 1 ); + + DateUnit fromDateUnit = DateUnit.fromDateTime( from ); + DateUnit toDateUnit = DateUnit.fromDateTime( to ); + + fromDateUnit.setDayOfWeek( isoWeekday( fromDateUnit ) ); + toDateUnit.setDayOfWeek( isoWeekday( toDateUnit ) ); + + return new DateInterval( toIso( fromDateUnit ), toIso( toDateUnit ), + DateIntervalType.ISO8601_WEEK ); + } + + private DateInterval toDayIsoInterval( DateUnit dateUnit, int offset, int length ) + { + DateTime from = dateUnit.toDateTime( chronology ); + + if ( offset > 0 ) + { + from = from.plusDays( offset ); + } + else if ( offset < 0 ) + { + from = from.minusDays( -offset ); + } + + DateTime to = new DateTime( from ).plusDays( length ); + + DateUnit fromDateUnit = DateUnit.fromDateTime( from ); + DateUnit toDateUnit = DateUnit.fromDateTime( to ); + + fromDateUnit.setDayOfWeek( isoWeekday( fromDateUnit ) ); + toDateUnit.setDayOfWeek( isoWeekday( toDateUnit ) ); + + return new DateInterval( toIso( fromDateUnit ), toIso( toDateUnit ), + DateIntervalType.ISO8601_DAY ); } @Override @@ -164,4 +234,60 @@ DateTime dateTime = dateUnit.toDateTime( chronology ); return dateTime.getDayOfWeek(); } + + @Override + public DateUnit plusDays( DateUnit dateUnit, int days ) + { + DateTime dateTime = dateUnit.toDateTime( chronology ); + return DateUnit.fromDateTime( dateTime.plusDays( days ) ); + } + + @Override + public DateUnit minusDays( DateUnit dateUnit, int days ) + { + DateTime dateTime = dateUnit.toDateTime( chronology ); + return DateUnit.fromDateTime( dateTime.minusDays( days ) ); + } + + @Override + public DateUnit plusWeeks( DateUnit dateUnit, int weeks ) + { + DateTime dateTime = dateUnit.toDateTime( chronology ); + return DateUnit.fromDateTime( dateTime.plusWeeks( weeks ) ); + } + + @Override + public DateUnit minusWeeks( DateUnit dateUnit, int weeks ) + { + DateTime dateTime = dateUnit.toDateTime( chronology ); + return DateUnit.fromDateTime( dateTime.minusWeeks( weeks ) ); + } + + @Override + public DateUnit plusMonths( DateUnit dateUnit, int months ) + { + DateTime dateTime = dateUnit.toDateTime( chronology ); + return DateUnit.fromDateTime( dateTime.plusMonths( months ) ); + } + + @Override + public DateUnit minusMonths( DateUnit dateUnit, int months ) + { + DateTime dateTime = dateUnit.toDateTime( chronology ); + return DateUnit.fromDateTime( dateTime.minusMonths( months ) ); + } + + @Override + public DateUnit plusYears( DateUnit dateUnit, int years ) + { + DateTime dateTime = dateUnit.toDateTime( chronology ); + return DateUnit.fromDateTime( dateTime.plusYears( years ) ); + } + + @Override + public DateUnit minusYears( DateUnit dateUnit, int years ) + { + DateTime dateTime = dateUnit.toDateTime( chronology ); + return DateUnit.fromDateTime( dateTime.minusYears( years ) ); + } } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/DateIntervalType.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/DateIntervalType.java 2014-04-27 02:45:02 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/DateIntervalType.java 2014-05-12 09:56:39 +0000 @@ -37,5 +37,5 @@ * Gives interval for a year, month or week based on ISO 8601. * @see http://en.wikipedia.org/wiki/ISO_8601 */ - ISO8601_YEAR, ISO8601_MONTH, ISO8601_WEEK + ISO8601_YEAR, ISO8601_MONTH, ISO8601_WEEK, ISO8601_DAY } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/DateUnit.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/DateUnit.java 2014-05-05 08:08:38 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/DateUnit.java 2014-05-12 09:56:39 +0000 @@ -70,6 +70,14 @@ { } + public DateUnit( DateUnit dateUnit ) + { + this.year = dateUnit.getYear(); + this.month = dateUnit.getMonth(); + this.day = dateUnit.getDay(); + this.dayOfWeek = dateUnit.getDayOfWeek(); + } + public DateUnit( int year, int month, int day ) { this.year = year; === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/impl/NepaliCalendar.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/impl/NepaliCalendar.java 2014-04-29 07:28:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/calendar/impl/NepaliCalendar.java 2014-05-12 09:56:39 +0000 @@ -94,65 +94,43 @@ DateTime start = startIso.toDateTime(); DateTime end = dateUnit.toDateTime(); - int days = Days.daysBetween( start, end ).getDays(); - - int curYear = startNepal.getYear(); - int curMonth = startNepal.getMonth(); - int curDay = startNepal.getDay(); - int dayOfWeek = startNepal.getDayOfWeek(); - - while ( days != 0 ) - { - // days in month - int dm = conversionMap.get( curYear )[curMonth]; - - curDay++; - - if ( curDay > dm ) - { - curMonth++; - curDay = 1; - } - - if ( curMonth > 12 ) - { - curYear++; - curMonth = 1; - } - - dayOfWeek++; - - if ( dayOfWeek > 7 ) - { - dayOfWeek = 1; - } - - days--; - } - - return new DateUnit( curYear, curMonth, curDay, dayOfWeek ); + return plusDays( startNepal, Days.daysBetween( start, end ).getDays() ); } @Override - public DateInterval toInterval( DateUnit dateUnit, DateIntervalType type ) + public DateInterval toInterval( DateUnit dateUnit, DateIntervalType type, int offset, int length ) { switch ( type ) { case ISO8601_YEAR: - return toYearIsoInterval( dateUnit ); + return toYearIsoInterval( dateUnit, offset, length ); case ISO8601_MONTH: - return toMonthIsoInterval( dateUnit ); + return toMonthIsoInterval( dateUnit, offset, length ); case ISO8601_WEEK: - return toWeekIsoInterval( dateUnit ); + return toWeekIsoInterval( dateUnit, offset, length ); + case ISO8601_DAY: + return toDayIsoInterval( dateUnit, offset, length ); } return null; } - private DateInterval toYearIsoInterval( DateUnit dateUnit ) + private DateInterval toYearIsoInterval( DateUnit dateUnit, int offset, int length ) { - DateUnit from = new DateUnit( dateUnit.getYear(), 1, 1 ); - DateUnit to = new DateUnit( dateUnit.getYear(), monthsInYear(), daysInMonth( dateUnit.getYear(), monthsInYear() ) ); + DateUnit from = new DateUnit( dateUnit ); + + if ( offset > 0 ) + { + from = plusYears( from, offset ); + } + else if ( offset < 0 ) + { + from = minusYears( from, -offset ); + } + + DateUnit to = new DateUnit( from ); + to = plusYears( to, length ); + to = minusDays( to, length ); from = toIso( from ); to = toIso( to ); @@ -160,10 +138,22 @@ return new DateInterval( from, to, DateIntervalType.ISO8601_YEAR ); } - private DateInterval toMonthIsoInterval( DateUnit dateUnit ) + private DateInterval toMonthIsoInterval( DateUnit dateUnit, int offset, int length ) { - DateUnit from = new DateUnit( dateUnit.getYear(), dateUnit.getMonth(), 1 ); - DateUnit to = new DateUnit( dateUnit.getYear(), dateUnit.getMonth(), daysInMonth( dateUnit.getYear(), dateUnit.getMonth() ) ); + DateUnit from = new DateUnit( dateUnit ); + + if ( offset > 0 ) + { + from = plusMonths( from, offset ); + } + else if ( offset < 0 ) + { + from = minusMonths( from, -offset ); + } + + DateUnit to = new DateUnit( from ); + to = plusMonths( to, length ); + to = minusDays( to, 1 ); from = toIso( from ); to = toIso( to ); @@ -171,14 +161,49 @@ return new DateInterval( from, to, DateIntervalType.ISO8601_MONTH ); } - private DateInterval toWeekIsoInterval( DateUnit dateUnit ) - { - DateTime dateTime = toIso( dateUnit ).toDateTime(); - - DateTime from = dateTime.weekOfWeekyear().toInterval().getStart(); - DateTime to = dateTime.weekOfWeekyear().toInterval().getEnd().minusDays( 1 ); - - return new DateInterval( DateUnit.fromDateTime( from ), DateUnit.fromDateTime( to ), DateIntervalType.ISO8601_WEEK ); + private DateInterval toWeekIsoInterval( DateUnit dateUnit, int offset, int length ) + { + DateUnit from = new DateUnit( dateUnit ); + + if ( offset > 0 ) + { + from = plusWeeks( from, offset ); + } + else if ( offset < 0 ) + { + from = minusWeeks( from, -offset ); + } + + DateUnit to = new DateUnit( from ); + to = plusWeeks( to, length ); + to = minusDays( to, 1 ); + + from = toIso( from ); + to = toIso( to ); + + return new DateInterval( from, to, DateIntervalType.ISO8601_WEEK ); + } + + private DateInterval toDayIsoInterval( DateUnit dateUnit, int offset, int length ) + { + DateUnit from = new DateUnit( dateUnit ); + + if ( offset > 0 ) + { + from = plusDays( from, offset ); + } + else if ( offset < 0 ) + { + from = minusDays( from, -offset ); + } + + DateUnit to = new DateUnit( from ); + to = plusDays( to, length ); + + from = toIso( from ); + to = toIso( to ); + + return new DateInterval( from, to, DateIntervalType.ISO8601_DAY ); } @Override @@ -284,6 +309,174 @@ return conversionMap.get( year )[0]; } + @Override + public DateUnit minusYears( DateUnit dateUnit, int years ) + { + DateUnit result = new DateUnit( dateUnit.getYear() - years, dateUnit.getMonth(), dateUnit.getDay(), dateUnit.getDayOfWeek() ); + updateDateUnit( result ); + + return result; + } + + @Override + public DateUnit minusMonths( DateUnit dateUnit, int months ) + { + DateUnit result = new DateUnit( dateUnit ); + + while ( months != 0 ) + { + result.setMonth( result.getMonth() - 1 ); + + if ( result.getMonth() < 1 ) + { + result.setMonth( monthsInYear() ); + result.setYear( result.getYear() - 1 ); + } + + months--; + } + + updateDateUnit( result ); + + return result; + } + + @Override + public DateUnit minusWeeks( DateUnit dateUnit, int weeks ) + { + return minusDays( dateUnit, weeks * daysInWeek() ); + } + + @Override + public DateUnit minusDays( DateUnit dateUnit, int days ) + { + int curYear = dateUnit.getYear(); + int curMonth = dateUnit.getMonth(); + int curDay = dateUnit.getDay(); + int dayOfWeek = dateUnit.getDayOfWeek(); + + while ( days != 0 ) + { + curDay--; + + if ( curDay == 0 ) + { + curMonth--; + + if ( curMonth == 0 ) + { + curYear--; + curMonth = 12; + } + + curDay = conversionMap.get( curYear )[curMonth]; + } + + dayOfWeek--; + + if ( dayOfWeek == 0 ) + { + dayOfWeek = 7; + } + + days--; + } + + return new DateUnit( curYear, curMonth, curDay, dayOfWeek ); + } + + @Override + public DateUnit plusYears( DateUnit dateUnit, int years ) + { + DateUnit result = new DateUnit( dateUnit.getYear() + years, dateUnit.getMonth(), dateUnit.getDay(), dateUnit.getDayOfWeek() ); + updateDateUnit( result ); + + return result; + } + + @Override + public DateUnit plusMonths( DateUnit dateUnit, int months ) + { + DateUnit result = new DateUnit( dateUnit ); + + while ( months != 0 ) + { + result.setMonth( result.getMonth() + 1 ); + + if ( result.getMonth() > monthsInYear() ) + { + result.setMonth( 1 ); + result.setYear( result.getYear() + 1 ); + } + + months--; + } + + updateDateUnit( result ); + + return result; + } + + @Override + public DateUnit plusWeeks( DateUnit dateUnit, int weeks ) + { + return plusDays( dateUnit, weeks * daysInWeek() ); + } + + @Override + public DateUnit plusDays( DateUnit dateUnit, int days ) + { + int curYear = dateUnit.getYear(); + int curMonth = dateUnit.getMonth(); + int curDay = dateUnit.getDay(); + int dayOfWeek = dateUnit.getDayOfWeek(); + + while ( days != 0 ) + { + // days in month + int dm = conversionMap.get( curYear )[curMonth]; + + curDay++; + + if ( curDay > dm ) + { + curMonth++; + curDay = 1; + } + + if ( curMonth > 12 ) + { + curYear++; + curMonth = 1; + } + + dayOfWeek++; + + if ( dayOfWeek > 7 ) + { + dayOfWeek = 1; + } + + days--; + } + + return new DateUnit( curYear, curMonth, curDay, dayOfWeek ); + } + + // check if day is more than current maximum for month, don't overflow, just set to maximum + // set day of week + private void updateDateUnit( DateUnit result ) + { + int dm = conversionMap.get( result.getYear() )[result.getMonth()]; + + if ( result.getDay() > dm ) + { + result.setDay( dm ); + } + + result.setDayOfWeek( weekday( result ) ); + } + //------------------------------------------------------------------------------------------------------------ // Conversion map for Nepali calendar // === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryFilter.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryFilter.java 2014-04-21 11:05:22 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryFilter.java 2014-05-12 09:56:39 +0000 @@ -1,8 +1,5 @@ package org.hisp.dhis.common; -import java.util.HashMap; -import java.util.Map; - /* * Copyright (c) 2004-2014, University of Oslo * All rights reserved. @@ -31,6 +28,9 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import java.util.HashMap; +import java.util.Map; + /** * @author Lars Helge Overland */ @@ -38,18 +38,18 @@ { public static final String OPTION_SEP = ";"; - public static final Map OPERATOR_MAP = new HashMap() { { - put( "eq", "=" ); - put( "gt", ">" ); - put( "ge", ">=" ); - put( "lt", "<" ); - put( "le", "<=" ); - put( "ne", "!=" ); - put( "like", "like" ); - put( "in", "in" ); + public static final Map OPERATOR_MAP = new HashMap() { { + put( QueryOperator.EQ, "=" ); + put( QueryOperator.GT, ">" ); + put( QueryOperator.GE, ">=" ); + put( QueryOperator.LT, "<" ); + put( QueryOperator.LE, "<=" ); + put( QueryOperator.NE, "!=" ); + put( QueryOperator.LIKE, "like" ); + put( QueryOperator.IN, "in" ); } }; - protected String operator; + protected QueryOperator operator; protected String filter; @@ -61,7 +61,7 @@ { } - public QueryFilter( String operator, String filter ) + public QueryFilter( QueryOperator operator, String filter ) { this.operator = operator; this.filter = filter; @@ -73,7 +73,7 @@ public boolean isFilter() { - return operator != null && !operator.isEmpty() && filter != null && !filter.isEmpty(); + return operator != null && filter != null && !filter.isEmpty(); } public String getSqlOperator() @@ -83,7 +83,7 @@ return null; } - return OPERATOR_MAP.get( operator.toLowerCase() ); + return OPERATOR_MAP.get( operator ); } public String getSqlFilter( String encodedFilter ) @@ -92,12 +92,12 @@ { return null; } - - if ( operator.equalsIgnoreCase( "like" ) ) + + if ( QueryOperator.LIKE.equals( operator ) ) { return "'%" + encodedFilter + "%'"; } - else if ( operator.equalsIgnoreCase( "in" ) ) + else if ( QueryOperator.IN.equals( operator ) ) { String[] split = encodedFilter.split( OPTION_SEP ); @@ -185,12 +185,12 @@ // Getters and setters // ------------------------------------------------------------------------- - public String getOperator() + public QueryOperator getOperator() { return operator; } - public void setOperator( String operator ) + public void setOperator( QueryOperator operator ) { this.operator = operator; } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryItem.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryItem.java 2014-04-21 11:05:22 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryItem.java 2014-05-12 09:56:39 +0000 @@ -61,7 +61,7 @@ this.numeric = numeric; } - public QueryItem( IdentifiableObject item, String operator, String filter, boolean numeric ) + public QueryItem( IdentifiableObject item, QueryOperator operator, String filter, boolean numeric ) { this.item = item; this.numeric = numeric; === added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryOperator.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryOperator.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryOperator.java 2014-05-12 09:56:39 +0000 @@ -0,0 +1,16 @@ +package org.hisp.dhis.common; + +public enum QueryOperator +{ + EQ, GT, GE, LT, LE, NE, LIKE, IN; + + public static final QueryOperator fromString( String string ) + { + if ( string == null || string.isEmpty() ) + { + return null; + } + + return valueOf( string.toUpperCase() ); + } +} === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStage.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStage.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStage.java 2014-05-12 09:56:39 +0000 @@ -180,6 +180,9 @@ this.reminders = reminders; } + @JsonProperty + @JsonView( { DetailedView.class, ExportView.class } ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public DataEntryForm getDataEntryForm() { return dataEntryForm; === 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 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceService.java 2014-05-12 09:56:39 +0000 @@ -146,25 +146,6 @@ List getProgramStageInstances( TrackedEntityInstance entityInstance, Boolean completed ); /** - * Get an event report of program instance - * - * @param programInstance ProgramInstance - * @param format I18nFormat object - * @param i18n I18n object - * - * @return List of grids. Each grid is included all information of a event - */ - List getProgramStageInstancesReport( ProgramInstance programInstance, I18nFormat format, I18n i18n ); - - /** - * Remove events without any data values - * - * @param programStage Empty events belong to this program stage are removed - * @param organisationUnit Specify an orgunit where empty events belong to - */ - void removeEmptyEvents( ProgramStage programStage, OrganisationUnit organisationUnit ); - - /** * Create relationship between an OutboundSms with many events. * * @param programStageInstances Event list @@ -337,11 +318,4 @@ */ ProgramStageInstance createProgramStageInstance( TrackedEntityInstance entityInstance, Program program, Date executionDate, OrganisationUnit organisationUnit ); - - Grid searchEvents( ProgramStage programStage, List columns, - Collection organisationUnits, Date startDate, Date endDate, Boolean completed, Integer min, - Integer max, I18n i18n ); - - int searchEventsCount( ProgramStage programStage, List columns, - Collection organisationUnits, Boolean completed, Date startDate, Date endDate ); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceStore.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceStore.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceStore.java 2014-05-12 09:56:39 +0000 @@ -35,7 +35,6 @@ import org.hisp.dhis.common.GenericIdentifiableObjectStore; import org.hisp.dhis.common.Grid; import org.hisp.dhis.i18n.I18n; -import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.sms.outbound.OutboundSms; import org.hisp.dhis.trackedentity.TrackedEntityInstance; @@ -102,14 +101,6 @@ List get( TrackedEntityInstance entityInstance, Boolean completed ); /** - * Remove events without any data values - * - * @param programStage Empty events belong to this program stage are removed - * @param organisationUnit Specify an orgunit where empty events belong to - */ - void removeEmptyEvents( ProgramStage programStage, OrganisationUnit organisationUnit ); - - /** * Create relationship between an OutboundSms with many events. * * @param programStageInstances Event list @@ -245,41 +236,4 @@ * @return Grid */ Grid getCompleteness( Collection orgunitIds, Program program, String startDate, String endDate, I18n i18n ); - - /** - * Search {@link ProgramStageInstance} by criteria with result limited - * - * @param programStage {@link ProgramStage} needs for searching events - * @param orgUnits List of {@link OrganisationUnit} ids - * @param columns The criteria for searching - * @param startDate Report date the instance should be on or after. - * @param endDate Report date the instance should be on or before. - * @param completed The status of events. There are three status values, - * NULL for retrieving all events, false for retrieving events - * uncompleted and true for retrieving events completed. - * @param min - * @param max - * @param i18n - * - * @return A grid - */ - Grid searchEvent( ProgramStage programStage, Collection orgUnits, List columns, - Date startDate, Date endDate, Boolean completed, Integer min, Integer max, I18n i18n ); - - /** - * Search {@link ProgramStageInstance} by criteria - * - * @param programStage {@link ProgramStage} needs for searching events - * @param orgUnits List of {@link OrganisationUnit} ids - * @param columns The criteria for searching - * @param startDate Report date the instance should be on or after. - * @param endDate Report date the instance should be on or before. - * @param completed The status of events. There are three status values, - * NULL for retrieving all events, false for retrieving events - * uncompleted and true for retrieving events completed. - * - * @return The number of events - */ - int searchEventsCount( ProgramStage programStage, List columns, - Collection organisationUnits, Date startDate, Date endDate, Boolean completed ); } === 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-21 11:05:22 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceQueryParams.java 2014-05-12 09:56:39 +0000 @@ -159,8 +159,30 @@ // ------------------------------------------------------------------------- /** - * //TODO allow attributes only once and allow multiple filters per item - * + * Adds a query item as attribute to the parameters. + */ + public void addAttribute( QueryItem attribute ) + { + this.attributes.add( attribute ); + } + + /** + * Adds a query item as filter to the parameters. + */ + public void addFilter( QueryItem filter ) + { + this.filters.add( filter ); + } + + /** + * Adds an organisation unit to the parameters. + */ + public void addOrganisationUnit( OrganisationUnit unit ) + { + this.organisationUnits.add( unit ); + } + + /** * Performs a set of operations on this params. * *
    @@ -210,8 +232,35 @@ return setMap; } + + /** + * Add the given attributes to this params if they are not already present. + */ + public void addAttributesIfNotExist( List attrs ) + { + for ( QueryItem attr : attrs ) + { + if ( attributes != null && !attributes.contains( attr ) ) + { + attributes.add( attr ); + } + } + } /** + * Adds the given filters to this params if they are not already present. + */ + public void addFiltersIfNotExist( List filtrs ) + { + for ( QueryItem filter : filtrs ) + { + if ( filters != null && !filters.contains( filter ) ) + { + filters.add( filter ); + } + } + } + /** * Indicates whether this is a logical OR query, meaning that a query string * is specified and instances which matches this query on one or more attributes * should be included in the response. The opposite is an item-specific query, @@ -278,35 +327,7 @@ return duplicates; } - - /** - * Add the given attributes to this params if they are not already present. - */ - public void addAttributesIfNotExist( List attrs ) - { - for ( QueryItem attr : attrs ) - { - if ( attributes != null && !attributes.contains( attr ) ) - { - attributes.add( attr ); - } - } - } - - /** - * Adds the given filters to this params if they are not already present. - */ - public void addFiltersIfNotExist( List filtrs ) - { - for ( QueryItem filter : filtrs ) - { - if ( filters != null && !filters.contains( filter ) ) - { - filters.add( filter ); - } - } - } - + /** * Indicates whether this params specifies any attributes and/or filters. */ === 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-05-04 14:04:41 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceService.java 2014-05-12 09:56:39 +0000 @@ -45,6 +45,49 @@ import org.hisp.dhis.validation.ValidationCriteria; /** + *

    This interface is responsible for retrieving tracked entity instances (TEI). + * The query methods accepts a TrackedEntityInstanceQueryParams object which + * encapsulates all arguments.

    + * + *

    The TEIs are returned as a Grid object, which is a two-dimensional list with + * headers. The TEI attribute values are returned in the same order as specified + * in the arguments. The grid has a set of columns which are always present + * starting at index 0, followed by attributes specified for the query. All + * values in the grid are of type String. The order is:

    + * + *
      + *
    • 0: Tracked entity instance UID
    • + *
    • 1: Created time stamp
    • + *
    • 2: Last updated time stamp
    • + *
    • 3: Organisation unit UID
    • + *
    • 4: Tracked entity UID
    • + *
        + * + *

        Attributes specified in the query follows on the next column indexes. + * Example usage for retrieving TEIs with two attributes using one attribute as + * filter:

        + * + *
        + * 
        + * TrackedEntityInstanceQueryParams params = new TrackedEntityInstanceQueryParams();
        + *
        + * params.addAttribute( new QueryItem( gender, QueryOperator.EQ, "Male", false ) );
        + * params.addAttribute( new QueryItem( age, QueryOperator.LT, "5", true ) );
        + * params.addFilter( new QueryItem( weight, QueryOperator.GT, "2500", true ) );
        + * params.addOrganistionUnit( unit );
        + * 
        + * Grid instances = teiService.getTrackedEntityInstances( params );
        + * 
        + * for ( List<Object> row : instances.getRows() )
        + * {
        + *     String tei = row.get( 0 );
        + *     String ou = row.get( 3 );
        + *     String gender = row.get( 5 );
        + *     String age = row.get( 6 );
        + * }
        + * 
        + * 
        + * * @author Abyot Asalefew Gizaw */ public interface TrackedEntityInstanceService @@ -154,7 +197,7 @@ * @return a collection of all TrackedEntityInstance, or an empty collection * if there are no TrackedEntityInstances. */ - Collection getAllTrackedEntityInstances(); + //Collection getAllTrackedEntityInstances(); /** * Retrieve entityInstances for mobile base on identifier value @@ -184,7 +227,7 @@ * @param program Program * @return TrackedEntityInstance list */ - Collection getTrackedEntityInstances( Program program ); + //Collection getTrackedEntityInstances( Program program ); /** * Retrieve entityInstances registered in a orgunit and enrolled into a @@ -194,16 +237,7 @@ * @param program * @return */ - Collection getTrackedEntityInstances( OrganisationUnit organisationUnit, Program program ); - - /** - * Retrieve entityInstances base on Attribute - * - * @param attributeId - * @param value - * @return - */ - Collection getTrackedEntityInstance( Integer attributeId, String value ); + //Collection getTrackedEntityInstances( OrganisationUnit organisationUnit, Program program ); /** * Search entityInstances base on OrganisationUnit and Program with result @@ -225,8 +259,7 @@ * @param attribute * @return TrackedEntityInstance List */ - Collection sortTrackedEntityInstancesByAttribute( - Collection entityInstances, TrackedEntityAttribute attribute ); + //Collection sortTrackedEntityInstancesByAttribute( Collection entityInstances, TrackedEntityAttribute attribute ); /** * Get entityInstances who has the same representative @@ -241,13 +274,13 @@ * Register a new entityInstance * * @param entityInstance TrackedEntityInstance - * @param representativeId The id of entityInstance who is representative + * @param representativeId The uid of entityInstance who is representative * @param relationshipTypeId The id of relationship type defined * @param attributeValues Set of attribute values * * @return The error code after registering entityInstance */ - int createTrackedEntityInstance( TrackedEntityInstance entityInstance, Integer representativeId, + int createTrackedEntityInstance( TrackedEntityInstance entityInstance, String representativeId, Integer relationshipTypeId, Set attributeValues ); /** @@ -261,7 +294,7 @@ * @param valuesForDelete The entityInstance attribute values for deleting * */ - void updateTrackedEntityInstance( TrackedEntityInstance entityInstance, Integer representativeId, + void updateTrackedEntityInstance( TrackedEntityInstance entityInstance, String representativeId, Integer relationshipTypeId, List valuesForSave, List valuesForUpdate, Collection valuesForDelete ); @@ -273,7 +306,7 @@ * * @return The number of entityInstances */ - int countGetTrackedEntityInstancesByOrgUnit( OrganisationUnit organisationUnit ); + //int countGetTrackedEntityInstancesByOrgUnit( OrganisationUnit organisationUnit ); /** * Get the number of entityInstances who registered into an organisation @@ -284,7 +317,7 @@ * * @return The number of entityInstances */ - int countGetTrackedEntityInstancesByOrgUnitProgram( OrganisationUnit organisationUnit, Program program ); + //int countGetTrackedEntityInstancesByOrgUnitProgram( OrganisationUnit organisationUnit, Program program ); /** * Cache value from String to the value type based on property @@ -298,26 +331,6 @@ Object getObjectValue( String property, String value, I18nFormat format ); /** - * Get events which meet the criteria for searching - * - * @param searchKeys The key for searching entityInstances by attribute - * values and/or a program - * @param orgunit Organisation unit where entityInstances registered - * @param followup Only getting entityInstances with program risked if this - * property is true. And getting entityInstances without program - * risked if its value is false - * @param statusEnrollment The status of program of entityInstances. There - * are three status, includes Active enrollments only, Completed - * enrollments only and Active and completed enrollments - * @parma min - * @param max - * - * @return List of entityInstance - */ - List getProgramStageInstances( List searchKeys, Collection orgunit, - Boolean followup, Integer statusEnrollment, Integer min, Integer max ); - - /** * Search entityInstances by phone number (performs partial search) * * @param phoneNumber The string for searching by phone number @@ -326,7 +339,7 @@ * * @return List of entityInstance */ - Collection getTrackedEntityInstancesByPhone( String phoneNumber, Integer min, Integer max ); + //Collection getTrackedEntityInstancesByPhone( String phoneNumber, Integer min, Integer max ); /** * Validate entityInstance attributes and validation criteria by program @@ -364,8 +377,7 @@ * @return TrackedEntityInstance List */ - Collection searchTrackedEntityInstancesForMobile( String searchText, int orgUnitId, - int attributeId ); + Collection searchTrackedEntityInstancesForMobile( String searchText, int orgUnitId, int attributeId ); /** * Search entityInstances by entityInstance attribute value (performs @@ -378,50 +390,8 @@ * * @return List of TrackedEntityInstance */ - Collection getTrackedEntityInstancesByAttributeValue( String searchText, int attributeId, - Integer min, Integer max ); - - /** - * Search entityInstances by attribute values and/or a program which - * entityInstances enrolled into - * - * @param searchKeys The key for searching entityInstances by attribute - * values, identifiers and/or a program - * @param orgunit Organisation unit where entityInstances registered - * @param followup Only getting entityInstances with program risked if this - * property is true. And getting entityInstances without program - * risked if its value is false - * @param attributes The attribute values of these attribute are displayed - * into result - * @param statusEnrollment The status of program of entityInstances. There - * are three status, includes Active enrollments only, Completed - * enrollments only and Active and completed enrollments - * @param min - * @param max - * - * @return An object - */ - Collection searchTrackedEntityInstances( List searchKeys, - Collection orgunit, Boolean followup, Collection attributes, - Integer statusEnrollment, Integer min, Integer max ); - - /** - * Get the number of entityInstances who meet the criteria for searching - * - * @param searchKeys The key for searching entityInstances by attribute - * values and/or a program - * @param orgunit Organisation unit where entityInstances registered - * @param followup Only getting entityInstances with program risked if this - * property is true. And getting entityInstances without program - * risked if its value is false - * @param statusEnrollment The status of program of entityInstances. There - * are three status, includes Active enrollments only, Completed - * enrollments only and Active and completed enrollments - * - * @return The number of entityInstances - */ - int countSearchTrackedEntityInstances( List searchKeys, Collection orgunit, - Boolean followup, Integer statusEnrollment ); + //Collection getTrackedEntityInstancesByAttributeValue( String searchText, int attributeId, Integer min, Integer max ); + /** * Get entityInstances by {@link TrackedEntity} * @@ -430,5 +400,4 @@ * @return List of entityInstance */ Collection getTrackedEntityInstances( TrackedEntity trackedEntity ); - } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceStore.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceStore.java 2014-05-04 14:04:41 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceStore.java 2014-05-12 09:56:39 +0000 @@ -79,8 +79,7 @@ * * @return List of entityInstances */ - Collection getByOrgUnitProgram( OrganisationUnit organisationUnit, Program program, - Integer min, Integer max ); + Collection getByOrgUnitProgram( OrganisationUnit organisationUnit, Program program, Integer min, Integer max ); /** * Search instances who has the same representative @@ -99,7 +98,7 @@ * * @return The number of entityInstances */ - int countListTrackedEntityInstanceByOrgunit( OrganisationUnit organisationUnit ); + //int countListTrackedEntityInstanceByOrgunit( OrganisationUnit organisationUnit ); /** * Get the number of entityInstances who registered into a certain @@ -113,7 +112,7 @@ * * @return The number of entityInstances */ - int countGetTrackedEntityInstancesByOrgUnitProgram( OrganisationUnit organisationUnit, Program program ); + //int countGetTrackedEntityInstancesByOrgUnitProgram( OrganisationUnit organisationUnit, Program program ); /** * Search entityInstances by phone number (performs partial search) @@ -127,29 +126,6 @@ Collection getByPhoneNumber( String phoneNumber, Integer min, Integer max ); /** - * Search events which meet the criteria for searching - * - * @param searchKeys The key for searching entityInstances by attribute - * values and/or a program - * @param orgunit Organisation unit where entityInstances registered - * @param followup Only getting entityInstances with program risked if this - * property is true. And getting entityInstances without program - * risked if its value is false - * @param attributes The attribute values of these attribute are displayed - * into result - * @param statusEnrollment The status of program of entityInstances. There - * are three status, includes Active enrollments only, Completed - * enrollments only and Active and completed enrollments - * @param min - * @param max - * - * @return List of entityInstances - */ - List getProgramStageInstances( List searchKeys, Collection orgunits, - Boolean followup, Collection attributes, Integer statusEnrollment, Integer min, - Integer max ); - - /** * Search entityInstances who enrolled into a program with active status * * @param program Program @@ -158,7 +134,7 @@ * * return List of entityInstances */ - Collection getByProgram( Program program, Integer min, Integer max ); + //Collection getByProgram( Program program, Integer min, Integer max ); /** * Validate entity-instances attribute values and validation criteria by @@ -198,48 +174,6 @@ */ Collection getByAttributeValue( String searchText, int attributeId, Integer min, Integer max ); - /** - * Search entityInstances by attribute values and/or a program which - * entityInstances enrolled into - * - * @param searchKeys The key for searching entityInstances by attribute - * values, identifiers and/or a program - * @param orgunit Organisation unit where entityInstances registered - * @param followup Only getting entityInstances with program risked if this - * property is true. And getting entityInstances without program - * risked if its value is false - * @param attributes The attribute values of these attribute are displayed - * into result - * @param statusEnrollment The status of program of entityInstances. There - * are three status, includes Active enrollments only, Completed - * enrollments only and Active and completed enrollments - * @param min - * @param max - * - * @return An object - */ - Collection search( List searchKeys, Collection orgunits, - Boolean followup, Collection attributes, Integer statusEnrollment, Integer min, - Integer max ); - - /** - * Get the number of entityInstances who meet the criteria for searching - * - * @param searchKeys The key for searching entityInstances by attribute - * values and/or a program - * @param orgunit Organisation unit where entityInstances registered - * @param followup Only getting entityInstances with program risked if this - * property is true. And getting entityInstances without program - * risked if its value is false - * @param statusEnrollment The status of program of entityInstances. There - * are three status, includes Active enrollments only, Completed - * enrollments only and Active and completed enrollments - * - * @return The number of entityInstances - */ - int countSearch( List searchKeys, Collection orgunits, Boolean followup, - Integer statusEnrollment ); - /** * Get entityInstances by {@link TrackedEntity} * === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsTable.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsTable.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsTable.java 2014-05-12 09:56:39 +0000 @@ -45,7 +45,11 @@ private Period period; private Program program; - + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + public AnalyticsTable() { } @@ -70,7 +74,11 @@ this.period = period; this.program = program; } - + + // ------------------------------------------------------------------------- + // Logic + // ------------------------------------------------------------------------- + public String getTableName() { String name = baseName; @@ -104,13 +112,27 @@ return name; } + + public boolean hasPeriod() + { + return period != null; + } + + public boolean hasProgram() + { + return program != null; + } @Override public String toString() { return getTableName(); } - + + // ------------------------------------------------------------------------- + // Getters and setters + // ------------------------------------------------------------------------- + public String getBaseName() { return baseName; === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventAnalyticsService.java 2014-03-27 11:13:02 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventAnalyticsService.java 2014-05-12 09:56:39 +0000 @@ -49,7 +49,8 @@ * Used for aggregate query. */ EventQueryParams getFromUrl( String program, String stage, String startDate, String endDate, - Set dimension, Set filter, boolean skipMeta, boolean hierarchyMeta, SortOrder sortOrder, Integer limit, I18nFormat format ); + Set dimension, Set filter, boolean skipMeta, boolean hierarchyMeta, SortOrder sortOrder, + Integer limit, boolean uniqueInstances, I18nFormat format ); /** * Used for event query. === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventQueryParams.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventQueryParams.java 2014-04-21 14:52:46 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventQueryParams.java 2014-05-12 09:56:39 +0000 @@ -80,6 +80,8 @@ private Integer limit; + private boolean uniqueInstances; + private boolean coordinatesOnly; // ------------------------------------------------------------------------- @@ -123,6 +125,7 @@ params.pageSize = this.pageSize; params.sortOrder = this.sortOrder; params.limit = this.limit; + params.uniqueInstances = this.uniqueInstances; params.coordinatesOnly = this.coordinatesOnly; params.periodType = this.periodType; @@ -240,6 +243,24 @@ return limit != null && limit > 0; } + /** + * Indicates whether the program of this query requires registration of + * tracked entity instances. + */ + public boolean isProgramRegistration() + { + return program != null && program.isRegistration(); + } + + /** + * Returns a negative integer in case of ascending sort order, a positive in + * case of descending sort order and 0 in case of no sort order. + */ + public int getSortOrderAsInt() + { + return SortOrder.ASC.equals( sortOrder ) ? -1 : SortOrder.DESC.equals( sortOrder ) ? 1 : 0; + } + public String toString() { return "[" + @@ -395,6 +416,16 @@ { this.limit = limit; } + + public boolean isUniqueInstances() + { + return uniqueInstances; + } + + public void setUniqueInstances( boolean uniqueInstances ) + { + this.uniqueInstances = uniqueInstances; + } public boolean isCoordinatesOnly() { === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventAnalyticsService.java 2014-04-28 18:23:49 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventAnalyticsService.java 2014-05-12 09:56:39 +0000 @@ -62,6 +62,7 @@ import org.hisp.dhis.common.Pager; import org.hisp.dhis.common.QueryFilter; import org.hisp.dhis.common.QueryItem; +import org.hisp.dhis.common.QueryOperator; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementService; import org.hisp.dhis.i18n.I18nFormat; @@ -169,6 +170,20 @@ { throw new IllegalQueryException( "Number of rows produced by query is larger than the max limit: " + MAX_ROWS_LIMIT ); } + + // --------------------------------------------------------------------- + // Limit and sort - done again due to potential multiple partitions + // --------------------------------------------------------------------- + + if ( params.hasSortOrder() ) + { + grid.sortGrid( 1, params.getSortOrderAsInt() ); + } + + if ( params.hasLimit() && grid.getHeight() > params.getLimit() ) + { + grid.limitGrid( params.getLimit() ); + } // --------------------------------------------------------------------- // Meta-data @@ -280,14 +295,15 @@ } public EventQueryParams getFromUrl( String program, String stage, String startDate, String endDate, - Set dimension, Set filter, boolean skipMeta, boolean hierarchyMeta, SortOrder sortOrder, Integer limit, - I18nFormat format ) + Set dimension, Set filter, boolean skipMeta, boolean hierarchyMeta, SortOrder sortOrder, + Integer limit, boolean uniqueInstances, I18nFormat format ) { EventQueryParams params = getFromUrl( program, stage, startDate, endDate, dimension, filter, null, null, null, skipMeta, hierarchyMeta, false, null, null, format ); params.setSortOrder( sortOrder ); params.setLimit( limit ); + params.setUniqueInstances( uniqueInstances ); params.setAggregate( true ); return params; @@ -426,7 +442,8 @@ { for ( int i = 1; i < split.length; i += 2 ) { - queryItem.getFilters().add( new QueryFilter( split[i], split[i+1] ) ); + QueryOperator operator = QueryOperator.fromString( split[i] ); + queryItem.getFilters().add( new QueryFilter( operator, split[i+1] ) ); } } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java 2014-04-21 14:52:46 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java 2014-05-12 09:56:39 +0000 @@ -84,7 +84,9 @@ public Grid getAggregatedEventData( EventQueryParams params, Grid grid ) { - String sql = "select count(psi) as value," + getSelectColumns( params ) + " "; + String countClause = ( params.isProgramRegistration() && params.isUniqueInstances() ) ? "count(distinct tei)" : "count(psi)"; + + String sql = "select " + countClause + " as value," + getSelectColumns( params ) + " "; // --------------------------------------------------------------------- // Criteria @@ -269,7 +271,14 @@ { String sql = "select count(psi) "; - sql += getFromWhereClause( params, params.getPartitions().getSinglePartition() ); + if ( params.spansMultiplePartitions() ) + { + sql += getFromWhereMultiplePartitionsClause( params, Arrays.asList( "psi" ) ); + } + else + { + sql += getFromWhereClause( params, params.getPartitions().getSinglePartition() ); + } int count = 0; @@ -325,13 +334,11 @@ private String getFromWhereMultiplePartitionsClause( EventQueryParams params, List fixedColumns ) { - String fixedCols = getSelectString( fixedColumns ); - String sql = "from ("; for ( String partition : params.getPartitions().getPartitions() ) { - sql += "select " + fixedCols + getSelectColumns( params ); + sql += "select " + getSelectString( fixedColumns ) + getSelectColumns( params ); sql += " " + getFromWhereClause( params, partition ); @@ -441,6 +448,11 @@ */ private String getSelectString( List columns ) { + if ( columns == null || columns.isEmpty() ) + { + return ""; + } + String fixedCols = StringUtils.join( columns, ", " ); return StringUtils.defaultIfEmpty( fixedCols + ", ", fixedCols ); === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java 2014-04-07 14:27:23 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java 2014-05-12 09:56:39 +0000 @@ -160,17 +160,19 @@ sql = removeLast( sql, 1 ) + " "; - sql += "from programstageinstance psi " - + "left join programinstance pi on psi.programinstanceid=pi.programinstanceid " - + "left join programstage ps on psi.programstageid=ps.programstageid " - + "left join program pr on pi.programid=pr.programid " - + "left join trackedentityinstance pa on pi.trackedentityinstanceid=pa.trackedentityinstanceid " - + "left join organisationunit ou on psi.organisationunitid=ou.organisationunitid " - + "left join _orgunitstructure ous on psi.organisationunitid=ous.organisationunitid " - + "left join _dateperiodstructure dps on psi.executiondate=dps.dateperiod " - + "where psi.executiondate >= '" + start + "' " + "and psi.executiondate <= '" + end + "' " - + "and pr.programid=" + table.getProgram().getId() + " " + "and psi.organisationunitid is not null " - + "and psi.executiondate is not null"; + sql += "from programstageinstance psi " + + "left join programinstance pi on psi.programinstanceid=pi.programinstanceid " + + "left join programstage ps on psi.programstageid=ps.programstageid " + + "left join program pr on pi.programid=pr.programid " + + "left join trackedentityinstance tei on pi.trackedentityinstanceid=tei.trackedentityinstanceid " + + "left join organisationunit ou on psi.organisationunitid=ou.organisationunitid " + + "left join _orgunitstructure ous on psi.organisationunitid=ous.organisationunitid " + + "left join _dateperiodstructure dps on psi.executiondate=dps.dateperiod " + + "where psi.executiondate >= '" + start + "' " + + "and psi.executiondate <= '" + end + "' " + + "and pr.programid=" + table.getProgram().getId() + " " + + "and psi.organisationunitid is not null " + + "and psi.executiondate is not null"; log.info( "Populate SQL: " + sql ); @@ -246,6 +248,12 @@ columns.addAll( Arrays.asList( psi, ps, ed, longitude, latitude, ou, oun, ouc ) ); + if ( table.hasProgram() && table.getProgram().isRegistration() ) + { + String[] tei = { quote( "tei" ), "character(11)", "tei.uid" }; + columns.add( tei ); + } + return columns; } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/message/EmailMessageSender.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/message/EmailMessageSender.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/message/EmailMessageSender.java 2014-05-12 09:56:39 +0000 @@ -30,8 +30,6 @@ import static org.hisp.dhis.user.UserSettingService.KEY_MESSAGE_EMAIL_NOTIFICATION; -import java.io.Serializable; -import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; @@ -104,8 +102,6 @@ ( sender.getEmail() != null ? ( sender.getEmail() + LB ) : StringUtils.EMPTY ) + ( sender.getPhoneNumber() != null ? ( sender.getPhoneNumber() + LB ) : StringUtils.EMPTY ) ); - Map settings = userService.getUserSettings( KEY_MESSAGE_EMAIL_NOTIFICATION, false ); - try { Email email = getEmail( hostName, port, username, password, tls ); @@ -116,7 +112,7 @@ for ( User user : users ) { - boolean emailNotification = settings.get( user ) != null && (Boolean) settings.get( user ) == true; + boolean emailNotification = (Boolean) userService.getUserSettingValue( user, KEY_MESSAGE_EMAIL_NOTIFICATION, false ); boolean doSend = forceSend || emailNotification; @@ -124,7 +120,7 @@ { email.addBcc( user.getEmail() ); - log.info( "Sending email to user: " + user + " with email address: " + user.getEmail() ); + log.info( "Sending email to user: " + user.getUsername() + " with email address: " + user.getEmail() ); hasRecipients = true; } === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/enrollment/AbstractEnrollmentService.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/enrollment/AbstractEnrollmentService.java 2014-04-15 03:54:06 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/enrollment/AbstractEnrollmentService.java 2014-05-12 09:56:39 +0000 @@ -30,10 +30,12 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; + import org.hisp.dhis.common.Grid; import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.common.OrganisationUnitSelectionMode; import org.hisp.dhis.common.QueryItem; +import org.hisp.dhis.common.QueryOperator; import org.hisp.dhis.dxf2.events.trackedentity.Attribute; import org.hisp.dhis.dxf2.events.trackedentity.TrackedEntityInstance; import org.hisp.dhis.dxf2.events.trackedentity.TrackedEntityInstanceService; @@ -218,9 +220,6 @@ for ( ProgramInstance programInstance : programInstances ) { - // check for null, both for pi, and for pi.entityInstance, there are DBs - // out there where trackedentityinstanceid == null - // even if the program is of type 1/2. if ( programInstance != null && programInstance.getEntityInstance() != null ) { enrollments.getEnrollments().add( getEnrollment( programInstance ) ); @@ -503,17 +502,17 @@ TrackedEntityInstanceQueryParams params = new TrackedEntityInstanceQueryParams(); - QueryItem queryItem = new QueryItem( attribute, "eq", value, false ); - params.getAttributes().add( queryItem ); + QueryItem queryItem = new QueryItem( attribute, QueryOperator.EQ, value, false ); + params.addAttribute( queryItem ); if ( attribute.getOrgunitScope() && attribute.getProgramScope() ) { params.setProgram( program ); - params.getOrganisationUnits().add( organisationUnit ); + params.addOrganisationUnit( organisationUnit ); } else if ( attribute.getOrgunitScope() ) { - params.getOrganisationUnits().add( organisationUnit ); + params.addOrganisationUnit( organisationUnit ); } else if ( attribute.getProgramScope() ) { === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java 2014-04-15 03:54:06 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java 2014-05-12 09:56:39 +0000 @@ -29,10 +29,12 @@ */ import com.google.common.collect.Lists; + import org.hisp.dhis.common.Grid; import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.common.OrganisationUnitSelectionMode; import org.hisp.dhis.common.QueryItem; +import org.hisp.dhis.common.QueryOperator; import org.hisp.dhis.dxf2.importsummary.ImportConflict; import org.hisp.dhis.dxf2.importsummary.ImportStatus; import org.hisp.dhis.dxf2.importsummary.ImportSummary; @@ -338,8 +340,8 @@ TrackedEntityInstanceQueryParams params = new TrackedEntityInstanceQueryParams(); - QueryItem queryItem = new QueryItem( attribute, "eq", value, false ); - params.getAttributes().add( queryItem ); + QueryItem queryItem = new QueryItem( attribute, QueryOperator.EQ, value, false ); + params.addAttribute( queryItem ); if ( attribute.getOrgunitScope() ) { === modified file 'dhis-2/dhis-services/dhis-service-i18n/src/main/resources/i18n_global.properties' --- dhis-2/dhis-services/dhis-service-i18n/src/main/resources/i18n_global.properties 2014-05-06 09:20:18 +0000 +++ dhis-2/dhis-services/dhis-service-i18n/src/main/resources/i18n_global.properties 2014-05-12 09:56:39 +0000 @@ -829,7 +829,7 @@ app_draggable_description=Items are draggable to change their order, so it's easy to customize your favorite apps. app_order_custom=My own order app_order_name_alpha=Alphabetical -app_search_placeholder=Search in apps +app_search_placeholder=Search apps #-- calendars ------------------------------------------------------------------# === modified file 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/DefaultImportService.java' --- dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/DefaultImportService.java 2014-05-05 18:01:22 +0000 +++ dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/DefaultImportService.java 2014-05-12 09:56:39 +0000 @@ -123,7 +123,7 @@ log.info( "Saved zipstream to file: " + tempZipFile.getAbsolutePath() ); zipFile = new ZipFile( tempZipFile ); - + xmlDataStream = new BufferedInputStream( ZipAnalyzer.getTransformableStream( zipFile ) ); } === modified file 'dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/ActivityReportingService.java' --- dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/ActivityReportingService.java 2014-05-05 10:16:05 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/ActivityReportingService.java 2014-05-12 09:56:39 +0000 @@ -35,6 +35,7 @@ import org.hisp.dhis.api.mobile.model.ActivityValue; import org.hisp.dhis.api.mobile.model.Message; import org.hisp.dhis.api.mobile.model.PatientAttribute; +import org.hisp.dhis.api.mobile.model.User; import org.hisp.dhis.api.mobile.model.LWUITmodel.LostEvent; import org.hisp.dhis.api.mobile.model.LWUITmodel.Notification; import org.hisp.dhis.api.mobile.model.LWUITmodel.Patient; @@ -106,4 +107,7 @@ public String sendFeedback( Message message ) throws NotAllowedException; + public Collection findUser( String keyword ) + throws NotAllowedException; + } === modified file 'dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/LWUITmodel/Patient.java' --- dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/LWUITmodel/Patient.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/LWUITmodel/Patient.java 2014-05-12 09:56:39 +0000 @@ -49,6 +49,8 @@ private int id; private String organisationUnitName; + + private String trackedEntityName; private List attributes = new ArrayList(); @@ -113,6 +115,16 @@ this.organisationUnitName = organisationUnitName; } + public String getTrackedEntityName() + { + return trackedEntityName; + } + + public void setTrackedEntityName( String trackedEntityName ) + { + this.trackedEntityName = trackedEntityName; + } + public List getEnrollmentPrograms() { return enrollmentPrograms; @@ -146,6 +158,7 @@ dout.writeInt( this.getId() ); dout.writeUTF( this.getOrganisationUnitName() ); + dout.writeUTF( this.getTrackedEntityName() ); // Write Patient Attribute dout.writeInt( attributes.size() ); @@ -185,6 +198,7 @@ { this.setId( din.readInt() ); this.setOrganisationUnitName( din.readUTF() ); + this.setTrackedEntityName( din.readUTF() ); // Read Attribute int attsNumb = din.readInt(); === modified file 'dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/MobileOrgUnitLinks.java' --- dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/MobileOrgUnitLinks.java 2014-05-05 10:16:05 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/MobileOrgUnitLinks.java 2014-05-12 09:56:39 +0000 @@ -67,6 +67,8 @@ private String sendFeedbackUrl; + private String findUserUrl; + private String updateContactUrl; private String findPatientUrl; @@ -227,6 +229,16 @@ this.sendFeedbackUrl = sendFeedbackUrl; } + public String getFindUserUrl() + { + return findUserUrl; + } + + public void setFindUserUrl( String findUserUrl ) + { + this.findUserUrl = findUserUrl; + } + public String getUpdateContactUrl() { return updateContactUrl; @@ -382,6 +394,7 @@ dataOutputStream.writeUTF( searchUrl ); dataOutputStream.writeUTF( updateNewVersionUrl ); dataOutputStream.writeUTF( sendFeedbackUrl ); + dataOutputStream.writeUTF( findUserUrl ); dataOutputStream.writeUTF( updateContactUrl ); dataOutputStream.writeUTF( findPatientUrl ); dataOutputStream.writeUTF( registerPersonUrl ); @@ -396,7 +409,6 @@ dataOutputStream.writeUTF( handleLostToFollowUpUrl ); dataOutputStream.writeUTF( generateRepeatableEventUrl ); dataOutputStream.writeUTF( uploadSingleEventWithoutRegistration ); - } @@ -415,6 +427,7 @@ searchUrl = dataInputStream.readUTF(); updateNewVersionUrl = dataInputStream.readUTF(); sendFeedbackUrl = dataInputStream.readUTF(); + findUserUrl = dataInputStream.readUTF(); updateContactUrl = dataInputStream.readUTF(); findPatientUrl = dataInputStream.readUTF(); registerPersonUrl = dataInputStream.readUTF(); @@ -464,6 +477,7 @@ dataOutputStream.writeUTF( this.searchUrl ); dataOutputStream.writeUTF( this.updateNewVersionUrl ); dataOutputStream.writeUTF( this.sendFeedbackUrl ); + dataOutputStream.writeUTF( this.findUserUrl ); // dataOutputStream.writeUTF( this.updateContactUrl ); } @@ -483,6 +497,7 @@ dataOutputStream.writeUTF( searchUrl ); dataOutputStream.writeUTF( updateNewVersionUrl ); dataOutputStream.writeUTF( sendFeedbackUrl ); + dataOutputStream.writeUTF( findUserUrl ); dataOutputStream.writeUTF( updateContactUrl ); dataOutputStream.writeUTF( findPatientUrl ); dataOutputStream.writeUTF( registerPersonUrl ); === added file 'dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/Recipient.java' --- dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/Recipient.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/Recipient.java 2014-05-12 09:56:39 +0000 @@ -0,0 +1,125 @@ +package org.hisp.dhis.api.mobile.model; + +/* + * Copyright (c) 2004-2014, 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. + */ + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.Collection; + +public class Recipient + implements DataStreamSerializable +{ + private String clientVersion; + + private Collection users; + + public String getClientVersion() + { + return clientVersion; + } + + public void setClientVersion( String clientVersion ) + { + this.clientVersion = clientVersion; + } + + public Collection getUsers() + { + return users; + } + + public void setUsers( Collection users ) + { + this.users = users; + } + + @Override + public void serialize( DataOutputStream dout ) + throws IOException + { + if ( users == null ) + { + dout.writeInt( 0 ); + } + else + { + dout.writeInt( users.size() ); + for ( User user : users ) + { + user.setClientVersion( DataStreamSerializable.TWO_POINT_TEN ); + user.serialize( dout ); + } + } + + } + + @Override + public void deSerialize( DataInputStream dataInputStream ) + throws IOException + { + + } + + @Override + public void serializeVersion2_8( DataOutputStream dataOutputStream ) + throws IOException + { + + } + + @Override + public void serializeVersion2_9( DataOutputStream dataOutputStream ) + throws IOException + { + + } + + @Override + public void serializeVersion2_10( DataOutputStream dout ) + throws IOException + { + + if ( users == null ) + { + dout.writeInt( 0 ); + } + else + { + dout.writeInt( users.size() ); + for ( User user : users ) + { + user.setClientVersion( DataStreamSerializable.TWO_POINT_TEN ); + user.serialize( dout ); + } + } + + } + +} === added file 'dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/User.java' --- dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/User.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/api/mobile/model/User.java 2014-05-12 09:56:39 +0000 @@ -0,0 +1,131 @@ +package org.hisp.dhis.api.mobile.model; + +/* + * Copyright (c) 2004-2014, 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. + */ + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import javax.xml.bind.annotation.XmlAttribute; + +public class User + implements DataStreamSerializable +{ + private String clientVersion; + + private String surname; + + private String firstName; + + public User() + { + } + + public User( String surname, String firstName ) + { + super(); + this.surname = surname; + this.firstName = firstName; + } + + public String getClientVersion() + { + return clientVersion; + } + + public void setClientVersion( String clientVersion ) + { + this.clientVersion = clientVersion; + } + + @XmlAttribute + public String getSurname() + { + return surname; + } + + public void setSurname( String surname ) + { + this.surname = surname; + } + + @XmlAttribute + public String getFirstName() + { + return firstName; + } + + public void setFirstName( String firstName ) + { + this.firstName = firstName; + } + + @Override + public void serialize( DataOutputStream dout ) + throws IOException + { + dout.writeUTF( this.surname ); + dout.writeUTF( this.firstName ); + + } + + @Override + public void deSerialize( DataInputStream din ) + throws IOException + { + surname = din.readUTF(); + firstName = din.readUTF(); + } + + @Override + public void serializeVersion2_8( DataOutputStream dout ) + throws IOException + { + dout.writeUTF( this.surname ); + dout.writeUTF( this.firstName ); + } + + @Override + public void serializeVersion2_9( DataOutputStream dout ) + throws IOException + { + dout.writeUTF( this.surname ); + dout.writeUTF( this.firstName ); + } + + @Override + public void serializeVersion2_10( DataOutputStream dout ) + throws IOException + { + dout.writeUTF( this.surname ); + dout.writeUTF( this.firstName ); + + } + +} === modified file 'dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/ActivityReportingServiceImpl.java' --- dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/ActivityReportingServiceImpl.java 2014-05-05 10:16:05 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/ActivityReportingServiceImpl.java 2014-05-12 09:56:39 +0000 @@ -59,8 +59,11 @@ import org.hisp.dhis.api.mobile.model.LWUITmodel.Notification; import org.hisp.dhis.api.mobile.model.LWUITmodel.Section; import org.hisp.dhis.api.mobile.model.comparator.ActivityComparator; +import org.hisp.dhis.common.Grid; +import org.hisp.dhis.common.QueryItem; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementService; +import org.hisp.dhis.event.EventStatus; import org.hisp.dhis.message.Message; import org.hisp.dhis.message.MessageConversation; import org.hisp.dhis.message.MessageService; @@ -88,6 +91,7 @@ import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.trackedentity.TrackedEntityAttributeService; import org.hisp.dhis.trackedentity.TrackedEntityInstance; +import org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams; import org.hisp.dhis.trackedentity.TrackedEntityInstanceService; import org.hisp.dhis.trackedentity.TrackedEntityMobileSetting; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; @@ -96,6 +100,7 @@ import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueService; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Required; @@ -150,6 +155,8 @@ private TrackedEntityAttributeService attributeService; + private UserService userService; + private Integer patientId; @Autowired @@ -250,6 +257,12 @@ this.programService = programService; } + @Required + public void setUserService( UserService userService ) + { + this.userService = userService; + } + // ------------------------------------------------------------------------- // MobileDataSetService // ------------------------------------------------------------------------- @@ -301,15 +314,23 @@ { List items = new ArrayList(); - Collection patients = entityInstanceService.getTrackedEntityInstances( unit, 0, - Integer.MAX_VALUE ); - - for ( TrackedEntityInstance patient : patients ) + + TrackedEntityInstanceQueryParams param = new TrackedEntityInstanceQueryParams(); + param.addOrganisationUnit( unit ); + + Grid trackedEntityDrid = entityInstanceService.getTrackedEntityInstances( param ); + List> listOfListProgramStageInstance = trackedEntityDrid.getRows(); + + for ( List listProgramStageInstance : listOfListProgramStageInstance ) { - for ( ProgramStageInstance programStageInstance : programStageInstanceService.getProgramStageInstances( - patient, false ) ) + for ( Object obj : listProgramStageInstance ) { - items.add( getActivity( programStageInstance, false ) ); + TrackedEntityInstance patient = (TrackedEntityInstance) obj; + for ( ProgramStageInstance programStageInstance : programStageInstanceService.getProgramStageInstances( + patient, false ) ) + { + items.add( getActivity( programStageInstance, false ) ); + } } } @@ -411,13 +432,6 @@ for ( TrackedEntityInstance patient : patients ) { - System.out.println( "----------------------------------------------------------------------------" ); - System.out.println( "Display Name: " + patient.getDisplayName() ); - System.out.println( "Name: " + patient.getName() ); - System.out.println( "Tracked Entity Display Name: " + patient.getTrackedEntity().getDisplayName() ); - System.out.println( "Tracked Entity Name: " + patient.getTrackedEntity().getName() ); - System.out.println( "----------------------------------------------------------------------------" ); - resultSet += patient.getId() + "/"; String attText = ""; for ( TrackedEntityAttribute displayAttribute : displayAttributes ) @@ -763,6 +777,15 @@ patientModel.setOrganisationUnitName( patient.getOrganisationUnit().getName() ); } + if ( patient.getTrackedEntity() != null ) + { + patientModel.setTrackedEntityName( patient.getTrackedEntity().getName() ); + } + else + { + patientModel.setTrackedEntityName( "" ); + } + this.setSetting( getSettings() ); List atts = new ArrayList( @@ -1552,24 +1575,25 @@ } Set trackedentities = new HashSet(); - for ( TrackedEntityInstance patient : patients) + for ( TrackedEntityInstance patient : patients ) { - if (patient.getTrackedEntity() != null) + if ( patient.getTrackedEntity() != null ) { trackedentities.add( patient.getTrackedEntity() ); } } - + String resultSet = ""; Collection displayAttributes = attributeService .getTrackedEntityAttributesDisplayInList( true ); - for ( TrackedEntity trackedentity : trackedentities) + for ( TrackedEntity trackedentity : trackedentities ) { resultSet += trackedentity.getDisplayName() + "$"; for ( TrackedEntityInstance patient : patients ) { - if(patient.getTrackedEntity()!=null && patient.getTrackedEntity().getId()==trackedentity.getId()) { + if ( patient.getTrackedEntity() != null && patient.getTrackedEntity().getId() == trackedentity.getId() ) + { resultSet += patient.getId() + "/"; String attText = ""; for ( TrackedEntityAttribute displayAttribute : displayAttributes ) @@ -1586,6 +1610,28 @@ } } } + + //get tracked entity with no tracked entity name + resultSet += "Others$"; + for ( TrackedEntityInstance patient : patients ) + { + if ( patient.getTrackedEntity() == null) + { + resultSet += patient.getId() + "/"; + String attText = ""; + for ( TrackedEntityAttribute displayAttribute : displayAttributes ) + { + TrackedEntityAttributeValue value = attValueService.getTrackedEntityAttributeValue( patient, + displayAttribute ); + if ( value != null ) + { + attText += value.getValue() + " "; + } + } + attText = attText.trim(); + resultSet += attText + "$"; + } + } return resultSet; } @@ -1595,35 +1641,19 @@ { String[] searchEventInfosArray = searchEventInfos.split( "-" ); - int programStageStatus = 0; + EventStatus eventStatus = EventStatus.ACTIVE; if ( searchEventInfosArray[1].equalsIgnoreCase( "Scheduled in future" ) ) { - programStageStatus = ProgramStageInstance.FUTURE_VISIT_STATUS; + eventStatus = EventStatus.FUTURE_VISIT; } else if ( searchEventInfosArray[1].equalsIgnoreCase( "Overdue" ) ) { - programStageStatus = ProgramStageInstance.LATE_VISIT_STATUS; - } - - boolean followUp; - - if ( searchEventInfosArray[2].equalsIgnoreCase( "true" ) ) - { - followUp = true; - } - else - { - followUp = false; + eventStatus = EventStatus.LATE_VISIT; } String eventsInfo = ""; - DateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd" ); - - List searchTextList = new ArrayList(); - Collection orgUnitList = new HashSet(); - Calendar toCalendar = new GregorianCalendar(); toCalendar.add( Calendar.DATE, -1 ); toCalendar.add( Calendar.YEAR, 100 ); @@ -1635,29 +1665,41 @@ Date fromDate = fromCalendar.getTime(); - String searchText = TrackedEntityInstance.PREFIX_PROGRAM_EVENT_BY_STATUS + "_" + searchEventInfosArray[0] + "_" - + formatter.format( fromDate ) + "_" + formatter.format( toDate ) + "_" + orgUnitId + "_" + true + "_" - + programStageStatus; - - searchTextList.add( searchText ); - orgUnitList.add( organisationUnitService.getOrganisationUnit( orgUnitId ) ); - List stageInstanceIds = entityInstanceService.getProgramStageInstances( searchTextList, orgUnitList, - followUp, ProgramInstance.STATUS_ACTIVE, null, null ); - - if ( stageInstanceIds.size() == 0 ) + TrackedEntityInstanceQueryParams param = new TrackedEntityInstanceQueryParams(); + List trackedEntityAttributeList = new ArrayList( + attributeService.getTrackedEntityAttributesByDisplayOnVisitSchedule( true ) ); + + for ( TrackedEntityAttribute trackedEntityAttribute : trackedEntityAttributeList ) + { + QueryItem queryItem = new QueryItem( trackedEntityAttribute ); + param.addAttribute( queryItem ); + } + + param.addOrganisationUnit( organisationUnitService.getOrganisationUnit( orgUnitId ) ); + param.setEventStatus( eventStatus ); + param.setEventStartDate( fromDate ); + param.setEventEndDate( toDate ); + + Grid programStageInstanceGrid = entityInstanceService.getTrackedEntityInstances( param ); + List> rows = programStageInstanceGrid.getRows(); + + if ( rows.size() == 0 ) { throw NotAllowedException.NO_EVENT_FOUND; } - else if ( stageInstanceIds.size() > 0 ) + else if ( rows.size() > 0 ) { - for ( Integer stageInstanceId : stageInstanceIds ) + for ( List row : rows ) { - ProgramStageInstance programStageInstance = programStageInstanceService - .getProgramStageInstance( stageInstanceId ); - TrackedEntityInstance patient = programStageInstance.getProgramInstance().getEntityInstance(); - eventsInfo += programStageInstance.getId() + "/" + patient.getName() + ", " - + programStageInstance.getProgramStage().getName() + "(" - + formatter.format( programStageInstance.getDueDate() ) + ")" + "$"; + for ( int i = 5; i < row.size(); i++ ) + { + eventsInfo += row.get( i ) + "/"; + if ( i == row.size() - 1 ) + { + eventsInfo += "$"; + } + } + } throw new NotAllowedException( eventsInfo ); @@ -1666,6 +1708,7 @@ { return ""; } + } @SuppressWarnings( "finally" ) @@ -1867,4 +1910,37 @@ return FEEDBACK_SENT; } + + @Override + public Collection findUser( String keyword ) + throws NotAllowedException + { + Collection users = new HashSet(); + + Collection userList = new HashSet(); + + if ( keyword != null ) + { + int index = keyword.indexOf( ' ' ); + + if ( index != -1 && index == keyword.lastIndexOf( ' ' ) ) + { + String[] keys = keyword.split( " " ); + keyword = keys[0] + " " + keys[1]; + } + } + + users = userService.getUsersByName( keyword ); + + for ( User userCore : users ) + { + org.hisp.dhis.api.mobile.model.User user = new org.hisp.dhis.api.mobile.model.User(); + user.setSurname( userCore.getSurname() ); + user.setFirstName( userCore.getFirstName() ); + userList.add( user ); + + } + + return userList; + } } \ No newline at end of file === modified file 'dhis-2/dhis-services/dhis-service-mobile/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-mobile/src/main/resources/META-INF/dhis/beans.xml 2014-03-26 19:40:22 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/main/resources/META-INF/dhis/beans.xml 2014-05-12 09:56:39 +0000 @@ -1,52 +1,70 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + === modified file 'dhis-2/dhis-services/dhis-service-mobile/src/test/java/org/hisp/dhis/mobile/api/model/OrgUnitTest.java' --- dhis-2/dhis-services/dhis-service-mobile/src/test/java/org/hisp/dhis/mobile/api/model/OrgUnitTest.java 2014-05-05 10:16:05 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/test/java/org/hisp/dhis/mobile/api/model/OrgUnitTest.java 2014-05-12 09:56:39 +0000 @@ -60,6 +60,7 @@ unit.setSearchUrl( "search" ); unit.setUpdateNewVersionUrl( "" ); unit.setSendFeedbackUrl( "sendFeedbackUrl" ); + unit.setFindUserUrl( "findUserUrl" ); unit.setUpdateContactUrl( "updateContactUrl" ); unit.setFindPatientUrl( "findPatientUrl" ); unit.setUploadProgramStageUrl( "uploadProgramStageUrl" ); === modified file 'dhis-2/dhis-services/dhis-service-mobile/src/test/java/org/hisp/dhis/mobile/api/model/OrgUnitsTest.java' --- dhis-2/dhis-services/dhis-service-mobile/src/test/java/org/hisp/dhis/mobile/api/model/OrgUnitsTest.java 2014-05-05 10:16:05 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/test/java/org/hisp/dhis/mobile/api/model/OrgUnitsTest.java 2014-05-12 09:56:39 +0000 @@ -86,6 +86,7 @@ orgUnit.setSearchUrl( "search" ); orgUnit.setUpdateNewVersionUrl( "updateNewVersionUrl" ); orgUnit.setSendFeedbackUrl( "sendFeedback" ); + orgUnit.setFindUserUrl( "findUserUrl" ); orgUnit.setUpdateContactUrl( "updateContactForMobile" ); orgUnit.setFindPatientUrl( "findPatient" ); orgUnit.setRegisterPersonUrl( "registerPerson" ); === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java 2014-05-12 09:56:39 +0000 @@ -40,7 +40,6 @@ import org.hisp.dhis.common.Grid; import org.hisp.dhis.common.GridHeader; -import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.i18n.I18n; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.message.MessageConversation; @@ -54,14 +53,11 @@ import org.hisp.dhis.trackedentity.TrackedEntityInstance; import org.hisp.dhis.trackedentity.TrackedEntityInstanceReminder; import org.hisp.dhis.trackedentity.TrackedEntityInstanceReminderService; -import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValue; -import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueService; import org.hisp.dhis.user.CurrentUserService; import org.springframework.transaction.annotation.Transactional; /** * @author Abyot Asalefew - * @version $Id$ */ @Transactional public class DefaultProgramStageInstanceService @@ -85,13 +81,6 @@ this.programInstanceService = programInstanceService; } - private TrackedEntityDataValueService dataValueService; - - public void setDataValueService( TrackedEntityDataValueService dataValueService ) - { - this.dataValueService = dataValueService; - } - private SmsSender smsSender; public void setSmsSender( SmsSender smsSender ) @@ -196,82 +185,6 @@ } @Override - public List getProgramStageInstancesReport( ProgramInstance programInstance, I18nFormat format, I18n i18n ) - { - List grids = new ArrayList(); - - Collection programStageInstances = programInstance.getProgramStageInstances(); - - for ( ProgramStageInstance programStageInstance : programStageInstances ) - { - Grid grid = new ListGrid(); - - // ----------------------------------------------------------------- - // Title - // ----------------------------------------------------------------- - - Date executionDate = programStageInstance.getExecutionDate(); - String executionDateValue = (executionDate != null) ? format.formatDate( programStageInstance - .getExecutionDate() ) : "[" + i18n.getString( "none" ) + "]"; - - grid.setTitle( programStageInstance.getProgramStage().getName() ); - grid.setSubtitle( i18n.getString( "due_date" ) + ": " - + format.formatDate( programStageInstance.getDueDate() ) + " - " + i18n.getString( "report_date" ) - + ": " + executionDateValue ); - - // ----------------------------------------------------------------- - // Headers - // ----------------------------------------------------------------- - - grid.addHeader( new GridHeader( i18n.getString( "name" ), false, true ) ); - grid.addHeader( new GridHeader( i18n.getString( "value" ), false, true ) ); - - // ----------------------------------------------------------------- - // Values - // ----------------------------------------------------------------- - - Collection entityDataValues = dataValueService - .getTrackedEntityDataValues( programStageInstance ); - - if ( executionDate == null || entityDataValues == null || entityDataValues.size() == 0 ) - { - grid.addRow(); - grid.addValue( "[" + i18n.getString( "none" ) + "]" ); - grid.addValue( "" ); - } - else - { - for ( TrackedEntityDataValue entityDataValue : entityDataValues ) - { - DataElement dataElement = entityDataValue.getDataElement(); - - grid.addRow(); - grid.addValue( dataElement.getName() ); - - if ( dataElement.getType().equals( DataElement.VALUE_TYPE_BOOL ) ) - { - grid.addValue( i18n.getString( entityDataValue.getValue() ) ); - } - else - { - grid.addValue( entityDataValue.getValue() ); - } - } - } - - grids.add( grid ); - } - - return grids; - } - - @Override - public void removeEmptyEvents( ProgramStage programStage, OrganisationUnit organisationUnit ) - { - programStageInstanceStore.removeEmptyEvents( programStage, organisationUnit ); - } - - @Override public void updateProgramStageInstances( Collection programStageInstanceIds, OutboundSms outboundSms ) { programStageInstanceStore.update( programStageInstanceIds, outboundSms ); @@ -313,13 +226,7 @@ int total = programInstanceService.countProgramInstances( program, orgunitIds, startDate, endDate ); grid.addRow(); grid.addValue( i18n.getString( "total_new_enrollments_in_this_period" ) ); - grid.addValue( total ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); + grid.addValue( total ).addEmptyValues( 6 ); // Total programs completed in this period @@ -327,13 +234,7 @@ program, orgunitIds, startDate, endDate ); grid.addRow(); grid.addValue( i18n.getString( "total_programs_completed_in_this_period" ) ); - grid.addValue( totalCompleted ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); + grid.addValue( totalCompleted ).addEmptyValues( 6 ); // Total programs discontinued (un-enrollments) @@ -341,13 +242,7 @@ program, orgunitIds, startDate, endDate ); grid.addRow(); grid.addValue( i18n.getString( "total_programs_discontinued_unenrollments" ) ); - grid.addValue( totalDiscontinued ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); + grid.addValue( totalDiscontinued ).addEmptyValues( 6 ); // Average number of stages for complete programs @@ -360,37 +255,16 @@ ProgramInstance.STATUS_ACTIVE ); percent = (stageCompleted + 0.0) / totalCompleted; } - grid.addValue( format.formatValue( percent ) ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); + grid.addValue( format.formatValue( percent ) ).addEmptyValues( 6 ); // Add empty row - grid.addRow(); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); + grid.addRow().addEmptyValues( 8 ); // Summary by stage grid.addRow(); - grid.addValue( i18n.getString( "summary_by_stage" ) ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); - grid.addValue( "" ); + grid.addValue( i18n.getString( "summary_by_stage" ) ).addEmptyValues( 7 ); // Add titles for stage details @@ -635,7 +509,7 @@ if ( type == Program.SINGLE_EVENT_WITH_REGISTRATION ) { - // Add a new program-instance + // Add a new program instance programInstance = new ProgramInstance(); programInstance.setEnrollmentDate( executionDate ); programInstance.setDateOfIncident( executionDate ); @@ -650,7 +524,7 @@ Collection programInstances = programInstanceService.getProgramInstances( program ); if ( programInstances == null || programInstances.size() == 0 ) { - // Add a new program-instance if it doesn't exist + // Add a new program instance if it doesn't exist programInstance = new ProgramInstance(); programInstance.setEnrollmentDate( executionDate ); programInstance.setDateOfIncident( executionDate ); @@ -664,7 +538,7 @@ } } - // Add a new program-stage-instance + // Add a new program stage instance ProgramStageInstance programStageInstance = new ProgramStageInstance(); programStageInstance.setProgramInstance( programInstance ); programStageInstance.setProgramStage( programStage ); @@ -677,23 +551,6 @@ return programStageInstance; } - @Override - public Grid searchEvents( ProgramStage programStage, List columns, - Collection organisationUnits, Date startDate, Date endDate, Boolean completed, Integer min, - Integer max, I18n i18n ) - { - return programStageInstanceStore.searchEvent( programStage, organisationUnits, columns, startDate, endDate, - completed, min, max, i18n ); - } - - @Override - public int searchEventsCount( ProgramStage programStage, List columns, - Collection organisationUnits, Boolean completed, Date startDate, Date endDate ) - { - return programStageInstanceStore.searchEventsCount( programStage, columns, organisationUnits, startDate, - endDate, completed ); - } - // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- @@ -723,5 +580,4 @@ return outboundSms; } - -} \ No newline at end of file +} === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramInstanceStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramInstanceStore.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramInstanceStore.java 2014-05-12 09:56:39 +0000 @@ -90,8 +90,10 @@ return new ArrayList(); } - return getCriteria( Restrictions.in( "program", programs ) ).createAlias( "entityInstance", "entityInstance" ) - .add( Restrictions.eq( "entityInstance.organisationUnit", organisationUnit ) ).list(); + return getCriteria( + Restrictions.in( "program", programs ) ). + createAlias( "entityInstance", "entityInstance" ). + add( Restrictions.eq( "entityInstance.organisationUnit", organisationUnit ) ).list(); } @Override @@ -103,9 +105,11 @@ return new ArrayList(); } - return getCriteria( Restrictions.eq( "status", status ), Restrictions.in( "program", programs ) ) - .createAlias( "entityInstance", "entityInstance" ).add( Restrictions.eq( "entityInstance.organisationUnit", organisationUnit ) ) - .list(); + return getCriteria( + Restrictions.eq( "status", status ), + Restrictions.in( "program", programs ) ). + createAlias( "entityInstance", "entityInstance" ). + add( Restrictions.eq( "entityInstance.organisationUnit", organisationUnit ) ).list(); } @SuppressWarnings( "unchecked" ) @@ -147,14 +151,22 @@ @SuppressWarnings( "unchecked" ) public Collection get( Program program, OrganisationUnit organisationUnit, Integer min, Integer max ) { - Criteria criteria = getCriteria( Restrictions.eq( "program", program ), Restrictions.isNull( "endDate" ) ) - .add( Restrictions.eq( "entityInstance.organisationUnit", organisationUnit ) ).createAlias( "entityInstance", "entityInstance" ) - .addOrder( Order.asc( "entityInstance.id" ) ); + Criteria criteria = getCriteria( + Restrictions.eq( "program", program ), Restrictions.isNull( "endDate" ) ). + add( Restrictions.eq( "entityInstance.organisationUnit", organisationUnit ) ). + createAlias( "entityInstance", "entityInstance" ). + addOrder( Order.asc( "entityInstance.id" ) ); - if ( min != null && max != null ) - { - criteria.setFirstResult( min ).setMaxResults( max ); - } + if ( min != null ) + { + criteria.setFirstResult( min ); + } + + if ( max != null ) + { + criteria.setMaxResults( max ); + } + return criteria.list(); } @@ -162,10 +174,14 @@ public Collection get( Program program, OrganisationUnit organisationUnit, Date startDate, Date endDate ) { - return getCriteria( Restrictions.eq( "program", program ), Restrictions.isNull( "endDate" ), - Restrictions.ge( "enrollmentDate", startDate ), Restrictions.le( "enrollmentDate", endDate ) ) - .createAlias( "entityInstance", "entityInstance" ).add( Restrictions.eq( "entityInstance.organisationUnit", organisationUnit ) ) - .addOrder( Order.asc( "entityInstance.id" ) ).list(); + return getCriteria( + Restrictions.eq( "program", program ), + Restrictions.isNull( "endDate" ), + Restrictions.ge( "enrollmentDate", startDate ), + Restrictions.le( "enrollmentDate", endDate ) ). + createAlias( "entityInstance", "entityInstance" ). + add( Restrictions.eq( "entityInstance.organisationUnit", organisationUnit ) ). + addOrder( Order.asc( "entityInstance.id" ) ).list(); } @SuppressWarnings( "unchecked" ) @@ -177,41 +193,54 @@ .createAlias( "entityInstance", "entityInstance" ).createAlias( "entityInstance.organisationUnit", "organisationUnit" ) .add( Restrictions.in( "organisationUnit.id", orgunitIds ) ).addOrder( Order.asc( "entityInstance.id" ) ); - if ( min != null && max != null ) - { - criteria.setFirstResult( min ).setMaxResults( max ); - } - + if ( min != null ) + { + criteria.setFirstResult( min ); + } + + if ( max != null ) + { + criteria.setMaxResults( max ); + } + return criteria.list(); } public int count( Program program, OrganisationUnit organisationUnit ) { - Number rs = (Number) getCriteria( Restrictions.eq( "program", program ), Restrictions.isNull( "endDate" ) ) - .createAlias( "entityInstance", "entityInstance" ).add( Restrictions.eq( "entityInstance.organisationUnit", organisationUnit ) ) - .setProjection( Projections.rowCount() ).uniqueResult(); + Number rs = (Number) getCriteria( + Restrictions.eq( "program", program ), Restrictions.isNull( "endDate" ) ). + createAlias( "entityInstance", "entityInstance" ). + add( Restrictions.eq( "entityInstance.organisationUnit", organisationUnit ) ). + setProjection( Projections.rowCount() ).uniqueResult(); + return rs != null ? rs.intValue() : 0; } public int count( Program program, Collection orgunitIds, Date startDate, Date endDate ) { - Number rs = (Number) getCriteria( Restrictions.eq( "program", program ), - Restrictions.ge( "enrollmentDate", startDate ), Restrictions.le( "enrollmentDate", endDate ) ) - .createAlias( "entityInstance", "entityInstance" ).createAlias( "entityInstance.organisationUnit", "organisationUnit" ) - .add( Restrictions.in( "organisationUnit.id", orgunitIds ) ).setProjection( Projections.rowCount() ) - .uniqueResult(); + Number rs = (Number) getCriteria( + Restrictions.eq( "program", program ), + Restrictions.ge( "enrollmentDate", startDate ), + Restrictions.le( "enrollmentDate", endDate ) ). + createAlias( "entityInstance", "entityInstance" ). + createAlias( "entityInstance.organisationUnit", "organisationUnit" ). + add( Restrictions.in( "organisationUnit.id", orgunitIds ) ). + setProjection( Projections.rowCount() ).uniqueResult(); return rs != null ? rs.intValue() : 0; } - public int countByStatus( Integer status, Program program, Collection orgunitIds, Date startDate, - Date endDate ) + public int countByStatus( Integer status, Program program, Collection orgunitIds, Date startDate, Date endDate ) { - Number rs = (Number) getCriteria( Restrictions.eq( "program", program ), - Restrictions.between( "enrollmentDate", startDate, endDate ) ).createAlias( "entityInstance", "entityInstance" ) - .createAlias( "entityInstance.organisationUnit", "organisationUnit" ) - .add( Restrictions.in( "organisationUnit.id", orgunitIds ) ).add( Restrictions.eq( "status", status ) ) - .setProjection( Projections.rowCount() ).uniqueResult(); + Number rs = (Number) getCriteria( + Restrictions.eq( "program", program ), + Restrictions.between( "enrollmentDate", startDate, endDate ) ). + createAlias( "entityInstance", "entityInstance" ). + createAlias( "entityInstance.organisationUnit", "organisationUnit" ). + add( Restrictions.in( "organisationUnit.id", orgunitIds ) ). + add( Restrictions.eq( "status", status ) ). + setProjection( Projections.rowCount() ).uniqueResult(); return rs != null ? rs.intValue() : 0; } @@ -220,12 +249,16 @@ public Collection getByStatus( Integer status, Program program, Collection orgunitIds, Date startDate, Date endDate ) { - return getCriteria( Restrictions.eq( "program", program ), - Restrictions.between( "enrollmentDate", startDate, endDate ) ).createAlias( "entityInstance", "entityInstance" ) - .createAlias( "entityInstance.organisationUnit", "organisationUnit" ) - .add( Restrictions.in( "organisationUnit.id", orgunitIds ) ).add( Restrictions.eq( "status", status ) ) - .list(); + return getCriteria( + Restrictions.eq( "program", program ), + Restrictions.between( "enrollmentDate", startDate, endDate ) ). + createAlias( "entityInstance", "entityInstance" ). + createAlias( "entityInstance.organisationUnit", "organisationUnit" ). + add( Restrictions.in( "organisationUnit.id", orgunitIds ) ). + add( Restrictions.eq( "status", status ) ).list(); } + + //TODO from here this class must be rewritten public Collection getSendMesssageEvents( String dateToCompare ) { === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageDataElementStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageDataElementStore.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageDataElementStore.java 2014-05-12 09:56:39 +0000 @@ -42,7 +42,6 @@ /** * @author Viet Nguyen - * @version $Id$ */ public class HibernateProgramStageDataElementStore implements ProgramStageDataElementStore === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java 2014-05-12 09:56:39 +0000 @@ -34,7 +34,6 @@ import java.util.Date; import java.util.HashSet; import java.util.List; -import java.util.Set; import org.hibernate.Criteria; import org.hibernate.criterion.Order; @@ -44,8 +43,6 @@ import org.hisp.dhis.common.GridHeader; import org.hisp.dhis.common.hibernate.HibernateIdentifiableObjectStore; import org.hisp.dhis.i18n.I18n; -import org.hisp.dhis.jdbc.StatementBuilder; -import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.period.PeriodType; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramInstance; @@ -54,11 +51,9 @@ import org.hisp.dhis.program.ProgramStageInstance; import org.hisp.dhis.program.ProgramStageInstanceStore; import org.hisp.dhis.program.SchedulingProgramObject; -import org.hisp.dhis.program.TabularEventColumn; import org.hisp.dhis.sms.outbound.OutboundSms; import org.hisp.dhis.system.grid.GridUtils; import org.hisp.dhis.system.grid.ListGrid; -import org.hisp.dhis.system.util.DateUtils; import org.hisp.dhis.system.util.TextUtils; import org.hisp.dhis.trackedentity.TrackedEntityInstance; import org.hisp.dhis.trackedentity.TrackedEntityInstanceReminder; @@ -82,13 +77,6 @@ this.programInstanceService = programInstanceService; } - private StatementBuilder statementBuilder; - - public void setStatementBuilder( StatementBuilder statementBuilder ) - { - this.statementBuilder = statementBuilder; - } - // ------------------------------------------------------------------------- // Implemented methods // ------------------------------------------------------------------------- @@ -97,9 +85,10 @@ @SuppressWarnings( "unchecked" ) public ProgramStageInstance get( ProgramInstance programInstance, ProgramStage programStage ) { - List list = new ArrayList( getCriteria( - Restrictions.eq( "programInstance", programInstance ), Restrictions.eq( "programStage", programStage ) ) - .addOrder( Order.asc( "id" ) ).list() ); + List list = getCriteria( + Restrictions.eq( "programInstance", programInstance ), + Restrictions.eq( "programStage", programStage ) ). + addOrder( Order.asc( "id" ) ).list(); return list.isEmpty() ? null : list.get( list.size() - 1 ); } @@ -108,10 +97,10 @@ @SuppressWarnings( "unchecked" ) public Collection getAll( ProgramInstance programInstance, ProgramStage programStage ) { - Criteria criteria = getCriteria( Restrictions.eq( "programInstance", programInstance ), - Restrictions.eq( "programStage", programStage ) ).addOrder( Order.asc( "id" ) ); - - return criteria.list(); + return getCriteria( + Restrictions.eq( "programInstance", programInstance ), + Restrictions.eq( "programStage", programStage ) ) + .addOrder( Order.asc( "id" ) ).list(); } @Override @@ -125,7 +114,8 @@ @SuppressWarnings( "unchecked" ) public Collection get( Collection programInstances, boolean completed ) { - return getCriteria( Restrictions.in( "programInstance", programInstances ), + return getCriteria( + Restrictions.in( "programInstance", programInstances ), Restrictions.eq( "completed", completed ) ).list(); } @@ -138,15 +128,8 @@ return getQuery( hql ).setEntity( "entityInstance", entityInstance ).setBoolean( "completed", completed ).list(); } - @Override - public void removeEmptyEvents( ProgramStage programStage, OrganisationUnit organisationUnit ) - { - String sql = "delete from programstageinstance where programstageid=" + programStage.getId() - + " and organisationunitid=" + organisationUnit.getId() + " and programstageinstanceid not in " - + "(select pdv.programstageinstanceid from trackedentitydatavalue pdv )"; - jdbcTemplate.execute( sql ); - } - + // TODO this class must be re-written from here + @Override public void update( Collection programStageInstanceIds, OutboundSms outboundSms ) { @@ -199,11 +182,7 @@ String programName = rs.getString( "programName" ); String programStageName = rs.getString( "programStageName" ); String daysSinceDueDate = rs.getString( "days_since_due_date" ); - String dueDate = rs.getString( "duedate" ).split( " " )[0];// just - // get - // date, - // remove - // timestamp + String dueDate = rs.getString( "duedate" ).split( " " )[0]; message = message.replace( TrackedEntityInstanceReminder.TEMPLATE_MESSSAGE_PROGRAM_NAME, programName ); message = message.replace( TrackedEntityInstanceReminder.TEMPLATE_MESSSAGE_PROGAM_STAGE_NAME, programStageName ); @@ -507,60 +486,6 @@ return criteria.list(); } - @Override - public Grid searchEvent( ProgramStage programStage, Collection orgUnits, List columns, - Date startDate, Date endDate, Boolean completed, Integer min, Integer max, I18n i18n ) - { - // --------------------------------------------------------------------- - // Headers cols - // --------------------------------------------------------------------- - - Grid grid = new ListGrid(); - grid.setTitle( programStage.getDisplayName() ); - grid.setSubtitle( i18n.getString( "from" ) + " " + DateUtils.getMediumDateString( startDate ) + " " - + i18n.getString( "to" ) + " " + DateUtils.getMediumDateString( endDate ) ); - - grid.addHeader( new GridHeader( "id", true, true ) ); - grid.addHeader( new GridHeader( programStage.getReportDateDescription(), false, true ) ); - - Collection deKeys = new HashSet(); - for ( TabularEventColumn column : columns ) - { - String deKey = "element_" + column.getIdentifier(); - if ( !deKeys.contains( deKey ) ) - { - grid.addHeader( new GridHeader( column.getName(), column.isHidden(), true ) ); - deKeys.add( deKey ); - } - } - - grid.addHeader( new GridHeader( "Complete", true, true ) ); - grid.addHeader( new GridHeader( "TrackedEntityInstanceId", true, true ) ); - - // --------------------------------------------------------------------- - // Get SQL and build grid - // --------------------------------------------------------------------- - - String sql = getTabularReportSql( false, programStage, columns, orgUnits, startDate, endDate, completed, min, - max ); - - SqlRowSet rowSet = jdbcTemplate.queryForRowSet( sql ); - - GridUtils.addRows( grid, rowSet ); - - return grid; - } - - @Override - public int searchEventsCount( ProgramStage programStage, List columns, - Collection organisationUnits, Date startDate, Date endDate, Boolean completed ) - { - String sql = getTabularReportSql( true, programStage, columns, organisationUnits, startDate, endDate, - completed, null, null ); - - return jdbcTemplate.queryForObject( sql, Integer.class ); - } - // --------------------------------------------------------------------- // Supportive methods // --------------------------------------------------------------------- @@ -719,101 +644,4 @@ + " and ( DATE(now()) - DATE(psi.duedate) ) = prm.daysallowedsendmessage " + " and prm.whentosend is null " + " and prm.sendto = " + TrackedEntityInstanceReminder.SEND_TO_USER_GROUP; } - - private String getTabularReportSql( boolean count, ProgramStage programStage, List columns, - Collection orgUnits, Date startDate, Date endDate, Boolean completed, Integer min, Integer max ) - { - Set deKeys = new HashSet(); - String selector = count ? "count(*) " : "* "; - - String sql = "select " + selector + "from ( select DISTINCT psi.programstageinstanceid, psi.executiondate,"; - String where = ""; - String operator = "where "; - - for ( TabularEventColumn column : columns ) - { - if ( column.isNumberDataElement() ) - { - String deKey = "element_" + column.getIdentifier(); - if ( !deKeys.contains( deKey ) ) - { - sql += "(select cast( value as " - + statementBuilder.getDoubleColumnType() - + " ) from trackedentitydatavalue where programstageinstanceid=psi.programstageinstanceid and dataelementid=" - + column.getIdentifier() + ") as element_" + column.getIdentifier() + ","; - deKeys.add( deKey ); - } - - if ( column.hasQuery() ) - { - where += operator + "element_" + column.getIdentifier() + " " + column.getOperator() + " " - + column.getQuery() + " "; - operator = "and "; - } - } - else if ( column.isDataElement() ) - { - String deKey = "element_" + column.getIdentifier(); - if ( !deKeys.contains( deKey ) ) - { - sql += "(select value from trackedentitydatavalue where programstageinstanceid=psi.programstageinstanceid and dataelementid=" - + column.getIdentifier() + ") as element_" + column.getIdentifier() + ","; - deKeys.add( deKey ); - } - - if ( column.hasQuery() ) - { - if ( column.isDateType() ) - { - where += operator + "element_" + column.getIdentifier() + " " + column.getOperator() + " " - + column.getQuery() + " "; - } - else - { - where += operator + "lower(element_" + column.getIdentifier() + ") " + column.getOperator() - + " " + column.getQuery() + " "; - } - operator = "and "; - } - } - } - - sql += " psi.completed "; - - sql += "from programstageinstance psi "; - sql += "left join programinstance pi on (psi.programinstanceid=pi.programinstanceid) "; - sql += "left join trackedentityinstance p on (pi.trackedentityinstanceid=p.trackedentityinstanceid) "; - sql += "join organisationunit ou on (ou.organisationunitid=psi.organisationunitid) "; - - sql += "where psi.programstageid=" + programStage.getId() + " "; - - if ( startDate != null && endDate != null ) - { - String sDate = DateUtils.getMediumDateString( startDate ); - String eDate = DateUtils.getMediumDateString( endDate ); - - sql += "and psi.executiondate >= '" + sDate + "' "; - sql += "and psi.executiondate <= '" + eDate + "' "; - } - - if ( orgUnits != null ) - { - sql += "and ou.organisationunitid in (" + TextUtils.getCommaDelimitedString( orgUnits ) + ") "; - } - if ( completed != null ) - { - sql += "and psi.completed=" + completed + " "; - } - - sql += "order by psi.executiondate desc "; - - sql += " "; - sql += ") as tabular "; - sql += where; // filters - sql = sql.substring( 0, sql.length() - 1 ) + " "; // Remove last comma - sql += (min != null && max != null) ? statementBuilder.limitRecord( min, max ) : ""; - - return sql; - } - } \ No newline at end of file === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageStore.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageStore.java 2014-05-12 09:56:39 +0000 @@ -48,7 +48,8 @@ public ProgramStage getByNameAndProgram( String name, Program program ) { - return (ProgramStage) getCriteria( Restrictions.eq( "name", name ), Restrictions.eq( "program", program ) ) - .uniqueResult(); + return (ProgramStage) getCriteria( + Restrictions.eq( "name", name ), + Restrictions.eq( "program", program ) ).uniqueResult(); } } === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStore.java 2014-04-06 17:03:28 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStore.java 2014-05-12 09:56:39 +0000 @@ -94,6 +94,7 @@ criteria2.add( Restrictions.eq( "orgunitMember.id", organisationUnit.getId() ) ); Collection programs = new HashSet(); + if ( criteria1.list() != null ) { programs.addAll( criteria1.list() ); === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/relationship/hibernate/HibernateRelationshipStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/relationship/hibernate/HibernateRelationshipStore.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/relationship/hibernate/HibernateRelationshipStore.java 2014-05-12 09:56:39 +0000 @@ -48,7 +48,9 @@ @SuppressWarnings( "unchecked" ) public Collection getForTrackedEntityInstance( TrackedEntityInstance instance ) { - return getCriteria( Restrictions.disjunction().add( Restrictions.eq( "entityInstanceA", instance ) ).add( + return getCriteria( + Restrictions.disjunction().add( + Restrictions.eq( "entityInstanceA", instance ) ).add( Restrictions.eq( "entityInstanceB", instance ) ) ).list(); } @@ -61,15 +63,17 @@ @SuppressWarnings( "unchecked" ) public Collection get( TrackedEntityInstance entityInstanceA, RelationshipType relationshipType ) { - return getCriteria( Restrictions.eq( "entityInstanceA", entityInstanceA ), + return getCriteria( + Restrictions.eq( "entityInstanceA", entityInstanceA ), Restrictions.eq( "relationshipType", relationshipType ) ).list(); } public Relationship get( TrackedEntityInstance entityInstanceA, TrackedEntityInstance entityInstanceB, RelationshipType relationshipType ) { - return (Relationship) getCriteria( Restrictions.eq( "entityInstanceA", entityInstanceA ), - Restrictions.eq( "entityInstanceB", entityInstanceB ), Restrictions.eq( "relationshipType", relationshipType ) ) - .uniqueResult(); + return (Relationship) getCriteria( + Restrictions.eq( "entityInstanceA", entityInstanceA ), + Restrictions.eq( "entityInstanceB", entityInstanceB ), + Restrictions.eq( "relationshipType", relationshipType ) ).uniqueResult(); } public Relationship get( TrackedEntityInstance entityInstanceA, TrackedEntityInstance entityInstanceB ) === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/relationship/hibernate/HibernateRelationshipTypeStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/relationship/hibernate/HibernateRelationshipTypeStore.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/relationship/hibernate/HibernateRelationshipTypeStore.java 2014-05-12 09:56:39 +0000 @@ -42,7 +42,8 @@ { public RelationshipType getRelationshipType( String aIsToB, String bIsToA ) { - return (RelationshipType) getCriteria( Restrictions.eq( "aIsToB", aIsToB ), Restrictions.eq( "bIsToA", bIsToA ) ) - .uniqueResult(); + return (RelationshipType) getCriteria( + Restrictions.eq( "aIsToB", aIsToB ), + Restrictions.eq( "bIsToA", bIsToA ) ).uniqueResult(); } } === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeGroupService.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeGroupService.java 2014-04-14 15:59:05 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeGroupService.java 2014-05-12 09:56:39 +0000 @@ -123,8 +123,7 @@ } @Override - public Collection getTrackedEntityAttributeGroupsBetweenByName( String name, - int min, int max ) + public Collection getTrackedEntityAttributeGroupsBetweenByName( String name, int min, int max ) { return attributeGroupStore.getAllLikeNameOrderedName( name, min, max ); } === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceReminderService.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceReminderService.java 2014-03-27 23:40:38 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceReminderService.java 2014-05-12 09:56:39 +0000 @@ -141,7 +141,6 @@ value = attributeValue.getValue(); } } - } templateMessage = templateMessage.replace( match, value ); === 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-05-04 14:04:41 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityInstanceService.java 2014-05-12 09:56:39 +0000 @@ -37,7 +37,6 @@ import static org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams.TRACKED_ENTITY_INSTANCE_ID; import java.lang.reflect.Type; -import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; @@ -56,6 +55,7 @@ import org.hisp.dhis.common.OrganisationUnitSelectionMode; import org.hisp.dhis.common.Pager; import org.hisp.dhis.common.QueryItem; +import org.hisp.dhis.common.QueryOperator; import org.hisp.dhis.event.EventStatus; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.organisationunit.OrganisationUnit; @@ -442,7 +442,9 @@ if ( operator != null && filter != null ) { - return new QueryItem( at, operator, filter, at.isNumericType() ); + QueryOperator op = QueryOperator.fromString( operator ); + + return new QueryItem( at, op, filter, at.isNumericType() ); } else { @@ -457,7 +459,7 @@ } @Override - public int createTrackedEntityInstance( TrackedEntityInstance instance, Integer representativeId, + public int createTrackedEntityInstance( TrackedEntityInstance instance, String representativeId, Integer relationshipTypeId, Set attributeValues ) { int id = addTrackedEntityInstance( instance ); @@ -474,7 +476,7 @@ if ( representativeId != null ) { - TrackedEntityInstance representative = trackedEntityInstanceStore.get( representativeId ); + TrackedEntityInstance representative = trackedEntityInstanceStore.getByUid( representativeId ); if ( representative != null ) { instance.setRepresentative( representative ); @@ -526,16 +528,10 @@ } @Override - public Collection getAllTrackedEntityInstances() - { - return trackedEntityInstanceStore.getAll(); - } - - @Override public Collection getTrackedEntityInstancesForMobile( String searchText, int orgUnitId ) { Set entityInstances = new HashSet(); - entityInstances.addAll( getTrackedEntityInstancesByPhone( searchText, 0, Integer.MAX_VALUE ) ); + entityInstances.addAll( trackedEntityInstanceStore.getByPhoneNumber( searchText, 0, Integer.MAX_VALUE ) ); if ( orgUnitId != 0 ) { @@ -563,74 +559,7 @@ } @Override - public Collection getTrackedEntityInstances( Program program ) - { - return trackedEntityInstanceStore.getByProgram( program, 0, Integer.MAX_VALUE ); - } - - @Override - public Collection getTrackedEntityInstances( OrganisationUnit organisationUnit, - Program program ) - { - return trackedEntityInstanceStore.getByOrgUnitProgram( organisationUnit, program, 0, Integer.MAX_VALUE ); - } - - @Override - public Collection getTrackedEntityInstance( Integer attributeId, String value ) - { - TrackedEntityAttribute attribute = attributeService.getTrackedEntityAttribute( attributeId ); - if ( attribute != null ) - { - return attributeValueService.getTrackedEntityInstance( attribute, value ); - } - - return null; - } - - @Override - public Collection sortTrackedEntityInstancesByAttribute( - Collection entityInstances, TrackedEntityAttribute attribute ) - { - Collection sortedTrackedEntityInstances = new ArrayList(); - - // --------------------------------------------------------------------- - // Better to fetch all attribute values at once than fetching the - // required attribute value of each instance using loop - // --------------------------------------------------------------------- - - Collection attributeValues = attributeValueService - .getTrackedEntityAttributeValues( entityInstances ); - - if ( attributeValues != null ) - { - for ( TrackedEntityAttributeValue attributeValue : attributeValues ) - { - if ( attribute == attributeValue.getAttribute() ) - { - sortedTrackedEntityInstances.add( attributeValue.getEntityInstance() ); - entityInstances.remove( attributeValue.getEntityInstance() ); - } - } - } - - // --------------------------------------------------------------------- - // Make sure all entityInstances are in the sorted list - because all - // entityInstances might not have the sorting attribute/value - // --------------------------------------------------------------------- - - sortedTrackedEntityInstances.addAll( entityInstances ); - - return sortedTrackedEntityInstances; - } - - @Override - public int countGetTrackedEntityInstancesByOrgUnit( OrganisationUnit organisationUnit ) - { - return trackedEntityInstanceStore.countListTrackedEntityInstanceByOrgunit( organisationUnit ); - } - - @Override - public void updateTrackedEntityInstance( TrackedEntityInstance instance, Integer representativeId, + public void updateTrackedEntityInstance( TrackedEntityInstance instance, String representativeId, Integer relationshipTypeId, List valuesForSave, List valuesForUpdate, Collection valuesForDelete ) { @@ -653,7 +582,7 @@ if ( shouldSaveRepresentativeInformation( instance, representativeId ) ) { - TrackedEntityInstance representative = trackedEntityInstanceStore.get( representativeId ); + TrackedEntityInstance representative = trackedEntityInstanceStore.getByUid( representativeId ); if ( representative != null ) { @@ -676,14 +605,14 @@ } } - private boolean shouldSaveRepresentativeInformation( TrackedEntityInstance instance, Integer representativeId ) + private boolean shouldSaveRepresentativeInformation( TrackedEntityInstance instance, String representativeId ) { - if ( representativeId == null ) + if ( representativeId == null || representativeId.isEmpty() ) { return false; } - return instance.getRepresentative() == null || !(instance.getRepresentative().getId() == representativeId); + return instance.getRepresentative() == null || !(instance.getRepresentative().getUid() == representativeId); } @Override @@ -694,12 +623,6 @@ } @Override - public int countGetTrackedEntityInstancesByOrgUnitProgram( OrganisationUnit organisationUnit, Program program ) - { - return trackedEntityInstanceStore.countGetTrackedEntityInstancesByOrgUnitProgram( organisationUnit, program ); - } - - @Override public Object getObjectValue( String property, String value, I18nFormat format ) { try @@ -741,21 +664,6 @@ } @Override - public List getProgramStageInstances( List searchKeys, Collection orgunits, - Boolean followup, Integer statusEnrollment, Integer min, Integer max ) - { - return trackedEntityInstanceStore.getProgramStageInstances( searchKeys, orgunits, followup, null, - statusEnrollment, min, max ); - } - - @Override - public Collection getTrackedEntityInstancesByPhone( String phoneNumber, Integer min, - Integer max ) - { - return trackedEntityInstanceStore.getByPhoneNumber( phoneNumber, min, max ); - } - - @Override public String validateTrackedEntityInstance( TrackedEntityInstance instance, Program program, I18nFormat format ) { return trackedEntityInstanceStore.validate( instance, program, format ); @@ -773,7 +681,7 @@ { Set entityInstances = new HashSet(); - entityInstances.addAll( getTrackedEntityInstancesByAttributeValue( searchText, attributeId, 0, + entityInstances.addAll( trackedEntityInstanceStore.getByAttributeValue( searchText, attributeId, 0, Integer.MAX_VALUE ) ); if ( orgUnitId != 0 ) @@ -793,34 +701,10 @@ return entityInstances; } - - @Override - public Collection getTrackedEntityInstancesByAttributeValue( String searchText, - int attributeId, Integer min, Integer max ) - { - return trackedEntityInstanceStore.getByAttributeValue( searchText, attributeId, min, max ); - } - - @Override - public Collection searchTrackedEntityInstances( List searchKeys, - Collection orgunits, Boolean followup, Collection attributes, - Integer statusEnrollment, Integer min, Integer max ) - { - return trackedEntityInstanceStore.search( searchKeys, orgunits, followup, attributes, statusEnrollment, min, - max ); - } - - @Override - public int countSearchTrackedEntityInstances( List searchKeys, Collection orgunits, - Boolean followup, Integer statusEnrollment ) - { - return trackedEntityInstanceStore.countSearch( searchKeys, orgunits, followup, statusEnrollment ); - } @Override public Collection getTrackedEntityInstances( TrackedEntity trackedEntity ) { return trackedEntityInstanceStore.get( trackedEntity ); } - } === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityAuditStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityAuditStore.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityAuditStore.java 2014-05-12 09:56:39 +0000 @@ -57,8 +57,10 @@ @Override public TrackedEntityAudit get( Integer entityInstanceId, String visitor, Date date, String accessedModule ) { - return (TrackedEntityAudit) getCriteria( Restrictions.eq( "entityInstance.id", entityInstanceId ), - Restrictions.eq( "visitor", visitor ), Restrictions.eq( "date", date ), + return (TrackedEntityAudit) getCriteria( + Restrictions.eq( "entityInstance.id", entityInstanceId ), + Restrictions.eq( "visitor", visitor ), + Restrictions.eq( "date", date ), Restrictions.eq( "accessedModule", accessedModule ) ).uniqueResult(); } } === 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-05-04 14:04:41 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityInstanceStore.java 2014-05-12 09:56:39 +0000 @@ -36,30 +36,20 @@ import static org.hisp.dhis.system.util.TextUtils.removeLastAnd; import static org.hisp.dhis.system.util.TextUtils.removeLastComma; import static org.hisp.dhis.system.util.TextUtils.removeLastOr; -import static org.hisp.dhis.trackedentity.TrackedEntityInstance.PREFIX_PROGRAM; -import static org.hisp.dhis.trackedentity.TrackedEntityInstance.PREFIX_PROGRAM_EVENT_BY_STATUS; -import static org.hisp.dhis.trackedentity.TrackedEntityInstance.PREFIX_PROGRAM_INSTANCE; -import static org.hisp.dhis.trackedentity.TrackedEntityInstance.PREFIX_PROGRAM_STAGE; -import static org.hisp.dhis.trackedentity.TrackedEntityInstance.PREFIX_TRACKED_ENTITY_ATTRIBUTE; import static org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams.CREATED_ID; import static org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams.LAST_UPDATED_ID; 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 java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; 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 org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Projections; @@ -73,10 +63,8 @@ import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.jdbc.StatementBuilder; import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramInstance; -import org.hisp.dhis.program.ProgramStageInstance; import org.hisp.dhis.program.ProgramStatus; import org.hisp.dhis.system.util.SqlHelper; import org.hisp.dhis.system.util.Timer; @@ -88,7 +76,6 @@ import org.hisp.dhis.trackedentity.TrackedEntityInstanceStore; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.validation.ValidationCriteria; -import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.transaction.annotation.Transactional; @@ -100,8 +87,6 @@ extends HibernateIdentifiableObjectStore implements TrackedEntityInstanceStore { - private static final Log log = LogFactory.getLog( HibernateTrackedEntityInstanceStore.class ); - private static final Map PROGRAM_STATUS_MAP = new HashMap() { { @@ -115,13 +100,6 @@ // Dependencies // ------------------------------------------------------------------------- - private OrganisationUnitService organisationUnitService; - - public void setOrganisationUnitService( OrganisationUnitService organisationUnitService ) - { - this.organisationUnitService = organisationUnitService; - } - private StatementBuilder statementBuilder; public void setStatementBuilder( StatementBuilder statementBuilder ) @@ -454,45 +432,6 @@ @Override @SuppressWarnings( "unchecked" ) - public Collection getByProgram( Program program, Integer min, Integer max ) - { - String hql = "select pt from TrackedEntityInstance pt inner join pt.programInstances pi " - + "where pi.program = :program and pi.status = :status"; - - Query query = getQuery( hql ); - query.setEntity( "program", program ); - query.setInteger( "status", ProgramInstance.STATUS_ACTIVE ); - - return query.list(); - } - - @Override - public int countListTrackedEntityInstanceByOrgunit( OrganisationUnit organisationUnit ) - { - Query query = getQuery( "select count(p.id) from TrackedEntityInstance p where p.organisationUnit.id=:orgUnitId " ); - - query.setParameter( "orgUnitId", organisationUnit.getId() ); - - Number rs = (Number) query.uniqueResult(); - - return rs != null ? rs.intValue() : 0; - } - - @Override - public int countGetTrackedEntityInstancesByOrgUnitProgram( OrganisationUnit organisationUnit, Program program ) - { - String sql = "select count(p.trackedentityinstanceid) from trackedentityinstance p join programinstance pi on p.trackedentityinstanceid=pi.trackedentityinstanceid " - + "where p.organisationunitid=" - + organisationUnit.getId() - + " and pi.programid=" - + program.getId() - + " and pi.status=" + ProgramInstance.STATUS_ACTIVE; - - return jdbcTemplate.queryForObject( sql, Integer.class ); - } - - @Override - @SuppressWarnings( "unchecked" ) public Collection getRepresentatives( TrackedEntityInstance instance ) { String hql = "select distinct p from TrackedEntityInstance p where p.representative = :representative order by p.id DESC"; @@ -643,416 +582,6 @@ } } - @Override - public List getProgramStageInstances( List searchKeys, Collection orgunits, - Boolean followup, Collection attributes, Integer statusEnrollment, Integer min, - Integer max ) - { - String sql = searchTrackedEntityInstanceSql( false, searchKeys, orgunits, followup, attributes, - statusEnrollment, min, max ); - - List programStageInstanceIds = new ArrayList(); - try - { - programStageInstanceIds = jdbcTemplate.query( sql, new RowMapper() - { - public Integer mapRow( ResultSet rs, int rowNum ) - throws SQLException - { - return rs.getInt( "programstageinstanceid" ); - } - } ); - } - catch ( Exception ex ) - { - ex.printStackTrace(); - } - - return programStageInstanceIds; - } - - private String searchTrackedEntityInstanceSql( boolean count, List searchKeys, - Collection orgunits, Boolean followup, Collection attributes, - Integer statusEnrollment, Integer min, Integer max ) - { - String selector = count ? "count(*) " : "* "; - String sql = "select " + selector + " from ( select distinct p.trackedentityinstanceid,"; - - if ( attributes != null ) - { - for ( TrackedEntityAttribute attribute : attributes ) - { - sql += "(select value from trackedentityattributevalue where trackedentityinstanceid=p.trackedentityinstanceid and trackedentityattributeid=" - + attribute.getId() + " ) as " + PREFIX_TRACKED_ENTITY_ATTRIBUTE + "_" + attribute.getId() + " ,"; - } - } - - String instanceWhere = ""; - String instanceOperator = " where "; - String instanceGroupBy = " GROUP BY p.trackedentityinstanceid "; - String otherWhere = ""; - String operator = " where "; - String orderBy = ""; - boolean isSearchEvent = false; - boolean isPriorityEvent = false; - Collection orgunitChilrenIds = null; - - if ( orgunits != null ) - { - orgunitChilrenIds = getOrgunitChildren( orgunits ); - } - - for ( String searchKey : searchKeys ) - { - String[] keys = searchKey.split( "_" ); - - if ( keys.length <= 1 || keys[1] == null || keys[1].trim().isEmpty() || keys[1].equals( "null" ) ) - { - continue; - } - - String id = keys[1]; - String value = ""; - - if ( keys.length >= 3 ) - { - value = keys[2]; - } - - if ( keys[0].equals( PREFIX_TRACKED_ENTITY_ATTRIBUTE ) ) - { - sql += "(select value from trackedentityattributevalue where trackedentityinstanceid=p.trackedentityinstanceid and trackedentityattributeid=" - + id + " ) as " + PREFIX_TRACKED_ENTITY_ATTRIBUTE + "_" + id + ","; - - String[] keyValues = value.split( " " ); - otherWhere += operator + "("; - String opt = ""; - - for ( String v : keyValues ) - { - otherWhere += opt + " lower(" + PREFIX_TRACKED_ENTITY_ATTRIBUTE + "_" + id + ") like '%" + v + "%'"; - opt = "or"; - } - - otherWhere += ")"; - operator = " and "; - } - else if ( keys[0].equals( PREFIX_PROGRAM ) ) - { - sql += "(select programid from programinstance pgi where trackedentityinstanceid=p.trackedentityinstanceid and programid=" - + id; - - if ( statusEnrollment != null ) - { - sql += " and pgi.status=" + statusEnrollment; - } - - sql += " limit 1 ) as " + PREFIX_PROGRAM + "_" + id + ","; - otherWhere += operator + PREFIX_PROGRAM + "_" + id + "=" + id; - operator = " and "; - } - else if ( keys[0].equals( PREFIX_PROGRAM_INSTANCE ) ) - { - sql += "(select pi." - + id - + " from programinstance pi where trackedentityinstanceid=p.trackedentityinstanceid and pi.status=0 "; - - if ( keys.length == 5 ) - { - sql += " and pi.programid=" + keys[4]; - } - else - { - sql += " limit 1 "; - } - - sql += ") as " + PREFIX_PROGRAM_INSTANCE + "_" + id + ","; - otherWhere += operator + PREFIX_PROGRAM_INSTANCE + "_" + id + "='" + keys[2] + "'"; - operator = " and "; - } - else if ( keys[0].equals( PREFIX_PROGRAM_EVENT_BY_STATUS ) ) - { - isSearchEvent = true; - isPriorityEvent = Boolean.parseBoolean( keys[5] ); - instanceWhere += instanceOperator + "pgi.trackedentityinstanceid=p.trackedentityinstanceid and "; - instanceWhere += "pgi.programid=" + id + " and "; - instanceWhere += "pgi.status=" + ProgramInstance.STATUS_ACTIVE; - - String operatorStatus = ""; - String condition = " and ( "; - - for ( int index = 6; index < keys.length; index++ ) - { - int statusEvent = Integer.parseInt( keys[index] ); - switch ( statusEvent ) - { - case ProgramStageInstance.COMPLETED_STATUS: - instanceWhere += condition + operatorStatus - + "( psi.executiondate is not null and psi.executiondate>='" + keys[2] - + "' and psi.executiondate<='" + keys[3] + "' and psi.completed=true "; - - // get events by orgunit children - if ( keys[4].equals( "-1" ) ) - { - instanceWhere += " and psi.organisationunitid in( " - + getCommaDelimitedString( orgunitChilrenIds ) + " )"; - } - - // get events by selected orgunit - else if ( !keys[4].equals( "0" ) ) - { - instanceWhere += " and psi.organisationunitid=" + getOrgUnitId( keys ); - } - - instanceWhere += ")"; - operatorStatus = " OR "; - condition = ""; - continue; - case ProgramStageInstance.VISITED_STATUS: - instanceWhere += condition + operatorStatus - + "( psi.executiondate is not null and psi.executiondate>='" + keys[2] - + "' and psi.executiondate<='" + keys[3] + "' and psi.completed=false "; - - // get events by orgunit children - if ( keys[4].equals( "-1" ) ) - { - instanceWhere += " and psi.organisationunitid in( " - + getCommaDelimitedString( orgunitChilrenIds ) + " )"; - } - - // get events by selected orgunit - else if ( !keys[4].equals( "0" ) ) - { - instanceWhere += " and psi.organisationunitid=" + getOrgUnitId( keys ); - } - - instanceWhere += ")"; - operatorStatus = " OR "; - condition = ""; - continue; - case ProgramStageInstance.FUTURE_VISIT_STATUS: - instanceWhere += condition + operatorStatus + "( psi.executiondate is null and psi.duedate>='" - + keys[2] + "' and psi.duedate<='" + keys[3] - + "' and psi.status is not null and (DATE(now()) - DATE(psi.duedate) <= 0) "; - - // get events by orgunit children - if ( keys[4].equals( "-1" ) ) - { - instanceWhere += " and p.organisationunitid in( " - + getCommaDelimitedString( orgunitChilrenIds ) + " )"; - } - - // get events by selected orgunit - else if ( !keys[4].equals( "0" ) ) - { - instanceWhere += " and p.organisationunitid=" + getOrgUnitId( keys ); - } - - instanceWhere += ")"; - operatorStatus = " OR "; - condition = ""; - continue; - case ProgramStageInstance.LATE_VISIT_STATUS: - instanceWhere += condition + operatorStatus + "( psi.executiondate is null and psi.duedate>='" - + keys[2] + "' and psi.duedate<='" + keys[3] - + "' and psi.status is not null and (DATE(now()) - DATE(psi.duedate) > 0) "; - - // get events by orgunit children - if ( keys[4].equals( "-1" ) ) - { - instanceWhere += " and p.organisationunitid in( " - + getCommaDelimitedString( orgunitChilrenIds ) + " )"; - } - - // get events by selected orgunit - else if ( !keys[4].equals( "0" ) ) - { - instanceWhere += " and p.organisationunitid=" + getOrgUnitId( keys ); - } - - instanceWhere += ")"; - operatorStatus = " OR "; - condition = ""; - continue; - case ProgramStageInstance.SKIPPED_STATUS: - instanceWhere += condition + operatorStatus + "( psi.status=5 and psi.duedate>='" + keys[2] - + "' and psi.duedate<='" + keys[3] + "' "; - - // get events by orgunit children - if ( keys[4].equals( "-1" ) ) - { - instanceWhere += " and psi.organisationunitid in( " - + getCommaDelimitedString( orgunitChilrenIds ) + " )"; - } - - // get events by selected orgunit - else if ( !keys[4].equals( "0" ) ) - { - instanceWhere += " and p.organisationunitid=" + getOrgUnitId( keys ); - } - instanceWhere += ")"; - operatorStatus = " OR "; - condition = ""; - continue; - default: - continue; - } - } - if ( condition.isEmpty() ) - { - instanceWhere += ")"; - } - - instanceWhere += " and pgi.status=" + ProgramInstance.STATUS_ACTIVE + " "; - instanceOperator = " and "; - } - else if ( keys[0].equals( PREFIX_PROGRAM_STAGE ) ) - { - isSearchEvent = true; - instanceWhere += instanceOperator - + "pgi.trackedentityinstanceid=p.trackedentityinstanceid and psi.programstageid=" + id + " and "; - instanceWhere += "psi.duedate>='" + keys[3] + "' and psi.duedate<='" + keys[4] + "' and "; - instanceWhere += "psi.organisationunitid = " + keys[5] + " and "; - - int statusEvent = Integer.parseInt( keys[2] ); - switch ( statusEvent ) - { - case ProgramStageInstance.COMPLETED_STATUS: - instanceWhere += "psi.completed=true"; - break; - case ProgramStageInstance.VISITED_STATUS: - instanceWhere += "psi.executiondate is not null and psi.completed=false"; - break; - case ProgramStageInstance.FUTURE_VISIT_STATUS: - instanceWhere += "psi.executiondate is null and psi.duedate >= now()"; - break; - case ProgramStageInstance.LATE_VISIT_STATUS: - instanceWhere += "psi.executiondate is null and psi.duedate < now()"; - break; - default: - break; - } - - instanceWhere += " and pgi.status=" + ProgramInstance.STATUS_ACTIVE + " "; - instanceOperator = " and "; - } - } - - if ( orgunits != null && !isSearchEvent ) - { - sql += "(select organisationunitid from trackedentityinstance where trackedentityinstanceid=p.trackedentityinstanceid and organisationunitid in ( " - + getCommaDelimitedString( getOrganisationUnitIds( orgunits ) ) + " ) ) as orgunitid,"; - otherWhere += operator + "orgunitid in ( " + getCommaDelimitedString( getOrganisationUnitIds( orgunits ) ) - + " ) "; - } - - sql = sql.substring( 0, sql.length() - 1 ) + " "; // Removing last comma - - String from = " from trackedentityinstance p "; - - if ( isSearchEvent ) - { - String subSQL = " , psi.programstageinstanceid as programstageinstanceid, pgs.name as programstagename, psi.duedate as duedate "; - - if ( isPriorityEvent ) - { - subSQL += ",pgi.followup "; - orderBy = " ORDER BY pgi.followup desc, p.trackedentityinstanceid, duedate asc "; - instanceGroupBy += ",pgi.followup "; - } - else - { - orderBy = " ORDER BY p.trackedentityinstanceid, duedate asc "; - } - - sql = sql + subSQL + from + " inner join programinstance pgi on " - + " (pgi.trackedentityinstanceid=p.trackedentityinstanceid) " - + " inner join programstageinstance psi on (psi.programinstanceid=pgi.programinstanceid) " - + " inner join programstage pgs on (pgs.programstageid=psi.programstageid) "; - - instanceGroupBy += ",psi.programstageinstanceid, pgs.name, psi.duedate "; - - from = " "; - } - - sql += from + instanceWhere; - if ( followup != null ) - { - sql += " AND pgi.followup=" + followup; - } - if ( isSearchEvent ) - { - sql += instanceGroupBy; - } - sql += orderBy; - sql += " ) as searchresult"; - sql += otherWhere; - - if ( min != null && max != null ) - { - sql += " limit " + max + " offset " + min; - } - - log.info( "Search tracked entity instance SQL: " + sql ); - - return sql; - } - - private Integer getOrgUnitId( String[] keys ) - { - Integer orgUnitId; - try - { - orgUnitId = Integer.parseInt( keys[4] ); - } - catch ( NumberFormatException e ) - { - // handle as uid - OrganisationUnit ou = organisationUnitService.getOrganisationUnit( keys[4] ); - orgUnitId = ou.getId(); - } - return orgUnitId; - } - - private Collection getOrgunitChildren( Collection orgunits ) - { - Collection orgUnitIds = new HashSet(); - - if ( orgunits != null ) - { - for ( OrganisationUnit orgunit : orgunits ) - { - orgUnitIds - .addAll( organisationUnitService.getOrganisationUnitHierarchy().getChildren( orgunit.getId() ) ); - orgUnitIds.remove( orgunit.getId() ); - } - } - - if ( orgUnitIds.size() == 0 ) - { - orgUnitIds.add( 0 ); - } - - return orgUnitIds; - } - - private Collection getOrganisationUnitIds( Collection orgunits ) - { - Collection orgUnitIds = new HashSet(); - - for ( OrganisationUnit orgUnit : orgunits ) - { - orgUnitIds.add( orgUnit.getId() ); - } - - if ( orgUnitIds.size() == 0 ) - { - orgUnitIds.add( 0 ); - } - - return orgUnitIds; - } - @SuppressWarnings( "unchecked" ) @Override public Collection getByAttributeValue( String searchText, int attributeId, Integer min, @@ -1079,41 +608,6 @@ return entityInstances; } - - @Override - public Collection search( List searchKeys, Collection orgunits, - Boolean followup, Collection attributes, Integer statusEnrollment, Integer min, - Integer max ) - { - String sql = searchTrackedEntityInstanceSql( false, searchKeys, orgunits, followup, attributes, - statusEnrollment, min, max ); - Collection instances = new HashSet(); - try - { - instances = jdbcTemplate.query( sql, new RowMapper() - { - public TrackedEntityInstance mapRow( ResultSet rs, int rowNum ) - throws SQLException - { - return get( rs.getInt( 1 ) ); - } - } ); - } - catch ( Exception ex ) - { - ex.printStackTrace(); - } - return instances; - } - - @Override - public int countSearch( List searchKeys, Collection orgunits, Boolean followup, - Integer statusEnrollment ) - { - String sql = searchTrackedEntityInstanceSql( true, searchKeys, orgunits, followup, null, statusEnrollment, - null, null ); - return jdbcTemplate.queryForObject( sql, Integer.class ); - } @SuppressWarnings( "unchecked" ) @Override === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/hibernate/HibernateTrackedEntityAttributeValueStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/hibernate/HibernateTrackedEntityAttributeValueStore.java 2014-03-19 06:44:30 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/hibernate/HibernateTrackedEntityAttributeValueStore.java 2014-05-12 09:56:39 +0000 @@ -28,6 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import java.util.ArrayList; import java.util.Collection; import org.hibernate.Query; @@ -77,7 +78,8 @@ @Override public TrackedEntityAttributeValue get( TrackedEntityInstance entityInstance, TrackedEntityAttribute attribute ) { - return (TrackedEntityAttributeValue) getCriteria( Restrictions.eq( "entityInstance", entityInstance ), + return (TrackedEntityAttributeValue) getCriteria( + Restrictions.eq( "entityInstance", entityInstance ), Restrictions.eq( "attribute", attribute ) ).uniqueResult(); } @@ -99,6 +101,11 @@ @SuppressWarnings( "unchecked" ) public Collection get( Collection entityInstances ) { + if ( entityInstances == null || entityInstances.isEmpty() ) + { + return new ArrayList(); + } + return getCriteria( Restrictions.in( "entityInstance", entityInstances ) ).list(); } @@ -106,7 +113,8 @@ @SuppressWarnings( "unchecked" ) public Collection searchByValue( TrackedEntityAttribute attribute, String searchText ) { - return getCriteria( Restrictions.eq( "attribute", attribute ), + return getCriteria( + Restrictions.eq( "attribute", attribute ), Restrictions.ilike( "value", "%" + searchText + "%" ) ).list(); } @@ -115,8 +123,9 @@ public Collection getTrackedEntityInstances( TrackedEntityAttribute attribute, String value ) { return getCriteria( - Restrictions.and( Restrictions.eq( "attribute", attribute ), Restrictions.eq( "value", value ) ) ) - .setProjection( Projections.property( "entityInstance" ) ).list(); + Restrictions.and( Restrictions.eq( "attribute", attribute ), + Restrictions.eq( "value", value ) ) ). + setProjection( Projections.property( "entityInstance" ) ).list(); } @Override === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentitydatavalue/DefaultTrackedEntityDataValueService.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentitydatavalue/DefaultTrackedEntityDataValueService.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentitydatavalue/DefaultTrackedEntityDataValueService.java 2014-05-12 09:56:39 +0000 @@ -41,7 +41,6 @@ /** * @author Abyot Asalefew Gizaw - * @version $Id$ */ @Transactional public class DefaultTrackedEntityDataValueService @@ -108,8 +107,7 @@ return dataValueStore.get( programStageInstance, dataElements ); } - public Collection getTrackedEntityDataValues( - Collection programStageInstances ) + public Collection getTrackedEntityDataValues( Collection programStageInstances ) { return dataValueStore.get( programStageInstances ); } === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentitydatavalue/TrackedEntityDataValueDeletionHandler.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentitydatavalue/TrackedEntityDataValueDeletionHandler.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentitydatavalue/TrackedEntityDataValueDeletionHandler.java 2014-05-12 09:56:39 +0000 @@ -38,8 +38,6 @@ /** * @author Chau Thu Tran - * @version $ TrackedEntityDataValueDeletionHandler.java Jun 24, 2011 1:10:46 PM $ - * */ public class TrackedEntityDataValueDeletionHandler extends DeletionHandler === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentitydatavalue/hibernate/HibernateTrackedEntityDataValueStore.java' --- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentitydatavalue/hibernate/HibernateTrackedEntityDataValueStore.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentitydatavalue/hibernate/HibernateTrackedEntityDataValueStore.java 2014-05-12 09:56:39 +0000 @@ -71,6 +71,11 @@ public Collection get( ProgramStageInstance programStageInstance, Collection dataElements ) { + if ( dataElements == null || dataElements.isEmpty() ) + { + return new ArrayList(); + } + String hql = "from TrackedEntityDataValue pdv where pdv.dataElement in ( :dataElements ) " + "and pdv.programStageInstance = :programStageInstance"; @@ -99,6 +104,11 @@ public Collection get( TrackedEntityInstance entityInstance, Collection dataElements, Date startDate, Date endDate ) { + if ( dataElements == null || dataElements.isEmpty() ) + { + return new ArrayList(); + } + String hql = "from TrackedEntityDataValue pdv where pdv.dataElement in ( :dataElements ) " + "and pdv.programStageInstance.programInstance.entityInstance = :entityInstance " + "and pdv.programStageInstance.executionDate >= :startDate and pdv.programStageInstance.executionDate <= :endDate "; === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-tracker/src/main/resources/META-INF/dhis/beans.xml 2014-05-04 14:04:41 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/main/resources/META-INF/dhis/beans.xml 2014-05-12 09:56:39 +0000 @@ -30,7 +30,6 @@ - - @@ -184,8 +181,6 @@ - (), organisationUnit ); @@ -198,87 +197,17 @@ } @Test - public void testGetAllTrackedEntityInstances() - { - entityInstanceService.addTrackedEntityInstance( entityInstanceA1 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceB1 ); - - assertTrue( equals( entityInstanceService.getAllTrackedEntityInstances(), entityInstanceA1, entityInstanceB1 ) ); - } - - @Test public void testGetTrackedEntityInstancesByOu() { entityInstanceService.addTrackedEntityInstance( entityInstanceA1 ); entityInstanceService.addTrackedEntityInstance( entityInstanceA2 ); entityInstanceService.addTrackedEntityInstance( entityInstanceA3 ); - Collection entityInstances = entityInstanceService.getTrackedEntityInstances( organisationUnit, null, null ); - assertEquals( 2, entityInstances.size() ); - assertTrue( entityInstances.contains( entityInstanceA1 ) ); - assertTrue( entityInstances.contains( entityInstanceA3 ) ); - } - - @Test - public void testGetTrackedEntityInstancesByProgram() - { - programService.addProgram( programA ); - - entityInstanceService.addTrackedEntityInstance( entityInstanceA1 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceA2 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceA3 ); - - programInstanceService.enrollTrackedEntityInstance( entityInstanceA1, programA, date, date, organisationUnit ); - programInstanceService.enrollTrackedEntityInstance( entityInstanceA3, programA, date, date, organisationUnit ); - - Collection entityInstances = entityInstanceService.getTrackedEntityInstances( programA ); - assertEquals( 2, entityInstances.size() ); - assertTrue( entityInstances.contains( entityInstanceA1 ) ); - assertTrue( entityInstances.contains( entityInstanceA3 ) ); - } - - @Test - public void testGetTrackedEntityInstancesbyOuProgram() - { - programService.addProgram( programA ); - - entityInstanceService.addTrackedEntityInstance( entityInstanceA1 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceA2 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceA3 ); - - programInstanceService.enrollTrackedEntityInstance( entityInstanceA1, programA, date, date, organisationUnit ); - programInstanceService.enrollTrackedEntityInstance( entityInstanceA2, programA, date, date, organisationUnit ); - programInstanceService.enrollTrackedEntityInstance( entityInstanceA3, programA, date, date, organisationUnit ); - - Collection entityInstances = entityInstanceService.getTrackedEntityInstances( organisationUnit, programA ); - assertEquals( 2, entityInstances.size() ); - assertTrue( entityInstances.contains( entityInstanceA1 ) ); - assertTrue( entityInstances.contains( entityInstanceA3 ) ); - } - - @Test - public void testGetTrackedEntityInstancesByAttribute() - { - entityInstanceService.addTrackedEntityInstance( entityInstanceA2 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceA3 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceB1 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceB2 ); - - TrackedEntityAttributeValue attributeValue = createTrackedEntityAttributeValue( 'A', entityInstanceA3, - entityInstanceAttribute ); - Set entityInstanceAttributeValues = new HashSet(); - entityInstanceAttributeValues.add( attributeValue ); - - entityInstanceService.createTrackedEntityInstance( entityInstanceA3, null, null, entityInstanceAttributeValues ); - - Collection entityInstances = entityInstanceService.getTrackedEntityInstance( attributeId, "AttributeA" ); - - assertEquals( 1, entityInstances.size() ); - assertTrue( entityInstances.contains( entityInstanceA3 ) ); - - TrackedEntityInstance entityInstance = entityInstances.iterator().next(); - assertEquals( 1, entityInstance.getAttributeValues().size() ); - assertTrue( entityInstance.getAttributeValues().contains( attributeValue ) ); + Collection entityInstances = entityInstanceService.getTrackedEntityInstances( + organisationUnit, null, null ); + assertEquals( 2, entityInstances.size() ); + assertTrue( entityInstances.contains( entityInstanceA1 ) ); + assertTrue( entityInstances.contains( entityInstanceA3 ) ); } @Test @@ -297,8 +226,8 @@ programInstanceService.enrollTrackedEntityInstance( entityInstanceA2, programA, date, date, organisationUnit ); programInstanceService.enrollTrackedEntityInstance( entityInstanceB2, programB, date, date, organisationUnit ); - Collection entityInstances = entityInstanceService.getTrackedEntityInstances( organisationUnit, programA, 0, - 100 ); + Collection entityInstances = entityInstanceService.getTrackedEntityInstances( + organisationUnit, programA, 0, 100 ); assertEquals( 2, entityInstances.size() ); assertTrue( entityInstances.contains( entityInstanceA1 ) ); @@ -327,7 +256,7 @@ @Test public void testCreateTrackedEntityInstanceAndRelative() { - int idB = entityInstanceService.addTrackedEntityInstance( entityInstanceB1 ); + entityInstanceService.addTrackedEntityInstance( entityInstanceB1 ); RelationshipType relationshipType = createRelationshipType( 'A' ); int relationshipTypeId = relationshipTypeService.addRelationshipType( relationshipType ); @@ -337,14 +266,15 @@ Set entityInstanceAttributeValues = new HashSet(); entityInstanceAttributeValues.add( attributeValue ); - int idA = entityInstanceService.createTrackedEntityInstance( entityInstanceA1, idB, relationshipTypeId, entityInstanceAttributeValues ); + int idA = entityInstanceService.createTrackedEntityInstance( entityInstanceA1, entityInstanceB1.getUid(), + relationshipTypeId, entityInstanceAttributeValues ); assertNotNull( entityInstanceService.getTrackedEntityInstance( idA ) ); } @Test public void testUpdateTrackedEntityInstanceAndRelative() { - int idB = entityInstanceService.addTrackedEntityInstance( entityInstanceB1 ); + entityInstanceService.addTrackedEntityInstance( entityInstanceB1 ); RelationshipType relationshipType = createRelationshipType( 'A' ); int relationshipTypeId = relationshipTypeService.addRelationshipType( relationshipType ); @@ -354,78 +284,17 @@ entityInstanceAttribute ); Set entityInstanceAttributeValues = new HashSet(); entityInstanceAttributeValues.add( attributeValue ); - int idA = entityInstanceService.createTrackedEntityInstance( entityInstanceA3, idB, relationshipTypeId, entityInstanceAttributeValues ); + int idA = entityInstanceService.createTrackedEntityInstance( entityInstanceA3, entityInstanceB1.getUid(), + relationshipTypeId, entityInstanceAttributeValues ); assertNotNull( entityInstanceService.getTrackedEntityInstance( idA ) ); attributeValue.setValue( "AttributeB" ); List attributeValues = new ArrayList(); attributeValues.add( attributeValue ); - entityInstanceService.updateTrackedEntityInstance( entityInstanceA3, idB, relationshipTypeId, attributeValues, - new ArrayList(), new ArrayList() ); + entityInstanceService.updateTrackedEntityInstance( entityInstanceA3, entityInstanceB1.getUid(), + relationshipTypeId, attributeValues, new ArrayList(), + new ArrayList() ); assertEquals( "B", entityInstanceService.getTrackedEntityInstance( idA ).getName() ); } - - @Test - public void testCountGetTrackedEntityInstancesByOrgUnit() - { - entityInstanceService.addTrackedEntityInstance( entityInstanceA1 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceA2 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceA3 ); - - assertEquals( 2, entityInstanceService.countGetTrackedEntityInstancesByOrgUnit( organisationUnit ) ); - } - - @Test - public void testCountGetTrackedEntityInstancesByOrgUnitProgram() - { - programService.addProgram( programA ); - programService.addProgram( programB ); - - entityInstanceService.addTrackedEntityInstance( entityInstanceA1 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceB1 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceA2 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceB2 ); - - programInstanceService.enrollTrackedEntityInstance( entityInstanceA1, programA, date, date, organisationUnit ); - programInstanceService.enrollTrackedEntityInstance( entityInstanceB1, programA, date, date, organisationUnit ); - programInstanceService.enrollTrackedEntityInstance( entityInstanceA2, programA, date, date, organisationUnit ); - programInstanceService.enrollTrackedEntityInstance( entityInstanceB2, programB, date, date, organisationUnit ); - - assertEquals( 2, entityInstanceService.countGetTrackedEntityInstancesByOrgUnitProgram( organisationUnit, programA ) ); - assertEquals( 1, entityInstanceService.countGetTrackedEntityInstancesByOrgUnitProgram( organisationUnit, programB ) ); - } - - @Test - public void testGetTrackedEntityInstancesByPhone() - { - entityInstanceService.addTrackedEntityInstance( entityInstanceA1 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceA2 ); - entityInstanceService.addTrackedEntityInstance( entityInstanceA3 ); - - TrackedEntityAttribute entityInstanceAttribute = createTrackedEntityAttribute( 'B' ); - entityInstanceAttribute.setValueType( TrackedEntityAttribute.TYPE_PHONE_NUMBER ); - attributeService.addTrackedEntityAttribute( entityInstanceAttribute ); - - TrackedEntityAttributeValue attributeValue = createTrackedEntityAttributeValue( 'A', entityInstanceA1, - entityInstanceAttribute ); - attributeValue.setValue( "123456789" ); - attributeValueService.addTrackedEntityAttributeValue( attributeValue ); - - entityInstanceA1.addAttributeValue( attributeValue ); - entityInstanceService.updateTrackedEntityInstance( entityInstanceA1 ); - - attributeValue = createTrackedEntityAttributeValue( 'A', entityInstanceA2, entityInstanceAttribute ); - attributeValue.setValue( "123456789" ); - attributeValueService.addTrackedEntityAttributeValue( attributeValue ); - entityInstanceA2.addAttributeValue( attributeValue ); - entityInstanceService.updateTrackedEntityInstance( entityInstanceA2 ); - - Collection entityInstances = entityInstanceService.getTrackedEntityInstancesByPhone( - "123456789", null, null ); - assertEquals( 2, entityInstances.size() ); - assertTrue( entityInstances.contains( entityInstanceA1 ) ); - assertTrue( entityInstances.contains( entityInstanceA2 ) ); - } - } === modified file 'dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceStoreTest.java' --- dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceStoreTest.java 2014-04-22 00:17:55 +0000 +++ dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentity/TrackedEntityInstanceStoreTest.java 2014-05-12 09:56:39 +0000 @@ -194,35 +194,6 @@ } @Test - public void testGetByProgram() - { - programService.addProgram( programA ); - programService.addProgram( programB ); - - entityInstanceStore.save( entityInstanceA1 ); - entityInstanceStore.save( entityInstanceB1 ); - entityInstanceStore.save( entityInstanceA2 ); - entityInstanceStore.save( entityInstanceB2 ); - - programInstanceService.enrollTrackedEntityInstance( entityInstanceA1, programA, date, date, organisationUnit ); - programInstanceService.enrollTrackedEntityInstance( entityInstanceA2, programA, date, date, organisationUnit ); - programInstanceService.enrollTrackedEntityInstance( entityInstanceB1, programA, date, date, organisationUnit ); - programInstanceService.enrollTrackedEntityInstance( entityInstanceB2, programB, date, date, organisationUnit ); - - Collection entityInstances = entityInstanceStore.getByProgram( programA, 0, 100 ); - - assertEquals( 3, entityInstances.size() ); - assertTrue( entityInstances.contains( entityInstanceA1 ) ); - assertTrue( entityInstances.contains( entityInstanceA2 ) ); - assertTrue( entityInstances.contains( entityInstanceB1 ) ); - - entityInstances = entityInstanceStore.getByOrgUnitProgram( organisationUnit, programB, 0, 100 ); - - assertEquals( 1, entityInstances.size() ); - assertTrue( entityInstances.contains( entityInstanceB2 ) ); - } - - @Test public void testGetRepresentatives() { entityInstanceStore.save( entityInstanceB1 ); === modified file 'dhis-2/dhis-support/dhis-support-hibernate/pom.xml' --- dhis-2/dhis-support/dhis-support-hibernate/pom.xml 2014-04-22 15:46:19 +0000 +++ dhis-2/dhis-support/dhis-support-hibernate/pom.xml 2014-05-12 09:56:39 +0000 @@ -33,8 +33,12 @@ hibernate-core - org.hibernate - hibernate-ehcache + com.hazelcast + hazelcast + + + com.hazelcast + hazelcast-hibernate4 org.hibernate === removed file 'dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml' --- dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml 2014-04-08 19:36:25 +0000 +++ dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml 1970-01-01 00:00:00 +0000 @@ -1,385 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - === added file 'dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/hazelcast.xml' --- dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/hazelcast.xml 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/hazelcast.xml 2014-05-12 09:56:39 +0000 @@ -0,0 +1,30 @@ + + + + 720 + 800000 + LRU + + \ No newline at end of file === modified file 'dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/hibernate-default.properties' --- dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/hibernate-default.properties 2014-04-28 19:23:37 +0000 +++ dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/hibernate-default.properties 2014-05-12 09:56:39 +0000 @@ -8,7 +8,7 @@ # 1) The classpath (src/main/resources) # 2) $DHIS2_HOME -# H2 In-Memory setup: +# H2 In-Memory setup hibernate.dialect = org.hibernate.dialect.H2Dialect hibernate.connection.driver_class = org.h2.Driver @@ -17,30 +17,28 @@ hibernate.connection.password = hibernate.hbm2ddl.auto = create-drop -# see c3p0-config.xml -#hibernate.c3p0.min_size = 3 -#hibernate.c3p0.max_size = 20 -#hibernate.c3p0.acquire_increment = 2 -#hibernate.c3p0.timeout = 5000 -#hibernate.c3p0.max_statements = 50 -#hibernate.c3p0.idle_test_period = 300 +# See c3p0-config.xml +# hibernate.c3p0.min_size = 3 +# hibernate.c3p0.max_size = 20 +# hibernate.c3p0.acquire_increment = 2 +# hibernate.c3p0.timeout = 5000 +# hibernate.c3p0.max_statements = 50 +# hibernate.c3p0.idle_test_period = 300 # Caching -hibernate.cache.region.factory_class = org.hibernate.cache.ehcache.EhCacheRegionFactory hibernate.cache.use_second_level_cache = true hibernate.cache.use_query_cache = true - -# hibernate.cache.region.factory_class = net.sf.ehcache.hibernate.EhCacheRegionFactory -# hibernate.cache.provider_class = org.hibernate.cache.EhCacheProvider - -# MySQL setup: +hibernate.cache.region.factory_class = com.hazelcast.hibernate.HazelcastLocalCacheRegionFactory +# hibernate.cache.region.factory_class = org.hibernate.cache.ehcache.EhCacheRegionFactory + +# MySQL setup # # hibernate.dialect = org.hibernate.dialect.MySQLDialect # hibernate.connection.driver_class = com.mysql.jdbc.Driver # hibernate.connection.url = jdbc:mysql://localhost/dhis2?useUnicode=true&characterEncoding=UTF-8 -# PostgreSQL setup: +# PostgreSQL setup # # hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect # hibernate.connection.driver_class = org.postgresql.Driver === modified file 'dhis-2/dhis-web/dhis-web-api-mobile/src/main/java/org/hisp/dhis/api/mobile/controller/MobileClientController.java' --- dhis-2/dhis-web/dhis-web-api-mobile/src/main/java/org/hisp/dhis/api/mobile/controller/MobileClientController.java 2014-05-05 10:16:05 +0000 +++ dhis-2/dhis-web/dhis-web-api-mobile/src/main/java/org/hisp/dhis/api/mobile/controller/MobileClientController.java 2014-05-12 09:56:39 +0000 @@ -83,8 +83,8 @@ @RequestMapping( method = RequestMethod.GET, value = "/{version}" ) @ResponseBody - public OrgUnits getOrgUnitsForUser( HttpServletRequest request, - @PathVariable String version ) + public OrgUnits getOrgUnitsForUser( HttpServletRequest request, @PathVariable + String version ) throws NotAllowedException { User user = currentUserService.getCurrentUser(); @@ -108,8 +108,8 @@ @RequestMapping( method = RequestMethod.GET, value = "/{version}/LWUIT" ) @ResponseBody - public OrgUnits getOrgUnitsForUserLWUIT( HttpServletRequest request, - @PathVariable String version ) + public OrgUnits getOrgUnitsForUserLWUIT( HttpServletRequest request, @PathVariable + String version ) throws NotAllowedException { User user = currentUserService.getCurrentUser(); @@ -147,7 +147,8 @@ orgUnit.setChangeUpdateDataSetLangUrl( getUrl( request, unit.getId(), "changeLanguageDataSet" ) ); orgUnit.setSearchUrl( getUrl( request, unit.getId(), "search" ) ); orgUnit.setUpdateNewVersionUrl( getUrl( request, unit.getId(), "updateNewVersionUrl" ) ); - orgUnit.setSendFeedbackUrl( getUrl(request, unit.getId(), "sendFeedback") ); + orgUnit.setSendFeedbackUrl( getUrl( request, unit.getId(), "sendFeedback" ) ); + orgUnit.setFindUserUrl( getUrl( request, unit.getId(), "findUser" ) ); orgUnit.setUpdateContactUrl( getUrl( request, unit.getId(), "updateContactForMobile" ) ); orgUnit.setFindPatientUrl( getUrl( request, unit.getId(), "findPatient" ) ); orgUnit.setRegisterPersonUrl( getUrl( request, unit.getId(), "registerPerson" ) ); @@ -161,7 +162,8 @@ orgUnit.setFindLostToFollowUpUrl( getUrl( request, unit.getId(), "findLostToFollowUp" ) ); orgUnit.setHandleLostToFollowUpUrl( getUrl( request, unit.getId(), "handleLostToFollowUp" ) ); orgUnit.setGenerateRepeatableEventUrl( getUrl( request, unit.getId(), "generateRepeatableEvent" ) ); - orgUnit.setUploadSingleEventWithoutRegistration(getUrl( request, unit.getId(), "uploadSingleEventWithoutRegistration" )); + orgUnit.setUploadSingleEventWithoutRegistration( getUrl( request, unit.getId(), + "uploadSingleEventWithoutRegistration" ) ); // generate URL for download new version String full = UrlUtils.buildFullRequestUrl( request ); === modified file 'dhis-2/dhis-web/dhis-web-api-mobile/src/main/java/org/hisp/dhis/api/mobile/controller/MobileOrganisationUnitController.java' --- dhis-2/dhis-web/dhis-web-api-mobile/src/main/java/org/hisp/dhis/api/mobile/controller/MobileOrganisationUnitController.java 2014-05-05 10:16:05 +0000 +++ dhis-2/dhis-web/dhis-web-api-mobile/src/main/java/org/hisp/dhis/api/mobile/controller/MobileOrganisationUnitController.java 2014-05-12 09:56:39 +0000 @@ -44,11 +44,12 @@ import org.hisp.dhis.api.mobile.model.DataSetValue; import org.hisp.dhis.api.mobile.model.DataSetValueList; import org.hisp.dhis.api.mobile.model.DataStreamSerializable; +import org.hisp.dhis.api.mobile.model.Message; import org.hisp.dhis.api.mobile.model.MobileModel; import org.hisp.dhis.api.mobile.model.ModelList; +import org.hisp.dhis.api.mobile.model.Recipient; import org.hisp.dhis.api.mobile.model.SMSCode; import org.hisp.dhis.api.mobile.model.SMSCommand; -import org.hisp.dhis.api.mobile.model.Message; import org.hisp.dhis.api.mobile.model.LWUITmodel.LostEvent; import org.hisp.dhis.api.mobile.model.LWUITmodel.Notification; import org.hisp.dhis.api.mobile.model.LWUITmodel.Patient; @@ -560,4 +561,17 @@ } + @RequestMapping( method = RequestMethod.GET, value = "{clientVersion}/orgUnits/{id}/findUser" ) + @ResponseBody + public Recipient findUser( String clientVersion, @PathVariable + int id, @RequestHeader( "name" ) + String keyword ) + throws NotAllowedException + { + Recipient recipient = new Recipient(); + recipient.setClientVersion( clientVersion ); + recipient.setUsers( activityReportingService.findUser( keyword ) ); + return recipient; + } + } === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/EventAnalyticsController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/EventAnalyticsController.java 2014-03-26 09:26:06 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/EventAnalyticsController.java 2014-05-12 09:56:39 +0000 @@ -85,11 +85,13 @@ @RequestParam(required=false) boolean skipMeta, @RequestParam(required=false) boolean hierarchyMeta, @RequestParam(required=false) Integer limit, + @RequestParam(required=false) boolean uniqueInstances, @RequestParam(required=false) SortOrder sortOrder, Model model, HttpServletResponse response ) throws Exception { - EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, filter, skipMeta, hierarchyMeta, sortOrder, limit, i18nManager.getI18nFormat() ); + EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, filter, + skipMeta, hierarchyMeta, sortOrder, limit, uniqueInstances, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_JSON, CacheStrategy.RESPECT_SYSTEM_SETTING ); Grid grid = analyticsService.getAggregatedEventData( params ); @@ -109,11 +111,13 @@ @RequestParam(required=false) boolean skipMeta, @RequestParam(required=false) boolean hierarchyMeta, @RequestParam(required=false) Integer limit, + @RequestParam(required=false) boolean uniqueInstances, @RequestParam(required=false) SortOrder sortOrder, Model model, HttpServletResponse response ) throws Exception { - EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, filter, skipMeta, hierarchyMeta, sortOrder, limit, i18nManager.getI18nFormat() ); + EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, filter, + skipMeta, hierarchyMeta, sortOrder, limit, uniqueInstances, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_XML, CacheStrategy.RESPECT_SYSTEM_SETTING, "events.xml", false ); Grid grid = analyticsService.getAggregatedEventData( params ); @@ -131,11 +135,13 @@ @RequestParam(required=false) boolean skipMeta, @RequestParam(required=false) boolean hierarchyMeta, @RequestParam(required=false) Integer limit, + @RequestParam(required=false) boolean uniqueInstances, @RequestParam(required=false) SortOrder sortOrder, Model model, HttpServletResponse response ) throws Exception { - EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, filter, skipMeta, hierarchyMeta, sortOrder, limit, i18nManager.getI18nFormat() ); + EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, filter, + skipMeta, hierarchyMeta, sortOrder, limit, uniqueInstances, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_EXCEL, CacheStrategy.RESPECT_SYSTEM_SETTING, "events.xls", true ); Grid grid = analyticsService.getAggregatedEventData( params ); @@ -153,11 +159,13 @@ @RequestParam(required=false) boolean skipMeta, @RequestParam(required=false) boolean hierarchyMeta, @RequestParam(required=false) Integer limit, + @RequestParam(required=false) boolean uniqueInstances, @RequestParam(required=false) SortOrder sortOrder, Model model, HttpServletResponse response ) throws Exception { - EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, filter, skipMeta, hierarchyMeta, sortOrder, limit, i18nManager.getI18nFormat() ); + EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, filter, + skipMeta, hierarchyMeta, sortOrder, limit, uniqueInstances, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_CSV, CacheStrategy.RESPECT_SYSTEM_SETTING, "events.csv", true ); Grid grid = analyticsService.getAggregatedEventData( params ); @@ -175,11 +183,13 @@ @RequestParam(required=false) boolean skipMeta, @RequestParam(required=false) boolean hierarchyMeta, @RequestParam(required=false) Integer limit, + @RequestParam(required=false) boolean uniqueInstances, @RequestParam(required=false) SortOrder sortOrder, Model model, HttpServletResponse response ) throws Exception { - EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, filter, skipMeta, hierarchyMeta, sortOrder, limit, i18nManager.getI18nFormat() ); + EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, filter, + skipMeta, hierarchyMeta, sortOrder, limit, uniqueInstances, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_HTML, CacheStrategy.RESPECT_SYSTEM_SETTING, "events.html", false ); Grid grid = analyticsService.getAggregatedEventData( params ); === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/SystemController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/SystemController.java 2014-04-25 13:14:41 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/SystemController.java 2014-05-12 09:56:39 +0000 @@ -29,6 +29,9 @@ */ import org.hisp.dhis.api.utils.ContextUtils; +import org.hisp.dhis.calendar.Calendar; +import org.hisp.dhis.calendar.CalendarService; +import org.hisp.dhis.calendar.DateIntervalType; import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.dxf2.metadata.ImportSummary; import org.hisp.dhis.dxf2.utils.JacksonUtils; === removed file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/LoadAnonymousProgramsAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/LoadAnonymousProgramsAction.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/LoadAnonymousProgramsAction.java 1970-01-01 00:00:00 +0000 @@ -1,125 +0,0 @@ -package org.hisp.dhis.caseentry.action.caseentry; - -/* - * Copyright (c) 2004-2014, 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. - */ - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.hisp.dhis.common.comparator.IdentifiableObjectNameComparator; -import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.organisationunit.OrganisationUnitLevel; -import org.hisp.dhis.organisationunit.OrganisationUnitService; -import org.hisp.dhis.ouwt.manager.OrganisationUnitSelectionManager; -import org.hisp.dhis.program.Program; -import org.hisp.dhis.program.ProgramService; - -import com.opensymphony.xwork2.Action; - -/** - * @author Chau Thu Tran - * - * @version $Id: LoadAnonymousProgramsAction.java Dec 14, 2011 9:12:34 AM $ - */ -public class LoadAnonymousProgramsAction - implements Action -{ - // ------------------------------------------------------------------------- - // Dependencies - // ------------------------------------------------------------------------- - - private OrganisationUnitSelectionManager selectionManager; - - public void setSelectionManager( OrganisationUnitSelectionManager selectionManager ) - { - this.selectionManager = selectionManager; - } - - private OrganisationUnitService organisationUnitService; - - public void setOrganisationUnitService( OrganisationUnitService organisationUnitService ) - { - this.organisationUnitService = organisationUnitService; - } - - private ProgramService programService; - - public void setProgramService( ProgramService programService ) - { - this.programService = programService; - } - - // ------------------------------------------------------------------------- - // Output - // ------------------------------------------------------------------------- - - private OrganisationUnit orgunit; - - public OrganisationUnit getOrgunit() - { - return orgunit; - } - - private List programs; - - public List getPrograms() - { - return programs; - } - - private List levels; - - public List getLevels() - { - return levels; - } - - // ------------------------------------------------------------------------- - // Implementation Action - // ------------------------------------------------------------------------- - - public String execute() - throws Exception - { - orgunit = selectionManager.getSelectedOrganisationUnit(); - - if ( orgunit != null ) - { - programs = new ArrayList( programService.getPrograms( Program.SINGLE_EVENT_WITHOUT_REGISTRATION, - orgunit ) ); - programs.retainAll( programService.getProgramsByCurrentUser()); - - Collections.sort( programs, IdentifiableObjectNameComparator.INSTANCE ); - } - - levels = organisationUnitService.getOrganisationUnitLevels(); - - return SUCCESS; - } -} === removed file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/RemoveEmptyEventsAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/RemoveEmptyEventsAction.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/RemoveEmptyEventsAction.java 1970-01-01 00:00:00 +0000 @@ -1,103 +0,0 @@ -package org.hisp.dhis.caseentry.action.caseentry; - -/* - * Copyright (c) 2004-2014, 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. - */ - -import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.ouwt.manager.OrganisationUnitSelectionManager; -import org.hisp.dhis.program.ProgramStage; -import org.hisp.dhis.program.ProgramStageInstanceService; -import org.hisp.dhis.program.ProgramStageService; - -import com.opensymphony.xwork2.Action; - -/** - * @author Chau Thu Tran - * @version RemoveEmptyEventsAction.java Jul 3, 2012 $ - */ -public class RemoveEmptyEventsAction - implements Action -{ - // ------------------------------------------------------------------------- - // Dependencies - // ------------------------------------------------------------------------- - - private ProgramStageService programStageService; - - public void setProgramStageService( ProgramStageService programStageService ) - { - this.programStageService = programStageService; - } - - private ProgramStageInstanceService programStageInstanceService; - - public void setProgramStageInstanceService( ProgramStageInstanceService programStageInstanceService ) - { - this.programStageInstanceService = programStageInstanceService; - } - - private OrganisationUnitSelectionManager selectionManager; - - public void setSelectionManager( OrganisationUnitSelectionManager selectionManager ) - { - this.selectionManager = selectionManager; - } - - // ------------------------------------------------------------------------- - // Input/Output - // ------------------------------------------------------------------------- - - private Integer programStageId; - - public void setProgramStageId( Integer programStageId ) - { - this.programStageId = programStageId; - } - - // ------------------------------------------------------------------------- - // Implementation Action - // ------------------------------------------------------------------------- - - public String execute() - throws Exception - { - if ( programStageId == null ) - { - return INPUT; - } - - ProgramStage programStage = programStageService.getProgramStage( programStageId ); - - OrganisationUnit organisationUnit = selectionManager.getSelectedOrganisationUnit(); - - programStageInstanceService.removeEmptyEvents( programStage, organisationUnit ); - - return SUCCESS; - } - -} === removed file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/SearchEventsAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/SearchEventsAction.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/SearchEventsAction.java 1970-01-01 00:00:00 +0000 @@ -1,457 +0,0 @@ -package org.hisp.dhis.caseentry.action.caseentry; - -/* - * Copyright (c) 2004-2014, 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. - */ - -import java.util.ArrayList; -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.hibernate.exception.SQLGrammarException; -import org.hisp.dhis.common.Grid; -import org.hisp.dhis.dataelement.DataElement; -import org.hisp.dhis.dataelement.DataElementService; -import org.hisp.dhis.i18n.I18n; -import org.hisp.dhis.i18n.I18nFormat; -import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.organisationunit.OrganisationUnitService; -import org.hisp.dhis.paging.ActionPagingSupport; -import org.hisp.dhis.program.ProgramStage; -import org.hisp.dhis.program.ProgramStageInstance; -import org.hisp.dhis.program.ProgramStageInstanceService; -import org.hisp.dhis.program.ProgramStageService; -import org.hisp.dhis.program.TabularEventColumn; -import org.hisp.dhis.system.util.ConversionUtils; -import org.hisp.dhis.system.util.TextUtils; -import org.hisp.dhis.trackedentity.TrackedEntityAttribute; -import org.hisp.dhis.user.CurrentUserService; - -/** - * @author Chau Thu Tran - * @version $ SearchEventsAction.java Nov 22, 2013 1:06:04 PM $ - */ -public class SearchEventsAction - extends ActionPagingSupport -{ - // ------------------------------------------------------------------------- - // Dependencies - // ------------------------------------------------------------------------- - - private OrganisationUnitService organisationUnitService; - - public void setOrganisationUnitService( OrganisationUnitService organisationUnitService ) - { - this.organisationUnitService = organisationUnitService; - } - - private ProgramStageService programStageService; - - public void setProgramStageService( ProgramStageService programStageService ) - { - this.programStageService = programStageService; - } - - private DataElementService dataElementService; - - public void setDataElementService( DataElementService dataElementService ) - { - this.dataElementService = dataElementService; - } - - private ProgramStageInstanceService programStageInstanceService; - - public void setProgramStageInstanceService( ProgramStageInstanceService programStageInstanceService ) - { - this.programStageInstanceService = programStageInstanceService; - } - - private CurrentUserService currentUserService; - - public void setCurrentUserService( CurrentUserService currentUserService ) - { - this.currentUserService = currentUserService; - } - - // ------------------------------------------------------------------------- - // Input/Output - // ------------------------------------------------------------------------- - - private List attributes = new ArrayList(); - - public List getAttributes() - { - return attributes; - } - - private Collection orgunitIds = new HashSet(); - - public void setOrgunitIds( Collection orgunitIds ) - { - this.orgunitIds = orgunitIds; - } - - private Integer programStageId; - - public void setProgramStageId( Integer programStageId ) - { - this.programStageId = programStageId; - } - - private String startDate; - - public void setStartDate( String startDate ) - { - this.startDate = startDate; - } - - private String endDate; - - public void setEndDate( String endDate ) - { - this.endDate = endDate; - } - - private List values = new ArrayList(); - - public List getValues() - { - return values; - } - - private List filterValues = new ArrayList(); - - public void setFilterValues( List filterValues ) - { - this.filterValues = filterValues; - } - - private Boolean userOrganisationUnit; - - public void setUserOrganisationUnit( Boolean userOrganisationUnit ) - { - this.userOrganisationUnit = userOrganisationUnit; - } - - private Boolean userOrganisationUnitChildren; - - public void setUserOrganisationUnitChildren( Boolean userOrganisationUnitChildren ) - { - this.userOrganisationUnitChildren = userOrganisationUnitChildren; - } - - private Grid grid; - - public Grid getGrid() - { - return grid; - } - - private Integer total; - - public void setTotal( Integer total ) - { - this.total = total; - } - - public Integer getTotal() - { - return total; - } - - private I18n i18n; - - public void setI18n( I18n i18n ) - { - this.i18n = i18n; - } - - private I18nFormat format; - - public void setFormat( I18nFormat format ) - { - this.format = format; - } - - private Boolean useCompletedEvents; - - public void setUseCompletedEvents( Boolean useCompletedEvents ) - { - this.useCompletedEvents = useCompletedEvents; - } - - private List dataElements = new ArrayList(); - - public List getDataElements() - { - return dataElements; - } - - private String type; - - public void setType( String type ) - { - this.type = type; - } - - private String facilityLB; // All, children, current - - public void setFacilityLB( String facilityLB ) - { - this.facilityLB = facilityLB; - } - - private List valueTypes = new ArrayList(); - - public List getValueTypes() - { - return valueTypes; - } - - private Map> mapSuggestedValues = new HashMap>(); - - public Map> getMapSuggestedValues() - { - return mapSuggestedValues; - } - - private String message; - - public String getMessage() - { - return message; - } - - private Boolean useFormNameDataElement; - - public void setUseFormNameDataElement( Boolean useFormNameDataElement ) - { - this.useFormNameDataElement = useFormNameDataElement; - } - - // ------------------------------------------------------------------------- - // Implementation Action - // ------------------------------------------------------------------------- - - public String execute() - throws Exception - { - if ( programStageId == null ) - { - return INPUT; - } - - // --------------------------------------------------------------------- - // Get user orgunits - // --------------------------------------------------------------------- - - Set ous = new HashSet( organisationUnitService.getOrganisationUnitsByUid( orgunitIds ) ); - Set orgUnitIds = new HashSet( ConversionUtils.getIdentifiers( OrganisationUnit.class, ous ) ); - - if ( userOrganisationUnit || userOrganisationUnitChildren ) - { - Collection userOrgunits = currentUserService.getCurrentUser().getOrganisationUnits(); - orgUnitIds = new HashSet(); - - if ( userOrganisationUnit ) - { - for ( OrganisationUnit userOrgunit : userOrgunits ) - { - orgUnitIds.add( userOrgunit.getId() ); - } - } - - if ( userOrganisationUnitChildren ) - { - for ( OrganisationUnit userOrgunit : userOrgunits ) - { - if ( userOrgunit.hasChild() ) - { - for ( OrganisationUnit childOrgunit : userOrgunit.getSortedChildren() ) - { - orgUnitIds.add( childOrgunit.getId() ); - } - } - } - } - } - - // --------------------------------------------------------------------- - // Get orgunitIds - // --------------------------------------------------------------------- - - Set organisationUnits = new HashSet(); - - if ( facilityLB.equals( "selected" ) ) - { - organisationUnits.addAll( orgUnitIds ); - } - else if ( facilityLB.equals( "childrenOnly" ) ) - { - for ( Integer orgunitId : orgUnitIds ) - { - OrganisationUnit selectedOrgunit = organisationUnitService.getOrganisationUnit( orgunitId ); - organisationUnits.addAll( organisationUnitService.getOrganisationUnitHierarchy() - .getChildren( orgunitId ) ); - organisationUnits.remove( selectedOrgunit ); - } - } - else - { - for ( Integer orgunitId : orgUnitIds ) - { - organisationUnits.addAll( organisationUnitService.getOrganisationUnitHierarchy() - .getChildren( orgunitId ) ); - } - } - - // --------------------------------------------------------------------- - // Get program-stage, start-date, end-date - // --------------------------------------------------------------------- - - ProgramStage programStage = programStageService.getProgramStage( programStageId ); - Date start = format.parseDate( startDate ); - Date end = format.parseDate( endDate ); - List columns = getTableColumns(); - - // --------------------------------------------------------------------- - // Generate tabular report - // --------------------------------------------------------------------- - try - { - if ( type == null ) // Tabular report - { - total = programStageInstanceService.searchEventsCount( programStage, columns, organisationUnits, - useCompletedEvents, start, end ); - this.paging = createPaging( total ); - - grid = programStageInstanceService.searchEvents( programStage, columns, organisationUnits, start, end, - useCompletedEvents, paging.getStartPos(), paging.getPageSize(), i18n ); - } - // Download as Excel - else - { - grid = programStageInstanceService.searchEvents( programStage, columns, organisationUnits, start, end, - useCompletedEvents, null, null, i18n ); - } - } - catch ( SQLGrammarException ex ) - { - message = i18n.getString( "failed_to_get_events" ); - } - - return type == null ? SUCCESS : type; - } - - // ------------------------------------------------------------------------- - // Supportive methods - // ------------------------------------------------------------------------- - - private List getTableColumns() - { - List columns = new ArrayList(); - - int index = 0; - - for ( String filterValue : filterValues ) - { - String[] values = filterValue.split( "_" ); - - if ( values != null && values.length >= 3 ) - { - String prefix = values[0]; - - TabularEventColumn column = new TabularEventColumn(); - column.setPrefix( prefix ); - column.setIdentifier( values[1] ); - column.setHidden( Boolean.parseBoolean( values[2] ) ); - - column.setOperator( values.length > 3 ? TextUtils.lower( values[3] ) : TextUtils.EMPTY ); - column.setQuery( values.length > 4 ? TextUtils.lower( values[4] ) : TextUtils.EMPTY ); - - if ( "de".equals( prefix ) ) - { - int objectId = Integer.parseInt( values[1] ); - DataElement dataElement = dataElementService.getDataElement( objectId ); - if ( dataElement.getType().equals( DataElement.VALUE_TYPE_INT ) ) - { - column.setPrefix( "numberDe" ); - } - dataElements.add( dataElement ); - - String valueType = dataElement.getOptionSet() != null ? "optionSet" : dataElement - .getType(); - valueTypes.add( valueType ); - mapSuggestedValues.put( index, getSuggestedDataElementValues( dataElement ) ); - if ( dataElement.getType().equals( DataElement.VALUE_TYPE_DATE ) ) - { - column.setDateType( true ); - } - - if ( useFormNameDataElement != null && useFormNameDataElement ) - { - column.setName( dataElement.getFormNameFallback() ); - } - else - { - column.setName( dataElement.getDisplayName() ); - } - } - - columns.add( column ); - - index++; - } - } - - return columns; - } - - private List getSuggestedDataElementValues( DataElement dataElement ) - { - List values = new ArrayList(); - String valueType = dataElement.getType(); - - if ( valueType.equals( DataElement.VALUE_TYPE_BOOL ) ) - { - values.add( i18n.getString( "yes" ) ); - values.add( i18n.getString( "no" ) ); - } - if ( valueType.equals( DataElement.VALUE_TYPE_TRUE_ONLY ) ) - { - values.add( i18n.getString( "" ) ); - values.add( i18n.getString( "yes" ) ); - } - - return values; - } -} === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddTrackedEntityInstanceAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddTrackedEntityInstanceAction.java 2014-04-12 12:12:30 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddTrackedEntityInstanceAction.java 2014-05-12 09:56:39 +0000 @@ -92,7 +92,7 @@ // Input // ------------------------------------------------------------------------- - private Integer representativeId; + private String representativeId; private Integer relationshipTypeId; @@ -269,7 +269,7 @@ this.attributeService = attributeService; } - public void setRepresentativeId( Integer representativeId ) + public void setRepresentativeId( String representativeId ) { this.representativeId = representativeId; } === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetAttributesByProgramAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetAttributesByProgramAction.java 2014-04-12 11:34:06 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetAttributesByProgramAction.java 2014-05-12 09:56:39 +0000 @@ -29,7 +29,6 @@ */ import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -115,18 +114,14 @@ public String execute() throws Exception { - if ( id != null ) + if ( id != null && !id.isEmpty() ) { program = programService.getProgram( id ); } else { attributes = new ArrayList( - attributeService.getTrackedEntityAttributesWithoutProgram() ); - Collection attribuesInList = attributeService - .getTrackedEntityAttributesDisplayInList( true ); - attributes.removeAll( attribuesInList ); - attributes.addAll( attribuesInList ); + attributeService.getTrackedEntityAttributesDisplayInList( true ) ); } Collections.sort( attributes, IdentifiableObjectNameComparator.INSTANCE ); === removed file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/SearchPersonAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/SearchPersonAction.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/SearchPersonAction.java 1970-01-01 00:00:00 +0000 @@ -1,135 +0,0 @@ -package org.hisp.dhis.caseentry.action.trackedentity; - -/* - * Copyright (c) 2004-2014, 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. - */ - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import org.hisp.dhis.trackedentity.TrackedEntityInstance; -import org.hisp.dhis.trackedentity.TrackedEntityInstanceService; -import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; -import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; - -import com.opensymphony.xwork2.Action; - -/** - * @author Viet - * @version $Id$ - */ - -public class SearchPersonAction - implements Action -{ - // ------------------------------------------------------------------------- - // Dependencies - // ------------------------------------------------------------------------- - - private TrackedEntityInstanceService entityInstanceService; - - private TrackedEntityAttributeValueService attributeValueService; - - // ------------------------------------------------------------------------- - // Input - // ------------------------------------------------------------------------- - - private Integer attributeId; - - private String searchValue; - - // ------------------------------------------------------------------------- - // Output - // ------------------------------------------------------------------------- - - private Map attributeValueMap = new HashMap(); - - private Collection entityInstances; - - // ------------------------------------------------------------------------- - // Action implementation - // ------------------------------------------------------------------------- - - public String execute() - throws Exception - { - entityInstances = entityInstanceService.getTrackedEntityInstance( attributeId, searchValue ); - - if ( entityInstances != null && entityInstances.size() > 0 ) - { - for ( TrackedEntityInstance p : entityInstances ) - { - Collection attributeValues = attributeValueService - .getTrackedEntityAttributeValues( p ); - - for ( TrackedEntityAttributeValue attributeValue : attributeValues ) - { - attributeValueMap.put( - p.getId() + "_" + attributeValue.getAttribute().getId(), - attributeValue.getValue() ); - } - } - } - - return SUCCESS; - } - - // ------------------------------------------------------------------------- - // Getter/Setter - // ------------------------------------------------------------------------- - - public void setAttributeId( Integer attributeId ) - { - this.attributeId = attributeId; - } - - public void setEntityInstanceService( TrackedEntityInstanceService entityInstanceService ) - { - this.entityInstanceService = entityInstanceService; - } - - public Collection getEntityInstances() - { - return entityInstances; - } - - public Map getAttributeValueMap() - { - return attributeValueMap; - } - - public void setAttributeValueService( TrackedEntityAttributeValueService attributeValueService ) - { - this.attributeValueService = attributeValueService; - } - - public void setSearchValue( String searchValue ) - { - this.searchValue = searchValue; - } -} === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/SelectAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/SelectAction.java 2014-04-11 00:54:51 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/SelectAction.java 2014-05-12 09:56:39 +0000 @@ -29,7 +29,6 @@ */ import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; @@ -127,12 +126,9 @@ public String execute() throws Exception { - organisationUnit = selectionManager.getSelectedOrganisationUnit(); - Collection _attributes = attributeService.getTrackedEntityAttributesWithoutProgram(); - _attributes.addAll( attributeService.getTrackedEntityAttributesDisplayInList( true ) ); - attributes = new ArrayList( _attributes ); + attributes = new ArrayList( attributeService.getTrackedEntityAttributesDisplayInList( true ) ); Collections.sort( attributes, IdentifiableObjectNameComparator.INSTANCE ); trackedEntities = new ArrayList( trackedEntityService.getAllTrackedEntity() ); === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/UpdateTrackedEntityInstanceAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/UpdateTrackedEntityInstanceAction.java 2014-04-12 12:12:30 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/UpdateTrackedEntityInstanceAction.java 2014-05-12 09:56:39 +0000 @@ -79,7 +79,7 @@ private Integer id; - private Integer representativeId; + private String representativeId; private Integer relationshipTypeId; @@ -207,7 +207,7 @@ return entityInstance; } - public void setRepresentativeId( Integer representativeId ) + public void setRepresentativeId( String representativeId ) { this.representativeId = representativeId; } === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/resources/META-INF/dhis/beans.xml 2014-04-30 12:57:22 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/resources/META-INF/dhis/beans.xml 2014-05-12 09:56:39 +0000 @@ -325,17 +325,6 @@ - - - - - - @@ -362,26 +351,8 @@ - - - - - - - - - - - - - - - - - - - - - - /dhis-web-commons/ajax/jsonResponseSuccess.vm - - - /dhis-web-caseentry/jsonUsernames.vm @@ -515,13 +508,6 @@ F_TRACKED_ENTITY_INSTANCE_ADD - - responseTrackedEntityInstances.vm - - F_TRACKED_ENTITY_INSTANCE_SEARCH - - responseRepresentative.vm === removed file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/anonymousRegistration.vm' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/anonymousRegistration.vm 2014-04-17 16:00:32 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/anonymousRegistration.vm 1970-01-01 00:00:00 +0000 @@ -1,252 +0,0 @@ - - -

        $i18n.getString( "anonymous_events_management" ) #openHelp('single_event_without_registration')

        -

        -

        fasdfadfa

        - - - - - - - - -
        -
        - - - - - - - - - - - - - - - - - - - - - - - - - -
        - $i18n.getString("program") * - - - - - - -
        - - - $i18n.getString("incomplete") -
        - - - - -
         
        - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
        - - - - - -
        - - - - - - - - - - - - - - - - - -
        - -
        - - - -#parse( "dhis-web-commons/loader/loader.vm" ) - - === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/index.vm' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/index.vm 2014-04-06 18:03:57 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/index.vm 2014-05-12 09:56:39 +0000 @@ -18,10 +18,6 @@ #introListImgItem( "singleEventSelect.action" "single_event_with_registration" "attribute" ) #end - #if( $auth.hasAccess( "dhis-web-caseentry", "anonymousRegistration" ) ) - #introListImgItem( "anonymousRegistration.action" "anonymous_events" "attribute" ) - #end - #if( $auth.hasAccess( "dhis-web-caseentry", "reportSelect" ) ) #introListImgItem( "reportSelect.action" "program_summary" "summaryreport" ) #end === removed file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/anonymousRegistration.js' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/anonymousRegistration.js 2014-03-20 10:17:37 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/anonymousRegistration.js 1970-01-01 00:00:00 +0000 @@ -1,1163 +0,0 @@ -var DAO = DAO || {}; - -DAO.store = new dhis2.storage.Store( { - name: 'dhis2', - adapters: [ dhis2.storage.IndexedDBAdapter, dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter ], - objectStores: [ 'programs', 'programStages', 'optionSets', 'usernames', { - name: 'dataValues', - adapters: [ dhis2.storage.IndexedDBAdapter, dhis2.storage.DomLocalStorageAdapter, dhis2.storage.InMemoryAdapter ] - } ] -} ); - -function loadPrograms() { - var def = $.Deferred(); - - $.ajax( { - url: 'getProgramMetaData.action', - dataType: 'json', - cache: false - } ).done(function ( data ) { - var programs = _.values( data.metaData.programs ); - DAO.store.setAll( 'programs', programs ).then( function () { - def.resolve( data.metaData ); - } ); - } ).fail( function () { - def.resolve(); - } ); - - return def.promise(); -} - -function loadProgramStages( metaData ) { - if ( !metaData ) { - return; - } - - var def = $.Deferred(); - var promise = def.promise(); - - _.each( _.values( metaData.programs ), function ( el ) { - var id = el.programStages[0].id; - promise = promise.then( makeProgramStageRequest( id )); - } ); - - promise = promise.then(function() { - return $.Deferred().resolve(metaData); - }); - - def.resolve( metaData ); - - return promise; -} - -function makeProgramStageRequest( id ) { - return function() { - var data = createProgramStage( id ); - - return $.ajax( { - url: 'dataentryform.action', - data: data, - dataType: 'html', - cache: false - } ).done( function ( data ) { - var obj = {}; - obj.id = id; - obj.form = data; - DAO.store.set( 'programStages', obj ); - } ); - } -} - -function loadOptionSets( metaData ) { - if ( !metaData ) { - return; - } - - var mainDef = $.Deferred(); - var mainPromise = mainDef.promise(); - - var def = $.Deferred(); - var promise = def.promise(); - - var builder = $.Deferred(); - var build = builder.promise(); - - _.each( metaData.optionSets, function ( item ) { - build = build.then(function() { - var d = $.Deferred(); - var p = d.promise(); - DAO.store.get('optionSets', item.uid).done(function(obj) { - if(!obj || obj.optionSet.version !== item.v) { - promise = promise.then( makeOptionSetRequest(item.uid) ); - } - - d.resolve(); - }); - - return p; - }); - } ); - - if ( metaData.usernames ) { - promise = promise.then( makeUsernameRequest() ); - } - - build.done(function() { - def.resolve(); - - promise = promise.done( function () { - mainDef.resolve( metaData ); - } ); - }); - - builder.resolve(); - - return mainPromise; -} - -function makeUsernameRequest() { - return function() { - return $.ajax( { - url: 'getUsernames.action', - dataType: 'json', - cache: false - }).done(function( data ) { - var obj = {}; - obj.id = 'usernames'; - obj.usernames = data.usernames; - DAO.store.set( 'usernames', obj ); - }); - } -} - -function makeOptionSetRequest( id ) { - return function() { - return $.ajax({ - url: 'getOptionSet.action', - data: { id: id }, - dataType: 'json', - cache: false - }).done(function(data) { - var obj = {}; - obj.id = id; - obj.optionSet = data.optionSet; - DAO.store.set('optionSets', obj); - }); - } -} - -function updateOfflineEvents() { - var no_offline_template = $( '#no-offline-event-template' ); - var no_offline_template_compiled = _.template( no_offline_template.html() ); - - var offline_template = $( '#offline-event-template' ); - var offline_template_compiled = _.template( offline_template.html() ); - - return DAO.store.getAll( 'dataValues' ).done( function ( arr ) { - var orgUnitId = selection.getSelected(); - var programId = $( '#programId' ).val(); - - var target = $( '#offlineEventList' ); - target.children().remove(); - - if ( arr.length > 0 ) { - var matched = false; - - $.each( arr, function ( idx, item ) { - var event = item.executionDate; - - if ( event.organisationUnitId == orgUnitId && event.programId == programId ) { - event.index = idx + 1; - var html = offline_template_compiled( event ); - target.append( html ); - matched = true; - } - } ); - - if ( !matched ) { - target.append( no_offline_template_compiled() ); - } - } else { - target.append( no_offline_template_compiled() ); - } - } ); -} - -function showOfflineEvents() { - $( "#offlineListDiv table" ).removeClass( 'hidden' ); -} - -function hideOfflineEvents() { - $( "#offlineListDiv table" ).addClass( 'hidden' ); -} - -var haveLocalData = false; - -function checkOfflineData( callback ) { - return DAO.store.getAll( 'dataValues' ).done( function ( arr ) { - haveLocalData = arr.length > 0; - if ( callback && typeof callback == 'function' ) callback( haveLocalData ); - } ); -} - -function uploadOfflineData( event ) { - $.ajax( { - url: 'uploadAnonymousEvent.action', - contentType: 'application/json', - data: JSON.stringify( event ), - cache: false - } ).done( function ( json ) { - if ( json.response === 'success' ) { - DAO.store.remove( 'dataValues', event.id ).done( function () { - updateOfflineEvents(); - searchEvents( eval( getFieldValue( 'listAll' ) ) ); - } ); - } - } ); -} - -function uploadLocalData() { - setHeaderWaitMessage( i18n_uploading_data_notification ); - - DAO.store.getAll( 'dataValues' ).done( function ( arr ) { - if(arr.length == 0) { - setHeaderDelayMessage( i18n_sync_success ); - return; - } - - var deferred = $.Deferred(); - var promise = deferred.promise(); - - $.each(arr, function(idx, item) { - promise = promise.pipe(function () { - uploadOfflineData( item ); - }); - }); - - deferred.done(function() { - setHeaderDelayMessage( i18n_sync_success ); - }); - - deferred.resolve(); - }); -} - -function sync_failed_button() { - var message = i18n_sync_failed - + ' '; - - setHeaderMessage( message ); - - $( '#sync_button' ).bind( 'click', uploadLocalData ); -} - -$( document ).ready( function () { - $.ajaxSetup( { - type: 'POST', - cache: false - } ); - - setHeaderWaitMessage(i18n_please_wait_loading); - - $("#programId").attr('disabled', true); - - $( "#orgUnitTree" ).one( "ouwtLoaded", function () { - var def = $.Deferred(); - var promise = def.promise(); - - promise = promise.then( DAO.store.open ); - promise = promise.then( loadPrograms ); - promise = promise.then( loadProgramStages ); - promise = promise.then( loadOptionSets ); - promise = promise.then( updateOfflineEvents ); - promise = promise.then( checkOfflineData ); - promise.then( function () { - $("#programId").removeAttr('disabled'); - - selection.setListenerFunction( organisationUnitSelected ); - - dhis2.availability.startAvailabilityCheck(); - selection.responseReceived(); - } ); - - def.resolve(); - } ); - - $( document ).bind( 'dhis2.online', function ( event, loggedIn ) { - if ( loggedIn ) { - checkOfflineData(function(localData) { - if ( localData ) { - var message = i18n_need_to_sync_notification - + ' '; - - setHeaderMessage( message ); - - $( '#sync_button' ).bind( 'click', uploadLocalData ); - } else { - setHeaderDelayMessage( i18n_online_notification ); - } - - enableFiltering(); - searchEvents( eval( getFieldValue( 'listAll' ) ) ); - $('#commentInput').removeAttr('disabled'); - $('#commentButton').removeAttr('disabled'); - $('#validateBtn').removeAttr('disabled'); - }); - - hideOfflineEvents(); - } - else { - var form = [ - '
        ', - '', - '', - '', - '', - '', - '
        ' - ].join( '' ); - - setHeaderMessage( form ); - ajax_login(); - - showOfflineEvents(); - } - } ); - - $( document ).bind( 'dhis2.offline', function () { - setHeaderMessage( i18n_offline_notification ); - $('#commentInput').attr('disabled', true); - $('#commentInput').attr('disabled', true); - $('#validateBtn').attr('disabled', true); - disableFiltering(); - showOfflineEvents(); - } ); -} ); - -function disableFiltering() { - $('#listDiv').hide(); - $('#filterBtn').attr('disabled', true); - $('#listBtn').attr('disabled', true); - $('#incompleted').attr('disabled', true); - $('#removeBtn').attr('disabled', true); -} - -function enableFiltering() { - var filtering = getFieldValue( 'programStageId' ) != undefined && getFieldValue( 'programStageId' ).length != 0; - - if ( filtering ) { - $( '#filterBtn' ).removeAttr( 'disabled' ); - $( '#listBtn' ).removeAttr( 'disabled' ); - $( '#incompleted' ).removeAttr( 'disabled' ); - $( '#removeBtn' ).removeAttr( 'disabled' ); - } -} - -function ajax_login() -{ - $( '#login_button' ).bind( 'click', function() - { - var username = $( '#username' ).val(); - var password = $( '#password' ).val(); - - $.post( '../dhis-web-commons-security/login.action', { - 'j_username' : username, - 'j_password' : password - } ).success( function() - { - var ret = dhis2.availability.syncCheckAvailability(); - - if ( !ret ) - { - alert( i18n_ajax_login_failed ); - } - } ); - } ); -} - -function organisationUnitSelected( orgUnits, orgUnitNames ) { - showById( 'dataEntryMenu' ); - hideById( 'eventActionMenu' ); - hideById( 'dataEntryInfor' ); - hideById( 'advanced-search' ); - hideById( 'minimized-advanced-search' ); - hideById( 'listDiv' ); - hideById( 'programName' ); - - setFieldValue( "listAll", true ); - setFieldValue( "startDate", '' ); - setFieldValue( "endDate", '' ); - setFieldValue( "programStageId", '' ); - setFieldValue( "programId", '' ); - - $( '#advancedSearchTB [name=searchText]' ).val( '' ); - - setFieldValue( 'orgunitId', orgUnits[0] ); - setFieldValue( 'orgunitName', orgUnitNames[0] ); - hideById( 'listDiv' ); - hideById( 'dataEntryInfor' ); - - DAO.store.getAll( 'programs' ).done( function (arr) { - var programs = []; - - $.each( arr, function ( idx, item ) { - if ( item.programAssociations.indexOf( orgUnits[0] ) != -1 ) { - programs.push( item ); - } - } ); - - updateProgramList( programs ); - } ); - - updateOfflineEvents(); -} - -function updateProgramList( arr ) { - $( '#searchingAttributeIdTD [id=searchObjectId] option' ).remove(); - $( '#advancedSearchTB [id=searchObjectId] option' ).remove(); - clearListById( 'displayInReports' ); - clearListById( 'programId' ); - - $( '#programId' ).append( '' ); - - for ( var i = 0; i < arr.length; i++ ) { - $( '#programId' ).append( - '' ); - } - - disableCriteriaDiv(); - showById( 'selectDiv' ); -} - -function disableCriteriaDiv() { - disable( 'listBtn' ); - disable( 'addBtn' ); - disable( 'filterBtn' ); - disable( 'removeBtn' ); - $( '#criteriaDiv :input' ).each( function ( idx, item ) { - disable( this.id ); - } ); -} - -function enableCriteriaDiv() { - enable( 'listBtn' ); - enable( 'addBtn' ); - enable( 'filterBtn' ); - enable( 'removeBtn' ); - $( '#criteriaDiv :input' ).each( function ( idx, item ) { - enable( this.id ); - } ); -} - -function getDataElements() { - hideById( 'dataEntryInfor' ); - hideById( 'listDiv' ); - $( '#searchingAttributeIdTD [id=searchObjectId] option' ).remove(); - $( '#advancedSearchTB [id=searchObjectId] option' ).remove(); - var programStageId = $( '#programId option:selected' ).attr( 'psid' ); - setFieldValue( 'programStageId', programStageId ); - setInnerHTML( 'reportDateDescriptionField', $( '#programId option:selected' ).attr( 'reportDateDes' ) ); - setInnerHTML( 'reportDateDescriptionField2', $( '#programId option:selected' ).attr( 'reportDateDes' ) ); - - if ( programStageId == '' ) { - removeAllAttributeOption(); - disableCriteriaDiv(); - enable( 'orgunitName' ); - enable( 'programId' ); - hideById( 'listDiv' ); - setFieldValue( 'searchText' ); - updateOfflineEvents(); - return; - } - - $.getJSON( "getProgramStageDataElementList.action", { - programStageId: programStageId - }, function ( json ) { - $( '#advancedSearchTB [name=searchText]' ).val( '' ); - $( '.stage-object-selected' ).attr( 'psid', $( '#programId option:selected' ).attr( "psid" ) ); - - clearListById( 'searchObjectId' ); - clearListById( 'displayInReports' ); - - $('[name=searchObjectId]').append(''); - - $.each(json.programStageDataElements, function() { - $('[name=searchObjectId]').append(''); - - if( this.displayInReports == 'true' ) { - $('#displayInReports').append(''); - } - }); - - enableCriteriaDiv(); - validateSearchEvents( true ); - } ).fail(function() { - enable( 'addBtn' ); - }); - - updateOfflineEvents(); -} - -function dataElementOnChange( this_ ) { - var container = $(this_).parent().parent().attr('id'); - var element = $('#' + container + ' [id=searchText]'); - var valueType = $('#' + container + ' [id=searchObjectId] option:selected').attr('type'); - - if( valueType == 'date' ) { - element.replaceWith(getDateField(container)); - datePickerValid('searchText_' + container); - } - else { - $('#searchText_' + container).datepicker("destroy"); - $('#' + container + ' [id=dateOperator]').replaceWith(""); - - if( valueType == 'bool' ) { - element.replaceWith(getTrueFalseBox()); - } - else if( valueType == 'optionset' ) { - element.replaceWith(searchTextBox); - autocompletedFilterField(container + " [id=searchText]", $(this_).find("option:selected").attr('uid')); - } - else if( valueType == 'username' ) { - autocompletedUsernameField($(this_).attr('id')); - } - else { - element.replaceWith(searchTextBox); - } - } -} - -function autocompletedFilterField( idField, searchObjectId ) { - var input = $( "#" + idField ); - input.css( "width", "237px" ); - input.autocomplete( { - delay: 0, - minLength: 0, - source: function ( request, response ) { - $.ajax( { - url: "getOptions.action?id=" + searchObjectId + "&query=" + input.val(), - dataType: "json", - cache: false, - success: function ( data ) { - response( $.map( data.options, function ( item ) { - return { - label: item.o, - id: item.o - }; - } ) ); - } - } ); - }, - select: function ( event, ui ) { - input.val( ui.item.value ); - input.autocomplete( "close" ); - } - } ) - .addClass( "ui-widget" ); - - input.data( "autocomplete" )._renderItem = function ( ul, item ) { - return $( "
      • " ) - .data( "item.autocomplete", item ) - .append( "" + item.label + "" ) - .appendTo( ul ); - }; - - var wrapper = this.wrapper = $( "" ) - .addClass( "ui-combobox" ) - .insertAfter( input ); - - var button = $( "" ) - .attr( "tabIndex", -1 ) - .attr( "title", i18n_show_all_items ) - .appendTo( wrapper ) - .button( { - icons: { - primary: "ui-icon-triangle-1-s" - }, - text: false - } ) - .addClass( 'small-button' ) - .click( function () { - if ( input.autocomplete( "widget" ).is( ":visible" ) ) { - input.autocomplete( "close" ); - return; - } - $( this ).blur(); - input.autocomplete( "search", "" ); - input.focus(); - } ); -} - -function autocompletedUsernameField( idField ) { - var input = $( "#" + idField ); - input.parent().width( input.width() + 200 ); - var dataElementId = input.attr( 'id' ).split( '-' )[1]; - - input.autocomplete( { - delay: 0, - minLength: 0, - source: function ( request, response ) { - $.ajax( { - url: "getUsernameList.action?query=" + input.val(), - dataType: "json", - cache: false, - success: function ( data ) { - response( $.map( data.usernames, function ( item ) { - return { - label: item.u, - id: item.u - }; - } ) ); - } - } ); - }, - select: function ( event, ui ) { - var fieldValue = ui.item.value; - - if ( !dhis2.trigger.invoke( "caseentry-value-selected", [dataElementId, fieldValue] ) ) { - input.val( "" ); - return false; - } - - input.val( fieldValue ); - if ( !unSave ) { - saveVal( dataElementId ); - } - input.autocomplete( "close" ); - }, - change: function ( event, ui ) { - if ( !ui.item ) { - var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $( this ).val() ) + "$", "i" ), - valid = false; - if ( !valid ) { - $( this ).val( "" ); - if ( !unSave ) - saveVal( dataElementId ); - input.data( "autocomplete" ).term = ""; - return false; - } - } - } - } ) - .addClass( "ui-widget" ); - - input.data( "autocomplete" )._renderItem = function ( ul, item ) { - return $( "
      • " ) - .data( "item.autocomplete", item ) - .append( "
        " + item.label + "" ) - .appendTo( ul ); - }; - - var wrapper = this.wrapper = $( "" ) - .addClass( "ui-combobox" ) - .insertAfter( input ); - - var button = $( "" ) - .attr( "tabIndex", -1 ) - .attr( "title", i18n_show_all_items ) - .appendTo( wrapper ) - .button( { - icons: { - primary: "ui-icon-triangle-1-s" - }, - text: false - } ) - .addClass( 'small-button' ) - .click( function () { - if ( input.autocomplete( "widget" ).is( ":visible" ) ) { - input.autocomplete( "close" ); - return; - } - $( this ).blur(); - input.autocomplete( "search", "" ); - input.focus(); - } ); -} - -function removeAllAttributeOption() { - $( '#advancedSearchTB tbody tr' ).each( function ( i, item ) { - if ( i > 0 ) { - $( item ).remove(); - } - } ) -} - -function validateSearchEvents( listAll ) { - listAll = eval( listAll ); - setFieldValue( 'listAll', listAll ); - - var flag = true; - if ( !listAll ) { - if ( getFieldValue( 'startDate' ) == "" || getFieldValue( 'endDate' ) == "" ) { - showWarningMessage( i18n_specify_a_date ); - flag = false; - } - - if ( flag && !listAll && $( '#filterBtn' ).attr( "disabled" ) == "disabled" ) { - $( '#advancedSearchTB tr' ).each( function ( index, row ) { - if ( index > 1 ) { - $( row ).find( ':input' ).each( function ( idx, item ) { - var input = $( item ); - if ( input.attr( 'type' ) != 'button' && idx == 0 && input.val() == '' ) { - showWarningMessage( i18n_specify_data_element ); - flag = false; - } - } ) - } - } ); - } - } - - if ( flag ) { - searchEvents( listAll ); - } -} - -function searchEvents( listAll ) { - var search = getFieldValue( 'programStageId' ) != undefined && getFieldValue( 'programStageId' ).length != 0; - - if ( !search ) { - return; - } - - hideById( 'dataEntryInfor' ); - hideById( 'listDiv' ); - - var params = ''; - $( '#displayInReports option' ).each( function ( i, item ) { - var input = $( item ); - params += '&filterValues=de_' + input.val() + '_false_'; - } ); - - if ( listAll ) { - params += '&startDate='; - params += '&endDate='; - } - else { - var value = ''; - var searchingValue = ''; - params += '&startDate=' + getFieldValue( 'startDate' ); - params += '&endDate=' + getFieldValue( 'endDate' ); - if ( byId( "incompleted" ).checked ) { - params += '&useCompletedEvents=false'; - } - $( '#advancedSearchTB tr' ).each( function ( index, row ) { - if ( index > 1 ) { - $( row ).find( ':input' ).each( function ( idx, item ) { - var input = $( item ); - if ( input.attr( 'type' ) != 'button' ) { - if ( idx == 0 && input.val() != '' ) { - searchingValue = 'de_' + input.val() + '_false_'; - } - else if ( input.val() != '' ) { - value += $.trim( input.val() ).toLowerCase(); - } - } - } ); - - if ( value != '' ) { - searchingValue += getValueFormula( value ); - params += '&filterValues=' + searchingValue; - } - searchingValue = ''; - value = ''; - } - } ) - } - - params += '&facilityLB=selected'; - params += '&orgunitIds=' + getFieldValue( 'orgunitId' ); - params += '&programStageId=' + $( '#programId option:selected' ).attr( 'psid' ); - params += '&userOrganisationUnit=false'; - params += '&userOrganisationUnitChildren=false'; - - contentDiv = 'listDiv'; - showLoader(); - - $.ajax( { - type: "POST", - url: 'searchEvents.action', - data: params, - dataType: 'text', - cache: false, - success: function ( data ) { - if ( data.indexOf( "|>=|<|<=|=|!=]+[ ]*/ ); - - if( value.indexOf("'") == -1 ) { - if( flag == null ) { - value = "='" + value + "'"; - } - else { - value = value.replace(flag, flag + "'"); - value += "'"; - } - } - else { - if( flag == null ) { - value = "=" + value; - } - } - - return value; -} - -function removeEvent( programStageId ) { - DAO.store.get('dataValues', programStageId).done(function(obj) { - if(obj) { - if( confirm(i18n_comfirm_delete_event) ) { - DAO.store.remove('dataValues', programStageId).always(function() { - updateOfflineEvents(); - // needed, seemed that from time-to-time the events are updated too early, could be idb related - setTimeout(updateOfflineEvents, 100); - }); - } - } else { - removeItem( programStageId, '', i18n_comfirm_delete_event, 'removeCurrentEncounter.action' ); - } - }); -} - -function showUpdateEvent( programStageInstanceId ) { - hideById( 'dataEntryMenu' ); - showById( 'eventActionMenu' ); - $( "[name=eventActionLink]" ).hide(); - hideById( 'selectDiv' ); - hideById( 'searchDiv' ); - hideById( 'listDiv' ); - hideById( 'offlineListDiv' ); - setFieldValue( 'programStageInstanceId', programStageInstanceId ); - setInnerHTML( 'dataEntryFormDiv', '' ); - showLoader(); - - service.displayProgramStage( getFieldValue( 'programStageId' ), programStageInstanceId, getFieldValue( 'orgunitId' ) ); - jQuery('.stage-object-selected').attr('id', 'ps_' + programStageInstanceId); -} - -function backEventList() { - showById( 'dataEntryMenu' ); - hideById( 'eventActionMenu' ); - hideById( 'dataEntryInfor' ); - hideById( 'programName' ); - showById( 'selectDiv' ); - showById( 'searchDiv' ); - showById( 'listDiv' ); - showById( 'offlineListDiv' ); - - updateOfflineEvents(); - searchEvents( eval( getFieldValue( 'listAll' ) ) ); -} - -function showAddEventForm( isCreateEvent ) { - showById( 'eventActionMenu' ); - $( "[name=eventActionLink]" ).hide(); - hideById( 'dataEntryMenu' ); - setInnerHTML( 'dataEntryFormDiv', '' ); - hideById( 'selectDiv' ); - hideById( 'searchDiv' ); - hideById( 'listDiv' ); - hideById( 'offlineListDiv' ); - showById( 'programName' ); - hideById( 'actionDiv' ); - showById( 'dataEntryInfor' ); - setFieldValue( 'programStageInstanceId', '0' ); - setInnerHTML( 'programName', $( '#programId option:selected' ).text() ); - setInnerHTML( 'orgunitNameInfor', getFieldValue("orgunitName")); - if( isCreateEvent != undefined ){ - addNewEvent(); - } -} - -function addNewEvent() { - var programStageInstanceId = getFieldValue( 'programStageInstanceId' ); - var programId = $( '#programId option:selected' ).val(); - var executionDate = getFieldValue( 'executionDate' ); - var orgunitId = getFieldValue( 'orgunitId' ); - - $( "#executionDate" ).css( 'background-color', SAVING_COLOR ); - - service.saveExecutionDate( programId, programStageInstanceId, executionDate, orgunitId ); -} - -function completedAndAddNewEvent() { - doComplete( true ); -} - -function removeEmptyEvents() { - var result = window.confirm( i18n_confirm_remove_empty_events ); - - if ( result ) { - $.getJSON( "removeEmptyEvents.action", - { - programStageId: $( '#selectDiv [id=programId] option:selected' ).attr( 'psid' ) - }, - function ( json ) { - if ( json.response == 'success' ) { - showSuccessMessage( i18n_remove_empty_events_success ); - validateSearchEvents( true ) - } - } ); - } -} - -function removeCurrentEvent() { - var programStageInstanceId = getFieldValue( 'programStageInstanceId' ); - - DAO.store.get('dataValues', programStageInstanceId).done(function(obj) { - if(obj) { - if( confirm(i18n_comfirm_delete_event) ) { - DAO.store.remove('dataValues', programStageInstanceId).always(function() { - setTimeout(backEventList, 200); - }); - } - } else { - removeCurrentEventFromServer(); - } - }); -} - -function removeCurrentEventFromServer() { - var result = window.confirm( i18n_comfirm_delete_event ); - - if ( result ) { - $.postJSON( "removeCurrentEncounter.action", { - "id": getFieldValue( 'programStageInstanceId' ) - }, - function ( json ) { - if ( json.response == "success" ) { - backEventList(); - } - else if ( json.response == "error" ) { - showWarningMessage( json.message ); - } - } ); - } -} - -function showFilterForm() { - showById( 'advanced-search' ); - hideById( 'minimized-advanced-search' ); - disable( 'filterBtn' ); - setFieldValue( 'listAll', false ); -} - -function removeAllOption() { - enable( 'filterBtn' ); - - $( '#advancedSearchTB tr' ).each( function ( idx ) { - if( idx > 2 ) { - $(this).remove(); - } - else if( idx == 2 ) { - $(this).find(':input').each(function( idx, item ) { - var input = $(item); - if( input.attr('type') != 'button' ) { - input.val(''); - } - }); - } - } ); - - $( '#searchObjectId' ).val( "" ); - $( '#searchText' ).val( "" ); - searchEvents( eval( getFieldValue( "listAll" ) ) ); -} - -function ajaxExecutionDate( programId, programStageInstanceId, executionDate, organisationUnitId ) { - return $.ajax( { - url: 'saveExecutionDate.action', - data: createExecutionDate( programId, programStageInstanceId, executionDate, organisationUnitId ), - type: 'POST', - dataType: 'json', - cache: false - } ); -} - -// execution date module -var service = (function () { - return { - saveExecutionDate: function( programId, programStageInstanceId, executionDate, organisationUnitId ) { - ajaxExecutionDate(programId, programStageInstanceId, executionDate, organisationUnitId).done(function ( json ) { - if ( json.response == 'success' ) { - $( "#executionDate" ).css( 'background-color', SUCCESS_COLOR ); - setFieldValue( 'programStageInstanceId', json.message ); - jQuery('.stage-object-selected').attr('id', json.message ); - showUpdateEvent( json.message ); - } - else { - $( "#executionDate" ).css( 'background-color', ERROR_COLOR ); - showWarningMessage( json.message ); - } - } ).fail( function () { - if(programStageInstanceId == 0) { - DAO.store.getKeys( 'dataValues' ).done( function ( keys ) { - var i = 100; - - for(; i<10000; i++) { - if( keys.indexOf("local" + i) == -1 ) break; - } - - programStageInstanceId = "local"+i; - - var data = {}; - data.id = programStageInstanceId; - data.executionDate = createExecutionDate(programId, programStageInstanceId, executionDate, organisationUnitId); - data.executionDate.completed = 'false'; - - this.set( 'dataValues', data).done(function() { - setFieldValue( 'programStageInstanceId', programStageInstanceId ); - $( "#executionDate" ).css( 'background-color', SUCCESS_COLOR ); - showUpdateEvent( programStageInstanceId ); - }); - }); - } else { - // if we have a programStageInstanceId, just reuse that one - setFieldValue( 'programStageInstanceId', programStageInstanceId ); - $( "#executionDate" ).css( 'background-color', SUCCESS_COLOR ); - showUpdateEvent( programStageInstanceId ); - } - } ); - }, - - displayProgramStage: function( programStageId, programStageInstanceId, organisationUnitId ) { - loadProgramStage( programStageId, programStageInstanceId, organisationUnitId, function ( data ) { - $( '#dataEntryFormDiv' ).html( data ); - updateDataForm(); - },function () { - $( '#dataEntryFormDiv' ).html( "
        Unable to load form.
        " ); - hideById( 'loaderDiv' ); - } ); - } - } -})(); - -function updateDataForm() { - $( '#inputCriteriaDiv' ).remove(); - showById( 'programName' ); - showById( 'actionDiv' ); - var programName = $( '#programId option:selected' ).text(); - var programStageId = $( '#programId option:selected' ).attr( 'psid' ); - $( '.stage-object-selected' ).attr( 'psid', programStageId ); - setInnerHTML( 'programName', programName ); - $('#executionDate').css('width',430); - $('#executionDate').css('margin-right',34); - - if ( getFieldValue( 'completed' ) == 'true' ) { - disable( "completeBtn" ); - enable( "uncompleteBtn" ); - } - else { - enable( "completeBtn" ); - disable( "uncompleteBtn" ); - } - - hideById( 'loaderDiv' ); - showById( 'dataEntryInfor' ); - showById( 'entryFormContainer' ); - - $( "#entryForm :input" ).each( function () { - if ( ( $( this ).attr( 'options' ) != null && $( this ).attr( 'options' ) == 'true' ) - || ( $( this ).attr( 'username' ) != null && $( this ).attr( 'username' ) == 'true' ) ) { - var input = $( this ); - input.parent().width( input.width() + 200 ); - } - } ); -} - -function createExecutionDate( programId, programStageInstanceId, executionDate, organisationUnitId ) { - var data = {}; - - if(programId) - data.programId = programId; - - if(programStageInstanceId) - data.programStageInstanceId = programStageInstanceId; - - if(executionDate) - data.executionDate = executionDate; - - if(organisationUnitId) { - data.organisationUnitId = organisationUnitId; - data.organisationUnit = organisationUnits[organisationUnitId].n; - } - - return data; -} - -function createProgramStage( programStageId, programStageInstanceId, organisationUnitId ) { - var data = {}; - - if(programStageId) - data.programStageId = programStageId; - - if(programStageInstanceId) - data.programStageInstanceId = programStageInstanceId; - - if(organisationUnitId) - data.organisationUnitId = organisationUnitId; - - return data; -} - -function loadProgramStage( programStageId, programStageInstanceId, organisationUnitId, success, fail ) { - var data = createProgramStage( programStageId, programStageInstanceId, organisationUnitId ); - - if( programStageId === undefined ) { - programStageId = $('#programId option:selected').attr('psid'); - } - - DAO.store.get('programStages', programStageId ).done(function(obj) { - if(success) success(obj.form); - } ).fail(function() { - $.ajax( { - url: 'dataentryform.action', - data: data, - dataType: 'html', - cache: false - } ).done(function(data) { - if(success) success(data); - } ).fail(function() { - if(fail) fail(); - }); - }); -} === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/form.js' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/form.js 2014-05-05 15:31:54 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/form.js 2014-05-12 09:56:39 +0000 @@ -154,7 +154,7 @@ if (statusSearching == 0) { return; } else if (statusSearching == 1) { - showById('listTrackedEntityInstanceDiv'); + showById('listEntityInstanceDiv'); } } === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/trackedEntityInstance.js' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/trackedEntityInstance.js 2014-05-05 15:31:54 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/trackedEntityInstance.js 2014-05-12 09:56:39 +0000 @@ -362,7 +362,7 @@ + "'>"
 				+ i18n_dashboard
 				+ "
        "; - table += ""; + if ( json.rows.length == 0 ){ + var message = "

        " + i18n_no_result_found + "

        "; container.html(message); } - - $( entityInstances ).each( function( i, entityInstance ) - { - sEntityInstance += "
        "; - var attributes = $( entityInstance ).find('attribute'); - $( attributes ).each( function( i, attribute ) - { - sEntityInstance += "" - + "" - + " " - + ""; + else{ + var attList = new Array(); + var attDate = new Array(); + $('#attributeIds option').each(function(i, item) { + var valueType = $(item).attr('valueType'); + var value = $(item).val(); + if ( valueType == 'bool' || valueType == 'trueOnly' ) { + for (var i = idx; i < json.width; i++) { + if( value==json.headers[i].name ){ + attList.push(i); + } + else if( valueType=='date'){ + attDate.push(i); + } + } + } + else if ( valueType == 'date' ) { + for (var i = idx; i < json.width; i++) { + if( value==json.headers[i].name ){ + attDate.push(i); + } + } + } }); - sEntityInstance += ""; - sEntityInstance += "
        " + $(attribute).find('name').text() + "" + $(attribute).find('value').text() + "
        "; - container.append(i18n_duplicate_warning + "
        " + sEntityInstance); - } ); + + var result = ""; + var idx = 4; + for ( var i in json.rows) { + result += "
        "; + var cols = json.rows[i]; + var uid = cols[0]; + for (var j = idx; j < json.width; j++) { + var colVal = cols[j]; + if( colVal!=''){ + if (j == 4) { + colVal = json.metaData.names[colVal]; + } + + if( jQuery.inArray( j, attList )>=0 && colVal!="" ){ + colVal = (colVal=='true')? i18n_yes : i18n_no; + } + else if( jQuery.inArray( j, attDate )>=0 && colVal!="" ){ + colVal = colVal.split(' ')[0]; + } + result += "" + + "" + + " " + + ""; + } + } + result += ""; + result += "
        " + json.headers[j].column + "" + colVal + "
        "; + } + container.append(i18n_duplicate_warning + "
        " + result); + } } -// Will be call after save new person successfully -function autoChoosePerson( xmlElement ) +// Will be call after save new TEI successfully +function autoChooseTEI( xmlElement ) { jQuery("#tab-2").html("
        " + i18n_add_person_successfully + "
        "); var root = jQuery(xmlElement); @@ -135,7 +178,7 @@ // Set Representative information to parent page. //------------------------------------------------------------------------------ -function choosePerson(this_) +function chooseTEI(this_) { var relationshipTypeId = jQuery("#searchForm [id=relationshipTypeId]").val(); if( isBlank( relationshipTypeId )) === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/menu.vm' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/menu.vm 2014-04-11 06:46:17 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/menu.vm 2014-05-12 09:56:39 +0000 @@ -1,6 +1,4 @@ -#if( $auth.hasAccess( "dhis-web-caseentry", "trackedEntityInstance" ) - || $auth.hasAccess( "dhis-web-caseentry", "activityPlanSelect" ) - || $auth.hasAccess( "dhis-web-caseentry", "smsReminderSelect" ) ) +#if( $auth.hasAccess( "dhis-web-caseentry", "trackedEntityInstance" ) || $auth.hasAccess( "dhis-web-caseentry", "activityPlanSelect" ) || $auth.hasAccess( "dhis-web-caseentry", "smsReminderSelect" ) )

        $i18n.getString( "tracked_entity_instance" ) 

        #end
        -#if( $auth.hasAccess( "dhis-web-caseentry", "singleEventSelect" ) - || $auth.hasAccess( "dhis-web-caseentry", "anonymousRegistration" ) ) +#if( $auth.hasAccess( "dhis-web-caseentry", "singleEventSelect" ) )

        $i18n.getString( "data_entry" ) 

        #end -#if( $auth.hasAccess( "dhis-web-caseentry", "reportSelect" ) - || $auth.hasAccess( "dhis-web-caseentry", "statisticalProgramReportSelect" ) - || $auth.hasAccess( "dhis-web-caseentry", "programStageCompletenessSelect" ) ) +#if( $auth.hasAccess( "dhis-web-caseentry", "reportSelect" ) || $auth.hasAccess( "dhis-web-caseentry", "statisticalProgramReportSelect" ) || $auth.hasAccess( "dhis-web-caseentry", "programStageCompletenessSelect" ) )

        $i18n.getString( "reports" ) 

        #end
          === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentForm.vm' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentForm.vm 2014-04-20 02:45:01 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentForm.vm 2014-05-12 09:56:39 +0000 @@ -1,6 +1,7 @@ #set($noGroup = $attributeGroups.size() ) #if( $programInstance || $hasDataEntry=='true' ) + @@ -167,7 +168,7 @@ getVisitSchedule(getFieldValue('programInstanceId')); } else if( ui.tab.hash == '#tab-5' ){ - programReports(getFieldValue('programInstanceId')); + programReports(getFieldValue('programInstanceUid')); } else if( ui.tab.hash == '#tab-4' ){ getEventMessages(getFieldValue('programInstanceId')); === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/underAgeForm.vm' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/underAgeForm.vm 2014-02-07 20:25:49 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/underAgeForm.vm 2014-05-12 09:56:39 +0000 @@ -1,14 +1,13 @@ === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/account.css' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/account.css 2013-12-30 13:12:08 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/account.css 2014-05-12 09:56:39 +0000 @@ -66,13 +66,28 @@ color: #333; } +/*----------------------------------------------------------------------------*/ +/* @font-face */ +/*----------------------------------------------------------------------------*/ + @font-face { - font-family: 'LiberationSansRegular'; - src: url('../fonts/LiberationSans-Regular-webfont.eot'); - src: url('../fonts/LiberationSans-Regular-webfont.eot?#iefix') format('eot'), - url('../fonts/LiberationSans-Regular-webfont.woff') format('woff'), - url('../fonts/LiberationSans-Regular-webfont.ttf') format('truetype'), - url('../fonts/LiberationSans-Regular-webfont.svg#webfontc8rbNdBe') format('svg'); + font-family: 'LiberationSans'; + src: url('../../fonts/LiberationSans-Regular-webfont.eot'); + src: url('../../fonts/LiberationSans-Regular-webfont.eot?#iefix') format('eot'), + url('../../fonts/LiberationSans-Regular-webfont.woff') format('woff'), + url('../../fonts/LiberationSans-Regular-webfont.ttf') format('truetype'), + url('../../fonts/LiberationSans-Regular-webfont.svg#webfontc8rbNdBe') format('svg'); font-weight: normal; font-style: normal; } + +@font-face { + font-family: 'LiberationSans'; + src: url('../../fonts/LiberationSans-Bold-webfont.eot'); + src: url('../../fonts/LiberationSans-Bold-webfont.eot?#iefix') format('eot'), + url('../../fonts/LiberationSans-Bold-webfont.woff') format('woff'), + url('../../fonts/LiberationSans-Bold-webfont.ttf') format('truetype'), + url('../../fonts/LiberationSans-Bold-webfont.svg#webfontHyWb8e07') format('svg'); + font-weight: bold; + font-style: normal; +} === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/green/green.css' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/green/green.css 2014-04-29 12:49:25 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/green/green.css 2014-05-12 09:56:39 +0000 @@ -5,7 +5,7 @@ * { - font-family: LiberationSansRegular, arial, sans-serif; + font-family: LiberationSans, arial, sans-serif; line-height: 140%; } @@ -76,7 +76,7 @@ position: absolute; top: 12px; left: 175px; - font-family: LiberationSansBold, arial; + font-weight: bold; color: #fff; font-size: 16px; } @@ -229,7 +229,7 @@ margin: 16px 20px 1px 20px; padding: 8px 0 8px 0; font-weight: normal; - font-family: LiberationSansBold, arial; + font-family: LiberationSan, arial; } #leftBarContents ul @@ -321,9 +321,8 @@ text-align: left; color: #39547d; padding: 3px 0 3px 1px; - font-family: LiberationSansBold, arial; font-size: 13px; - font-weight: normal; + font-weight: bold; border-collapse: collapse; border-bottom: 1px solid #cad5e5; min-height: 28px; @@ -388,12 +387,12 @@ .bold, .bold td { - font-family: LiberationSansBold, arial, sans-serif; + font-weight: bold; } .normal { - font-family: LiberationSansRegular, arial, sans-serif; + font-weight: normal; } /*----------------------------------------------------------------------------*/ @@ -453,7 +452,7 @@ .introItemHeader { - font-family: LiberationSansBold, arial; + font-weight: bold; color: #3F693F; font-size: 13px; } @@ -468,7 +467,7 @@ /*----------------------------------------------------------------------------*/ @font-face { - font-family: 'LiberationSansRegular'; + font-family: 'LiberationSans'; src: url('../../fonts/LiberationSans-Regular-webfont.eot'); src: url('../../fonts/LiberationSans-Regular-webfont.eot?#iefix') format('eot'), url('../../fonts/LiberationSans-Regular-webfont.woff') format('woff'), @@ -479,12 +478,12 @@ } @font-face { - font-family: 'LiberationSansBold'; + font-family: 'LiberationSans'; src: url('../../fonts/LiberationSans-Bold-webfont.eot'); src: url('../../fonts/LiberationSans-Bold-webfont.eot?#iefix') format('eot'), url('../../fonts/LiberationSans-Bold-webfont.woff') format('woff'), url('../../fonts/LiberationSans-Bold-webfont.ttf') format('truetype'), url('../../fonts/LiberationSans-Bold-webfont.svg#webfontHyWb8e07') format('svg'); - font-weight: normal; + font-weight: bold; font-style: normal; } === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/india/india.css' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/india/india.css 2014-03-30 20:47:31 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/india/india.css 2014-05-12 09:56:39 +0000 @@ -5,7 +5,7 @@ * { - font-family: LiberationSansRegular, arial, sans-serif; + font-family: LiberationSans, arial, sans-serif; line-height: 140%; } @@ -76,7 +76,7 @@ position: absolute; top: 12px; left: 175px; - font-family: LiberationSansBold, arial; + font-weight: bold; color: #fff; font-size: 16px; } @@ -227,8 +227,7 @@ font-size: 9pt; margin: 16px 20px 2px 20px; padding: 7px 0 7px 0; - font-weight: normal; - font-family: LiberationSansBold, arial; + font-weight: bold; } #leftBarContents ul @@ -325,9 +324,8 @@ border-style: solid; border-width: 1px; border-color: #c8dbea; - font-family: LiberationSansBold, arial; + font-weight: bold; font-size: 13px; - font-weight: normal; } #mainPage @@ -381,12 +379,12 @@ .bold, .bold td { - font-family: LiberationSansBold, arial, sans-serif; + font-weight: bold; } .normal { - font-family: LiberationSansRegular, arial, sans-serif; + font-weight: normal; } /*----------------------------------------------------------------------------*/ @@ -446,7 +444,7 @@ .introItemHeader { - font-family: LiberationSansBold, arial; + font-weight: bold; color: #3F693F; font-size: 13px; } @@ -461,7 +459,7 @@ /*----------------------------------------------------------------------------*/ @font-face { - font-family: 'LiberationSansRegular'; + font-family: 'LiberationSans'; src: url('../../fonts/LiberationSans-Regular-webfont.eot'); src: url('../../fonts/LiberationSans-Regular-webfont.eot?#iefix') format('eot'), url('../../fonts/LiberationSans-Regular-webfont.woff') format('woff'), @@ -472,12 +470,12 @@ } @font-face { - font-family: 'LiberationSansBold'; + font-family: 'LiberationSans'; src: url('../../fonts/LiberationSans-Bold-webfont.eot'); src: url('../../fonts/LiberationSans-Bold-webfont.eot?#iefix') format('eot'), url('../../fonts/LiberationSans-Bold-webfont.woff') format('woff'), url('../../fonts/LiberationSans-Bold-webfont.ttf') format('truetype'), url('../../fonts/LiberationSans-Bold-webfont.svg#webfontHyWb8e07') format('svg'); - font-weight: normal; + font-weight: bold; font-style: normal; } === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/light_blue/light_blue.css' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/light_blue/light_blue.css 2014-04-29 12:49:25 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/light_blue/light_blue.css 2014-05-12 09:56:39 +0000 @@ -5,7 +5,7 @@ * { - font-family: LiberationSansRegular, arial, sans-serif; + font-family: LiberationSans, arial, sans-serif; line-height: 140%; } @@ -76,7 +76,7 @@ position: absolute; top: 12px; left: 175px; - font-family: LiberationSansBold, arial; + font-weight: bold; color: #fff; font-size: 16px; } @@ -228,8 +228,7 @@ font-size: 9pt; margin: 16px 20px 1px 20px; padding: 8px 0 8px 0; - font-weight: normal; - font-family: LiberationSansBold, arial; + font-weight: bold; } #leftBarContents ul @@ -321,9 +320,8 @@ text-align: left; color: #39547d; padding: 3px 0 3px 1px; - font-family: LiberationSansBold, arial; font-size: 13px; - font-weight: normal; + font-weight: bold; border-collapse: collapse; border-bottom: 1px solid #cad5e5; min-height: 28px; @@ -383,12 +381,12 @@ .bold, .bold td { - font-family: LiberationSansBold, arial, sans-serif; + font-weight: bold; } .normal { - font-family: LiberationSansRegular, arial, sans-serif; + font-weight: normal; } /*----------------------------------------------------------------------------*/ @@ -448,7 +446,7 @@ .introItemHeader { - font-family: LiberationSansBold, arial; + font-weight: bold; color: #3F693F; font-size: 13px; } @@ -463,7 +461,7 @@ /*----------------------------------------------------------------------------*/ @font-face { - font-family: 'LiberationSansRegular'; + font-family: 'LiberationSans'; src: url('../../fonts/LiberationSans-Regular-webfont.eot'); src: url('../../fonts/LiberationSans-Regular-webfont.eot?#iefix') format('eot'), url('../../fonts/LiberationSans-Regular-webfont.woff') format('woff'), @@ -474,12 +472,12 @@ } @font-face { - font-family: 'LiberationSansBold'; + font-family: 'LiberationSans'; src: url('../../fonts/LiberationSans-Bold-webfont.eot'); src: url('../../fonts/LiberationSans-Bold-webfont.eot?#iefix') format('eot'), url('../../fonts/LiberationSans-Bold-webfont.woff') format('woff'), url('../../fonts/LiberationSans-Bold-webfont.ttf') format('truetype'), url('../../fonts/LiberationSans-Bold-webfont.svg#webfontHyWb8e07') format('svg'); - font-weight: normal; + font-weight: bold; font-style: normal; } === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/login.css' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/login.css 2014-01-10 08:25:15 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/login.css 2014-05-12 09:56:39 +0000 @@ -1,7 +1,7 @@ * { - font-family: LiberationSansRegular, sans-serif; + font-family: LiberationSans, sans-serif; line-height: 125%; overflow: hidden; } === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/menu.css' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/menu.css 2014-05-06 09:20:18 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/menu.css 2014-05-12 09:56:39 +0000 @@ -12,11 +12,16 @@ } #apps-search { - width: 330px; + border: 1px solid #ccc; + border-radius: 3px; + outline: none; padding-right: 25px; + padding-left: 5px; + width: 328px; } .apps-search-wrap { + padding-bottom: 10px; position: relative; width: 360px; } @@ -31,7 +36,7 @@ padding: 0; position: absolute; right: 5px; - top: 24%; + top: 18%; width: 20px; } @@ -327,7 +332,7 @@ { display: table; height: 34px; - padding-top: 12px; + padding-top: 8px; text-align: center; width: 360px; margin-top: 5px; @@ -375,15 +380,15 @@ .menu-drop-down-wrap { overflow: hidden; - height: 340px; + height: 375px; } .menu-drop-down-scroll { - height: 340px; - width: 384px; + height: 375px; overflow-y: auto; overflow-x: hidden; + width: 384px; } #appsDropDown ul.menuDropDownBox { === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/vietnam/vietnam.css' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/vietnam/vietnam.css 2014-03-30 20:47:31 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/vietnam/vietnam.css 2014-05-12 09:56:39 +0000 @@ -5,7 +5,7 @@ * { - font-family: LiberationSansRegular, arial, sans-serif; + font-family: LiberationSans, arial, sans-serif; line-height: 140%; } @@ -76,7 +76,7 @@ position: absolute; top: 12px; left: 175px; - font-family: LiberationSansBold, arial; + font-weight: bold; color: #fff; font-size: 16px; } @@ -228,7 +228,7 @@ margin: 16px 20px 2px 20px; padding: 7px 0 7px 0; font-weight: normal; - font-family: LiberationSansBold, arial; + font-weight: bold; } #leftBarContents ul @@ -325,9 +325,8 @@ border-style: solid; border-width: 1px; border-color: #c8dbea; - font-family: LiberationSansBold, arial; + font-weight: bold; font-size: 13px; - font-weight: normal; } #mainPage @@ -381,12 +380,12 @@ .bold, .bold td { - font-family: LiberationSansBold, arial, sans-serif; + font-weight: bold; } .normal { - font-family: LiberationSansRegular, arial, sans-serif; + font-weight: normal; } /*----------------------------------------------------------------------------*/ @@ -446,7 +445,7 @@ .introItemHeader { - font-family: LiberationSansBold, arial; + font-weight: bold; color: #3F693F; font-size: 13px; } @@ -461,7 +460,7 @@ /*----------------------------------------------------------------------------*/ @font-face { - font-family: 'LiberationSansRegular'; + font-family: 'LiberationSans'; src: url('../../fonts/LiberationSans-Regular-webfont.eot'); src: url('../../fonts/LiberationSans-Regular-webfont.eot?#iefix') format('eot'), url('../../fonts/LiberationSans-Regular-webfont.woff') format('woff'), @@ -472,12 +471,12 @@ } @font-face { - font-family: 'LiberationSansBold'; + font-family: 'LiberationSans'; src: url('../../fonts/LiberationSans-Bold-webfont.eot'); src: url('../../fonts/LiberationSans-Bold-webfont.eot?#iefix') format('eot'), url('../../fonts/LiberationSans-Bold-webfont.woff') format('woff'), url('../../fonts/LiberationSans-Bold-webfont.ttf') format('truetype'), url('../../fonts/LiberationSans-Bold-webfont.svg#webfontHyWb8e07') format('svg'); - font-weight: normal; + font-weight: bold; font-style: normal; } === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css 2014-04-22 16:55:51 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css 2014-05-12 09:56:39 +0000 @@ -104,7 +104,7 @@ #detailsArea label { - font-family: LiberationSansBold, arial; + font-weight: bold; font-size: 13px; } @@ -181,7 +181,7 @@ position: absolute; left: 22px; top: 50px; - font-family: LiberationSansBold, arial; + font-weight: bold; font-size: 9pt; cursor: pointer; } @@ -190,7 +190,7 @@ { position: absolute; right: 2px; - font-family: LiberationSansBold, arial; + font-weight: bold; font-size: 9pt; cursor: pointer; } @@ -271,7 +271,7 @@ div#orgUnitTree a.selected { color: #000; - font-family: LiberationSansBold, arial; + font-weight: bold; } /*----------------------------------------------------------------------------*/ @@ -604,7 +604,7 @@ div.paging span, div.paging a { - font-family: LiberationSansBold, arial; + font-weight: bold; padding: 0 5px; font-size: 12px; } @@ -705,7 +705,7 @@ border: 1px solid #bbb; border-radius: 3px; margin-right: 4px; - font-family: LiberationSansBold, arial; + font-weight: bold; font-size: 13px; background-color: #f3f3f3; color: #606060 !important; @@ -725,7 +725,7 @@ border: 1px solid #3D77B3; border-radius: 3px; margin-right: 4px; - font-family: LiberationSansBold, arial; + font-weight: bold; font-size: 13px; background-color: #3581CE; color: #fff !important; @@ -778,37 +778,29 @@ .ui-widget, .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { - font-family: LiberationSansRegular, arial, sans-serif !important; + font-family: LiberationSans, arial, sans-serif !important; font-size: 9pt !important; } .ui-datepicker th { - font-family: LiberationSansBold, arial, sans-serif !important; - font-weight: normal !important; + font-family: LiberationSans, arial, sans-serif !important; padding: 0.5em 0 !important; font-size: 9pt !important; } .ui-widget-header, .ui-widget-header a { - font-family: LiberationSansBold, arial, sans-serif !important; - font-weight: normal !important; + font-family: LiberationSans, arial, sans-serif !important; font-size: 10pt !important; } .ui-button-text { - font-family: LiberationSansBold, arial, sans-serif !important; - font-weight: normal !important; + font-family: LiberationSans, arial, sans-serif !important; font-size: 9pt !important; } -.ui-state-default -{ - font-weight: normal !important; -} - /*----------------------------------------------------------------------------*/ /* Messages used for sharing */ /*----------------------------------------------------------------------------*/ === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.menu.js' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.menu.js 2014-05-06 09:20:18 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.menu.js 2014-05-12 09:56:39 +0000 @@ -629,7 +629,7 @@ self.parent().css('width', '360px'); self.parent().parent().css('width', '360px'); } else { - if (self.innerHeight() === 340 ) { + if (self.innerHeight() === 375 ) { moreAppsElement.hide(); self.parent().css('width', '384px'); self.parent().parent().css('width', '384px'); === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/ouwt/ouwt.js' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/ouwt/ouwt.js 2014-04-20 16:15:45 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/ouwt/ouwt.js 2014-05-12 09:56:39 +0000 @@ -283,7 +283,6 @@ subtree.reloadTree(); $( "#ouwt_loader" ).hide(); - selection.scrollToSelected(); $( "#orgUnitTree" ).trigger( "ouwtLoaded" ); } ); } ); === removed file 'dhis-2/dhis-web/dhis-web-commons/src/main/resources/i18n_global_lo.properties' --- dhis-2/dhis-web/dhis-web-commons/src/main/resources/i18n_global_lo.properties 2014-05-03 11:43:27 +0000 +++ dhis-2/dhis-web/dhis-web-commons/src/main/resources/i18n_global_lo.properties 1970-01-01 00:00:00 +0000 @@ -1,663 +0,0 @@ -not_logged_in=\u0e9a\u0ecd\u0ec8\u0e95\u0ec9\u0ead\u0e87\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0eaa\u0eb9\u0ec8\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a -log_out=\u0ead\u0ead\u0e81\u0e88\u0eb2\u0e81\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a -org_unit_tree=\u0ec2\u0e84\u0e87\u0eae\u0ec8\u0eb2\u0e87\u0e81\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87 -locate_organisation_unit_by_name=\u0e97\u0eb5\u0ec8\u0e95\u0eb1\u0ec9\u0e87\u0e82\u0ead\u0e87\u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87\u0e9b\u0eb0\u0e95\u0eb4\u0e9a\u0eb1\u0e94\u0ead\u0eb5\u0e87\u0e95\u0eb2\u0ea1\u0e8a\u0eb7\u0ec8 -error_occurred=\u0e82\u0ecd\u0ec9\u0e9c\u0eb4\u0e94\u0e9e\u0eb2\u0e94\u0e9b\u0eb0\u0e81\u0ebb\u0e94\u0e82\u0eb7\u0ec9\u0e99. -select_organisationunit=\u0e97\u0ec8\u0eb2\u0e99\u0e95\u0ec9\u0ead\u0e87\u0ec4\u0e94\u0ec9\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ec0\u0ead\u0ebb\u0eb2\u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e81\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87\u0e9b\u0eb0\u0e95\u0eb4\u0e9a\u0eb1\u0e94\u0e88\u0eb2\u0e81\u0ec2\u0e84\u0e87\u0eae\u0ec8\u0eb2\u0e87\u0ea5\u0ea7\u0ea1 -dhis-web-maintenance-user=\u0e9c\u0eb9\u0ec9\u0e99\u0ecd\u0eb2\u0ec3\u0e8a\u0ec9 -dhis-web-maintenance-settings=\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2 -dhis-web-maintenance-patient=\u0e84\u0ebb\u0e99 \u0ec1\u0ea5\u0eb0 \u0ec1\u0e9c\u0e99\u0e87\u0eb2\u0e99 -dhis-web-importexport=\u0e82\u0eb2\u0ec0\u0e82\u0ebb\u0ec9\u0eb2-\u0e82\u0eb2\u0ead\u0ead\u0e81 -dhis-web-light=\u0ec0\u0e84\u0eb7\u0ec8\u0ead\u0e99\u0e97\u0eb5\u0ec8 (\u0ec1\u0eaa\u0e87) -dhis-web-dashboard-integration=\u0edc\u0ec9\u0eb2\u0e95\u0ec8\u0eb2\u0e87\u0eaa\u0eb0\u0ec1\u0e94\u0e87\u0e9c\u0ebb\u0e99\u0e97\u0eb5\u0ec8\u0ec0\u0e9b\u0eb1\u0e99\u0eae\u0eb9\u0e9a\u0e9e\u0eb2\u0e9a -dhis-web-integration=\u0e81\u0eb2\u0e99\u0e9b\u0eb0\u0eaa\u0eb2\u0e99\u0e87\u0eb2\u0e99\u0e82\u0ead\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -dhis-web-linelisting-mp=\u0e81\u0ecd\u0eb2\u0ea5\u0eb1\u0e87\u0e84\u0ebb\u0e99 -intro_dhis-web-maintenance-appmanager=\u0e81\u0eb2\u0e99\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0ec0\u0e96\u0eb4\u0e87 \u0ec1\u0ea5\u0eb0 \u0e81\u0eb2\u0e99\u0eaa\u0ebb\u0ec8\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 \u0e81\u0eb2\u0e99\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9 \u0e97\u0eb5\u0ec8\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ec0\u0e9e\u0eb5\u0ec9\u0ea1 \u0ea1\u0eb2\u0e94\u0e95\u0eb0\u0e96\u0eb2\u0e99\u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 -intro_dhis-web-caseentry=\u0e81\u0eb2\u0e99\u0ea5\u0ebb\u0e87\u0e97\u0eb0\u0e9a\u0ebd\u0e99\u0e9c\u0eb9\u0ec9\u0ec4\u0e94\u0ec9\u0eae\u0eb1\u0e9a\u0e9c\u0ebb\u0e99\u0e9b\u0eb0\u0ec2\u0eab\u0e8d\u0e94, \u0e81\u0eb2\u0e99\u0e95\u0eb7\u0ec8\u0ea1\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 \u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a \u0eaa\u0eb5\u0ec8\u0e87\u0e97\u0eb5\u0ec8\u0ec0\u0e81\u0eb5\u0e94\u0e82\u0eb7\u0ec9\u0e99\u0e95\u0ec8\u0eb2\u0e87\u0ec6 \u0ec1\u0ea5\u0eb0 \u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0e9a\u0ebb\u0e94\u0ea5\u0eb2\u0e8d\u0e87\u0eb2\u0e99\u0ea5\u0ea7\u0ea1 -intro_dhis-web-dataentry=\u0e81\u0eb2\u0e99\u0e95\u0eb7\u0ec8\u0ea1\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 \u0ec3\u0eaa\u0ec8\u0ec1\u0e9a\u0e9a\u0e9f\u0ead\u0ea1 \u0ec2\u0e94\u0e8d\u0e81\u0eb2\u0e99\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8 \u0ead\u0eb5\u0e99\u0ec0\u0e95\u0eb5\u0ec1\u0e99\u0eb1\u0e94 \u0eab\u0ea5\u0eb7\u0e9a\u0ecd\u0ec8\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8, \u0e81\u0eb2\u0e99\u0ea2\u0eb1\u0ec9\u0e87\u0ea2\u0eb7\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 \u0ec1\u0ea5\u0eb0 \u0eaa\u0eb1\u0e87\u0ec0\u0e81\u0e94\u0e97\u0ec8\u0eb2\u0ead\u0ec8\u0ebd\u0e87\u0e95\u0ec8\u0eb2\u0e87\u0e82\u0ead\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -intro_dhis-web-mobile=\u0e81\u0eb2\u0e99\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0ec0\u0e96\u0eb4\u0e87 Smartphone \u0ec1\u0ea1\u0ec8\u0e99\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0e9b\u0ec9\u0ead\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99, \u0e88\u0eb1\u0e94\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a \u0ec1\u0ea5\u0eb0 \u0eaa\u0ebb\u0ec8\u0e87\u0e82\u0ecd\u0ec9\u0e84\u0ea7\u0eb2\u0ea1\u0ec4\u0e94\u0ec9\u0eaa\u0eb0\u0e94\u0ea7\u0e81 \u0ec1\u0ea5\u0eb0 \u0ea7\u0ec8\u0ead\u0e87\u0ec4\u0ea7 -intro_dhis-web-dashboard-integration=\u0e97\u0ec8\u0eb2\u0e99\u0e8d\u0eb1\u0e87\u0eaa\u0eb2\u0ea1\u0eb2\u0e94 \u0ec0\u0e9a\u0eb5\u0ec8\u0e87 \u0e9a\u0eb1\u0e99\u0e94\u0eb2\u0e81\u0eae\u0eb2\u0e9f \u0e97\u0eb5\u0ec8\u0eaa\u0eb0\u0ec1\u0e94\u0e87\u0e9c\u0ebb\u0e99, \u0ec1\u0e9c\u0e99\u0e97\u0eb5\u0ec8 \u0ec1\u0ea5\u0eb0 \u0e82\u0ebd\u0e99\u0e82\u0ecd\u0ec9\u0e84\u0ea7\u0eb2\u0ea1\u0ec0\u0e9e\u0eb7\u0ec8\u0ead\u0eaa\u0ebb\u0ec8\u0e87\u0ec3\u0eab\u0ec9\u0e97\u0eb5\u0ea1\u0e87\u0eb2\u0e99 -intro_help_center=\u0e97\u0ec8\u0eb2\u0e99\u0e8d\u0eb1\u0e87\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0e95\u0ebb\u0ea7\u0e8a\u0ec8\u0ea7\u0e8d\u0e88\u0eb2\u0e81\u0eab\u0ea5\u0eb2\u0e8d\u0eab\u0ebb\u0ea7\u0e82\u0ecd\u0ec9\u0e97\u0eb5\u0ec8\u0e81\u0ec8\u0ebd\u0ea7\u0e82\u0ec9\u0ead\u0e87 \u0ec0\u0e9e\u0eb7\u0ec8\u0ead\u0e88\u0eb1\u0e94\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a \u0ec1\u0ea5\u0eb0 \u0e99\u0ecd\u0eb2\u0ec3\u0e8a\u0ec9 DHIS 2. -next=\u0e95\u0ecd\u0ec8\u0ec4\u0e9b -sync_success=\u0e81\u0eb2\u0e99\u0eaa\u0ebb\u0ec8\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec4\u0e9b\u0eab\u0eb2 server (\u0edc\u0ec8\u0ea7\u0e8d\u0e84\u0ea7\u0eb2\u0ea1\u0e88\u0ecd\u0eb2) \u0ec4\u0e94\u0ec9\u0eaa\u0ecd\u0eb2\u0ec0\u0ea5\u0eb1\u0e94 -extend_menu=\u0ec0\u0e9e\u0eb5\u0ec9\u0ea1\u0ec0\u0ea1\u0e99\u0e8d\u0eb9\u0e95\u0eb7\u0ec8\u0ea1 -organisation_unit=\u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87\u0e9b\u0eb0\u0e95\u0eb4\u0e9a\u0eb1\u0e94 -start_date=\u0ea1\u0eb7\u0ec9\u0ec0\u0ea5\u0eb5\u0ec8\u0ea1 -end_date=\u0ea1\u0eb7\u0ec9\u0eaa\u0eb4\u0ec9\u0e99\u0eaa\u0eb8\u0e94 -operations=\u0e81\u0eb2\u0e99\u0e9b\u0eb0\u0e95\u0eb4\u0e9a\u0eb1\u0e94\u0e81\u0eb2\u0e99 -all=\u0e97\u0eb1\u0e87\u0edd\u0ebb\u0e94 -clone=\u0e81\u0eb2\u0e99\u0ea5\u0ead\u0e81\u0ec1\u0e9a\u0e9a -reply=\u0e81\u0eb2\u0e99\u0e95\u0ead\u0e9a -deleting=\u0e81\u0eb2\u0e99\u0ea5\u0eb6\u0e9a -gender_male=~\u0ec0\u0e9e\u0e94\u0e8a\u0eb2\u0e8d -confirm_password=\u0ea2\u0eb7\u0e99\u0ea2\u0eb1\u0e99\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99 -create_new_account=\u0eaa\u0ec9\u0eb2\u0e87~\u0ec0\u0ead\u0e81\u0eb0\u0eaa\u0eb2\u0e99\u0ec3\u0edd\u0ec8 -prove_you_are_not_a_robot=\u0ea2\u0eb1\u0ec9\u0e87\u0ea2\u0eb7\u0e99\u0ea7\u0ec8\u0eb2\u0e97\u0ec8\u0eb2\u0e99\u0e9a\u0ecd\u0ec8\u0ec1\u0ea1\u0ec8\u0e99\u0eab\u0eb8\u0ec8\u0e99\u0e8d\u0ebb\u0e99 -cant_read_the_words_try_another_one=\u0e96\u0ec9\u0eb2\u0ead\u0ec8\u0eb2\u0e99\u0e84\u0ecd\u0eb2\u0e99\u0eb5\u0ec9\u0e9a\u0ecd\u0ec8\u0ec4\u0e94\u0ec9\u0ec1\u0ea1\u0ec8\u0e99\u0ec3\u0eab\u0ec9\u0e9e\u0eb0\u0e8d\u0eb2\u0e8d\u0eb2\u0ea1\u0e84\u0ecd\u0eb2\u0ead\u0eb7\u0ec8\u0e99 -Monthly=\u0ec0\u0e9b\u0eb1\u0e99\u0ec0\u0e94\u0eb7\u0ead\u0e99 -Yearly=\u0ec1\u0e95\u0ec8\u0ea5\u0eb0\u0e9b\u0eb5 -TwoYearly=\u0e97\u0eb8\u0e81\u0ec6\u0eaa\u0ead\u0e87\u0e9b\u0eb5 -FinancialOct=\u0e87\u0ebb\u0e9a\u0e9b\u0eb0\u0ea1\u0eb2\u0e99\u0eaa\u0ebb\u0e81\u0e9b\u0eb5-\u0ec0\u0e94\u0eb7\u0ead\u0e99 10 -format.Monthly.startDate=MMMM yyyy -format.Monthly.endDate= -format.BiMonthly.endDate=\u0ec0\u0e94\u0eb7\u0ead\u0e99 \u0e9b\u0eb5 -format.SixMonthly.endDate=MMM yyyy -format.Yearly.endDate= -format.TwoYearly.endDate=\u0e9b\u0eb5 -format.Survey.startDate=\u0e9b\u0eb5- \u0ec0\u0e94\u0eb7\u0ead\u0e99-\u0ea1\u0eb5\u0ec9 -format.Relative.startDate=\u0e9b\u0eb5-\u0ec0\u0e94\u0eb7\u0ead\u0e99-\u0ea1\u0eb7\u0ec9 '- ' -format.FinancialApril.startDate=\u0ea1\u0eb7\u0ec9-\u0ec0\u0e94\u0eb7\u0ead\u0e99-\u0e9b\u0eb5 '\u0eab\u0eb2 ' -format.FinancialJuly.endDate=\u0ea1\u0eb7\u0ec9-\u0ec0\u0e94\u0eb7\u0ead\u0e99-\u0e9b\u0eb5 -format.FinancialOct.startDate='FY ' \u0eaa\u0ebb\u0e81\u0e9b\u0eb5\u0e87\u0ebb\u0e9a\u0e9b\u0eb0\u0ea1\u0eb2\u0e99 -month.february=\u0e81\u0eb8\u0ea1\u0e9e\u0eb2 -month.july=\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94 -month.august=\u0eaa\u0eb4\u0e87\u0eab\u0eb2 -month.september=\u0e81\u0eb2\u0e99\u0e8d\u0eb2 -month.short.january=\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99 -month.short.august=\u0ec0\u0e94\u0eb7\u0ead\u0e99\u0eaa\u0eb4\u0e87\u0eab\u0eb2 -weekday.wednesday=\u0ea7\u0eb1\u0e99\u0e9e\u0eb8\u0e94 -weekday.short.tuesday=\u0ea7\u0eb1\u0e99\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99 -weekday.short.saturday=\u0ea7\u0eb1\u0e99\u0ec0\u0eaa\u0ebb\u0eb2 -translation_label_id=Id -translation_label_description=\u0e9e\u0eb1\u0e99\u0ea5\u0eb0\u0e99\u0eb2\u0ead\u0eb0\u0ead\u0ebd\u0e94 -translation_label_comment=\u0e84\u0eb3\u0ec0\u0eab\u0eb1\u0e99 -translation_languagecode=\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9e\u0eb2\u0eaa\u0eb2 -translation_label_numerator_description=\u0e9e\u0eb1\u0e99\u0ea5\u0eb0\u0e99\u0eb2\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e95\u0ebb\u0ea7\u0e95\u0eb1\u0ec9\u0e87 -translation_label_denominator_description=\u0e81\u0eb2\u0e99\u0e9e\u0eb1\u0e99\u0ea5\u0eb0\u0e99\u0eb2\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e95\u0ebb\u0ea7\u0eab\u0eb2\u0e99 -translation_cancel=\u0e8d\u0ebb\u0e81\u0ec0\u0ea5\u0eb5\u0e81 -translation_add=\u0ec0\u0e9e\u0eb5\u0ec8\u0ea1 -translation_language_must_be_two_chars=\u0e9e\u0eb2\u0eaa\u0eb2\u0e88\u0eb0\u0e95\u0ec9\u0ead\u0e87\u0ea1\u0eb5\u0eaa\u0ead\u0e87\u0e84\u0ecd\u0eb2 -translation_locale_already_exists=\u0e97\u0eb5\u0ec8\u0e95\u0eb1\u0ec9\u0e87\u0e99\u0eb5\u0ec9\u0ea1\u0eb5\u0ec1\u0ea5\u0ec9\u0ea7 -translation_shortname_wellformed=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2 \u0e81\u0ecd\u0eb2\u0e99\u0ebb\u0e94 \u0ec0\u0e9b\u0eb1\u0e99\u0e95\u0ebb\u0ea7\u0edc\u0eb1\u0e87\u0eaa\u0eb7, \u0ec0\u0e9b\u0eb1\u0e99\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81, \u0edd\u0eb2\u0e8d\u0e82\u0eb5\u0e94\u0e81\u0ec9\u0ead\u0e87 \u0ec1\u0ea5\u0eb0 \u0e8d\u0eb0\u0eab\u0ea7\u0ec8\u0eb2\u0e87 \u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a \u0e9e\u0ebd\u0e87\u0ec1\u0e95\u0ec8\u0e8a\u0eb7\u0ec8\u0eaa\u0eb1\u0ec9\u0e99 -translation_shortname_length=\u0e8a\u0eb7\u0ec8\u0eaa\u0eb1\u0ec9\u0e99\u0eaa\u0eb9\u0e87\u0eaa\u0eb8\u0e94\u0e9a\u0ecd\u0ec8\u0ec3\u0eab\u0ec9\u0e81\u0eb2\u0e8d 25 \u0e84\u0ecd\u0eb2 -translation_label_formName=\u0e8a\u0eb7\u0ec8\u200b\u0ec1\u0e9a\u0e9a\u200b\u0e9f\u0ead\u0ea1\u200b -name_exists=\u0e8a\u0eb7\u0ec8\u0e99\u0eb5\u0ec9\u0ea1\u0eb5\u0eae\u0ebd\u0e9a\u0eae\u0ec9\u0ead\u0e8d\u0ec1\u0ea5\u0ec9\u0ea7. -name_is_required=\u0e97\u0ec8\u0eb2\u0e99\u0e88\u0ecd\u0eb2\u0ec0\u0e9b\u0eb1\u0e99\u0e95\u0ec9\u0ead\u0e87\u0e95\u0eb7\u0ec8\u0ea1\u0e8a\u0eb7\u0ec8\u0ec3\u0eaa\u0ec8 -version=\u0ea5\u0eb9\u0ec9\u0e99 -build_revision=\u0e81\u0eb2\u0e99\u0e97\u0ebb\u0e9a\u0e97\u0ea7\u0e99\u0e81\u0eb2\u0e99\u0eaa\u0ec9\u0eb2\u0e87 -environment_variable=\u0e95\u0ebb\u0ea7\u0ec1\u0e9b\u0e97\u0eb2\u0e87\u0e94\u0ec9\u0eb2\u0e99\u0eaa\u0eb0\u0e9e\u0eb2\u0e9a\u0ec1\u0ea7\u0e94\u0ea5\u0ec9\u0ead\u0ea1 -home_page=\u0eab\u0e99\u0ec9\u0eb2\u0eab\u0ea5\u0eb1\u0e81 -launchpad_site=Launchpad \u0ec1\u0ea7\u0e9a\u0ec4\u0e8a -enter_message=\u0e95\u0eb7\u0ec8\u0ea1\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec3\u0eaa\u0ec8 -send=\u0eaa\u0ebb\u0ec8\u0e87 -send_feedback=\u0eaa\u0ebb\u0ec8\u0e87\u0e84\u0ecd\u0eb2\u0ec0\u0eab\u0eb1\u0e99\u0e84\u0eb7\u0e99\u0ec3\u0eab\u0ec9 -feedback=\u0ea1\u0eb5\u0e84\u0ecd\u0eb2\u0ec0\u0eab\u0eb1\u0e99\u0eaa\u0ebb\u0ec8\u0e87\u0e84\u0eb7\u0e99\u0ec3\u0eab\u0ec9 -help_contents=\u0e8a\u0ec8\u0ea7\u0e8d\u0e97\u0eb2\u0e87\u0e94\u0ec9\u0eb2\u0e99\u0ec0\u0e99\u0eb5\u0eb7\u0ec9\u0ead\u0ec3\u0e99 -os_version=\u0ea5\u0eb8\u0ec9\u0e99\u0e82\u0ead\u0e87\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a -supportive_software=\u0e8a\u0ead\u0e9a\u0ec1\u0ea7\u0e97\u0eb5\u0ec8\u0eaa\u0eb0\u0edc\u0eb1\u0e9a\u0eaa\u0eb0\u0edc\u0eb9\u0e99\u0ec3\u0eab\u0ec9\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0e97\u0ecd\u0eb2\u0e87\u0eb2\u0e99\u0ec4\u0e94\u0ec9 -foxit_description=\u0e9f\u0ea3\u0eb5 \u0ec1\u0ea5\u0eb0 \u0ea1\u0eb5\u0e97\u0eb1\u0e87\u0ec2\u0e9b\u0ebc\u0ec1\u0e81\u0ebc\u0ea1 PDF \u0e97\u0eb5\u0ec8\u0eaa\u0eb0\u0e94\u0ea7\u0e81 \u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0ea7\u0eb4\u0e99\u0ec2\u0e94 -pdf_reader=\u0ec2\u0e9b\u0ebc\u0ec1\u0e81\u0ebc\u0ea1 PDF \u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0ead\u0ec8\u0eb2\u0e99 -my_datamart_description=\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e9e\u0eb7\u0ec9\u0e99\u0e96\u0eb2\u0e99\u0e97\u0eb5\u0ec8\u0ea1\u0eb5\u0ec1\u0ea1\u0ec8\u0e99\u0ec4\u0e94\u0ec9\u0ec0\u0e81\u0eb1\u0e9a\u0eae\u0eb1\u0e81\u0eaa\u0eb2\u0ec4\u0ea7\u0ec9 \u0ec0\u0ea7\u0ea5\u0eb2\u0e97\u0eb5\u0ec8\u0e9a\u0ecd\u0ec8\u0ea1\u0eb5\u0e81\u0eb2\u0e99\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8\u0ec0\u0e9e\u0eb7\u0ec8\u0ead\u0e81\u0eb2\u0e99\u0ea7\u0eb4\u0ec4\u0e88 -web_api=\u0ec0\u0e84\u0eb7\u0ead\u0e84\u0ec8\u0eb2\u0e8d API -gender=\u0ec0\u0e9e\u0e94 -male=\u0e8a\u0eb2\u0e8d -birthday=\u0ea7\u0eb1\u0e99-\u0ec0\u0e94\u0eb7\u0ead\u0e99-\u0e9b\u0eb5 \u0ec0\u0e81\u0eb5\u0e94 -languages=\u0e9e\u0eb2\u0eaa\u0eb2 -style=\u0eae\u0eb9\u0e9a\u0ec1\u0e9a\u0e9a -user_message_settings=\u0e81\u0eb2\u0e99\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9 -intro_user_general_settings=\u0e94\u0eb1\u0e94\u0e9b\u0eb1\u0e9a\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0e94\u0eb1\u0ec8\u0e87\u0e81\u0ec8\u0eb2\u0ea7\u0ec3\u0eab\u0ec9\u0ec4\u0e9b\u0e95\u0eb2\u0ea1\u0e84\u0ea7\u0eb2\u0ea1\u0e95\u0ec9\u0ead\u0e87\u0e81\u0eb2\u0e99\u0e9e\u0eb4\u0ec0\u0eaa\u0e94\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 \u0ec0\u0e8a\u0eb1\u0ec8\u0e99\u0e97\u0eb5\u0ec8\u0e95\u0eb1\u0ec9\u0e87 \u0ec1\u0ea5\u0eb0 \u0eae\u0eb9\u0e9a\u0ec1\u0e9a\u0e9a\u0e95\u0ec8\u0eb2\u0e87\u0ec6 -green=\u0e82\u0ebd\u0ea7 -settings_updated=\u0e81\u0eb2\u0e99\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2\u0ec4\u0e94\u0ec9\u0e9b\u0eb1\u0e9a\u0e9b\u0eb8\u0e87\u0ec1\u0ea5\u0ec9\u0ea7 -interface_style=\u0eae\u0eb9\u0e9a\u0ec1\u0e9a\u0e9a\u0e82\u0ead\u0e87\u0e81\u0eb2\u0e99\u0eaa\u0ebb\u0e99\u0e97\u0eb0\u0e99\u0eb2\u0ec1\u0ea5\u0e81\u0e9b\u0ec8\u0ebd\u0e99 -user_groups=\u0e81\u0eb8\u0ec8\u0ea1\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 -browse_it_here=\u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0ea2\u0eb9\u0ec8\u0e9a\u0ec8\u0ead\u0e99\u0e99\u0eb5\u0ec9 -change_log=\u0e9b\u0ec8\u0ebd\u0e99 \u0e81\u0eb2\u0e99\u0e9a\u0eb1\u0e99\u0e97\u0eb6\u0e81 -sum=\u0e9c\u0ebb\u0e99\u0e9a\u0ea7\u0e81 -string=\u0eaa\u0eb0\u0e95\u0eb4\u0e87 -date=\u0ea7\u0eb1\u0e99\u0e97\u0eb5\u0ec8 -none=\u0e9a\u0ecd\u0ec8\u0ea1\u0eb5 -profile=\u0eaa\u0eb1\u0e87\u0ea5\u0ea7\u0ea1\u0eab\u0e8d\u0ecd\u0ec9\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0eaa\u0ec8\u0ea7\u0e99\u0e95\u0ebb\u0ea7 -account=\u0e9a\u0eb1\u0e99\u0e8a\u0eb5 -user_account=\u0e9a\u0eb1\u0e99\u0e8a\u0eb5\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 -wrong_password=\u0ea5\u0eb0\u0eab\u0eb1\u0e81\u0e9c\u0ec8\u0eb2\u0e99\u0e97\u0eb5\u0ec8\u0e9c\u0eb4\u0e94 -help_center=\u0eaa\u0eb9\u0e99\u0e81\u0eb2\u0e87\u0e8a\u0ec8\u0ea7\u0e8d\u0ec0\u0eab\u0ea5\u0eb7\u0ead\u0ec1\u0e81\u0ec9\u0ec4\u0e82 -help_intro_header=\u0e8d\u0eb4\u0e99\u0e94\u0eb5\u0e95\u0ec9\u0ead\u0e99\u0eae\u0eb1\u0e9a\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0eaa\u0eb9\u0ec8\u0eaa\u0eb9\u0e99\u0e81\u0eb2\u0e87\u0e8a\u0ec8\u0ea7\u0e8d\u0ec0\u0eab\u0ea5\u0eb7\u0ead\u0ec1\u0e81\u0ec9\u0ec4\u0e82 -organisation_unit_required_for_user=\u0e9c\u0eb9\u0ec9\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9\u0e88\u0eb0\u0e95\u0ec9\u0ead\u0e87\u0ec4\u0e94\u0ec9\u0ea1\u0ead\u0e9a\u0edd\u0eb2\u0e8d\u0ea2\u0ec8\u0eb2\u0e87\u0edc\u0ec9\u0ead\u0e8d \u0e99\u0eb7\u0ec8\u0e87 \u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e81\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87 -address=\u0e97\u0eb5\u0ec8\u0ea2\u0eb9\u0ec8 -please_fix_this_field=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0ec1\u0e9b\u0e87\u0e9a\u0ec8\u0ead\u0e99\u0e99\u0eb5\u0ec9 -please_enter_the_equal_values_again=\u0e81\u0eb2\u0e99\u0e95\u0eb7\u0ec8\u0ea1\u0ea1\u0eb9\u0e99\u0e84\u0ec8\u0eb2\u0e9a\u0ecd\u0ec8\u0e96\u0eb7\u0e81\u0e95\u0ec9\u0ead\u0e87. \u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ec3\u0eaa\u0ec8\u0ec3\u0edd\u0ec8 -please_enter_at_least_than_n_character=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ec3\u0eaa\u0ec8\u0ea2\u0ec8\u0eb2\u0e87\u0e95\u0ecd\u0ec8\u0eb2 {0} \u0ec2\u0e95 -please_enter_a_value_between_a_and_b=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ea1\u0eb9\u0e99\u0e84\u0ec8\u0eb2\u0ec3\u0eaa\u0ec8 \u0ea5\u0eb0\u0eab\u0ea7\u0ec8\u0eb2\u0e87 {0} \u0ec1\u0ea5\u0eb0 {1}. -please_enter_a_value_greater_than_or_equal_to_n=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ea1\u0eb9\u0e99\u0e84\u0ec8\u0eb2\u0ec3\u0eaa\u0ec8\u0ec3\u0eab\u0e8d\u0ec8\u0e81\u0ea7\u0ec8\u0eb2\u0eab\u0ea5\u0eb7 \u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0e81\u0eb1\u0e9a {0} -please_letters_numbers_spaces_underscores_only=\u0ea1\u0eb5\u0ec1\u0e95\u0ec8\u0ec2\u0e95\u0edc\u0eb1\u0e87\u0eaa\u0eb7, \u0ec2\u0e95\u0ec0\u0ea5\u0e81, \u0e8d\u0eb0\u0eab\u0ea7\u0ec8\u0eb2\u0e87 \u0ec1\u0ea5\u0eb0 \u0e82\u0eb5\u0e94\u0e81\u0ec9\u0ead\u0e87 \u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0e99\u0eb1\u0ec9\u0e99\u0e97\u0eb5\u0ec8\u0ead\u0eb2\u0e99\u0eb8\u0e8d\u0eb2\u0e94 -please_enter_a_value_less_than_or_equal_to=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ea1\u0eb9\u0e99\u0e84\u0ec8\u0eb2\u0ec3\u0eaa\u0ec8\u0e95\u0ecd\u0ec8\u0eb2\u0e81\u0ea7\u0ec8\u0eb2\u0eab\u0ea5\u0eb7\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0e81\u0eb1\u0e9a {1} -no_white_space_please=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e9a\u0ecd\u0ec8\u0ec3\u0eab\u0ec9\u0ea1\u0eb5\u0e9e\u0eb7\u0ec9\u0e99\u0e97\u0eb5\u0ec8\u0e82\u0eb2\u0ea7 -no_start_white_space_please=\u0ec0\u0e82\u0e94\u0e99\u0eb5\u0ec9\u0ec1\u0ea1\u0ec8\u0e99\u0e9a\u0ecd\u0ec8\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ec0\u0ea5\u0eb5\u0ec9\u0ea1\u0e95\u0ebb\u0ec9\u0e99\u0e94\u0ec9\u0ea7\u0e8d \u0e8d\u0eb0\u0eab\u0ea7\u0ec8\u0eb2\u0e87 -ZIP_code_must_be_in_the_range=\u0ea5\u0eb0\u0eab\u0eb1\u0e94 ZIP \u0e82\u0ead\u0e87\u0e97\u0ec8\u0eb2\u0e99\u0e88\u0eb0\u0e95\u0ec9\u0ead\u0e87\u0ea2\u0eb9\u0ec8\u0ec3\u0e99\u0ea5\u0eb0\u0eab\u0ea7\u0ec8\u0eb2\u0e87 902xx-xxxx \u0eab\u0eb2 905-xx-xxxx -please_enter_valid_time=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec0\u0ea7\u0ea5\u0eb2\u0ec3\u0eab\u0ec9\u0e96\u0eb7\u0e81\u0e95\u0ec9\u0ead\u0e87 \u0ec0\u0e8a\u0eb5\u0ec8\u0e87\u0e88\u0eb0\u0ea2\u0eb9\u0ec8\u0ea5\u0eb0\u0eab\u0ea7\u0ec8\u0eb2\u0e87 00:00 \u0ec2\u0ea1\u0e87 \u0eab\u0eb2 23:59 \u0ec2\u0ea1\u0e87 -please_enter_at_least_n_character=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ea2\u0ec8\u0eb2\u0e87\u0edc\u0ec9\u0ead\u0e8d {0} \u0ec2\u0e95\u0edc\u0eb1\u0e87\u0eaa\u0eb7 -this_date_can_not_be_after_today=\u0ea7\u0eb1\u0e99\u0e97\u0eb5\u0e99\u0eb5\u0ec9\u0e9a\u0ecd\u0ec8\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0e9e\u0eb2\u0e8d\u0eab\u0ea5\u0eb1\u0e87\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec4\u0e94\u0ec9 -password_must_contain_at_least_one_capital_letter_and_one_digit=\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99\u0ea2\u0ec8\u0eb2\u0e87\u0edc\u0ec9\u0ead\u0ebd\u0e88\u0eb0\u0e95\u0ec9\u0ead\u0e87\u0ea1\u0eb5\u0e95\u0ebb\u0ea7\u0edc\u0eb1\u0e87\u0eaa\u0eb7\u0e9e\u0eb5\u0ea1\u0ec3\u0eab\u0e8d\u0ec8 \u0ec1\u0ea5\u0eb0 \u0e99\u0eb7\u0ec8\u0e87\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81 -closedDate_should_be_greater_than_openDate=\u0ea1\u0eb7\u0ec9\u0e9b\u0eb4\u0e94\u0ea7\u0e82\u0eb0\u0ec1\u0edc\u0e87\u0e88\u0eb0\u0e95\u0ec9\u0ead\u0e87\u0ec3\u0eab\u0e8d\u0ec8\u0e81\u0ea7\u0ec8\u0eb2\u0ea1\u0eb7\u0ec9\u0ec0\u0e9b\u0eb5\u0e94 -unrecognized_coordinate_string=\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e97\u0eb5\u0ec8\u0e95\u0eb1\u0ec9\u0e87\u0e9a\u0ecd\u0ec8\u0e96\u0eb7\u0e81\u0eae\u0eb1\u0e9a\u0eae\u0eb9\u0ec9\u0ec4\u0e94\u0ec9 -please_enter_a_letters_or_digits=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1 \u0e95\u0ebb\u0ea7\u0edc\u0eb1\u0e87\u0eaa\u0eb7 \u0eab\u0ea5\u0eb7\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81 -please_enter_valid_integer=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81\u0e97\u0eb5\u0ec8\u0ec4\u0e94\u0ec9\u0ea2\u0eb1\u0ec9\u0e87\u0ea2\u0eb7\u0e99\u0ec1\u0ea5\u0ec9\u0ea7 -please_enter_valid_negative_integer=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81\u0e97\u0eb5\u0ec8\u0ea1\u0eb5\u0e9c\u0ebb\u0e99\u0ea5\u0ebb\u0e9a -please_select_dataset=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0e8a\u0eb8\u0e94\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -please_select_dataelement=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ead\u0ebb\u0e87\u0e9b\u0eb0\u0e81\u0ead\u0e9a\u0e82\u0ead\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -selected=\u0ec0\u0ea5\u0eb7\u0ead\u0e81 -waiting=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0ea5\u0ecd\u0e96\u0ec9\u0eb2 -select_at_level=\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ea5\u0eb0\u0e94\u0eb1\u0e9a\u0e82\u0eb1\u0ec9\u0e99 -unselect_children=\u0e8d\u0ebb\u0e81\u0ec0\u0ea5\u0eb5\u0e81\u0e81\u0eb2\u0e99\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ec0\u0e94\u0eb1\u0e81\u0e99\u0ec9\u0ead\u0ebd -organisation_unit_selection_tree=\u0e81\u0eb2\u0e99\u0e84\u0eb1\u0e94\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87\u0e9b\u0eb0\u0e95\u0eb4\u0e9a\u0eb1\u0e94 -go=\u0ec0\u0e94\u0eb5\u0e99\u0edc\u0eca\u0eb2\u0ec4\u0e9b -delete_success=\u0ea5\u0eb7\u0e9a\u0eab\u0ebb\u0ea7\u0e82\u0ecd\u0ec9\u0ead\u0ead\u0e81 -process=\u0e81\u0ecd\u0eb2\u0ea5\u0eb1\u0e87\u0e94\u0ecd\u0eb2\u0ec0\u0e99\u0eb5\u0e99\u0e81\u0eb2\u0e99 -code=\u0ea5\u0eb0\u0eab\u0eb1\u0e94 -description=\u0e81\u0eb2\u0e99\u200b\u0ead\u0eb0\u200b\u0e97\u0eb4\u200b\u0e8d\u0eb2\u0e8d\u200b -opening_date=\u0ea1\u0eb7\u0ec9\u0ec0\u0e9b\u0eb5\u0e94 -active=\u0e94\u0eb3\u0ec0\u0e99\u0eb5\u0e99\u0ea2\u0eb9\u0ec8 -type=\u0e8a\u0eb0\u0e99\u0eb4\u0e94 -on_time=\u0e97\u0eb1\u0e99\u0ec0\u0ea7\u0ea5\u0eb2 -indicator_groups=\u0e81\u0eb8\u0ec8\u0ea1\u0e95\u0ebb\u0ea7\u0e8a\u0eb5\u0ec9\u0ea7\u0eb1\u0e94 -left_expression=\u0e81\u0eb2\u0e99\u0eaa\u0eb0\u0ec1\u0e94\u0e87\u0e84\u0ecd\u0eb2\u0ec0\u0eab\u0eb1\u0e99\u0e9f\u0ec8\u0eb2\u0e8d\u0e8a\u0ec9\u0eb2\u0e8d -numerator_aggregation_operator=\u0e81\u0eb2\u0e99\u0e9a\u0ecd\u0ea5\u0eb4\u0eab\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e81\u0eb2\u0e99\u0eaa\u0eb1\u0e87\u0ea5\u0ea7\u0ea1\u0e95\u0ebb\u0ea7\u0e95\u0eb1\u0ec9\u0e87 -denominator_description=\u0e81\u0eb2\u0e99\u0e9e\u0eb1\u0e99\u0ea5\u0eb0\u0e99\u0eb2\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e95\u0ebb\u0ea7\u0eab\u0eb2\u0e99 -id_not_numeric=\u0e81\u0eb2\u0e99\u0e88\u0ecd\u0eb2\u0ec1\u0e99\u0e81\u0e97\u0eb5\u0ec8\u0e9a\u0ecd\u0ec8\u0ec1\u0ea1\u0ec8\u0e99\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81 -absolute=\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81\u0e97\u0eb5\u0ec8\u0e8d\u0eb1\u0e87\u0e9a\u0ecd\u0ec8\u0e97\u0eb1\u0e99\u0ec4\u0e94\u0ec9\u0e9b\u0eb8\u0e87\u0ec1\u0e95\u0ec8\u0e87 -statistical=\u0eaa\u0eb0\u0e96\u0eb4\u0e95\u0eb4 -left_side_of_expression=\u0e84\u0ecd\u0eb2\u0ec0\u0eab\u0eb1\u0e99\u0e82\u0ead\u0e87\u0e9d\u0ec8\u0ec8\u0eb2\u0e8d\u0e8a\u0ec9\u0eb2\u0e8d -equal_to_symbol=== -not_equal_to_symbol=!= -not_equal_to=!= -public_access=\u0e97\u0eb8\u0e81\u0e84\u0ebb\u0e99\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0ec0\u0e96\u0eb4\u0e87\u0ec4\u0e94\u0ec9 (\u0ec1\u0e95\u0ec8\u0e95\u0ec9\u0ead\u0e87 login) \u0e81\u0ec8\u0ead\u0e99 -read_only=\u0ead\u0ec8\u0eb2\u0e99\u0ec4\u0e94\u0ec9\u0ea2\u0ec8\u0eb2\u0e87\u0e94\u0ebd\u0ea7 -object_will_created_public=\u0eab\u0ebb\u0ea7\u0e82\u0ecd\u0ec9\u0e99\u0eb5\u0ec9\u0ec1\u0ea1\u0ec8\u0e99\u0e88\u0eb0\u0e96\u0eb7\u0e81\u0eaa\u0ec9\u0eb2\u0e87\u0e94\u0ec9\u0ea7\u0e8d\u0e81\u0eb2\u0e99\u0e81\u0ea7\u0e94\u0ec1\u0e81\u0ec9\u0e88\u0eb2\u0e81\u0eaa\u0eb2\u0e97\u0eb2\u0ea5\u0eb0\u0e99\u0eb0 -afghanistan=\u0ead\u0eb2\u0e9f\u0e81\u0eb2\u0e99\u0eb4\u0eaa\u0e96\u0eb2\u0e99 -burkina_faso=\u0ec0\u0e9a\u0eb5\u0e81\u0eb5\u0e99\u0eb2\u0e9f\u0eb2\u0ec2\u0e8a -ecowas=ECOWAS -ghana=Ghana -guinea_bissau=Guinea Bissau -haiti=\u0ec4\u0eae\u0e95\u0eb4 -india=\u0ead\u0eb4\u0e99\u0ec0\u0e94\u0e8d -lesotho=\u0ec0\u0ea5\u0ec2\u0e8a\u0ec2\u0e97 -mali=\u0ea1\u0eb2\u0ea5\u0eb5 -myanmar=\u0e9e\u0eb0\u0ea1\u0ec9\u0eb2 -peru=\u0ec0\u0e9b\u0ea3\u0eb9 -rwanda=\u0ea3\u0eb0\u0ea7\u0eb1\u0e99\u0e94\u0eb2 -zanzibar=\u0e8a\u0eb2\u0e99\u0e8a\u0eb5\u0e9a\u0eb2 -login_password=\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99: -login_username=\u0e8a\u0eb7\u0ec8\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9: -new_user_account_name=\u0e8a\u0eb7\u0ec8 -new_user_account_first_name=\u0e97\u0eb3\u0ead\u0eb4\u0e94 -go_back=\u0e81\u0eb1\u0e9a\u0e84\u0eb7\u0e99 -dhis-web-dataentry-national=\u0e9a\u0ec8\u0ead\u0e99\u0e9b\u0ec9\u0ead\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e82\u0ead\u0e87\u0ec1\u0e95\u0ec8\u0ea5\u0eb0\u0e84\u0ebb\u0e99 -dataelement=\u0ead\u0ebb\u0e87\u0e9b\u0eb0\u0e81\u0ead\u0e9a\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -month.march=\u0ea1\u0eb5\u0e99\u0eb2 -java_vendor=\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a Java -please_do_not_enter_same_values=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0ea2\u0ec8\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ea1\u0eb9\u0e99\u0e84\u0ec8\u0eb2\u0ec0\u0e94\u0eb5\u0ea1 -dhis-web-maintenance-datadictionary=\u0ead\u0ebb\u0e87\u0e9b\u0eb0\u0e81\u0ead\u0e9a\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 \u0ec1\u0ea5\u0eb0 \u0e95\u0ebb\u0ea7\u0e8a\u0eb5\u0ec9\u0ea7\u0eb1\u0e94 -dhis-web-maintenance-organisationunit=\u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e81\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87 -dhis-web-maintenance-appmanager=\u0e81\u0eb2\u0e99\u0e9a\u0ecd\u0ea5\u0eb4\u0eab\u0eb2\u0e99\u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e81\u0eb2\u0e99\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9 -ok=\u0e95\u0ebb\u0e81\u0ea5\u0ebb\u0e87 -format.OnChange.startDate=\u0e9b\u0eb5-\u0ec0\u0e94\u0eb7\u0ead\u0e99-\u0ea1\u0eb7\u0ec9 '- ' -ireport_description=\u0e81\u0eb2\u0e99\u0ead\u0ead\u0e81\u0ec1\u0e9a\u0e9a\u0e9a\u0ebb\u0e94\u0ea5\u0eb2\u0e8d\u0e87\u0eb2\u0e99\u0e97\u0eb5\u0ec8\u0ec0\u0e9b\u0eb1\u0e99\u0ea1\u0eb2\u0e94\u0e95\u0eb0\u0e96\u0eb2\u0e99\u0e9a\u0ebb\u0e94\u0ea5\u0eb2\u0e8d\u0e87\u0eb2\u0e99 -db_language=\u0e9e\u0eb2\u0eaa\u0eb2\u0e82\u0ead\u0e87\u0e96\u0eb2\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -please_enter_a_different_value_to_above=Please enter a different value to above. -move_up=\u0e8d\u0ec9\u0eb2\u0e8d\u0e82\u0eb6\u0ec9\u0e99 -greater_than_or_equal_to=>= -intro_dhis-web-light=Access a mobile device optimized version of data entry and analysis. -format.FinancialJuly.startDate=dd MMM yyyy 'to ' -dhis2=DHIS2 -FinancialJuly=\u0e87\u0ebb\u0e9a\u0e9b\u0eb0\u0ea1\u0eb2\u0e99\u0eaa\u0ebb\u0e81\u0e9b\u0eb5-\u0ec0\u0e94\u0eb7\u0ead\u0e99\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94 -format.SixMonthly.startDate=\u0ec0\u0e94\u0eb7\u0ead\u0e99 '\u0ec0\u0e96\u0eb4\u0e87 ' -translation_label_title=\u0eab\u0ebb\u0ea7\u0e82\u0ecd\u0ec9 -os_architecture=\u0e82\u0eb0\u0edc\u0eb2\u0e94\u0e82\u0ead\u0e87\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a -release_page=\u0edc\u0ec9\u0eb2\u0e99\u0eb5\u0ec9\u0ec1\u0ea1\u0ec8\u0e99\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0ec3\u0e94\u0ec9 online -please_enter_description=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0e81\u0eb2\u0e99\u0e9e\u0eb1\u0e99\u0ea5\u0eb0\u0e99\u0eb2\u0ec3\u0eaa\u0ec8 -delete_confirm=\u0e97\u0ec8\u0eb2\u0e99\u0e95\u0ec9\u0ead\u0e87\u0e81\u0eb2\u0e99\u0e88\u0eb0\u0ea5\u0eb7\u0e9a\u0e96\u0eb5\u0ec9\u0ea1\u0e9a\u0ecd\u0ec8? -no_page_specified=\u0e9a\u0ecd\u0ec8\u0ec4\u0e94\u0ec9\u0ea5\u0eb0\u0e9a\u0eb8\u0edc\u0ec9\u0eb2 -exception_explanation_text=\u0e82\u0ecd\u0ead\u0eb0\u0ec4\u0e9e \u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0ea1\u0eb5\u0e81\u0eb2\u0e99\u0e82\u0eb1\u0e94\u0e82\u0ec9\u0ead\u0e87. \u0e9b\u0ebb\u0e81\u0eb0\u0e95\u0eb4\u0ec1\u0ea5\u0ec9\u0ea7 \u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e9a\u0ecd\u0ec8\u0ea1\u0eb5 \u0ec1\u0e95\u0ec8\u0e97\u0ec8\u0eb2\u0e99\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0eaa\u0eb7\u0e9a\u0e95\u0ecd\u0ec8\u0e9b\u0eb0\u0e95\u0eb4\u0e9a\u0eb1\u0e94\u0e87\u0eb2\u0e99 \u0ec2\u0e94\u0e8d\u0e95\u0ec9\u0ead\u0e87\u0e81\u0eb1\u0e9a\u0e84\u0eb7\u0e99\u0ec4\u0e9b\u0e99\u0edc\u0ec9\u0eb2\u0e97\u0eb5\u0ec8\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2 -unknown_source=\u0e9a\u0ecd\u0ec8\u0eae\u0eb9\u0ec9\u0ec1\u0eab\u0ec8\u0ea5\u0e87\u0e97\u0eb5\u0ec8\u0ea1\u0eb2 -logged_in=\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0eaa\u0eb9\u0ec8\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a -access_denied_message=\u0e97\u0ec8\u0eb2\u0e99\u0e9a\u0ecd\u0ec8\u0ea1\u0eb5\u0eaa\u0eb4\u0e94\u0e97\u0eb5\u0ec8\u0e88\u0eb0\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0edc\u0ec9\u0eb2\u0e99\u0eb5\u0ec9 -create_access_denied_message=\u0e97\u0ec8\u0eb2\u0e99\u0e9a\u0ecd\u0ec8\u0ead\u0eb2\u0e99\u0eb8\u0e8d\u0eb2\u0e94\u0ec3\u0eab\u0ec9\u0e94\u0eb1\u0e94\u0ec1\u0e9b\u0e87 -update_access_denied_message=\u0e97\u0ec8\u0eb2\u0e99\u0e9a\u0ecd\u0ec8\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0e9b\u0ec8\u0ebd\u0e99\u0ec1\u0e9b\u0e87\u0eab\u0ebb\u0ea7\u0e82\u0ecd\u0ec9\u0e99\u0eb5\u0ec9 -main_menu=\u0ec0\u0ea1\u0e99\u0e8d\u0eb9\u0eab\u0ea5\u0eb1\u0e81 -services=\u0e9a\u0ecd\u0ea5\u0eb4\u0e81\u0eb2\u0e99 -dhis-web-maintenance-dataset=\u0e8a\u0eb8\u0e94\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -dhis-web-maintenance-dataadmin=\u0e9c\u0eb9\u0ec9\u0e9a\u0ecd\u0ea5\u0eb4\u0eab\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e81\u0eb2\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -dhis-web-caseentry=\u0e81\u0eb2\u0e99\u0e9a\u0eb1\u0e99\u0e97\u0eb6\u0e81\u0eaa\u0ec8\u0ea7\u0e99\u0e95\u0ebb\u0ea7 -dhis-web-validationrule=\u0e84\u0eb8\u0e99\u0e99\u0eb0\u0e9e\u0eb2\u0e9a\u0e82\u0ead\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -dhis-web-mapping=GIS -dhis-web-dashboard=\u0e9c\u0eb9\u0ec9\u0ea7\u0eb4\u0ec4\u0e88\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -dhis-web-spreadsheet-reporting=\u0e9a\u0ebb\u0e94\u0ea5\u0eb2\u0e8d\u0e87\u0eb2\u0e99\u0ec1\u0e9a\u0e9a\u0e95\u0eb2\u0e95\u0eb0\u0ea5\u0eb2\u0e87 -dhis-web-sms=SMS -dhis-web-maintenance-in=\u0e81\u0eb2\u0e99\u0e81\u0eb3\u0e99\u0ebb\u0e94\u0e84\u0ec8\u0eb2 -intro_dhis-web-maintenance-dataset=\u0ec0\u0e81\u0eb1\u0e9a\u0eae\u0eb1\u0e81\u0eaa\u0eb2\u0e8a\u0eb8\u0e94\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99, \u0e94\u0eb1\u0e94\u0e9b\u0eb1\u0e9a\u0ec1\u0e9a\u0e9a\u0e9f\u0ead\u0ea1, \u0ead\u0ebb\u0e87\u0e9b\u0eb0\u0e81\u0ead\u0e9a\u0e82\u0ead\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e97\u0eb5\u0ec8\u0ec0\u0e9b\u0eb1\u0e99 \u0eaa\u0ec8\u0ea7\u0e99 \u0ec1\u0ea5\u0eb0 \u0e9e\u0eb2\u0e81\u0e9a\u0eb1\u0e87\u0e84\u0eb1\u0e9a -intro_dhis-web-maintenance-settings=\u0eae\u0eb1\u0e81\u0eaa\u0eb2\u0e9c\u0eb9\u0ec9\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9 \u0ec1\u0ea5\u0eb0 \u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0e81\u0eb2\u0e99\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2\u0e97\u0eb5\u0ec8\u0e81\u0ec8\u0ebd\u0ea7\u0e82\u0ec9\u0ead\u0e87 \u0ec0\u0e9e\u0eb7\u0ec8\u0ead\u0e84\u0eb8\u0e99\u0ea5\u0eb1\u0e81\u0eaa\u0eb0\u0e99\u0eb0\u0ea1 \u0e81\u0eb2\u0e99\u0ec1\u0e88\u0ec9\u0e87\u0e81\u0eb2\u0e99 \u0ec1\u0ea5\u0eb0 \u0ead\u0eb7\u0ec8\u0e99\u0ec6\u0ead\u0eb5\u0e81 -intro_dhis-web-maintenance-patient=\u0eae\u0eb1\u0e81\u0eaa\u0eb2\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e9c\u0eb9\u0ec9\u0e97\u0eb5\u0ec8\u0ec4\u0e94\u0ec9\u0eae\u0eb1\u0e9a\u0e9c\u0ebb\u0e99\u0e9b\u0eb0\u0ec2\u0eab\u0e8d\u0e94 \u0ec1\u0ea5\u0eb0 \u0ec1\u0e9c\u0e99\u0e87\u0eb2\u0e99 \u0ea5\u0ea7\u0ea1\u0e97\u0eb1\u0e87 \u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0eaa\u0eb0\u0ec0\u0e9e\u0eb2\u0eb0\u0ead\u0eb7\u0ec8\u0e99\u0ec6\u0ead\u0eb5\u0e81 -intro_dhis-web-validationrule=\u0e81\u0eb2\u0e99\u0ea2\u0eb1\u0ec9\u0e87\u0ea2\u0eb7\u0e99 \u0ec1\u0ea5\u0eb0 \u0e81\u0eb2\u0e99\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0ec0\u0e96\u0eb4\u0e87\u0e84\u0eb8\u0e99\u0e99\u0eb0\u0e9e\u0eb2\u0e9a\u0e82\u0ead\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec2\u0e94\u0e8d\u0e99\u0ecd\u0eb2\u0ec3\u0e8a\u0ec9\u0ea1\u0eb2\u0e94\u0e95\u0eb0\u0e96\u0eb2\u0e99 \u0ec1\u0ea5\u0eb0 \u0eab\u0ea5\u0eb1\u0e81\u0e81\u0eb2\u0e99 -intro_dhis-web-reporting=\u0e81\u0eb2\u0e99\u0ea7\u0eb4\u0ec4\u0e88\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 \u0ec1\u0ea5\u0eb0 \u0ead\u0eb1\u0e94\u0e95\u0eb2\u0e81\u0eb2\u0e99\u0ea5\u0eb2\u0e8d\u0e87\u0eb2\u0e99 \u0ec2\u0e94\u0e8d\u0e99\u0ecd\u0eb2\u0ec3\u0e8a\u0ec9 \u0e81\u0eb2\u0e99\u0e81\u0ecd\u0eb2\u0e99\u0ebb\u0e94\u0e81\u0ec8\u0ead\u0e99\u0ea5\u0ec8\u0ea7\u0e87\u0edc\u0ec9\u0eb2 \u0ec1\u0ea5\u0eb0 \u0ec0\u0e84\u0eb7\u0ec8\u0ead\u0e87\u0ea1\u0eb7\u0e81\u0eb2\u0e99\u0ea5\u0eb2\u0e8d\u0e87\u0eb2\u0e99 -intro_dhis-web-pivot=\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0eaa\u0ec9\u0eb2\u0e87\u0e95\u0eb2\u0e95\u0eb0\u0ea5\u0eb2\u0e87\u0ec4\u0e94\u0ec9\u0e95\u0eb2\u0ea1\u0ec3\u0e88\u0e81\u0eb1\u0e9a\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e97\u0eb5\u0ec8\u0eaa\u0eb1\u0e87\u0ea5\u0ea7\u0ea1 \u0ec3\u0e94\u0ec9\u0ec3\u0e99\u0eab\u0ea5\u0eb2\u0e8d\u0eae\u0eb9\u0e9a\u0ec1\u0e9a\u0e9a -intro_dhis-web-sms=\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0eaa\u0ebb\u0ec8\u0e87 \u0e82\u0ecd\u0ec9\u0e84\u0ea7\u0eb2\u0ea1 SMS \u0ec0\u0e95\u0eb7\u0ec8\u0ead\u0e99 \u0ec1\u0ea5\u0eb0 \u0ec1\u0e88\u0ec9\u0e87\u0e81\u0eb2\u0e99\u0e95\u0ec8\u0eb2\u0e87\u0ec4\u0e94\u0ec9\u0e84\u0eb7\u0e81\u0eb1\u0e9a\u0ec2\u0e97\u0ea5\u0eb0\u0eaa\u0eb1\u0e9a \u0eab\u0eb7\u0ebc \u0e9b\u0eb0\u0e95\u0eb4\u0e97\u0eb4\u0e99\u0ec1\u0e88\u0ec9\u0e87\u0e81\u0eb4\u0e94\u0e88\u0eb0\u0e81\u0ecd\u0eb2\u0e95\u0ec8\u0eb2\u0e87\u0ec6\u0ec4\u0e94\u0ec9 -intro_web_api=\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0ec4\u0e9b\u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0ec3\u0e99 Web API \u0e9a\u0ec8\u0ead\u0e99\u0e97\u0eb5\u0ec8\u0e95\u0eb7\u0ec8\u0ea1\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 \u0e97\u0eb5\u0ec8\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ec1\u0ea5\u0e81\u0e9b\u0ec8\u0ebd\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e81\u0eb1\u0e9a\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0e84\u0ead\u0ea1\u0e9e\u0eb5\u0ea7\u0ec0\u0e95\u0eb5\u0ead\u0eb7\u0ec8\u0e99\u0ec6 -intro_about_dhis2=\u0ec0\u0ead\u0ebb\u0eb2\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0e99\u0eb5\u0ec9 \u0ec1\u0ea5\u0eb0 \u0e9a\u0eb1\u0e99\u0e96\u0eb2\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ead\u0eb7\u0ec8\u0e99\u0ec6\u0e82\u0ead\u0e87\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a -intro_account=\u0e9a\u0ecd\u0ea5\u0eb4\u0eab\u0eb2\u0e99 \u0e9a\u0eb1\u0e99\u0e8a\u0eb5\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 \u0ec0\u0e8a\u0eb5\u0ec8\u0e87\u0ea5\u0ea7\u0ea1\u0ea1\u0eb5 \u0e8a\u0eb7\u0ec8, \u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99, \u0e97\u0eb5\u0ec8\u0ea2\u0eb9\u0ec8 \u0ead\u0eb5\u0ec1\u0ea1\u0ea7 \u0ec1\u0ea5\u0eb0 \u0ec0\u0e9a\u0eb5\u0ec2\u0e97 \u0ec2\u0ea1\u0e9a\u0eb2\u0e8d -offline=\u0e9a\u0ecd\u0ec8\u0ea1\u0eb5\u0e81\u0eb2\u0e99\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8 -online=\u0ea1\u0eb5\u0e81\u0eb2\u0e99\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8 -online_notification=\u0e97\u0ec8\u0eb2\u0e99\u0ea2\u0eb9\u0ec8\u0ec3\u0e99\u0e81\u0eb2\u0e99\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec1\u0e99\u0e94 -sync_now=\u0e81\u0eb2\u0e99\u0eaa\u0ebb\u0ec8\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ead\u0ead\u0e81\u0eaa\u0eb9\u0ec8\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a -sync_failed=\u0e81\u0eb2\u0e99\u0eaa\u0ebb\u0ec8\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec4\u0e9b\u0eab\u0eb2\u0e96\u0eb2\u0e99\u0ec0\u0e81\u0eb1\u0e9a\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e9a\u0ecd\u0ec8\u0ec4\u0e94\u0ec9, \u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e9e\u0eb0\u0e8d\u0eb2\u0e8d\u0eb2\u0ea1\u0ead\u0eb5\u0e81\u0ec0\u0e97\u0eb7\u0ec8\u0ead\u0ec3\u0edd\u0ec8 -year=\u0e9b\u0eb5 -hide_details=\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0e87\u0ea5\u0eb2\u0e8d\u0ea5\u0eb0\u0ead\u0ebd\u0e94 -change_password=\u0e9b\u0ec8\u0ebd\u0e99\u0ec1\u0e9b\u0e87\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99 -show_menu=\u0eaa\u0eb0\u0ec1\u0e94\u0e87\u0ec3\u0eab\u0ec9\u0ec0\u0eab\u0eb1\u0e99\u0ec0\u0ea1\u0e99\u0e8d\u0eb9 -show_main_menu=\u0eaa\u0eb0\u0ec1\u0e94\u0e87\u0ec3\u0eab\u0ec9\u0ec0\u0eab\u0eb1\u0e99\u0ec0\u0ea1\u0e99\u0e8d\u0eb9\u0eab\u0ea5\u0eb1\u0e81 -view_home_page=\u0e81\u0eb1\u0e9a\u0e84\u0eb7\u0e99\u0ea1\u0eb2\u0eab\u0eb2\u0edc\u0ec9\u0eb2\u0e97\u0ecd\u0eb2\u0ead\u0eb4\u0e94 -view_intepretations=\u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0e81\u0eb2\u0e99\u0ec1\u0e9b -add_new=\u0ec0\u0e9e\u0eb5\u0ec9\u0ea1\u0ec3\u0eaa\u0ec8\u0ec3\u0edd\u0ec8 -remove=\u0ec0\u0ead\u0ebb\u0eb2\u0ead\u0ead\u0e81 -edit=\u0ec1\u0e81\u0ec9\u0ec4\u0e82 -close=\u0e9b\u0eb4\u0e94 -gender_female=~\u0ec0\u0e9e\u0e94\u0e8d\u0eb4\u0e87 -gender_other=\u0ead\u0eb7\u0ec8\u0e99\u0ec6 -mobile_phone=\u0ec2\u0e97\u0ea5\u0eb0\u0eaa\u0eb1\u0e9a\u0ea1\u0eb7\u0e96\u0eb7 -restore_account=\u0eae\u0ec9\u0ead\u0e87\u0e84\u0eb7\u0e99\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9a\u0eb1\u0e99\u0e8a\u0eb5 -account_recovery=\u0e9b\u0ebb\u0ea7\u0ec1\u0e9b\u0e87\u0e84\u0eb7\u0e99\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9a\u0eb1\u0e99\u0e8a\u0eb5 -recover=\u0e81\u0eb2\u0e99\u0e81\u0eb9\u0ec9\u0e84\u0eb7\u0e99 -code_from_email=\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e88\u0eb2\u0e81 email -password_hint=\u0ea2\u0ec8\u0eb2\u0e87\u0e95\u0ecd\u0ec8\u0eb2\u0ec3\u0eab\u0ec9\u0ea1\u0eb5 8 \u0e95\u0ebb\u0ea7\u0edc\u0eb1\u0e87\u0eaa\u0eb7, \u0ec3\u0e99\u0e99\u0eb1\u0e99 \u0ea1\u0eb5\u0ec2\u0e95\u0e99\u0eb7\u0ec8\u0e87\u0ec0\u0e9b\u0eb1\u0e99\u0ec2\u0e95\u0e9e\u0eb4\u0ea1\u0ec3\u0eab\u0e8d\u0ec8 \u0ec1\u0ea5\u0eb0 \u0ea1\u0eb5\u0ec2\u0e95\u0ec0\u0ea5\u0e81 1\u200b \u0ec2\u0e95 -object_not_deleted_associated_by_objects=\u0e9a\u0ecd\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ea5\u0eb7\u0e9a\u0e9f\u0eb2\u0e8d\u0e99\u0eb5\u0ec9\u0ec4\u0e94\u0ec9\u0ec0\u0e9e\u0eb2\u0eb0\u0e8d\u0eb1\u0e87\u0ec0\u0e9b\u0eb5\u0e94\u0ec3\u0e8a\u0ec9\u0ea2\u0eb9\u0ec8 -Weekly=\u0ec0\u0e9b\u0eb1\u0e99\u0ead\u0eb2\u0e97\u0eb4\u0e94 -BiMonthly=\u0e97\u0eb8\u0e81\u0ec6\u0eaa\u0ead\u0e87\u0ec0\u0e94\u0eb7\u0ead\u0e99 -Quarterly=\u0ec1\u0e95\u0ec8\u0ea5\u0eb0\u0ec4\u0e95\u0ebc\u0ea1\u0eb2\u0e94 -Relative=\u0ec4\u0e81\u0ec9\u0e84\u0ebd\u0e87 -FinancialApril=\u0e87\u0ebb\u0e9a\u0e9b\u0eb0\u0ea1\u0eb2\u0e99\u0e81\u0eb2\u0e99\u0ec0\u0e87\u0eb4\u0e99-\u0ec0\u0e94\u0eb7\u0ead\u0e99\u0ec0\u0ea1\u0eaa\u0eb2 -format.Daily.endDate= -format.TwoYearly.startDate=yyyy 'and ' -month.april=\u0ec0\u0ea1\u0eaa\u0eb2 -month.may=\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2 -month.november=\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2 -month.december=\u0e97\u0eb1\u0e99\u0ea7\u0eb2 -month.short.march=\u0ea1\u0eb5\u0e99\u0eb2 -month.short.june=\u0ea1\u0eb5\u0e96\u0eb8\u0e99\u0eb2 -month.short.november=\u0e9e\u0eb0\u0e88\u0eb4\u0e81 -month.short.december=\u0ec0\u0e94\u0eb7\u0ead\u0e99\u0e97\u0eb1\u0e99\u0ea7\u0eb2 -weekday.friday=\u0ea7\u0eb1\u0e99\u0eaa\u0eb8\u0e81 -weekday.saturday=\u0ea7\u0eb1\u0e99\u0ec0\u0eaa\u0ebb\u0eb2 -weekday.short.monday=\u0ea7\u0eb1\u0e99\u0e88\u0eb1\u0e99 -weekday.short.thursday=\u0ea7\u0eb1\u0e99\u0e9e\u0eb0\u0eab\u0eb1\u0e94 -weekday.short.friday=\u0ea7\u0eb1\u0e99\u0eaa\u0eb8\u0e81 -weekday.short.sunday=\u0ea7\u0eb1\u0e99\u0ead\u0eb2\u0e97\u0eb4\u0e94 -translation_addlocale=\u0e95\u0eb7\u0ec8\u0ea1\u0e97\u0eb5\u0ec8\u0e95\u0eb1\u0ec9\u0e87 -translation_select_ref=\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0eaa\u0eb7\u0ec8\u0e87\u0ead\u0ec9\u0eb2\u0e87\u0ead\u0eb5\u0e87 -translation_label_shortName=\u0e8a\u0eb7\u0ec8\u0eaa\u0eb1\u0ec9\u0e99 -translation_variant=\u0eab\u0ea5\u0eb2\u0e8d\u0ec1\u0e9a\u0e9a -translation_countrycode=\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9b\u0eb0\u0ec0\u0e97\u0e94 -translation_country_must_be_two_chars=\u0e9b\u0eb0\u0ec0\u0e97\u0e94\u0e88\u0eb0\u0e95\u0ec9\u0ead\u0e87\u0ea1\u0eb5\u0eaa\u0ead\u0e87\u0e95\u0ebb\u0ea7\u0ead\u0eb1\u0e81\u0eaa\u0ead\u0e99 -translation_variant_must_be_specified=\u0eae\u0eb9\u0e9a\u0ec1\u0e9a\u0e9a\u0e95\u0ec8\u0eb2\u0e87\u0ec6\u0e88\u0eb0\u0e95\u0ec9\u0ead\u0e87\u0ec4\u0e94\u0ec9\u0e81\u0ecd\u0eb2\u0e99\u0ebb\u0e94 -translation_duplicated_name_with=\u0e82\u0ecd\u0ead\u0eb0\u0ec4\u0e9e \u0e8a\u0eb7\u0ec8\u0e82\u0ead\u0e87\u0e97\u0ec8\u0eb2\u0e99\u0e97\u0eb5\u0ec8\u0e95\u0eb7\u0ec8\u0ea1\u0ec3\u0eaa\u0ec8\u0e8a\u0ecd\u0ec9\u0eb2\u0e8a\u0ec9\u0ead\u0e99\u0e81\u0eb1\u0e9a\u0e8a\u0eb7\u0ec8 -build_date=\u0ea7\u0eb1\u0e99\u0eaa\u0ec9\u0eb2\u0e87 -external_configuration_directory=\u0ec2\u0e84\u0e87\u0eaa\u0ec9\u0eb2\u0e87\u0e82\u0ead\u0e87\u0eae\u0eb9\u0e9a\u0ec1\u0e9a\u0e9a\u0e9e\u0eb2\u0e8d\u0e99\u0ead\u0e81 -database_user=\u0e96\u0eb2\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 -current_user=\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9\u0e9b\u0eb0\u0e88\u0eb8\u0e9a\u0eb1\u0e99 -system_status=\u0eaa\u0eb0\u0e9e\u0eb2\u0e9a\u0e82\u0ead\u0e87\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a -about_dhis2=\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a DHIS 2 -last_name=\u0e99\u0eb2\u0ea1\u0eaa\u0eb0\u0e81\u0eb8\u0e99 -unknown=\u0e9a\u0ecd\u0ec8\u0eae\u0eb9\u0ec9 -os_name=\u0e8a\u0eb7\u0ec8\u0e82\u0ead\u0e87\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0e9a\u0ecd\u0ea5\u0eb4\u0eab\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e81\u0eb2\u0e99 -chrome_description=web browser \u0e97\u0eb5\u0ec8\u0ea1\u0eb5\u0e84\u0ea7\u0eb2\u0ea1\u0ec4\u0ea7\u0eaa\u0eb9\u0e87 -web_browser=\u0eae\u0e87\u0e81\u0ec0\u0e9a\u0eb4\u0ec8\u0e87\u0e96\u0eb2\u0e99\u0ec0\u0e9a\u0eb4\u0ec8\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e97\u0eb5\u0ec8\u0ea1\u0eb5\u0e84\u0ea7\u0eb2\u0ea1\u0ec4\u0ea7\u0e8d\u0eb9\u0e87 -online_release_page=\u0edc\u0ec9\u0eb2\u0e97\u0eb5\u0ec8\u0eaa\u0ebb\u0ec8\u0e87\u0ead\u0ead\u0e81\u0ec4\u0e99\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec1\u0e99\u0e94 -edit_profile=\u0e94\u0eb1\u0e94\u0ec1\u0e81\u0ec9 \u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -view_profile=\u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -job_title=\u0e95\u0eb3\u0ec1\u0edc\u0ec8\u0e87 -introduction=\u0ec1\u0e99\u0eb0\u0e99\u0eb3 -employer=\u0e9c\u0eb9\u0ec9\u0e88\u0ec9\u0eb2\u0e87\u0e87\u0eb2\u0e99 -interests=\u0e9c\u0ebb\u0e99\u0e81\u0ecd\u0eb2\u0ec4\u0ea5 -settings=\u0e81\u0eb2\u0e99\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2 -user_settings=\u0e81\u0eb2\u0e99\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2\u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0e9c\u0eb9\u0ec9\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9 -message=\u0e82\u0ecd\u0ec9\u0e84\u0ea7\u0eb2\u0ea1 -language=\u0e9e\u0eb2\u0eaa\u0eb2\u0e97\u0eb5\u0ec8\u0ec4\u0e8a\u0ec9\u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0ec3\u0e8a\u0ec9\u0eaa\u0ebb\u0e99\u0e97\u0eb0\u0e99\u0eb2\u0ec1\u0ea5\u0e81\u0e9b\u0ec8\u0ebd\u0e99 -use_db_locale_no_translation=\u0ec3\u0e8a\u0ec9\u0e96\u0eb2\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec3\u0e99\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0e82\u0ead\u0e87\u0ea1\u0eb1\u0e99 \u0e9a\u0ecd\u0ec8\u0ea1\u0eb5\u0e81\u0eb2\u0e99\u0ec1\u0e9b -messages=\u0e82\u0ecd\u0ec9\u0e84\u0ea7\u0eb2\u0ea1 -server_memory=\u0e96\u0eb2\u0e99\u0e84\u0ea7\u0eb2\u0ea1\u0e88\u0ecd\u0eb2 -please_select=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0ec0\u0ea5\u0eb7\u0ead\u0e81 -release=\u0ec0\u0ea5\u0eb7\u0ead\u0e81 -false=No -text=\u0e82\u0ecd\u0ec9\u0e84\u0ea7\u0eb2\u0ea1 -number=\u0e88\u0eb3\u0e99\u0ea7\u0e99 -retype_new_password=\u0e9e\u0eb4\u0ea1\u0e84\u0eb7\u0e99\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99 -email=\u0ead\u0eb5\u0ec0\u0ea1\u0ea5 -user_roles=\u0edc\u0ec9\u0eb2\u0e97\u0eb5\u0ec8\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 -update_user_success=\u0e9a\u0eb1\u0e99\u0e8a\u0eb5\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9\u0e9a\u0ecd\u0ec8\u0ec4\u0e94\u0ec9\u0e9b\u0eb1\u0e9a\u0e9b\u0eb8\u0e87\u0ec0\u0e97\u0eb7\u0ec8\u0ead -please_wait_while_the_system_is_processing=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0ea5\u0ecd\u0e96\u0ec9\u0eb2\u0e81\u0ecd\u0eb2\u0ea5\u0eb1\u0e87\u0e94\u0ecd\u0eb2\u0ec0\u0e99\u0eb5\u0e99\u0e81\u0eb2\u0e99 -contact_details=\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec0\u0e9e\u0eb7\u0ec8\u0ead\u0e81\u0eb2\u0e99\u0e95\u0eb4\u0e94\u0e95\u0ecd\u0ec8\u0e9e\u0ebb\u0ea7\u0e9e\u0eb1\u0e99 -please_enter_a_valid_date_iso=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ea7\u0eb1\u0e99\u0e97\u0eb5\u0ec8\u0ec3\u0eab\u0ec9\u0e96\u0eb7\u0e81\u0e95\u0ec9\u0ead\u0e87 (\u0e95\u0ebb\u0ea7\u0ea2\u0ec8\u0eb2\u0e87: 1990-01-01) -please_enter_a_valid_digits=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ec3\u0eaa\u0ec8\u0ec1\u0e95\u0ec8\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81 -please_enter_a_value_with_a_valid_expression=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ea1\u0eb9\u0e99\u0e84\u0ec8\u0eb2\u0e94\u0ec9\u0ea7\u0e8d\u0e81\u0eb2\u0e99\u0e82\u0eb0\u0eab\u0e8d\u0eb2\u0e8d -first_character_must_be_alphabetical=\u0e95\u0ebb\u0ea7\u0e97\u0ecd\u0eb2\u0ead\u0eb4\u0e94\u0e88\u0eb0\u0e95\u0ec9\u0ead\u0e87\u0ec1\u0ea1\u0ec8\u0e99\u0e95\u0ebb\u0ea7\u0edc\u0eb1\u0e87\u0eaa\u0eb7 -please_enter_no_more_than_n_character=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ec3\u0eaa\u0ec8\u0e9a\u0ecd\u0ec8\u0ec3\u0eab\u0ec8\u0ec9\u0e81\u0eb2\u0e8d (0) \u0e95\u0ebb\u0ea7 -please_enter_a_value_between_n_character=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ea1\u0eb9\u0e99\u0e84\u0ec8\u0eb2\u0ec3\u0eaa\u0ec8 \u0ea5\u0eb0\u0eab\u0ea7\u0ec8\u0eb2\u0e87 (0) \u0ec1\u0ea5\u0eb0 (1) \u0ec0\u0e9b\u0eb1\u0e99\u0e95\u0ebb\u0ea7\u0edc\u0eb1\u0e87\u0eaa\u0eb7\u0e8d\u0eb2\u0ea7 -please_enter_a_value_less_than_or_equal_to_n=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ea1\u0eb9\u0e99\u0e84\u0ec8\u0eb2\u0ec3\u0eaa\u0ec8 \u0e95\u0ecd\u0ec8\u0eb2\u0e81\u0ea7\u0ec8\u0eb2\u0eab\u0ea5\u0eb7 \u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0e81\u0eb1\u0e9a (0) -letters_or_punctuation_only_please=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ec3\u0eaa\u0ec8\u0ec1\u0e95\u0ec8\u0ec2\u0e95\u0edc\u0eb1\u0e87\u0eaa\u0eb7 \u0eab\u0ea5\u0eb7 \u0e88\u0ecd\u0ec9\u0eb2, \u0e88\u0eb8\u0e94 \u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0e99\u0eb1\u0ec9\u0e99 -please_enter_at_least_n_words=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ec3\u0eaa\u0ec8\u0ea2\u0ec8\u0eb2\u0e87\u0e95\u0ecd\u0ec8\u0eb2 (0) \u0e84\u0ecd\u0eb2 -available=\u0eab\u0eb2\u0ec4\u0e94\u0ec9 -select_in_group=\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb8\u0ec8\u0ea1 -move_selected=\u0e8d\u0ec9\u0eb2\u0e8d\u0e81\u0eb2\u0e99\u0ec0\u0ea5\u0eb7\u0ead\u0e81 -remove_selected=\u0ec0\u0ead\u0ebb\u0eb2\u0ead\u0eb1\u0e99\u0e97\u0eb5\u0ec8\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ec4\u0ea7\u0ec9\u0e99\u0eb1\u0ec9\u0e99\u0ead\u0ead\u0e81 -move_down=\u0e8d\u0ec9\u0eb2\u0e8d\u0ea5\u0ebb\u0e87 -move_to_bottom=\u0e8d\u0ec9\u0eb2\u0e8d\u0ea5\u0ebb\u0e87\u0ec4\u0e9b\u0ea5\u0eb8\u0ec8\u0ea1 -no_of_pages=\u0e88\u0ecd\u0eb2\u0e99\u0ea7\u0e99\u0e82\u0ead\u0e87\u0edc\u0ec9\u0eb2\u0ec0\u0e88\u0ebb\u0ec9\u0eb1\u0ec9\u0ebd -filter=\u0e95\u0ebb\u0ea7\u0e81\u0ead\u0e87 -clear=\u0e88\u0eb0\u0ec1\u0e88\u0ec9\u0e87\u0edd\u0ebb\u0e94\u0ec1\u0ea5\u0ec9\u0ea7 -find=\u0e8a\u0ead\u0e81\u0eab\u0eb2 -name=\u0e8a\u0eb7\u0ec8 -target=\u0ec0\u0e9b\u0ebb\u0ec9\u0eb2\u0edd\u0eb2\u0e8d -data_sets=\u0e8a\u0eb8\u0e94\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -data_element_concepts=\u0ec1\u0e99\u0ea7\u0e84\u0ea7\u0eb2\u0ea1\u0e84\u0eb4\u0e94\u0e82\u0ead\u0e87\u0ead\u0ebb\u0e87\u0e9b\u0eb0\u0e81\u0ead\u0e9a\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -organisation_units=\u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e81\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87 -validation_rules=\u0eab\u0ea5\u0eb1\u0e81\u0e81\u0eb2\u0e99\u0e81\u0eb2\u0e99\u0ea2\u0eb1\u0ec9\u0e87\u0ea2\u0eb7\u0e99 -indicator_type=\u0e9b\u0eb0\u0ec0\u0e9e\u0e94\u0e95\u0ebb\u0ea7\u0e8a\u0eb5\u0ec9\u0ea7\u0eb1\u0e94 -aggregation_operator=\u0e81\u0eb2\u0e99\u0e9b\u0eb0\u0e95\u0eb4\u0e9a\u0eb1\u0e94\u0e87\u0eb2\u0e99\u0e81\u0eb2\u0e99\u0eaa\u0eb1\u0e87\u0ea5\u0ea7\u0ea1 -numerator_formula=\u0eaa\u0eb9\u0e94\u0e82\u0ead\u0e87\u0e95\u0ebb\u0ea7\u0e95\u0eb1\u0ec9\u0e87 -numerator_description=\u0e9e\u0eb1\u0e99\u0ea5\u0eb0\u0e99\u0eb2\u0ec0\u0e96\u0eb4\u0e87\u0e95\u0ebb\u0ea7\u0e95\u0eb1\u0ec9\u0e87 -expression_is_empty=\u0e9a\u0ecd\u0ec8\u0ea1\u0eb5\u0e81\u0eb2\u0e99\u0eaa\u0eb0\u0ec1\u0e94\u0e87\u0ead\u0ead\u0e81 -data_element_does_not_exist=\u0e9a\u0ecd\u0ec8\u0ea1\u0eb5\u0ead\u0ebb\u0e87\u0e9b\u0eb0\u0e81\u0ead\u0e9a\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -right_side_description=\u0e81\u0eb2\u0e99\u0e9e\u0eb1\u0e99\u0ea5\u0eb0\u0e99\u0eb2\u0e82\u0ead\u0e87\u0e9d\u0ec8\u0eb2\u0e8d\u0e82\u0ea7\u0eb2 -less_than_or_equal_to_symbol=<= -greater_than=> -constants=\u0e84\u0ec8\u0eb2\u0e84\u0ebb\u0e87\u0e97\u0eb5\u0ec8 -external_access=\u0e81\u0eb2\u0e99\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0ec0\u0e96\u0eb4\u0e87\u0e88\u0eb2\u0e81\u0e9e\u0eb2\u0e8d\u0e99\u0ead\u0e81(\u0ec2\u0e94\u0e8d\u0e9a\u0ecd\u0ec8\u0ec4\u0e94\u0ec9 login -ajax_login_failed=Login \u0e9a\u0ecd\u0ec8\u0ec4\u0e94\u0ec9 \u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2 \u0e81\u0ea7\u0e94\u0e84\u0eb7\u0e99\u0ec0\u0e9a\u0eb7\u0ec8\u0e87\u0e8a\u0eb7\u0ec8\u0e9c\u0eb9\u0ec9\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9 \u0ec1\u0ea5\u0eb0 \u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99 \u0ec1\u0ea5\u0ec9\u0ea7 \u0e9e\u0eb0\u0e8d\u0eb2\u0e8d\u0eb2\u0ea1\u0ead\u0eb5\u0e81\u0ec0\u0e97\u0eb7\u0ec8\u0ead -no_access=\u0e9a\u0ecd\u0ec8\u0ea1\u0eb5 -search_for_user_groups=\u0e84\u0ebb\u0ec9\u0e99\u0eab\u0eb2\u0e9c\u0eb9\u0ec9\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9\u0e97\u0eb5\u0ec8\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb8\u0ec8\u0ea1 -akros=Akros -benin=\u0ec0\u0e9a\u0e99\u0eb5\u0e99 -botswana=\u0e9a\u0ead\u0eaa\u0ea7\u0eb2\u0e99\u0eb2 -colombia=\u0ec2\u0e84\u0ea5\u0eb5\u0ea1\u0ec0\u0e9a\u0e8d -congo_brazzaville=\u0eaa\u0eb2\u0e97\u0eb2\u0ea5\u0eb0\u0e99\u0eb0\u0ea5\u0eb1\u0e94\u0e81\u0ebb\u0e87\u0ec2\u0e81 -east_africa_community=\u0e8a\u0eb8\u0ea1\u0e8a\u0ebb\u0e99\u0ead\u0e9f\u0eae\u0eb4\u0e81\u0e81\u0eb2\u0e95\u0eb2\u0ec0\u0ea7\u0eb1\u0e99\u0ead\u0ead\u0e81\u0e8a\u0ebd\u0e87\u0ec4\u0e95\u0ec9 -ecuador=\u0ec0\u0ead\u0e84\u0ebb\u0ea7\u0e94\u0ecd -global_fund=\u0e81\u0ead\u0e87\u0e97\u0eb6\u0e99\u0ec2\u0ea5\u0e81 -guinea=Guinea -irc=\u0e84\u0eb0\u0e99\u0eb0\u0e81\u0ecd\u0eb2\u0ea1\u0eb0\u0e81\u0eb2\u0e99\u0e8a\u0ec8\u0ea7\u0e8d\u0ec1\u0e81\u0ec9\u0ec4\u0e82\u0eaa\u0eb2\u0e81\u0ebb\u0e99 -liberia=\u0ea5\u0eb5\u0ec0\u0e9a\u0eb5\u0ec0\u0ea3\u0e8d -namibia=\u0e99\u0eb2\u0ea1\u0eb5\u0ec0\u0e9a\u0e8d -nepal=\u0ec0\u0e99\u0e9b\u0eb2\u0e99 -niger=\u0ec4\u0e99\u0ec0\u0e81\u0eb5 -nigeria=\u0ec4\u0e99\u0e88\u0eb5\u0ec0\u0ea3\u0e8d -norway=\u0e99\u0ecd\u0ec0\u0ea7 -pepfar=PEPFAR -philippines=\u0e9f\u0eb5\u0ea5\u0eb4\u0e9a\u0e9b\u0eb4\u0e99 -senegal=Senegal -sierra_leone=Sierra Leone -south_africa_department_of_health=South Africa Department of Health -swaziland=\u0eaa\u0eb0\u0ea7\u0eb2\u0e8a\u0eb5\u0ec1\u0ea5\u0e99 -uganda=\u0ead\u0eb9\u0e81\u0eb2\u0e99\u0e94\u0eb2 -zambia=Zambia -forgot_password=\u0ea5\u0eb7\u0ea1\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99 -wrong_username_or_password=\u0e97\u0eb1\u0e87\u0e8a\u0eb7\u0ec8\u0e9c\u0eb9\u0ec9\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9 \u0ec1\u0ea5\u0eb0 \u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99\u0e9a\u0ecd\u0ec8\u0e96\u0eb7\u0e81\u0e95\u0ec9\u0ead\u0e87 -recover_success_message=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e81\u0ea7\u0e94\u0e81\u0eb2\u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0e9a\u0eb1\u0e99\u0e8a\u0eb5\u0e9c\u0eb9\u0ec9\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9 email \u0e97\u0eb5\u0ec8\u0ec4\u0e94\u0ec9\u0ea5\u0ebb\u0e87\u0e97\u0eb0\u0e9a\u0ebd\u0e99\u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0e8a\u0eb7\u0ec8\u0e99\u0eb5\u0ec9. \u0e9e\u0ea7\u0e81\u0ec0\u0eae\u0ebb\u0eb2\u0ec4\u0e94\u0ec9\u0eaa\u0ebb\u0ec8\u0e87\u0e82\u0ecd\u0ec9\u0ec1\u0e99\u0eb0\u0e99\u0ecd\u0eb2\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0ea7\u0eb4\u0e97\u0eb5\u0eae\u0ebd\u0e81\u0e84\u0eb7\u0e99\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99 -recover_error_message=\u0e82\u0ecd\u0ec2\u0e97\u0e94\u0e9e\u0ea7\u0e81\u0ec0\u0eae\u0ebb\u0eb2\u0e9a\u0ecd\u0ec8\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0eae\u0ebd\u0e81\u0e84\u0eb7\u0e99\u0e9a\u0eb1\u0e99\u0e8a\u0eb5\u0e82\u0ead\u0e87\u0e97\u0ec8\u0eb2\u0e99\u0ec4\u0e94\u0ec9. \u0e8a\u0eb7\u0ec8\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9\u0ead\u0eb2\u0e94\u0e88\u0eb0\u0e9a\u0ecd\u0ec8\u0e96\u0eb7\u0e81\u0e95\u0ec9\u0ead\u0e87, \u0e9a\u0eb1\u0e99\u0e8a\u0eb5\u0e82\u0ead\u0e87\u0e97\u0ec8\u0eb2\u0e99\u0ead\u0eb2\u0e94\u0e88\u0eb0\u0e9a\u0ecd\u0ec8\u0ead\u0eb2\u0e99\u0eb8\u0e8d\u0eb2\u0e94\u0ec3\u0eab\u0ec9\u0eae\u0ebd\u0e81\u0e84\u0eb7\u0e99 \u0eab\u0ea5\u0eb7 \u0e81\u0eb2\u0e99\u0e95\u0eb7\u0ec8\u0ea1 \u0e97\u0eb5\u0ec8\u0ea2\u0eb9\u0ec8 emai \u0e9a\u0ecd\u0ec8\u0e96\u0eb7\u0e81\u0e95\u0eb2\u0ea1\u0e9a\u0eb1\u0e99\u0e8a\u0eb5\u0e82\u0ead\u0e87\u0e97\u0ec8\u0eb2\u0e99 -offline_notification=\u0e97\u0ec8\u0eb2\u0e99\u0e9a\u0ecd\u0ec8\u0ec4\u0e94\u0ec9\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec1\u0e99\u0e94 \u0eaa\u0eb0\u0e99\u0eb1\u0ec9\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec1\u0ea1\u0ec8\u0e99\u0ec4\u0e94\u0ec9\u0eae\u0eb1\u0e81\u0eaa\u0eb2\u0ec3\u0ea7\u0ec9\u0ea2\u0eb9\u0ec8\u0e84\u0ead\u0ea1\u0e9e\u0eb5\u0ea7\u0ec0\u0e95\u0eb5\u0edc\u0ec8\u0ea7\u0e99\u0e99\u0eb5\u0ec9 -format.OnChange.endDate=\u0e9b\u0eb5-\u0ec0\u0e94\u0eb7\u0ead\u0e99-\u0ea1\u0eb7\u0ec9 -translation_translate=\u0ec1\u0e9b -light_blue=\u0eaa\u0eb5\u0e9f\u0ec9\u0eb2\u0ead\u0ec8\u0ead\u0e99 -yes=\u0ec1\u0ea1\u0ec8\u0e99 -dhis-web-maintenance-mobile=\u0e81\u0eb2\u0e99\u0e81\u0ecd\u0eb2\u0e99\u0ebb\u0e94\u0e84\u0ec8\u0eb2\u0ec0\u0e84\u0eb7\u0ec8\u0ead\u0e99\u0e97\u0eb5\u0ec8 -true=Yes -district_health_information_software=\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e82\u0ec8\u0eb2\u0ea7\u0eaa\u0eb2\u0e99\u0eaa\u0eb2\u0e97\u0eb2\u0ea5\u0eb0\u0e99\u0eb0\u0eaa\u0eb8\u0e81\u0ec0\u0ea1\u0eb7\u0ead\u0e87 2 -rename=\u0e9b\u0ec8\u0ebd\u0e99\u0e8a\u0eb7\u0ec8 -format.Weekly.endDate= -enable_message_sms_notifications=\u0e82\u0ecd\u0ec9\u0e84\u0ea7\u0eb2\u0ea1 \u0ec1\u0ea1\u0ec8\u0e99\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0eaa\u0ebb\u0ec8\u0e87\u0e9c\u0ec8\u0eb2\u0e99 SMS \u0ec4\u0e94\u0ec9 -please_letters_numbers_spaces_or_some_special_chars_only=Only letters, numbers, spaces and the characters -.,-,(,)=\u0ec1\u0ea1\u0ec8\u0e99\u0ead\u0eb2\u0e99\u0eb8\u0e8d\u0eb2\u0e94\u0ec3\u0eab\u0ec9 -error=\u0e9c\u0eb4\u0e94\u0e9e\u0eb2\u0e94 -locate_by_code=\u0ec3\u0eaa\u0ec8\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0ec2\u0e84\u0e94\u0ec3\u0ea7\u0ec9 -annualized=\u0ec0\u0e9b\u0eb1\u0e99\u0ec1\u0e95\u0ec8\u0ea5\u0eb0\u0e9b\u0eb5 -kenya=\u0ec0\u0e84\u0e99\u0ea2\u0eb2 -timor_leste=\u0e95\u0eb5\u0ea1\u0ecd\u0ec0\u0ea5\u0eb1\u0e94\u0eaa\u0eb0\u0ec0\u0e95 -move=\u0e8d\u0ec9\u0eb2\u0e8d -format.Quarterly.endDate=MMM yyyy -user_general_settings=\u0e81\u0eb2\u0e99\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2\u0ec2\u0e94\u0e8d\u0e97\u0ebb\u0ec8\u0ea7\u0ec4\u0e9b\u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0e9c\u0eb9\u0ec9\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9 -period_type=\u0e9b\u0eb0\u0ec0\u0e9e\u0e94\u0e82\u0ead\u0e87\u0ec4\u0ea5\u0e8d\u0eb0\u0ec0\u0ea7\u0ea5\u0eb2 -less_than=\u0edc\u0ec9\u0ead\u0e8d\u0e81\u0ea7\u0ec8\u0eb2 -an_exception_occured=\u0ec0\u0e81\u0eb5\u0e94\u0e82\u0eb7\u0ec9\u0e99\u0ec2\u0e94\u0e8d\u0e9a\u0eb1\u0e87\u0ec0\u0ead\u0eb5\u0e99 -caused_by=\u0e94\u0ec9\u0ea7\u0e8d\u0ec0\u0eab\u0e94 -about=\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a -access_denied=\u0e81\u0eb2\u0e99\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0eaa\u0eb9\u0ec8\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0e96\u0eb7\u0e81\u0e9b\u0eb0\u0e95\u0eb4\u0ec0\u0eaa\u0e94 -read_access_denied_message=\u0e97\u0ec8\u0eb2\u0e99\u0e9a\u0ecd\u0ec8\u0ea1\u0eb5\u0eaa\u0eb4\u0e94\u0e97\u0eb5\u0ec8\u0e88\u0eb0\u0ead\u0ec8\u0eb2\u0e99\u0eab\u0ebb\u0ea7\u0e82\u0ecd\u0ec9\u0e99\u0eb5\u0ec9 -maintenance=\u0e81\u0eb2\u0e99\u0e9a\u0ebb\u0ea7\u0ea5\u0eb0\u0e9a\u0eb1\u0e94\u0eae\u0eb1\u0e81\u0eaa\u0eb2 -specify_organisationunit=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e81\u0ecd\u0eb2\u0e99\u0ebb\u0e94\u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e81\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87\u0e9b\u0eb0\u0e95\u0eb4\u0e9a\u0eb1\u0e94 -cannot_clear_selected_orgunits=\u0e9a\u0ecd\u0ec8\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ea5\u0eb7\u0e9a\u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e81\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87 -dhis-web-dataentry=\u0e81\u0eb2\u0e99\u0e9b\u0ec9\u0ead\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -dhis-web-reporting=\u0ea5\u0eb2\u0e8d\u200b\u0e87\u0eb2\u0e99\u200b -dhis-web-visualizer=\u0e81\u0eb2\u0e99\u0eaa\u0ec9\u0eb2\u0e87\u0eae\u0eb9\u0e9a\u0e9e\u0eb2\u0e9a\u0e88\u0eb2\u0e81\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -dhis-web-pivot=\u0e95\u0eb2\u0e95\u0eb0\u0ea5\u0eb2\u0e87\u0eaa\u0eb0\u0ec1\u0e94\u0e87\u0e9c\u0ebb\u0e99 -dhis-web-reports=\u0e9a\u0ebb\u0e94\u0ea5\u0eb2\u0e8d\u0e87\u0eb2\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -intro_dhis-web-maintenance-datadictionary=\u0eae\u0eb1\u0e81\u0eaa\u0eb2\u0ead\u0ebb\u0e87\u0e9b\u0eb0\u0e81\u0ead\u0e9a\u0e82\u0ead\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99, \u0e94\u0eb1\u0e94\u0eaa\u0eb0\u0e99\u0eb5\u0edd\u0eb2\u0e8d, \u0ea7\u0eb1\u0e94\u0e88\u0eb0\u0e99\u0eb2\u0e99\u0eb8\u0e81\u0ebb\u0ea1\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99, \u0e9b\u0eb0\u0ec0\u0e9e\u0e94 \u0ec1\u0ea5\u0eb0 \u0e81\u0eb8\u0ec8\u0ea1 -intro_dhis-web-maintenance-dataadmin=\u0e95\u0eb2\u0e95\u0eb0\u0ea5\u0eb2\u0e87\u0eab\u0ea5\u0eb1\u0e81\u0e82\u0ead\u0e87\u0ec1\u0eab\u0ea5\u0ec8\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99, \u0e81\u0ea7\u0e94\u0e81\u0eb2\u0e84\u0ea7\u0eb2\u0ea1\u0edc\u0ec9\u0eb2\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0e96\u0eb7\u0e82\u0ead\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99, \u0ec0\u0e9a\u0eb5\u0ec8\u0e87 \u0eaa\u0eb0\u0e96\u0eb4\u0e95\u0eb4 \u0ec1\u0ea5\u0eb0 \u0ead\u0eb7\u0ec8\u0e99\u0ec6\u0ead\u0eb5\u0e81 -intro_dhis-web-maintenance-mobile=\u0eae\u0eb1\u0e81\u0eaa\u0eb2\u0e8a\u0eb8\u0e94\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 \u0ea5\u0ea7\u0ea1\u0e97\u0eb1\u0e87\u0e81\u0eb2\u0e99\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2 \u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0e81\u0eb2\u0e99\u0ea5\u0eb2\u0e8d\u0e87\u0eb2\u0e99\u0ec1\u0e9a\u0e9a\u0ec0\u0e84\u0eb7\u0ec8\u0ead\u0e99\u0e97\u0eb5\u0ec8 \u0ec1\u0ea5\u0eb0 \u0ec1\u0e9a\u0e9a SMS -intro_dhis-web-importexport=\u0e81\u0eb2\u0e99\u0ec2\u0ead\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec0\u0e82\u0ebb\u0ec9\u0eb2 \u0ec1\u0ea5\u0eb0 \u0ead\u0ead\u0e81\u0e88\u0eb2\u0e81 DHIS \u0eab\u0ea5\u0eb7 \u0e9e\u0eb2\u0e81\u0eaa\u0ec8\u0ea7\u0e99\u0ead\u0eb7\u0ec8\u0e99 \u0ead\u0eb5\u0e87\u0e95\u0eb2\u0ea1\u0eae\u0eb9\u0e9a\u0ec1\u0e9a\u0e9a\u0e95\u0ec8\u0eb2\u0e87\u0ec6 -intro_dhis-web-visualizer=\u0eaa\u0ec9\u0eb2\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec3\u0eab\u0ec9\u0ec0\u0e9b\u0eb1\u0e99\u0eae\u0eb9\u0e9a\u0e9e\u0eb2\u0e8d \u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0ead\u0ebb\u0e87\u0e9b\u0eb0\u0e81\u0ead\u0e9a\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 \u0ec1\u0ea5\u0eb0 \u0e94\u0eb1\u0e94\u0eaa\u0eb0\u0e99\u0eb5\u0edd\u0eb2\u0e8d -intro_dhis-web-spreadsheet-reporting=\u0eaa\u0ec9\u0eb2\u0e87 \u0ec1\u0ea5\u0eb0 \u0e99\u0ecd\u0eb2\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0e96\u0eb2\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e9a\u0ebb\u0e99\u0e9e\u0eb7\u0ec9\u0e99\u0e96\u0eb2\u0e99\u0e81\u0eb2\u0e99\u0e81\u0ecd\u0eb2\u0e99\u0ebb\u0e94\u0e81\u0ec8\u0ead\u0e99 \u0e95\u0eb2\u0e95\u0eb0\u0ea5\u0eb2\u0e87 Excel -intro_supportive_software=\u0e97\u0ec8\u0eb2\u0e99\u0e88\u0eb0\u0ec0\u0eab\u0eb1\u0e99\u0e9e\u0eb2\u0e9a\u0ea5\u0ea7\u0ea1\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e9c\u0ebb\u0e99\u0e9b\u0eb0\u0ec2\u0eab\u0e8d\u0e94\u0e82\u0ead\u0e87 software \u0e99\u0eb5\u0ec9 \u0ec0\u0e8a\u0eb1\u0ec8\u0e99\u0e97\u0ec8\u0eb2\u0e99\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ead\u0ead\u0e81\u0ec1\u0e9a\u0e9a\u0e9a\u0ebb\u0e94\u0ea5\u0eb2\u0e8d\u0e87\u0eb2\u0e99\u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0e9b\u0eb0\u0e8a\u0eb2\u0e81\u0ead\u0e99\u0ec0\u0e84\u0eb7\u0ec8\u0ead\u0e99\u0e97\u0eb5\u0ec8 -intro_system_overview=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e81\u0eb1\u0e9a\u0ec4\u0e9b\u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0edc\u0ec9\u0eb2\u0e9e\u0eb2\u0e9a\u0ea5\u0ea7\u0ea1\u0e82\u0ead\u0e87\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a \u0ec0\u0e9e\u0eb7\u0ec8\u0ead\u0e88\u0eb0 \u0eaa\u0eb2\u0ea1\u0eb2\u0e94 \u0eaa\u0ecd\u0eb2\u0ec0\u0ea5\u0eb1\u0e94\u0e97\u0eb8\u0e81 \u0ec2\u0ea1\u0e94\u0eb9\u0e99 -intro_settings=\u0e95\u0eb1\u0ec9\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0eaa\u0ec8\u0ea7\u0e99\u0e95\u0ebb\u0ea7 \u0ec0\u0e9e\u0eb7\u0ec8\u0ead\u0eaa\u0eb0\u0e94\u0ea7\u0e81\u0ec3\u0e99\u0e81\u0eb2\u0e99\u0eaa\u0ebb\u0e99\u0e97\u0eb0\u0e99\u0eb2 \u0ec1\u0ea5\u0eb0\u0e9b\u0ec8\u0ebd\u0e99, \u0eae\u0eb9\u0e9a\u0ec1\u0e9a\u0e9a \u0ec1\u0ea5\u0eb0 \u0e81\u0eb2\u0e99\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2 \u0ead\u0eb5\u0ec1\u0ea1\u0ea7\u0e95\u0ec8\u0eb2\u0e87\u0ec6 -intro_log_out=\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0e9a\u0ec8\u0ead\u0e99\u0e99\u0eb5\u0ec9 \u0ec0\u0e9e\u0eb7\u0ec8\u0ead\u0ead\u0ead\u0e81\u0e88\u0eb2\u0e81 \u0ea5\u0eb0\u0e9a\u0ebb\u0e9a \u0ec1\u0ea5\u0eb0 \u0ea2\u0eb8\u0e94\u0e81\u0eb2\u0e99\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0eaa\u0eb9\u0ec8\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0e9a\u0eb1\u0e99\u0e8a\u0eb5\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2\u0ec3\u0e8a\u0ec9 -previous=\u0e81\u0ec8\u0ead\u0e99\u0edc\u0ec9\u0eb2\u0e99\u0eb5\u0ec9 -need_to_sync_notification=\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec4\u0e94\u0ec9\u0e9a\u0eb1\u0e99\u0e97\u0eb6\u0e81\u0ec4\u0ea7\u0ec9\u0ea2\u0eb9\u0ec8\u0ec3\u0e99\u0e84\u0ead\u0ea1\u0e9e\u0eb5\u0ea7\u0ec0\u0e95\u0eb5, \u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2 \u0ead\u0eb1\u0e9a\u0ec2\u0ea5\u0e94\u0ea1\u0eb2\u0ec3\u0eaa\u0ec8 server -show_details=\u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0ea5\u0eb2\u0e8d\u0ea5\u0eb0\u0ead\u0ebd\u0e94 -date_selector=\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ea7\u0eb1\u0e99\u0e97\u0eb5\u0ec8 -hide_menu=\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0e87 \u0ec0\u0ea1\u0e99\u0e8d\u0eb9 -entry=\u0e9b\u0ec9\u0ead\u0e99\u0ec0\u0e82\u0ebb\u0ec9\u0eb2 -comment=\u0e84\u0eb3\u0ec0\u0eab\u0eb1\u0e99 -save=\u0e9a\u0eb1\u0e99\u0e97\u0eb6\u0e81 -new=\u0eaa\u0ec9\u0eb2\u0e87\u0ec3\u0eab\u0ea1\u0ec8 -back=\u0e81\u0eb1\u0e9a\u0e84\u0eb7\u0e99 -cancel=Cancel -add=Add -password=\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99 -create=Create -restore=\u0e81\u0eb9\u0ec9\u0e84\u0eb7\u0e99 -optional=\u0e97\u0eb2\u0e87\u0ec0\u0ea5\u0eb7\u0ead\u0e81 -Daily=\u0e97\u0eb8\u0e81\u0ec6\u0ea1\u0eb7\u0ec9 -SixMonthly=\u0ec1\u0e95\u0ec8\u0ea5\u0eb0 6 \u0ec0\u0e94\u0eb7\u0ead\u0e99 -format.Daily.startDate=\u0e9b\u0eb5-\u0ec0\u0e94\u0eb7\u0ead\u0e99-\u0ea1\u0eb7\u0ec9 -format.Yearly.startDate=\u0e9b\u0eb5 -format.Relative.endDate=yyyy-MM-dd -format.FinancialApril.endDate=\u0ea1\u0eb7\u0ec9-\u0ec0\u0e94\u0eb7\u0ead\u0e99-\u0e9b\u0eb5 -format.FinancialOct.endDate=yyyy -month.june=\u0ea1\u0eb5\u0e96\u0eb8\u0e99\u0eb2 -month.october=\u0ec0\u0e94\u0eb7\u0ead\u0e99\u0e95\u0eb8\u0ea5\u0eb2 -month.short.february=\u0e81\u0eb8\u0ea1\u0e9e\u0eb2 -month.short.april=\u0ec0\u0ea1\u0eaa\u0eb2 -month.short.july=\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94 -month.short.september=Sep -month.short.october=Oct -weekday.monday=\u0ea7\u0eb1\u0e99\u0e88\u0eb1\u0e99 -weekday.thursday=\u0ea7\u0eb1\u0e99\u0e9e\u0eb0\u0eab\u0eb1\u0e94 -weekday.sunday=\u0ea7\u0eb1\u0e99\u0ead\u0eb2\u0e97\u0eb4\u0e94 -weekday.short.wednesday=\u0ea7\u0eb1\u0e99\u0e9e\u0eb8\u0e94 -translation_details=\u0ea5\u0eb2\u0e8d\u0ea5\u0eb0\u0ead\u0ebd\u0e94 -translation_save=~\u0e9a\u0eb1\u0e99\u0e97\u0eb6\u0e81 -translation_label_region=\u0e9e\u0eb2\u0e81 -translation_locale_added=\u0e95\u0eb7\u0ec8\u0ea1\u0e97\u0eb5\u0ec8\u0e95\u0eb1\u0ec9\u0e87 -translation_reference=\u0e81\u0eb2\u0e99\u0ead\u0ec9\u0eb2\u0e87\u0ead\u0eb4\u0e87 -translation_duplicated_shortname_with=\u0e82\u0ecd\u0ead\u0eb2\u0ec4\u0e9e\u0e8a\u0eb7\u0ec8\u0eaa\u0eb1\u0ec9\u0e99\u0e82\u0ead\u0e87\u0e97\u0ec8\u0eb2\u0e99\u0e8a\u0ecd\u0ec9\u0eb2\u0e8a\u0ec9\u0ead\u0e99\u0e81\u0eb1\u0e9a -user_agent=\u0ead\u0ebb\u0e87\u0e81\u0ead\u0e99\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 -database_type=\u0e9b\u0eb0\u0ec0\u0e9e\u0e94\u0e82\u0ead\u0e87\u0e96\u0eb2\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -database_name=\u0e8a\u0eb7\u0ec8\u0e96\u0eb2\u0e99\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -dhis2_online=\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a DHIS 2 -error_message_stack_trace=\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e9a\u0ecd\u0ec8\u0e96\u0eb7\u0e81 -help=\u0e8a\u0ec8\u0ea7\u0e8d -status=\u0eaa\u0eb0\u0e96\u0eb2\u0e99\u0eb0\u0e9e\u0eb2\u0e9a -java_opts=\u0e96\u0eb2\u0e99 Java \u0e8a\u0ebb\u0ec8\u0eaa\u0e84\u0eb2\u0ea7 -java_tmp_dir=\u0e96\u0eb2\u0e99 Java \u0e8a\u0ebb\u0ec8\u0ea7\u0e84\u0eb2\u0ea7 -my_datamart=MyDatamart -mobile_client=Mobile client -mobile_client_description=Client for data capture on mobile devices -system_overview=\u0e9e\u0eb2\u0e9a\u0ea5\u0ea7\u0ea1\u0e82\u0ead\u0e87\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a -server_date=\u0ea7\u0eb1\u0e99\u0e97\u0eb5\u0e95\u0ebb\u0ea7\u0e9a\u0ecd\u0ea5\u0eb4\u0e81\u0eb2\u0e99 -profile_details=\u0ea5\u0eb2\u0e8d\u0ea5\u0eb0\u0ead\u0ebd\u0e94\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -nationality=Nationality -update_user_profile_success=\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec4\u0e94\u0ec9\u0e9b\u0eb1\u0e9a\u0e9b\u0eb8\u0e87\u0ec1\u0ea5\u0ec9\u0ea7 -property_to_display_in_analysis_modules=\u0eaa\u0eb7\u0ec8\u0e87\u0e97\u0eb5\u0ec8\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0e99\u0ecd\u0eb2\u0eaa\u0eb0\u0ec0\u0edc\u0eb5 \u0ec3\u0e99\u0ec2\u0ea1\u0e94\u0eb9\u0e99\u0e82\u0ead\u0e87\u0e81\u0eb2\u0e99\u0ea7\u0eb4\u0ec4\u0e88 -enable_message_email_notifications=Enable message email notifications -intro_user_message_settings=Customize the system with user specific settings for message email and sms notification. -dashboard=\u0e95\u0eb2\u0edc\u0ec8\u0eb2\u0e87\u0eaa\u0eb1\u0e87\u0ea5\u0ea7\u0ea1\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e82\u0ec8\u0eb2\u0ea7\u0eaa\u0eb2\u0e99 -interpretations=\u0e81\u0eb2\u0e99\u0ec1\u0e9b -cpu_cores=CPU cores -yes_only=\u0ea1\u0eb5\u0ec1\u0e95\u0ec8\u0e96\u0eb7\u0e81\u0e95\u0ec9\u0ead\u0e87 -user_name=~\u0e8a\u0eb7\u0ec8\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 -old_password=\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99~\u0ec0\u0e81\u0ebb\u0ec8\u0eb2 -new_password=\u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99\u0ec3\u0edd\u0ec8 -surname=\u0e99\u0eb2\u0ea1\u0eaa\u0eb0\u0e81\u0eb8\u0e99 -first_name=\u0e8a\u0eb7\u0ec8\u0ec1\u0e97\u0ec9 -username=\u0e8a\u0eb7\u0ec8\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9\u0e87\u0eb2\u0e99 -phone_number=\u0ec0\u0e9a\u0eb5\u0ec2\u0e97\u0ec2\u0ea1\u0e9a\u0eb2\u0e8d -help_intro_text=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ec0\u0ead\u0ebb\u0eb2\u0ea5\u0eb2\u0e8d\u0e81\u0eb2\u0e99\u0e95\u0ec8\u0eb2\u0e87\u0ec6\u0e88\u0eb2\u0e81 menu \u0ec4\u0e9b\u0e97\u0eb2\u0e87\u0e8a\u0ec9\u0eb2\u0e8d -contact_person=\u0e9c\u0eb9\u0ec9\u0e9b\u0eb0\u0eaa\u0eb2\u0e99\u0e87\u0eb2\u0e99 -this_field_is_required=\u0ea2\u0eb9\u0ec8\u0e9a\u0ec8\u0ead\u0e99\u0e99\u0eb5\u0ec9\u0e95\u0ec9\u0ead\u0e87\u0ec4\u0e94\u0ec9\u0e95\u0eb7\u0ec8\u0ea1\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0ec3\u0eaa\u0ec8 -please_enter_a_valid_email_address=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2 \u0e95\u0eb7\u0ec8\u0ea1 \u0ec1\u0ea5\u0eb0 \u0ea2\u0eb1\u0ec9\u0e87\u0ea2\u0eb7\u0e99\u0e97\u0eb5\u0ec8\u0ea2\u0eb9\u0ec8 \u0ead\u0eb5\u0ec1\u0ea1\u0ea7 \u0e82\u0ead\u0e87\u0e97\u0ec8\u0eb2\u0e99 -please_enter_a_valid_date=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ec3\u0eaa\u0ec8 \u0ec1\u0ea5\u0eb0 \u0ea2\u0eb1\u0ec9\u0e87\u0ea2\u0eb7\u0e99\u0ea7\u0eb1\u0e99\u0e97\u0eb5 -digits_decimal_only_please=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ec1\u0e95\u0ec8\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81. 3 \u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81 \u0e81\u0ead\u0ec8\u0e99\u0ec0\u0e84\u0eb7\u0ec8\u0ead\u0e87\u0edd\u0eb2\u0e8d\u0e88\u0ecd\u0ec9\u0eb2\u0e88\u0eb8\u0e94 \u0ec1\u0ea5\u0eb0 2 \u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81 \u0eab\u0ea5\u0eb1\u0e87\u0e88\u0ecd\u0ec9\u0eb2\u0e88\u0eb8\u0e94 \u0ec1\u0ea1\u0ec8\u0e99\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ec0\u0eae\u0eb1\u0e94\u0ec4\u0e94\u0ec9 -please_enter_betwwen_a_and_b_words=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ec3\u0eaa\u0ec8 \u0ea5\u0eb0\u0eab\u0ea7\u0ec8\u0eb2\u0e87\u0e84\u0ecd\u0eb2 {0} \u0ec1\u0ea5\u0eb0 {1} -letters_only_please=\u0ea1\u0eb5\u0ec1\u0e95\u0ec8\u0e95\u0ebb\u0ea7\u0edc\u0eb1\u0e87\u0eaa\u0eb7\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0e99\u0eb1\u0ec9\u0e99 -please_enter_valid_phone_number=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e82\u0ebd\u0e99\u0ec2\u0e9a\u0ec2\u0e97\u0ea5\u0eb0\u0eaa\u0eb1\u0e9a\u0e97\u0eb5\u0ec8\u0eaa\u0eb2\u0ea1\u0e94\u0ec3\u0e8a\u0ec9\u0ec4\u0e94\u0ec9 -please_fill_out_at_least_one_of_these_fields=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ec3\u0eaa\u0ec8 \u0ea2\u0ec8\u0eb2\u0e87\u0e95\u0ecd\u0ec8\u0eb2 \u0e99\u0eb7\u0ec8\u0e87\u0ec3\u0e99\u0e9a\u0eb1\u0e99\u0e94\u0eb2 \u0e82\u0eb0\u0ec1\u0edc\u0e87\u0ea7\u0eb4\u0e8a\u0eb2\u0e95\u0ec8\u0eb2\u0e87\u0ec6 -please_select_at_least_one_option_for_these_fields=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ea2\u0ec8\u0eb2\u0e87\u0e95\u0ecd\u0ec8\u0eb2 \u0e99\u0eb7\u0ec8\u0e87\u0e97\u0eb2\u0e87\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0e9a\u0eb1\u0e99\u0e94\u0eb2\u0e82\u0eb0\u0ec1\u0edc\u0e87\u0ea7\u0eb4\u0e8a\u0eb2\u0e95\u0ec8\u0eb2\u0e87\u0ec6 -please_unicode_chars_only=\u0ead\u0eb2\u0e99\u0eb8\u0e9a\u0eb2\u0e94\u0ec3\u0eab\u0ec9\u0ec3\u0eaa\u0ec8\u0ec4\u0e94\u0ec9\u0ec1\u0e95\u0ec8 \u0e95\u0ebb\u0ea7\u0edc\u0eb1\u0e87\u0eaa\u0eb7\u0e97\u0eb5\u0ec8\u0ea1\u0eb5 \u0ea2\u0eb9\u0e99\u0eb5 \u0ec2\u0e84\u0e94 -please_enter_valid_number=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81\u0e97\u0eb5\u0ec8\u0e96\u0eb7\u0e81\u0e95\u0ec9\u0ead\u0e87\u0ec3\u0eaa\u0ec8 -please_enter_valid_positive_integer=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0e95\u0ebb\u0ea7\u0ec0\u0ea5\u0e81\u0e97\u0eb5\u0ec8\u0ec0\u0e9b\u0eb1\u0e99\u0e9c\u0ebb\u0e99\u0ea5\u0ebb\u0e9a -please_enter_name=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0e8a\u0eb7\u0ec8\u0ec3\u0eaa\u0ec8 -please_select_indicator=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0e95\u0ebb\u0ea7\u0e8a\u0eb5\u0ec9\u0ea7\u0eb1\u0e94 -success=\u0eaa\u0eb3\u0ec0\u0ea5\u0eb1\u0e94 -select_all=\u0ec0\u0ea5\u0eb7\u0ead\u200b\u0e81\u0e97\u0eb1\u0e87\u0edd\u0ebb\u0e94 -unselect_in_group=\u0e9a\u0ecd\u0ec8\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb8\u0ec8\u0ea1 -remove_all=\u0ea5\u0eb7\u0e9a\u0e96\u0eb5\u0ec9\u0ea1\u0edd\u0ebb\u0e94 -move_to_top=Move to top -jump_to_page=Jump to page -filter_by_name=Filter by name -get_pdf=Get PDF -no_item_to_export=There is no item to export -short_name=Short name -alternative_name=\u0e97\u0eb2\u0e87\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0e8a\u0eb7\u0ec8\u0ead\u0eb7\u0ec8\u0e99\u0ec6 -value_type=\u0e9b\u0eb0\u0ec0\u0e9e\u0e94\u0e82\u0ead\u0e87\u0ea1\u0eb9\u0e99\u0e84\u0ec8\u0eb2 -data_dictionary=\u0ea7\u0eb1\u0e94\u0e88\u0eb0\u0e99\u0eb2\u0e99\u0eb8\u0e81\u0ebb\u0ea1\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -indicators=\u0e94\u0eb1\u0e94\u0eaa\u0eb0\u0e99\u0eb5\u0edd\u0eb2\u0e8d -data_element_groups=\u0ead\u0ebb\u0e87\u0e9b\u0eb0\u0e81\u0ead\u0e9a\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0e97\u0eb5\u0ec8\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb8\u0ec8\u0ea1 -organisation_unit_hierarchy=\u0e82\u0eb1\u0ec9\u0e99\u0e95\u0ec8\u0eb2\u0e87\u0ec6\u0e82\u0ead\u0e87\u0eab\u0ebb\u0ea7\u0edc\u0ec8\u0ea7\u0e8d\u0e81\u0eb2\u0e99\u0e88\u0eb1\u0e94\u0e95\u0eb1\u0ec9\u0e87 -expression=\u0e81\u0eb2\u0e99\u0eaa\u0eb0\u0ec1\u0e94\u0e87\u0ead\u0ead\u0e81 -right_expression=\u0e81\u0eb2\u0e99\u0eaa\u0eb0\u0ec1\u0e94\u0e87\u0ead\u0ead\u0e81\u0e97\u0eb5\u0ec8\u0e96\u0eb7\u0e81\u0e95\u0ec9\u0ead\u0e87 -numerator=\u0e95\u0ebb\u0ea7\u0e95\u0eb1\u0ec9\u0e87 -denominator=\u0e95\u0ebb\u0ea7\u0eab\u0eb2\u0e99 -denominator_formula=\u0eaa\u0eb9\u0e94\u0e82\u0ead\u0e87\u0e95\u0ebb\u0ea7\u0eab\u0eb2\u0e99 -denominator_aggregation_operator=\u0e81\u0eb2\u0e99\u0e9b\u0eb0\u0e95\u0eb4\u0e9a\u0eb1\u0e94\u0e81\u0eb2\u0e99\u0eaa\u0eb1\u0e87\u0ea5\u0ea7\u0ea1\u0e95\u0ebb\u0ea7\u0eab\u0eb2\u0e99 -category_option_combo_does_not_exist=\u0e97\u0eb2\u0e87\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0eaa\u0ec8\u0ea7\u0e99\u0e9b\u0eb0\u0e81\u0ead\u0e9a\u0e9a\u0ecd\u0ec8\u0ea1\u0eb5\u0ec4\u0e99\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a -left_side_description=\u0e81\u0eb2\u0e99\u0e9e\u0eb1\u0e99\u0ea5\u0eb0\u0e99\u0eb2\u0e97\u0eb2\u0e87\u0e8a\u0ec9\u0eb2\u0e8d\u0ea1\u0eb7 -right_side_of_expression=Right side of Expression -operator=Operator -greater_than_symbol=> -greater_than_or_equal_to_symbol=>= -less_than_symbol=< -less_than_or_equal_to=<= -constant=Constant -multiple_choice=Multiple Choice -user_group_access=\u0e81\u0eb2\u0e99\u0ec0\u0e82\u0ebb\u0ec9\u0eb2\u0ec0\u0e96\u0eb4\u0e87\u0e81\u0eb8\u0ec8\u0ea1\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 -group_name=\u0e8a\u0eb7\u0ec8\u0e81\u0eb8\u0ec8\u0ea1 -sharing_settings=\u0e95\u0eb4\u0e94\u0e95\u0eb1\u0ec9\u0e87\u0e81\u0eb2\u0e99\u0e81\u0eb0\u0e88\u0eb2\u0e8d\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99 -read_write=\u0ead\u0ec8\u0eb2\u0e99 \u0ec1\u0ea5\u0eb0 \u0e82\u0ebd\u0e99 -can_edit_and_view=\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0e94\u0eb1\u0e94\u0ec1\u0e81\u0ec9\u0ec4\u0e94\u0ec9 \u0ec1\u0ea5\u0eb0 \u0ec0\u0e9a\u0eb5\u0ec8\u0e87 -can_view=\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ec0\u0e9a\u0eb5\u0ec8\u0e87\u0ec4\u0e94\u0ec9 -object_will_created_private=This object will be private to yourself -algeria=Algeria -armenia=Armenia -bangladesh=Bangladesh -bhutan=Bhutan -burkina_faso_coat_of_arms=Burkina Faso Coat of Arms -china=China -congo_kinshasa=Democratic Republic of the Congo -ethiopia=Ethiopia -gambia=Gambia -indonesia=Indonesia -ivory_coast=Ivory Coast -laos=Lao People's Democratic Republic -mozambique=Mozambique -nicaragua=Nicaragua -psi=PSI -republic_of_trinidad_and_tobago=Republic of Trinidad & Tobago -sierra_leone_coat_of_arms=Sierra Leone Coat of Arms -solomon_islands=Solomon Islands -south_africa=South Africa -tajikistan=Tajikistan -togo=Togo -who=WHO -zimbabwe=Zimbabwe -login=Login -new_user_account_last_name=Last -uploading_data_notification=Uploading locally stored data to the server -details=\u0ea5\u0eb2\u0e8d\u0ea5\u0eb0\u0ead\u0ebd\u0e94 -month.january=\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99 -translation_select_locale=[ Select locale ] -message_to_the_dhis2_development_team=\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0eaa\u0ecd\u0eb2\u0ea5\u0eb1\u0e9a\u0e97\u0eb4\u0ea1\u0e87\u0eb2\u0e99\u0e97\u0eb5\u0ec8\u0e9e\u0eb1\u0e94\u0e97\u0eb0\u0e99\u0eb2 \u0ea5\u0eb0\u0e9a\u0ebb\u0e9a DHIS 2 -intro=Intro -education=Education -general=\u0ec2\u0e94\u0e8d\u0e97\u0ebb\u0ec8\u0ea7\u0ec4\u0e9b -average=\u0eaa\u0eb0\u0ec0\u0ea5\u0ec8\u0e8d -please_enter_a_value_greater_than_or_equal_to=Please enter a value greater than or equal to {1} -unselect_at_level=\u0e8d\u0ebb\u0e81\u0ec0\u0ea5\u0eb5\u0e81\u0e81\u0eb2\u0e99\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0ea5\u0eb0\u0e94\u0eb1\u0e9a\u0e82\u0eb1\u0ec9\u0e99 -tanzania=\u0e95\u0eb2\u0e99\u0e8a\u0eb2\u0ec0\u0e99\u0eb1\u0ebd -intro_dhis-web-maintenance-user=\u0eae\u0eb1\u0e81\u0eaa\u0eb2\u0e9c\u0eb9\u0ec9\u0e8a\u0ebb\u0ea1\u0ec3\u0e8a\u0ec9 \u0ec3\u0e99\u0ec1\u0e87\u0ec8\u0e82\u0ead\u0e87 \u0e81\u0eb2\u0e99\u0ead\u0eb2\u0e99\u0eb8\u0e8d\u0eb2\u0e94 \u0ec1\u0ea5\u0eb0 \u0ea5\u0eb0\u0eab\u0eb1\u0e94\u0e9c\u0ec8\u0eb2\u0e99, \u0edc\u0ec9\u0eb2\u0e97\u0eb5\u0ec8\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 \u0ec1\u0ea5\u0eb0 \u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb8\u0ec8\u0ea1 -update_user=\u0e9b\u0eb1\u0e9a\u0e9b\u0eb8\u0e87\u0e84\u0eb7\u0e99\u0e9c\u0eb9\u0ec9\u0ec3\u0e8a\u0ec9 -only_digits_are_not_allowed=\u0ea1\u0eb5\u0ec1\u0e95\u0ec8\u0ec2\u0e95\u0ec0\u0ea5\u0e81\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0e99\u0eb1\u0ec9\u0e99\u0e97\u0eb5\u0ec8\u0e9a\u0ecd\u0ec8\u0ead\u0eb2\u0e99\u0eb8\u0e8d\u0eb2\u0e94 -select_children=\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0e81\u0eb8\u0ec8\u0ea1\u0ec0\u0e94\u0eb1\u0e81 -format.Weekly.startDate=yyyy 'W' w -format.Survey.endDate= -not_set=\u0e9a\u0ecd\u0ec8\u0e97\u0eb1\u0e99\u0ec4\u0e94\u0ec9\u0e95\u0eb1\u0ec9\u0e87 -no=\u0e9a\u0ecd\u0ec8\u0ec1\u0ea1\u0ec8\u0e99 -please_enter_a_valid_number=Please enter a valid number. -warning=\u0e81\u0eb2\u0e99\u0ec0\u0e95\u0eb7\u0ead\u0e99 -unselect_all=\u0e9a\u0ecd\u0ec8\u0ec0\u0ea5\u0eb7\u0ead\u0e81\u0e97\u0eb1\u0e87\u0edd\u0ebb\u0e94 -closed_date=\u0ea1\u0eb7\u0ec9\u0e9b\u0eb4\u0e94 -vanuatu=Vanuatu -vietnam=Vietnam -create_an_account=Create an account -exception=\u0e8d\u0ebb\u0e81\u0ec0\u0ea7\u0eb1\u0ec9\u0e99 -delete_access_denied_message=\u0e97\u0ec8\u0eb2\u0e99\u0e9a\u0ecd\u0ec8\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ea5\u0eb7\u0e9a\u0eab\u0ebb\u0ea7\u0e82\u0ecd\u0ec9\u0e99\u0eb5\u0ec9 -dhis-web-mobile=Mobile (Smartphone) -dhis-web-validationrule-local-in=\u0e81\u0eb2\u0e99\u0ea2\u0eb1\u0ec9\u0e87\u0ea2\u0eb7\u0e99\u0e81\u0eb2\u0e99\u0ea7\u0eb4\u0ec4\u0e88 -dhis-web-survey=\u0e81\u0eb2\u0e99\u0eaa\u0ecd\u0eb2\u0eab\u0ea5\u0ea7\u0e94-\u0ec0\u0e9b\u0ebb\u0ec9\u0eb2\u0edd\u0eb2\u0e8d -intro_dhis-web-maintenance-organisationunit=Maintain organisation units and its hierarchy, groups and group sets. -intro_dhis-web-mapping=\u0e82\u0ea1\u0eb9\u0e99\u0e97\u0eb5\u0ec8\u0ec0\u0e9b\u0eb1\u0e99\u0eae\u0eb9\u0e9a\u0e9e\u0eb2\u0e9a \u0ec1\u0ea5\u0eb0 \u0ec1\u0e9c\u0e99\u0e97\u0eb5\u0ec8 \u0ec2\u0e94\u0e8d\u0e99\u0ecd\u0eb2\u0ec3\u0e8a\u0ec9 \u0ec0\u0e84\u0eb7\u0ec8\u0ead\u0e87\u0edd\u0eb2\u0e8d \u0e97\u0eb5\u0ec8\u0e88\u0eb1\u0e94\u0ea7\u0eb2\u0e87\u0ec0\u0e9b\u0eb1\u0e99\u0eab\u0ea5\u0eb2\u0e8d\u0e8a\u0eb1\u0ec9\u0e99 -intro_profile=\u0e95\u0eb1\u0ec9\u0e87\u0e82\u0ecd\u0ec9\u0ea1\u0eb9\u0e99\u0eaa\u0ec8\u0ea7\u0e99\u0e95\u0ebb\u0ea7\u0e82\u0ead\u0e87\u0e97\u0ec8\u0eb2\u0e99 \u0ec0\u0e8a\u0eb1\u0e99\u0e95\u0ebb\u0ea7\u0ea2\u0ec8\u0eb2\u0e87 \u0edc\u0ec9\u0eb2\u0e97\u0eb5\u0ec8\u0e95\u0ecd\u0eb2\u0ec1\u0edc\u0ec8\u0e87\u0edd \u0e9a\u0ec8\u0ead\u0e99\u0ec0\u0eae\u0eb1\u0e94\u0ea7\u0ebd\u0e81 \u0ec1\u0ea5\u0eb0 \u0ead\u0eb7\u0ec8\u0e99\u0ec6 -required=\u0e95\u0ec9\u0ead\u0e87\u0e81\u0eb2\u0e99 -update=Update -delete=Delete -OnChange=On-change -Survey=Survey -format.BiMonthly.startDate=MMM 'to ' -format.Quarterly.startDate=MMM 'to ' -month.short.may=\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2 -weekday.tuesday=Tuesday -translation_label_name=Name -translation_locale=Locale -java_version=\u0e95\u0eb2\u0ea1\u0ea5\u0eb0\u0e9a\u0ebb\u0e9a\u0e82\u0ead\u0e87 Java -report_designer=Report designer -female=Female -other=Other -count=\u0e99\u0eb1\u0e9a -int=\u0e88\u0eb3\u0e99\u0ea7\u0e99 -yes_no=Yes/No -bool=Yes/No -please_enter_a_valid_url=\u0e81\u0eb0\u0ea5\u0eb8\u0e99\u0eb2\u0e95\u0eb7\u0ec8\u0ea1\u0ec3\u0eaa\u0ec8 \u0ec1\u0ea5\u0eb0 \u0ea2\u0eb1\u0ec9\u0e99\u0ea2\u0eb7\u0e99 URL -please_enter_n_words_or_less=Please enter {0} words or less. -please_select_period=Please select period! -move_all=Move all -rows_in_page=No. of rows per page -actual=Actual -percent=Percent -data_elements=Data elements -organisation_unit_groups=Organisation unit groups -users=Users -expression_not_well_formed=Expression is not well-formed -equal_to=== -no_constant_to_select=No constants to select -cambodia=Cambodia -fhi360=FHI360 -malawi=Malawi -paraguay=Paraguay -sri_lanka=Sri Lanka -powered_by=Powered by === modified file 'dhis-2/dhis-web/dhis-web-event-capture/src/main/webapp/dhis-web-event-capture/event-capture.appcache' --- dhis-2/dhis-web/dhis-web-event-capture/src/main/webapp/dhis-web-event-capture/event-capture.appcache 2014-04-14 06:37:04 +0000 +++ dhis-2/dhis-web/dhis-web-event-capture/src/main/webapp/dhis-web-event-capture/event-capture.appcache 2014-05-12 09:56:39 +0000 @@ -2,9 +2,9 @@ CACHE: ../dhis-web-commons/javascripts/jQuery/jquery.min.js -../dhis-web-commons/javascripts/jQuery/ui/jquery-ui-1.9.1.custom.min.js +../dhis-web-commons/javascripts/jQuery/ui/jquery-ui.min.js ../dhis-web-commons/javascripts/jQuery/jquery.tmpl.js -../dhis-web-commons/javascripts/jQuery/ui/css/redmond/jquery-ui-1.9.1.custom.css +../dhis-web-commons/javascripts/jQuery/ui/css/redmond/jquery-ui.css ../dhis-web-commons/fonts/LiberationSans-Regular-webfont.eot === modified file 'dhis-2/dhis-web/dhis-web-event-capture/src/main/webapp/dhis-web-event-capture/index.html' --- dhis-2/dhis-web/dhis-web-event-capture/src/main/webapp/dhis-web-event-capture/index.html 2014-04-20 16:30:35 +0000 +++ dhis-2/dhis-web/dhis-web-event-capture/src/main/webapp/dhis-web-event-capture/index.html 2014-05-12 09:56:39 +0000 @@ -8,9 +8,9 @@ - + - + === modified file 'dhis-2/dhis-web/dhis-web-event-reports/src/main/webapp/dhis-web-event-reports/app/scripts/app.js' --- dhis-2/dhis-web/dhis-web-event-reports/src/main/webapp/dhis-web-event-reports/app/scripts/app.js 2014-05-01 17:07:09 +0000 +++ dhis-2/dhis-web/dhis-web-event-reports/src/main/webapp/dhis-web-event-reports/app/scripts/app.js 2014-05-12 09:56:39 +0000 @@ -6170,7 +6170,7 @@ iconCls: 'ns-menu-item-datasource', handler: function() { if (ns.core.init.contextPath && ns.app.paramString) { - window.open(ns.core.init.contextPath + ns.core.web.analytics.getParamString(ns.app.layout, 'html'), '_blank'); + window.open(ns.core.init.contextPath + ns.core.web.analytics.getParamString(ns.app.layout, 'html', true), '_blank'); } } }, @@ -6179,7 +6179,7 @@ iconCls: 'ns-menu-item-datasource', handler: function() { if (ns.core.init.contextPath && ns.app.paramString) { - window.open(ns.core.init.contextPath + ns.core.web.analytics.getParamString(ns.app.layout, 'json'), '_blank'); + window.open(ns.core.init.contextPath + ns.core.web.analytics.getParamString(ns.app.layout, 'json', true), '_blank'); } } }, @@ -6188,7 +6188,7 @@ iconCls: 'ns-menu-item-datasource', handler: function() { if (ns.core.init.contextPath && ns.app.paramString) { - window.open(ns.core.init.contextPath + ns.core.web.analytics.getParamString(ns.app.layout, 'xml'), '_blank'); + window.open(ns.core.init.contextPath + ns.core.web.analytics.getParamString(ns.app.layout, 'xml', true), '_blank'); } } }, @@ -6197,7 +6197,7 @@ iconCls: 'ns-menu-item-datasource', handler: function() { if (ns.core.init.contextPath && ns.app.paramString) { - window.open(ns.core.init.contextPath + ns.core.web.analytics.getParamString(ns.app.layout, 'xls'), '_blank'); + window.open(ns.core.init.contextPath + ns.core.web.analytics.getParamString(ns.app.layout, 'xls', true), '_blank'); } } }, @@ -6206,7 +6206,7 @@ iconCls: 'ns-menu-item-datasource', handler: function() { if (ns.core.init.contextPath && ns.app.paramString) { - window.open(ns.core.init.contextPath + ns.core.web.analytics.getParamString(ns.app.layout, 'csv'), '_blank'); + window.open(ns.core.init.contextPath + ns.core.web.analytics.getParamString(ns.app.layout, 'csv', true), '_blank'); } } } @@ -6444,8 +6444,6 @@ } }); - - getLayoutWindow = function(dataType) { if (dataType === 'aggregated_values') { return ns.app.aggregateLayoutWindow; === modified file 'dhis-2/dhis-web/dhis-web-event-reports/src/main/webapp/dhis-web-event-reports/app/scripts/core.js' --- dhis-2/dhis-web/dhis-web-event-reports/src/main/webapp/dhis-web-event-reports/app/scripts/core.js 2014-05-01 11:03:40 +0000 +++ dhis-2/dhis-web/dhis-web-event-reports/src/main/webapp/dhis-web-event-reports/app/scripts/core.js 2014-05-12 09:56:39 +0000 @@ -1313,10 +1313,13 @@ } // add span and children - for (var i = 0; i < aaAllFloorObjects.length; i++) { + for (var i = 0, aAboveFloorObjects, doorIds, uniqueDoorIds; i < aaAllFloorObjects.length; i++) { + doorIds = []; + for (var j = 0, obj, doorCount = 0, oldestObj; j < aaAllFloorObjects[i].length; j++) { obj = aaAllFloorObjects[i][j]; + doorIds.push(obj.id); if (doorCount === 0) { @@ -1324,8 +1327,9 @@ obj[spanType] = aFloorSpan[i]; // children - //obj.children = Ext.isDefined(aFloorSpan[i + 1]) ? aFloorSpan[i] / aFloorSpan[i + 1] : 0; - obj.children = obj.leaf ? 0 : aFloorSpan[i]; + if (obj.leaf) { + obj.children = 0; + } // first sibling obj.oldest = true; @@ -1345,6 +1349,16 @@ doorCount = 0; } } + + // set above floor door children to number of unique door ids on this floor + if (i > 0) { + aAboveFloorObjects = aaAllFloorObjects[i-1]; + uniqueDoorIds = Ext.Array.unique(doorIds); + + for (var j = 0; j < aAboveFloorObjects.length; j++) { + aAboveFloorObjects[j].children = uniqueDoorIds.length; + } + } } // add parents if more than 1 floor @@ -1790,7 +1804,7 @@ // analytics web.analytics = {}; - web.analytics.getParamString = function(view, format) { + web.analytics.getParamString = function(view, format, skipPaging) { var paramString, dimensions = Ext.Array.clean([].concat(view.columns || [], view.rows || [])), ignoreKeys = ['longitude', 'latitude'], @@ -1838,8 +1852,19 @@ for (var i = 0, dim; i < view.filters.length; i++) { dim = view.filters[i]; - paramString += '&filter=' + dim.dimension; - paramString += dim.filter ? ':' + encodeURIComponent(dim.filter) : ''; + paramString += '&filter=' + dim.dimension; + + if (dim.items) { + paramString += ':'; + + for (var i = 0; i < dim.items.length; i++) { + paramString += encodeURIComponent(dim.items[i].id); + paramString += i < dim.items.length - 1 ? ';' : ''; + } + } + else { + paramString += dim.filter ? ':' + encodeURIComponent(dim.filter) : ''; + } } } @@ -1864,7 +1889,7 @@ } // paging - if (view.dataType === 'individual_cases' && view.paging) { + if (view.dataType === 'individual_cases' && view.paging && !skipPaging) { paramString += view.paging.pageSize ? '&pageSize=' + view.paging.pageSize : ''; paramString += view.paging.page ? '&page=' + view.paging.page : ''; } === modified file 'dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/message/action/AddRecipientAction.java' --- dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/message/action/AddRecipientAction.java 2014-05-06 06:43:36 +0000 +++ dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/message/action/AddRecipientAction.java 2014-05-12 09:56:39 +0000 @@ -1,10 +1,36 @@ package org.hisp.dhis.light.message.action; +/* + * Copyright (c) 2004-2014, 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. + */ + import java.util.HashSet; import java.util.Set; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -18,8 +44,6 @@ public class AddRecipientAction implements Action { - private static final Log log = LogFactory.getLog( AddRecipientAction.class ); - public AddRecipientAction() { } === modified file 'dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/messaging/action/FindUserAction.java' --- dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/messaging/action/FindUserAction.java 2014-05-06 06:43:36 +0000 +++ dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/messaging/action/FindUserAction.java 2014-05-12 09:56:39 +0000 @@ -32,8 +32,6 @@ import java.util.HashSet; import java.util.Set; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -42,8 +40,6 @@ public class FindUserAction implements Action { - private static final Log log = LogFactory.getLog( FindUserAction.class ); - private static final String REDIRECT = "redirect"; private UserService userService; === modified file 'dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/namebaseddataentry/action/FindBeneficiarytAction.java' --- dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/namebaseddataentry/action/FindBeneficiarytAction.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/namebaseddataentry/action/FindBeneficiarytAction.java 2014-05-12 09:56:39 +0000 @@ -28,11 +28,17 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.util.Collection; -import java.util.HashSet; + +import java.util.List; import java.util.Set; -import org.hisp.dhis.trackedentity.TrackedEntityInstance; +import org.hisp.dhis.common.Grid; +import org.hisp.dhis.common.OrganisationUnitSelectionMode; +import org.hisp.dhis.common.QueryItem; +import org.hisp.dhis.common.QueryOperator; +import org.hisp.dhis.organisationunit.OrganisationUnitService; +import org.hisp.dhis.trackedentity.TrackedEntityAttributeService; +import org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams; import org.hisp.dhis.trackedentity.TrackedEntityInstanceService; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; @@ -54,32 +60,34 @@ this.patientService = patientService; } + private OrganisationUnitService organisationUnitService; + + public void setOrganisationUnitService( OrganisationUnitService organisationUnitService ) + { + this.organisationUnitService = organisationUnitService; + } + + private TrackedEntityAttributeService trackedEntityAttributeService; + + public void setTrackedEntityAttributeService( TrackedEntityAttributeService trackedEntityAttributeService ) + { + this.trackedEntityAttributeService = trackedEntityAttributeService; + } + // ------------------------------------------------------------------------- // Input & Output // ------------------------------------------------------------------------- - private Collection patients; - - public Collection getPatients() - { - return patients; - } - - public void setPatients( Collection patients ) - { - this.patients = patients; - } - - private Set pavSet; - - public Set getPavSet() - { - return pavSet; - } - - public void setPavSet( Set pavSet ) - { - this.pavSet = pavSet; + private List> trackedEntityList; + + public List> getTrackedEntityList() + { + return trackedEntityList; + } + + public void setTrackedEntityList( List> trackedEntityList ) + { + this.trackedEntityList = trackedEntityList; } private Set patientAttributes; @@ -130,16 +138,16 @@ this.patientAttributeId = patientAttributeId; } - private Integer patientId; + private String patientUID; - public Integer getPatientId() + public String getPatientUID() { - return patientId; + return patientUID; } - public void setPatientId( Integer patientId ) + public void setPatientUID( String patientUID ) { - this.patientId = patientId; + this.patientUID = patientUID; } // Use in search related patient @@ -172,21 +180,30 @@ public String execute() throws Exception { - - patients = patientService.searchTrackedEntityInstancesForMobile( keyword, organisationUnitId, - patientAttributeId ); - - pavSet = new HashSet(); - - for ( TrackedEntityInstance p : patients ) - { - pavSet.addAll( p.getAttributeValues() ); - } - - if ( patients.size() == 1 ) - { - TrackedEntityInstance patient = patients.iterator().next(); - patientId = patient.getId(); + TrackedEntityInstanceQueryParams param = new TrackedEntityInstanceQueryParams(); + QueryItem queryItem = new QueryItem( + trackedEntityAttributeService.getTrackedEntityAttribute( patientAttributeId ), QueryOperator.EQ, keyword, + false ); + + if ( organisationUnitId == null || organisationUnitId == 0 ) + { + param.setOrganisationUnitMode( OrganisationUnitSelectionMode.ALL ); + } + else + { + param.addOrganisationUnit( organisationUnitService.getOrganisationUnit( organisationUnitId ) ); + } + + param.addAttribute( queryItem ); + + Grid trackedEntityGrid = patientService.getTrackedEntityInstances( param ); + trackedEntityList = trackedEntityGrid.getRows(); + + + if ( trackedEntityList.size() == 1 ) + { + List firstRow = trackedEntityList.iterator().next(); + patientUID = firstRow.get( 0 ).toString(); return REDIRECT; } === modified file 'dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/namebaseddataentry/action/GetPatientProgramListAction.java' --- dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/namebaseddataentry/action/GetPatientProgramListAction.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/namebaseddataentry/action/GetPatientProgramListAction.java 2014-05-12 09:56:39 +0000 @@ -126,16 +126,16 @@ // Input & Output // ------------------------------------------------------------------------- - private Integer patientId; + private String patientUID; - public Integer getPatientId() + public String getPatientUID() { - return patientId; + return patientUID; } - public void setPatientId( Integer patientId ) + public void setPatientUID( String patientUID ) { - this.patientId = patientId; + this.patientUID = patientUID; } private Set programInstances = new HashSet(); @@ -249,7 +249,7 @@ programInstances.clear(); relatedPeople = new HashMap(); - patient = patientService.getTrackedEntityInstance( patientId ); + patient = patientService.getTrackedEntityInstance( patientUID ); Collection programByCurrentUser = programService.getProgramsByCurrentUser(); for ( ProgramInstance programInstance : patient.getProgramInstances() ) { === modified file 'dhis-2/dhis-web/dhis-web-light/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-web/dhis-web-light/src/main/resources/META-INF/dhis/beans.xml 2014-05-06 06:43:36 +0000 +++ dhis-2/dhis-web/dhis-web-light/src/main/resources/META-INF/dhis/beans.xml 2014-05-12 09:56:39 +0000 @@ -245,6 +245,8 @@ class="org.hisp.dhis.light.namebaseddataentry.action.FindBeneficiarytAction" scope="prototype"> + + === modified file 'dhis-2/dhis-web/dhis-web-light/src/main/resources/struts.xml' --- dhis-2/dhis-web/dhis-web-light/src/main/resources/struts.xml 2014-05-06 06:43:36 +0000 +++ dhis-2/dhis-web/dhis-web-light/src/main/resources/struts.xml 2014-05-12 09:56:39 +0000 @@ -200,7 +200,7 @@ - showPatientProgramList.action?patientId=${patientId} + showPatientProgramList.action?patientUID=${patientUID} /dhis-web-light/main.vm /dhis-web-light/namebased/beneficiaryList.vm === modified file 'dhis-2/dhis-web/dhis-web-light/src/main/webapp/dhis-web-light/namebased/beneficiaryList.vm' --- dhis-2/dhis-web/dhis-web-light/src/main/webapp/dhis-web-light/namebased/beneficiaryList.vm 2014-03-07 08:27:33 +0000 +++ dhis-2/dhis-web/dhis-web-light/src/main/webapp/dhis-web-light/namebased/beneficiaryList.vm 2014-05-12 09:56:39 +0000 @@ -2,14 +2,14 @@

          -

          Total found: $patients.size()

          +

          Total found: $trackedEntityList.size()

          '; - html += '
          '; - html += '
           
          '; - html += '
          '; - } - else { - html += 'style="padding:' + displayDensity + '; font-size:' + fontSize + ';"' + '>' + htmlValue + ''; - } + //if (bgColor && isValue) { + //html += 'style="color:' + bgColor + ';padding:' + displayDensity + '; font-size:' + fontSize + ';"' + '>' + htmlValue + ''; + //html += '>'; + //html += '
          '; + //html += '
          ' + htmlValue + '
          '; + //html += '
          '; + //html += '
           
          '; + //html += '
          '; + //} + //else { + html += 'style="' + (bgColor && isValue ? 'color:' + bgColor + '; ' : '') + 'padding:' + displayDensity + '; font-size:' + fontSize + ';"' + '>' + htmlValue + ''; + //} return html; }; === modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/plugin.js' --- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/plugin.js 2014-05-03 13:51:53 +0000 +++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/plugin.js 2014-05-12 09:56:39 +0000 @@ -1079,7 +1079,6 @@ getUpdatedAxis = function(axis) { var dimension; - axis = Ext.clone(axis); for (var i = 0; i < axis.length; i++) { if (axis[i].dimension === objectName) { @@ -2693,6 +2692,7 @@ css += '.x-mask-msg { \n padding: 0; \n border: 0 none; \n background-image: none; \n background-color: transparent; \n } \n'; css += '.x-mask-msg div { \n background-position: 11px center; \n } \n'; css += '.x-mask-msg .x-mask-loading { \n border: 0 none; \n background-color: #000; \n color: #fff; \n border-radius: 2px; \n padding: 12px 14px 12px 30px; \n opacity: 0.65; \n } \n'; + css += '.x-mask { opacity: 0 } \n'; css += '.pivot td.legend { \n padding: 0; \n } \n'; css += '.pivot div.legendCt { \n display: table; \n float: right; \n width: 100%; \n } \n'; @@ -2967,6 +2967,12 @@ config = web.pivot.getHtml(xLayout, xResponse, xColAxis, xRowAxis); ns.app.centerRegion.update(config.html); + Ext.defer( function() { + Ext.get(ns.core.init.el).fadeIn({ + duration: 400 + }); + }, 300 ); + // after render ns.app.layout = layout; ns.app.xLayout = xLayout; @@ -3028,6 +3034,8 @@ } ns.core = PT.getCore(Ext.clone(init)); + ns.core.init.el = config.el; + Ext.get(ns.core.init.el).setStyle('opacity', 0); extendInstance(ns); ns.app.viewport = createViewport(); === modified file 'dhis-2/dhis-web/dhis-web-portal/india-pom.xml' --- dhis-2/dhis-web/dhis-web-portal/india-pom.xml 2014-04-22 15:46:19 +0000 +++ dhis-2/dhis-web/dhis-web-portal/india-pom.xml 2014-05-12 09:56:39 +0000 @@ -2,21 +2,21 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - + org.hisp.dhis dhis-web 2.16-SNAPSHOT - + dhis-web-india-portal war DHIS Web Portal - + dhis - + @@ -28,6 +28,10 @@ org.hisp.dhis + dhis-api + + + org.hisp.dhis dhis-web-commons @@ -35,6 +39,10 @@ dhis-web-commons-resources war + + org.hisp.dhis + dhis-service-core + @@ -176,26 +184,43 @@ ${project.version} war - - - + + org.hisp.dhis + dhis-web-event-capture + ${project.version} + war + + + org.hisp.dhis + dhis-web-event-reports + ${project.version} + war + + + org.hisp.dhis + dhis-web-tracker-capture + ${project.version} + war + + + org.hisp.dhis + dhis-web-maintenance-appmanager + ${project.version} + war + + + + + org.hisp.dhis - dhis-web-maintenance-ccem - ${project.version} - war - - - org.hisp.dhis - dhis-web-coldchain + dhis-web-maintenance-pbf ${project.version} war - ../../ - === modified file 'dhis-2/dhis-web/dhis-web-sms/src/main/java/org/hisp/dhis/sms/outcoming/SearchPatientAction.java' --- dhis-2/dhis-web/dhis-web-sms/src/main/java/org/hisp/dhis/sms/outcoming/SearchPatientAction.java 2014-04-23 23:45:11 +0000 +++ dhis-2/dhis-web/dhis-web-sms/src/main/java/org/hisp/dhis/sms/outcoming/SearchPatientAction.java 2014-05-12 09:56:39 +0000 @@ -38,7 +38,6 @@ import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.ouwt.manager.OrganisationUnitSelectionManager; import org.hisp.dhis.paging.ActionPagingSupport; -import org.hisp.dhis.program.ProgramInstance; import org.hisp.dhis.program.ProgramService; import org.hisp.dhis.trackedentity.TrackedEntityInstance; import org.hisp.dhis.trackedentity.TrackedEntityInstanceService; @@ -55,7 +54,7 @@ private OrganisationUnitSelectionManager selectionManager; @Autowired - private TrackedEntityInstanceService patientService; + private TrackedEntityInstanceService trackedEntityInstanceService; @Autowired private ProgramService programService; @@ -123,11 +122,12 @@ // List all patients if ( listAll ) { - total = patientService.countGetTrackedEntityInstancesByOrgUnit( organisationUnit ); + //TODO re-implement using TrackedEntityInstanceService.getTrackedEntityInstances( TrackedEntityInstanceQueryParams ) + + //total = patientService.countGetTrackedEntityInstancesByOrgUnit( organisationUnit ); this.paging = createPaging( total ); - patients = new ArrayList( patientService.getTrackedEntityInstances( organisationUnit, paging.getStartPos(), - paging.getPageSize() ) ); + //patients = new ArrayList( patientService.getTrackedEntityInstances( organisationUnit, paging.getStartPos(), paging.getPageSize() ) ); } // search patients @@ -139,10 +139,12 @@ orgunits.add( organisationUnit ); } - total = patientService.countSearchTrackedEntityInstances( searchTexts, orgunits, null, ProgramInstance.STATUS_ACTIVE ); + //TODO re-implement using TrackedEntityInstanceService.getTrackedEntityInstances( TrackedEntityInstanceQueryParams ) + + //total = patientService.countSearchTrackedEntityInstances( searchTexts, orgunits, null, ProgramInstance.STATUS_ACTIVE ); this.paging = createPaging( total ); - patients = patientService.searchTrackedEntityInstances( searchTexts, orgunits, null, null, ProgramInstance.STATUS_ACTIVE, - paging.getStartPos(), paging.getPageSize() ); + //patients = patientService.searchTrackedEntityInstances( searchTexts, orgunits, null, null, ProgramInstance.STATUS_ACTIVE, + // paging.getStartPos(), paging.getPageSize() ); if ( !searchBySelectedOrgunit ) { === modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json' --- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json 2014-04-11 07:13:54 +0000 +++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json 2014-05-12 09:56:39 +0000 @@ -61,5 +61,13 @@ "not_like": "NOT LIKE", "move_to_selected": "Move to selected", "move_all_to_selected": "Move all to selected", - "more": "More" + "more": "More", + "profile": "Profile", + "applications": "Apps", + "more_applications": "More apps", + "settings": "Settings", + "account": "Account", + "help": "Help", + "log_out": "Log out", + "about_dhis2": "About DHIS 2" } \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html' --- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html 2014-04-08 15:37:00 +0000 +++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html 2014-05-12 09:56:39 +0000 @@ -9,8 +9,9 @@ - - + + + @@ -58,11 +59,16 @@ - + + + + + + @@ -71,10 +77,81 @@ + +
          + + + + + + + + + +
          + \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js' --- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js 2014-04-04 11:55:55 +0000 +++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js 2014-05-12 09:56:39 +0000 @@ -21,7 +21,7 @@ delete $httpProvider.defaults.headers.common['X-Requested-With']; $routeProvider.when('/', { - templateUrl:'views/selection.html', + templateUrl:'views/home.html', controller: 'SelectionController' }).when('/dashboard',{ templateUrl:'views/dashboard.html', === modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js' --- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js 2014-04-08 15:37:00 +0000 +++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js 2014-05-12 09:56:39 +0000 @@ -417,8 +417,7 @@ } }); - $scope.programStages = []; - + $scope.programStages = []; angular.forEach($scope.selectedProgram.programStages, function(stage){ $scope.programStages.push(storage.get(stage.id)); }); @@ -433,6 +432,10 @@ }); } }; + + $scope.enroll = function(){ + console.log('Enrollment', $scope.selectedEntity, ' ', $scope.selectedProgram); + }; }) //Controller for the data entry section === modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css' --- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css 2014-04-08 15:37:00 +0000 +++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css 2014-05-12 09:56:39 +0000 @@ -318,7 +318,6 @@ .container-heading { color: white; - padding: 12px; } div.paging a.active === modified file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/tracker-capture-appcache' --- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/tracker-capture-appcache 2014-03-18 10:09:53 +0000 +++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/tracker-capture-appcache 2014-05-12 09:56:39 +0000 @@ -2,8 +2,8 @@ CACHE: ../dhis-web-commons/javascripts/jQuery/jquery.min.js -../dhis-web-commons/javascripts/jQuery/ui/jquery-ui-1.9.1.custom.min.js -../dhis-web-commons/javascripts/jQuery/ui/css/redmond/jquery-ui-1.9.1.custom.css +../dhis-web-commons/javascripts/jQuery/ui/jquery-ui.min.js +../dhis-web-commons/javascripts/jQuery/ui/css/redmond/jquery-ui.css ../dhis-web-commons/fonts/LiberationSans-Regular-webfont.eot ../dhis-web-commons/fonts/LiberationSans-Regular-webfont.woff === added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/home.html' --- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/home.html 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/home.html 2014-05-12 09:56:39 +0000 @@ -0,0 +1,131 @@ + + + +
          +
          +
            +
          +
          + +
          +
          +

          + + {{'search'| translate}} {{selectedProgram.trackedEntity.name}} + + + {{'search_for'| translate}} {{selectedProgram.trackedEntity.name}} + + +

          + +
          + +
          + + + + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          +

          + {{selectedProgram.trackedEntity.name|| 'entity' | translate}} {{'list'| translate}} +

          +
          +
          +

          + {{'empty'| translate}} {{selectedProgram.trackedEntity.name|| 'entity' | translate}} {{'list'| translate}} +

          +
          +
          +

          + {{'empty'| translate}} {{selectedProgram.trackedEntity.name|| 'entity' | translate}} {{'list'| translate}} +

          +
          +
          + + + + + +
          + + + + + + {{gridColumn.name}} + + + + + + + + + + + + + + + +
          + + + + + + +