All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sogei.utility.UCheckDigit Maven / Gradle / Ivy

There is a newer version: 0.7.7.R4
Show newest version
package sogei.utility;

 import java.util.Hashtable;
import java.util.Vector;

 /**
 * Downloaded from http://www.agenziaentrate.gov.it/wps/content/Nsilib/Nsi/Home/CosaDeviFare/Richiedere/Codice+fiscale+e+tessera+sanitaria/Richiesta+TS_CF/SchedaI/Programma+correttezza+formale+CF/
 * @author Sogei S.p.A.
 */
 public class UCheckDigit {
 private String strCodFisc;

 private static Vector vctCd;
 private static Vector vctCp;
 private static Vector vctNd;
 private static Vector vctNp;
 private static Vector vctVm; // vector dei mesi
 private static Hashtable ctr_giorno;

 static {
 creaCarattereDispari();
 creaCaratterePari();
 creaNumeroDispari();
 creaNumeroPari(); 
 creaMese(); 
 crea_ctr_giorno();
 }

 /**
 * Costruttore della classe.
 */
 public UCheckDigit (String g ) {

 strCodFisc = g;
 }
 /**
 * @return boolean
 */
 public boolean controllaCheckDigit( ) {
 int intAppoggio = 0;
 char chrCarattereEsaminato;

 // Ciclo di conteggio dei valori sui primi 15 caratteri del codice fiscale
 for (int i=0; i<15; i++)
 {
 chrCarattereEsaminato = getCodFisc().charAt(i);
 String strElem = getCodFisc().substring(i,i+1);
 int intResto = (i % 2);
 switch (intResto)
 { 
 case 0:
 if (Character.isDigit(chrCarattereEsaminato) == false)
 {
 intAppoggio += getVectCarDisp(strElem);
 }
 else
 { 
 intAppoggio += getVectNumDisp(strElem);
 } 
 break; 
 case 1:
 if (Character.isDigit(chrCarattereEsaminato) == false)
 {
 intAppoggio += getVectCarPari(strElem);
 }
 else
 { 
 intAppoggio += getVectNumPari(strElem);
 } 
 break; 
 default:
 break;

 }
 } 

 // Estraggo il carattere di controllo
 String ceckdigit = getCodFisc().substring(15,16);
 return (intAppoggio % 26) == getVectCarPari(ceckdigit);
 }
 /**
 * @return boolean
 */
 public boolean controllaCorrettezza() {
 if (controllaCorrettezzaChar() == '0')
 return true;
 else 
 return false;
 }
 /**
 * @return char
 */
 public char controllaCorrettezzaChar () {
 boolean bolLettera = false;

 for (int i=0; i<6; i++) 
 {
 if (!(strCodFisc.charAt(i) == 'A' || strCodFisc.charAt(i) == 'B' || strCodFisc.charAt(i) == 'C'  // controllo dei primi 6 caratteri alfabetici
 || strCodFisc.charAt(i) == 'D' || strCodFisc.charAt(i) == 'E' || strCodFisc.charAt(i) == 'F'
 || strCodFisc.charAt(i) == 'G' || strCodFisc.charAt(i) == 'H' || strCodFisc.charAt(i) == 'I'
 || strCodFisc.charAt(i) == 'J' || strCodFisc.charAt(i) == 'K' || strCodFisc.charAt(i) == 'L'
 || strCodFisc.charAt(i) == 'M' || strCodFisc.charAt(i) == 'N' || strCodFisc.charAt(i) == 'O'
 || strCodFisc.charAt(i) == 'P' || strCodFisc.charAt(i) == 'Q' || strCodFisc.charAt(i) == 'R'
 || strCodFisc.charAt(i) == 'S' || strCodFisc.charAt(i) == 'T' || strCodFisc.charAt(i) == 'U'
 || strCodFisc.charAt(i) == 'V' || strCodFisc.charAt(i) == 'W' || strCodFisc.charAt(i) == 'X'
 || strCodFisc.charAt(i) == 'Y' || strCodFisc.charAt(i) == 'Z'
 ))

return '2'; 
 } 

 for (int i=6; i<8; i++)
 {

 if (!(Character.isDigit(strCodFisc.charAt(i))) &&
 ((strCodFisc.charAt(i) != 'L') && (strCodFisc.charAt(i) != 'M') && 
 (strCodFisc.charAt(i) != 'N') && (strCodFisc.charAt(i) != 'P') && 
 (strCodFisc.charAt(i) != 'Q') && (strCodFisc.charAt(i) != 'R') && 
 (strCodFisc.charAt(i) != 'S') && (strCodFisc.charAt(i) != 'T') && 
 (strCodFisc.charAt(i) != 'U') && (strCodFisc.charAt(i) != 'V'))) 
 return '2';
 }

 if (! 
 ((strCodFisc.charAt(8) == 'A') || (strCodFisc.charAt(8) == 'B') || // controllo del mese
 (strCodFisc.charAt(8) == 'C') || (strCodFisc.charAt(8) == 'D') || 
 (strCodFisc.charAt(8) == 'E') || (strCodFisc.charAt(8) == 'H') || 
 (strCodFisc.charAt(8) == 'L') || (strCodFisc.charAt(8) == 'M') || 
 (strCodFisc.charAt(8) == 'P') || (strCodFisc.charAt(8) == 'R') || 
 (strCodFisc.charAt(8) == 'S') || (strCodFisc.charAt(8) == 'T'))
 )
 return '2';

 for (int i=9; i<11; i++) 
 {

 if (!(Character.isDigit(strCodFisc.charAt(i))) &&
 ((strCodFisc.charAt(i) != 'L') && (strCodFisc.charAt(i) != 'M') && 
 (strCodFisc.charAt(i) != 'N') && (strCodFisc.charAt(i) != 'P') && 
 (strCodFisc.charAt(i) != 'Q') && (strCodFisc.charAt(i) != 'R') && 
 (strCodFisc.charAt(i) != 'S') && (strCodFisc.charAt(i) != 'T') && 
 (strCodFisc.charAt(i) != 'U') && (strCodFisc.charAt(i) != 'V'))) 
 return '2';
 }

 int intGiorno = trasforma_giorno(9); // controllo formale del giorno

 if (intGiorno > 31)
 intGiorno -= 40; 
 if (intGiorno <1 || intGiorno > 31)
 return '2';

 String strElem = strCodFisc.substring(8,9); // lettera del mese
 String strMese = String.valueOf(getVectMese(strElem)); // valore della lettera del mese 
 if (strMese.length() == 1) // se mese ha una sola cifra
 strMese = "0" + strMese; // viene aggiunto uno zero

 String strAnno = String.valueOf(trasforma_giorno(6));
 if (strAnno.length() == 1) // viene aggiunto uno zero
 strAnno = "0" + strAnno;
 String strGiorno = String.valueOf(intGiorno); // se giorno ha una sola cifra
 if (strGiorno.length() == 1) // viene aggiunto uno zero
 strGiorno = "0" + strGiorno; 

 String data = strGiorno + strMese + strAnno; // controllo dell'intera data

 if (!(controllaData(data)))
 return'2' ;
 if (
 ((strCodFisc.charAt(11) != 'A') && (strCodFisc.charAt(11) != 'B') &&
 // controllo del 1° carattere
 (strCodFisc.charAt(11) != 'C') && (strCodFisc.charAt(11) != 'D') &&
 // del codice catastale
 (strCodFisc.charAt(11) != 'E') && (strCodFisc.charAt(11) != 'F') &&

 (strCodFisc.charAt(11) != 'G') && (strCodFisc.charAt(11) != 'H') &&

 (strCodFisc.charAt(11) != 'I') && (strCodFisc.charAt(11) != 'L') &&

 (strCodFisc.charAt(11) != 'M') && (strCodFisc.charAt(11) != 'Z'))
 )
 return '2';

 for (int i=12; i<15; i++)
 {
 if (!(Character.isDigit(strCodFisc.charAt(i))))
 {bolLettera = true;
 if ((strCodFisc.charAt(i) != 'L') && (strCodFisc.charAt(i) != 'M') && // controllo
 (strCodFisc.charAt(i) != 'N') && (strCodFisc.charAt(i) != 'P') && // del codice catastale 
 (strCodFisc.charAt(i) != 'Q') && (strCodFisc.charAt(i) != 'R') && 
 (strCodFisc.charAt(i) != 'S') && (strCodFisc.charAt(i) != 'T') && 
 (strCodFisc.charAt(i) != 'U') && (strCodFisc.charAt(i) != 'V')) 
 return '3';
 } 
 } 

 if (bolLettera == false)
 { 
 int intNumeroCodCat = Integer.parseInt(strCodFisc.substring(12,15));

 if (intNumeroCodCat == 000)
 return '2';

 }

 if (controllaCheckDigit())
 return '0';
 return '1';

 }
 /**
 * @return int
 */
 public int controllaCorrettezzaInt() {
 return ((char)controllaCorrettezzaChar() - 48);
 }
 /**
 * @return boolean
 */
 public boolean controllaData(String s) {


 //controllo l'anno dopo averlo estrapolato dalla stringa
 try {
 String strAnno = s.substring(4,s.length()); 
 if ((s.length() == 8) || (s.length() == 6))
 { if (s.length() == 6)
 {strAnno = "19" + s ;}
 if (Integer.parseInt(strAnno) < 1870)
 {return false;}
 } 
 else
 {
 return false;

 }

 //Estrapolazione mese e giorno
 String strMese = s.substring(2,4);
 String strGiorno = s.substring(0,2);

 //Trasformazione delle stringhe in interi
 int intMese = Integer.parseInt(strMese);
 int intGiorno = Integer.parseInt(strGiorno);
 int intAnno = Integer.parseInt(strAnno);

 //controlli di ammissibilità sul giorno e sul mese
 if ((intMese > 12) || (intGiorno > 31) || (intMese < 1) || (intGiorno < 1))
 {return false;}

 //controllo mese
 switch (intMese) {
 //febbraio
 case 2:
 boolean bisestile = false;
 if (intAnno % 4 == 0)
 {
 if (intAnno % 400 == 0)
 {
 if (intAnno % 1000 == 0)
 {
 bisestile = true;
 }
 }
 else
 {
 bisestile = true;
 }
 } 
 if ( (bisestile && (intGiorno > 29)) || (!bisestile && (intGiorno > 28)) )
 {return false;}
 break;
 //aprile
 case 4:
 if (intGiorno > 30)
 {return false;}
 break;
 //giugno
 case 6:
 if (intGiorno > 30)
 {return false;}
 break;
 //settembre
 case 9:
 if (intGiorno > 30)
 {return false;}
 break;
 //novembre 
 case 11:
 if (intGiorno > 30)
 {return false;}
 break; 

 default:
 break;}
 //se arrivo a questo punto vuol dire che la data è corretta 
 return true;
 }
 catch(Exception e) { return false; } 
 }
 /**
 * Tabella (di tipo Vector) dei valori dei caratteri con posizione di ordine dispari.
 */
 public static Vector creaCarattereDispari() {

 vctCd= new Vector(); 

 vctCd.addElement("B"); //valore dei caratteri dispari
 vctCd.addElement("A");
 vctCd.addElement("K");
 vctCd.addElement("P");
 vctCd.addElement("L");
 vctCd.addElement("C");
 vctCd.addElement("Q");
 vctCd.addElement("D");
 vctCd.addElement("R");
 vctCd.addElement("E");
 vctCd.addElement("V");
 vctCd.addElement("O");
 vctCd.addElement("S");
 vctCd.addElement("F");
 vctCd.addElement("T");
 vctCd.addElement("G");
 vctCd.addElement("U");
 vctCd.addElement("H");
 vctCd.addElement("M");
 vctCd.addElement("I");
 vctCd.addElement("N");
 vctCd.addElement("J");
 vctCd.addElement("W");
 vctCd.addElement("Z");
 vctCd.addElement("Y");
 vctCd.addElement("X");


 return vctCd;
 }
 /**
 * Tabella (di tipo Vector) dei valori dei caratteri con posizione di ordine pari.
 */
 public static Vector creaCaratterePari( ) {
 vctCp = new Vector();

 vctCp.addElement("A"); //valore dei caratteri pari
 vctCp.addElement("B");
 vctCp.addElement("C");
 vctCp.addElement("D");
 vctCp.addElement("E");
 vctCp.addElement("F");
 vctCp.addElement("G");
 vctCp.addElement("H");
 vctCp.addElement("I");
 vctCp.addElement("J");
 vctCp.addElement("K");
 vctCp.addElement("L");
 vctCp.addElement("M");
 vctCp.addElement("N");
 vctCp.addElement("O");
 vctCp.addElement("P");
 vctCp.addElement("Q");
 vctCp.addElement("R");
 vctCp.addElement("S");
 vctCp.addElement("T");
 vctCp.addElement("U");
 vctCp.addElement("V");
 vctCp.addElement("W");
 vctCp.addElement("X");
 vctCp.addElement("Y");
 vctCp.addElement("Z");

 return vctCp;
 }
 /**
 * @return vector
 */
 public static Vector creaMese ( ) {
 vctVm = new Vector();

 vctVm.addElement(" "); 
 vctVm.addElement("A"); // gennaio 
 vctVm.addElement("B"); // febbraio
 vctVm.addElement("C"); // marzo
 vctVm.addElement("D"); // aprile
 vctVm.addElement("E"); // maggio
 vctVm.addElement("H"); // giugno
 vctVm.addElement("L"); // luglio 
 vctVm.addElement("M"); // agosto
 vctVm.addElement("P"); // settembre
 vctVm.addElement("R"); // ottobre
 vctVm.addElement("S"); // novembre
 vctVm.addElement("T"); // dicembre

 return vctVm; 
 }
 /**
 * Tabella (di tipo Vector) dei valori dei numeri con posizione di ordine dispari.
 */
 public static Vector creaNumeroDispari ( ) {
 vctNd = new Vector();

 vctNd.addElement("1"); //valore dei numeri dispari
 vctNd.addElement("0");
 vctNd.addElement(" ");
 vctNd.addElement(" ");
 vctNd.addElement(" ");
 vctNd.addElement("2");
 vctNd.addElement(" ");
 vctNd.addElement("3");
 vctNd.addElement(" ");
 vctNd.addElement("4");
 vctNd.addElement(" ");
 vctNd.addElement(" ");
 vctNd.addElement(" ");
 vctNd.addElement("5");
 vctNd.addElement(" ");
 vctNd.addElement("6");
 vctNd.addElement(" ");
 vctNd.addElement("7");
 vctNd.addElement(" ");
 vctNd.addElement("8");
 vctNd.addElement(" ");
 vctNd.addElement("9");

 return vctNd;
 }

 public static Hashtable crea_ctr_giorno ( ) {
 ctr_giorno = new Hashtable();
 ctr_giorno.put("L", 0);
 ctr_giorno.put("M", 1);
 ctr_giorno.put("N", 2);
 ctr_giorno.put("P", 3);
 ctr_giorno.put("Q", 4);
 ctr_giorno.put("R", 5);
 ctr_giorno.put("S", 6);
 ctr_giorno.put("T", 7);
 ctr_giorno.put("U", 8);
 ctr_giorno.put("V", 9);


 return ctr_giorno;
 }
 /**
 * Tabella (di tipo Vector) dei valori dei numeri con posizione di ordine pari.
 */
 public static Vector creaNumeroPari( ) {
 vctNp = new Vector();

 vctNp.addElement("0"); //valore dei numeri pari
 vctNp.addElement("1");
 vctNp.addElement("2");
 vctNp.addElement("3");
 vctNp.addElement("4");
 vctNp.addElement("5");
 vctNp.addElement("6");
 vctNp.addElement("7");
 vctNp.addElement("8");
 vctNp.addElement("9");

 return vctNp;
 }
 /**
 * Questo metodo prende il codice fiscale come parametro e torna una stringa.
 * @return java.lang.String
 */
 public String getCodFisc ( ) {
 String s = new String (this.strCodFisc);
 return s;
 }

 /**
 * Calcola valore del carattere dispari.
 */
 public int getVectCarDisp (String elem ) {

 return vctCd.indexOf(elem);


 }
 /**
 * Calcola valore del carattere pari.
 * @return int
 */
 public int getVectCarPari (String elem) {
 return vctCp.indexOf(elem);

 }
 /**
 * @return int
 * @param elem java.lang.String
 */
 public int getVectMese(String stringa) {

 return vctVm.indexOf(stringa);
 }
 /**
 * Calcola valore del numero dispari.
 * @return int
 */
 public int getVectNumDisp (String elem) {
 return vctNd.indexOf(elem);
 }
 /**
 *Calcola valore del numero pari.
 * @return int
 */
 public int getVectNumPari (String elem) {
 return vctNp.indexOf(elem);
 }
 /**
 * Inizializzazione di un codice fiscale come stringa.
 * @param s java.lang.String
 */
 public void setCodFisc ( String s) {
 this.strCodFisc = new String(s);
 return;
 }
 public Hashtable getCtr_giorno() {
 return ctr_giorno;
 }
 public void setCtr_giorno(Hashtable ctr_giorno) {
 UCheckDigit.ctr_giorno = ctr_giorno;
 }

 /*
 * c=byte campo substring
 * 9 giorno
 * 6 anno
 */
 public int trasforma_giorno(int c){

 String appo="";

 for (int i=c; i




© 2015 - 2024 Weber Informatics LLC | Privacy Policy