------------------------------------------------------------ revno: 10857 committer: Tran Chau <tran.hispviet...@gmail.com> branch nick: dhis2 timestamp: Thu 2013-05-16 15:06:31 +0700 message: Reorganize code to generate patient-system-identifier in tracker module. removed: dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/PatientIdentifierGenerator.java dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/idgen/ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/idgen/PatientIdentifierGenerator.java added: dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/util/ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/util/PatientIdentifierGenerator.java modified: dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/ActivityReportingServiceImpl.java dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddPatientAction.java dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddRelationshipPatientAction.java dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddRepresentativeAction.java dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/viewDataEntryForm.vm
-- lp:dhis2 https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk Your team DHIS 2 developers is subscribed to branch lp:dhis2. To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== 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 2013-05-16 03:53:39 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/ActivityReportingServiceImpl.java 2013-05-16 08:06:31 +0000 @@ -66,6 +66,7 @@ import org.hisp.dhis.patient.PatientIdentifierTypeService; import org.hisp.dhis.patient.PatientMobileSetting; import org.hisp.dhis.patient.PatientService; +import org.hisp.dhis.patient.util.PatientIdentifierGenerator; import org.hisp.dhis.patientattributevalue.PatientAttributeValue; import org.hisp.dhis.patientattributevalue.PatientAttributeValueService; import org.hisp.dhis.patientdatavalue.PatientDataValue; === removed file 'dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/PatientIdentifierGenerator.java' --- dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/PatientIdentifierGenerator.java 2013-05-16 03:53:39 +0000 +++ dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/PatientIdentifierGenerator.java 1970-01-01 00:00:00 +0000 @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2004-2009, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.hisp.dhis.mobile.service; - -import java.text.DecimalFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Random; - -/** - * @author Viet - */ -public class PatientIdentifierGenerator -{ - /** - * Creates a new Patient Identifier: (BirthDate)(Gender)(XXXXXX)(checkdigit) <br> - * <strong>BirthDate</strong> = YYYYMMDD <br> - * <strong>Gender</strong> = Male : 1 | Female : 0<br> - * <strong>XXXXXX</strong> = random digits e.g. from 0 - 999999 <br> - * <strong>checkdigit</strong>= using the Lunh Algorithm - * - * @param birthDate - * @param gender - * @return - */ - public static String getNewIdentifier( Date birthDate, String gender ) - { - String noCheck = formatDate( birthDate ) + formatGender( gender ) - + getFixLengthOfNumber( new Random().nextInt( 100000 ), 6 ); - return noCheck + getCheckdigit( noCheck ); - } - - /** - * Using the Luhn Algorithm to generate check digits - * - * @param idWithoutCheckdigit - * @return idWithCheckdigit - */ - private static int getCheckdigit( String idWithoutCheckdigit ) - { - idWithoutCheckdigit = idWithoutCheckdigit.trim().toUpperCase(); - int sum = 0; - for ( int i = 0; i < idWithoutCheckdigit.length(); i++ ) - { - char ch = idWithoutCheckdigit.charAt( idWithoutCheckdigit.length() - i - 1 ); - - int digit = ch - 48; - int weight; - if ( i % 2 == 0 ) - { - weight = (2 * digit) - (digit / 5) * 9; - } - else - { - weight = digit; - } - sum += weight; - } - sum = Math.abs( sum ) + 10; - return (10 - (sum % 10)) % 10; - } - - public static boolean isValidCC( String num ) - { - final int[][] sumTable = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, { 0, 2, 4, 6, 8, 1, 3, 5, 7, 9 } }; - int sum = 0, flip = 0; - - for ( int i = num.length() - 1; i >= 0; i--, flip++ ) - sum += sumTable[flip & 0x1][num.charAt( i ) - '0']; - return sum % 10 == 0; - } - - private static String getFixLengthOfNumber( long number, int length ) - { - int i = 0; - String pattern = ""; - if ( length == 0 ) - pattern = "000000"; - while ( i < length && length > 0 ) - { - pattern += "0"; - i++; - } - DecimalFormat df = new DecimalFormat( pattern ); - return df.format( number ); - } - - private static String formatDate( Date birthDate ) - { - SimpleDateFormat formater = new SimpleDateFormat( "yyyyMMdd" ); - String bd = formater.format( birthDate ); - return bd; - } - - private static String formatGender( String gender ) - { - return gender.equalsIgnoreCase( "f" ) ? "0" : "1"; - } -} === added directory 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/util' === added file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/util/PatientIdentifierGenerator.java' --- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/util/PatientIdentifierGenerator.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/util/PatientIdentifierGenerator.java 2013-05-16 08:06:31 +0000 @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2004-2009, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.hisp.dhis.patient.util; + +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +/** + * @author Viet + */ +public class PatientIdentifierGenerator +{ + /** + * Creates a new Patient Identifier: (BirthDate)(Gender)(XXXXXX)(checkdigit) <br> + * <strong>BirthDate</strong> = YYYYMMDD <br> + * <strong>Gender</strong> = Male : 1 | Female : 0<br> + * <strong>XXXXXX</strong> = random digits e.g. from 0 - 999999 <br> + * <strong>checkdigit</strong>= using the Lunh Algorithm + * + * @param birthDate + * @param gender + * @return + */ + public static String getNewIdentifier( Date birthDate, String gender ) + { + String noCheck = formatDate( birthDate ) + formatGender( gender ) + + getFixLengthOfNumber( new Random().nextInt( 100000 ), 6 ); + return noCheck + getCheckdigit( noCheck ); + } + + /** + * Using the Luhn Algorithm to generate check digits + * + * @param idWithoutCheckdigit + * @return idWithCheckdigit + */ + private static int getCheckdigit( String idWithoutCheckdigit ) + { + idWithoutCheckdigit = idWithoutCheckdigit.trim().toUpperCase(); + int sum = 0; + for ( int i = 0; i < idWithoutCheckdigit.length(); i++ ) + { + char ch = idWithoutCheckdigit.charAt( idWithoutCheckdigit.length() - i - 1 ); + + int digit = ch - 48; + int weight; + if ( i % 2 == 0 ) + { + weight = (2 * digit) - (digit / 5) * 9; + } + else + { + weight = digit; + } + sum += weight; + } + sum = Math.abs( sum ) + 10; + return (10 - (sum % 10)) % 10; + } + + public static boolean isValidCC( String num ) + { + final int[][] sumTable = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, { 0, 2, 4, 6, 8, 1, 3, 5, 7, 9 } }; + int sum = 0, flip = 0; + + for ( int i = num.length() - 1; i >= 0; i--, flip++ ) + sum += sumTable[flip & 0x1][num.charAt( i ) - '0']; + return sum % 10 == 0; + } + + private static String getFixLengthOfNumber( long number, int length ) + { + int i = 0; + String pattern = ""; + if ( length == 0 ) + pattern = "000000"; + while ( i < length && length > 0 ) + { + pattern += "0"; + i++; + } + DecimalFormat df = new DecimalFormat( pattern ); + return df.format( number ); + } + + private static String formatDate( Date birthDate ) + { + SimpleDateFormat formater = new SimpleDateFormat( "yyyyMMdd" ); + String bd = formater.format( birthDate ); + return bd; + } + + private static String formatGender( String gender ) + { + return gender.equalsIgnoreCase( "f" ) ? "0" : "1"; + } +} === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddPatientAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddPatientAction.java 2013-04-22 08:18:41 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddPatientAction.java 2013-05-16 08:06:31 +0000 @@ -37,7 +37,6 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.struts2.ServletActionContext; -import org.hisp.dhis.caseentry.idgen.PatientIdentifierGenerator; import org.hisp.dhis.caseentry.state.SelectedStateManager; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.organisationunit.OrganisationUnit; @@ -52,6 +51,7 @@ import org.hisp.dhis.patient.PatientIdentifierType; import org.hisp.dhis.patient.PatientIdentifierTypeService; import org.hisp.dhis.patient.PatientService; +import org.hisp.dhis.patient.util.PatientIdentifierGenerator; import org.hisp.dhis.patientattributevalue.PatientAttributeValue; import org.hisp.dhis.user.UserService; === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddRelationshipPatientAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddRelationshipPatientAction.java 2012-10-03 08:45:36 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddRelationshipPatientAction.java 2013-05-16 08:06:31 +0000 @@ -33,6 +33,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.struts2.ServletActionContext; +import org.hisp.dhis.caseentry.state.SelectedStateManager; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.patient.Patient; @@ -45,8 +46,7 @@ import org.hisp.dhis.patient.PatientIdentifierType; import org.hisp.dhis.patient.PatientIdentifierTypeService; import org.hisp.dhis.patient.PatientService; -import org.hisp.dhis.caseentry.idgen.PatientIdentifierGenerator; -import org.hisp.dhis.caseentry.state.SelectedStateManager; +import org.hisp.dhis.patient.util.PatientIdentifierGenerator; import org.hisp.dhis.patientattributevalue.PatientAttributeValue; import org.hisp.dhis.patientattributevalue.PatientAttributeValueService; import org.hisp.dhis.relationship.Relationship; === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddRepresentativeAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddRepresentativeAction.java 2012-05-29 15:37:40 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/patient/AddRepresentativeAction.java 2013-05-16 08:06:31 +0000 @@ -42,7 +42,7 @@ import org.hisp.dhis.patient.PatientIdentifierType; import org.hisp.dhis.patient.PatientIdentifierTypeService; import org.hisp.dhis.patient.PatientService; -import org.hisp.dhis.caseentry.idgen.PatientIdentifierGenerator; +import org.hisp.dhis.patient.util.PatientIdentifierGenerator; import com.opensymphony.xwork2.Action; === removed directory 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/idgen' === removed file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/idgen/PatientIdentifierGenerator.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/idgen/PatientIdentifierGenerator.java 2013-04-04 18:06:19 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/idgen/PatientIdentifierGenerator.java 1970-01-01 00:00:00 +0000 @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2004-2009, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.hisp.dhis.caseentry.idgen; - -import java.text.DecimalFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Random; - -/** - * @author Viet - */ -public class PatientIdentifierGenerator -{ - /** - * Creates a new Patient Identifier: (BirthDate)(Gender)(XXXXXX)(checkdigit) <br> - * <strong>BirthDate</strong> = YYYYMMDD <br> - * <strong>Gender</strong> = Male : 1 | Female : 0<br> - * <strong>XXXXXX</strong> = random digits e.g. from 0 - 999999 <br> - * <strong>checkdigit</strong>= using the Lunh Algorithm - * - * @param birthDate - * @param gender - * @return - */ - public static String getNewIdentifier( Date birthDate, String gender ) - { - String noCheck = formatDate( birthDate ) + formatGender( gender ) - + getFixLengthOfNumber( new Random().nextInt( 100000 ), 6 ); - return noCheck + getCheckdigit( noCheck ); - } - - /** - * Using the Luhn Algorithm to generate check digits - * - * @param idWithoutCheckdigit - * @return idWithCheckdigit - */ - private static int getCheckdigit( String idWithoutCheckdigit ) - { - idWithoutCheckdigit = idWithoutCheckdigit.trim().toUpperCase(); - int sum = 0; - for ( int i = 0; i < idWithoutCheckdigit.length(); i++ ) - { - char ch = idWithoutCheckdigit.charAt( idWithoutCheckdigit.length() - i - 1 ); - - int digit = ch - 48; - int weight; - if ( i % 2 == 0 ) - { - weight = (2 * digit) - (digit / 5) * 9; - } - else - { - weight = digit; - } - sum += weight; - } - sum = Math.abs( sum ) + 10; - return (10 - (sum % 10)) % 10; - } - - public static boolean isValidCC( String num ) - { - final int[][] sumTable = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, { 0, 2, 4, 6, 8, 1, 3, 5, 7, 9 } }; - int sum = 0, flip = 0; - - for ( int i = num.length() - 1; i >= 0; i--, flip++ ) - sum += sumTable[flip & 0x1][num.charAt( i ) - '0']; - return sum % 10 == 0; - } - - private static String getFixLengthOfNumber( long number, int length ) - { - int i = 0; - String pattern = ""; - if ( length == 0 ) - pattern = "000000"; - while ( i < length && length > 0 ) - { - pattern += "0"; - i++; - } - DecimalFormat df = new DecimalFormat( pattern ); - return df.format( number ); - } - - private static String formatDate( Date birthDate ) - { - SimpleDateFormat formater = new SimpleDateFormat( "yyyyMMdd" ); - String bd = formater.format( birthDate ); - return bd; - } - - private static String formatGender( String gender ) - { - return gender.equalsIgnoreCase( "f" ) ? "0" : "1"; - } -} === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/viewDataEntryForm.vm' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/viewDataEntryForm.vm 2013-05-16 07:31:48 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/webapp/dhis-web-maintenance-patient/viewDataEntryForm.vm 2013-05-16 08:06:31 +0000 @@ -112,9 +112,6 @@ #if(!$dataElements.isEmpty()) <button type="button" id='insertDataElements' onclick="openDataElementSelector()">$i18n.getString( 'insert_data_elements' )</button> #end - #if(!$programStages.isEmpty()) - <button type="button" id='insertOtherDataElements' onclick="openOtherProgramStageDataElements()">$i18n.getString( 'other_program_stage_data_element')</button> - #end <button type="button" id="insertImagesButton">$i18n.getString( 'insert_images' )</button> #if( $!dataEntryForm ) @@ -181,7 +178,9 @@ </tr> <tr> <td colspan='2'><hr/> + #if(!$programStages.isEmpty()) <input type="button" value="$i18n.getString('other_program_stages')" onclick="hideById('dataElementSelection');showById('otherProgramStageDataElements');" > + #end <input type="button" id="insertButton" value="$i18n.getString('insert')" onclick="insertDataElement( '#dataElementSelection', '$programStage.uid')" style="width:100px"> </td> </tr>
_______________________________________________ Mailing list: https://launchpad.net/~dhis2-devs Post to : dhis2-devs@lists.launchpad.net Unsubscribe : https://launchpad.net/~dhis2-devs More help : https://help.launchpad.net/ListHelp