← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 10778: add missing file

 

------------------------------------------------------------
revno: 10778
committer: Long <Long@Long-Laptop>
branch nick: dhis2
timestamp: Wed 2013-05-08 08:59:32 +0700
message:
  add missing file
added:
  dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/utils/PatientIdentifierGenerator.java


--
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
=== added file 'dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/utils/PatientIdentifierGenerator.java'
--- dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/utils/PatientIdentifierGenerator.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/utils/PatientIdentifierGenerator.java	2013-05-08 01:59:32 +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.light.utils;
+
+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";
+    }
+}