Spiegazione del significato di ogni singola lettera/cifra del Codice Fiscale con alcune routine in Visual Basic per testarne la validità.

Il codice fiscale è composto da 16 caratteri di cui 15 portano informazioni il 16esimo è un carattere di controllo sui dati precedenti.

Vediamo un esempio:

Rossi Mario nato il 11/02/1979 Cesano Maderno (MI), il codice fiscale è:
RSS	MRA	79	B	11	C566	R	
111	111	00	1	00	1000	1	
La seconda riga va letta in questo modo:
  • un 1 indica la presenza di una lettera in quella posizione
  • uno 0 indica la presenza di un numero in quella posizione
ed è valida per tutti i codici fiscali.

Descrizione (Tabella 1):
  • RSS ricavato dal cognome (solo caratteri)
    per la codifica vedi: Codifica del Cognome
  • MRA ricavato dal nome (solo caratteri)
    per la codifica vedi: Codifica del Nome
  • 79 Ultime due cifre dell’anno di nascita (solo numeri)
  • B Mese di nascita (una lettera) codificato secondo la seguente tabella:
    01 Gennaio A
    02 Febbraio B
    03 Marzo C
    04 Aprile D
    05 Maggio E
    06 Giugno H
    07 Luglio L
    08 Agosto M
    09 Settembre P
    10 Ottobre R
    11 Novembre S
    12 Dicembre T
  • 11 Giorno di nascita (solo numerico) a cui va sommato:
    - se di sesso maschile 0
    - se di sesso femminile 40
  • C566 Codice Erariale del comune di nascita, composto da una lettera seguita da tre cifre
    per trovare i codice erariale vedi Cerca comuni italiani
  • R codice di controllo codificato in base ai caratteri precedenti
    (si tratta di una invenzione della IBM degli anni ‘50, chiamata C.I.N.)
    per la codifica vedi: Calcolo del C.I.N.

Compattazione del Cognome

Si valutano tutti i caratteri che compongono il cognome e si scartano tutti gli spazi e gli eventuali simboli come l’apostrofo, ricostruendo così una stringa composta solo da numeri e da caratteri maiuscoli (la stringa risultante deve essere almeno di 2 caratteri).
Scorrendo la nuova stringa carattere per carattere partendo da sinistra e si creano due stringhe così composte: una contenente tutte le consonanti (strcons) e l’altra tutte le vocali (strvoc).
A questo punto uniamo strcons, strvoc e "X", poi prendiamo i primi tre caratteri di questa nuova stringa, abbiamo ottenuto la codifica del cognome.
In altre parole la codifica avviene prendendo le prime tre consonanti presenti nel cognome o se queste dovessero essere meno di tre, si aggiungono le vocali in modo tale da arrivare a un totale di tre caratteri, sempre dando la priorità a quelle più a sinistra spostandosi poi verso destra.

Compattazione del Nome

La compattazione del nome avviene in due fasi successive:
  • la prima, identica alla compattazione del cognome, che chiamiamo codifica parziale
  • la seconda parte dalla codifica parziale per ottenere la codifica finale e verrà descritta qui di seguito
Seconda fase codifica finale

Se strcons risultante è maggiore di tre:
Avviene prendendo il primo carattere di strcons + strvoc (detta anche codifica parziale) aggiungendogli poi due caratteri partendo però dal terzo (ovvero primo, terzo e quarto carattere) il risultato è la codifica del nome (non so perché e stata aggiunta questa seconda fase, prendiamola per buona).

N.B. Sia il nome che il cognome devono avere un minimo di 2 caratteri.

Compattazione finale del Cognome e del Nome

Si effettua utilizzando la sequenza di seguito indicata:

codif. finale del cognome + codif. finale del nome + strvoc dalla codifica del nome + "X"

prendendo da questo solo i primi sei caratteri partendo da sinistra.

Calcolo del C.I.N.

Il calcolo del CIN (Control Internal Number) avviene attribuendo valori diversi legati ad ogni cifra e alla posizione da questa occupata nel codice fiscale, viene generata univocamente una somma che, divisa per un fattore e moltiplicata per un altro, può essere rappresentata, sotto forma di codice, da una cifra, detta C.I.N.
Vediamo come calcolarlo:
  • Si parte dalla stringa composta da:
    - codice del cognome
    - codice del nome
    - ultime due cifre dell’anno di nascita
    - codifica del mese di nascita
    - giorno di nascita
    - Codice Erariale
  • a questo punto si valuta carattere per carattere:
    - se è una lettera si ricava il codice ASCII e si sottrae 65 (A)
    - e se è una cifra si ricava il codice ASCII e si sottrae 48 (0)
    questo per ricavare sempre un numero compreso tra 0 e 25 (cifra). Controllare inoltre che il carattere o numero trovati siano quelli che ci si aspettava in questa posizione (vedi tabella 1).
  • se si tratta di un carattere in posizione dispari:
    - sommare a CIN il valore ricavato dalla tabella 2, nel seguente modo:
    andare a leggere il valore di cifra nella colonna con la lettera (L) e utilizzare il valore della colonna successiva (V) per sommarlo a totale
  • se si tratta di un carattere in posizione pari:
    - memorizzare nella variabile CIN il valore di cifra
  • ripetere le due frasi precedenti fino al 15esimo carattere
  • applicare la seguente formula a CIN:
    CIN = (CIN - INT(CIN / 26) *26) + 65
    dove INT e una funzione che restituisce il numero privo della parte decimale, mentre 65 e il codice ASCII corrispondente alla lettera ‘A’. CIN restituirà un valore compreso tra 0 e 25 che sommato a 65 darà il codice ASCII di una lettera dell’alfabeto.

Tabella 2
LVLVLVLVLV
A=0001 B=0100 C=0205 D=0307 E=0409
F=0513 G=0615 H=0717 I=0819 J=0921
K=1002 L=1104 M=1218 N=1320 O=1411
P=1503 Q=1606 R=1708 S=1812 T=1914
U=2016 V=2110 W=22 22 X=2325 Y=2424
Z=2523 -- -- -- --

Gestione Omocodia

Per Omocodia si intende la situazione che si verifica quando il codice fiscale, di due o più persone è identico, ovvero il calcolo genera la stessa sequenza di 16 caratteri.

Essendo il codice fiscale univoco, questi casi devono essere gestiti in modo da risultare univoci per ogni persona.

La gestione del conflitto la fa lo Stato, sostituendo, uno o più dei 7 numeri con una lettera, iniziando dai numeri a destra.
In questo modo si ottengono 128 possibili varianti.

I numeri vengono sostituiti secondo questa tabella:
0123456789
LMNPQRSTUV

Programmi di esempio per il calcolo del CIN

VBScript
'Dove cf è una stringa contenente i primi 15 caratteri del codice fiscale da controllare 
'(non gestisce i casi di Omocodia)
Function CalcolaCIN (cf As String) As String
    
    Dim cin As Integer, i As Integer, alterna As Integer, car As Integer
    Dim num  As String * 1
    Const CARATTERIDISPARI = 1
    Const NUMLETT = "111111001001000"	‘ 1 = lettera, 0 = Numero
    Const TD = "0100050709131517192102041820110306081214161022252423"
    alterna = 1

    For i = 1 To 15
        car = Asc(Mid$(cf, i, 1))
        If car > 47 And car < 58 Then			'cifre da 0 a 9
            car = car - 48
            num = "0"
        ElseIf car > 64 And car < 91 Then		'lettere
            car = car - 65
            num = "1"
        Else
            num = "3"
        End If
	
        'se c'é una discordanza sulla posizione lettera/numero
        If num <> Mid$(NUMLETT, i, 1) Then
            'memorizza la posizione dell'errore ed esci, ritorna una stringa > 1 carattere
            CalcolaCIN = Str(i) + "Errore"
            Exit Function
        End If

        If alterna = CARATTERIDISPARI Then
            cin = cin + Val(Mid$(TD, car * 2 + 1, 2))	‘Legge un numero nella stringa TD
            alterna = 0
        Else
            cin = cin + car
            alterna = 1
        End If
    Next i

    cin = (cin - Int(cin / 26) * 26) + 65
    'Ritorna una stringa di un carattere contenente il CIN
    CalcolaCIN = Chr$(cin)
        
End Function

Programmi di esempio per il controllo del Codice Fiscale

VBScript
tmp = codice fiscale completo

    If CalcolaCIN(Left$(tmp, 15)) <> Right$(tmp, 1) Then
        MsgBox ("Errore nel Codice Fiscale")
    Else
        MsgBox ("Codice Fiscale esatto")
    End If 

Programmi di esempio per la codifica della parte contenente la Data

VBScript
' strdata formato =  GGMMAA oppure GGMMAAAA
'passare strdata nel formato ggmmaa o ggmmaaaa
'sesso se = 0 é maschile, se = 1 é femminile
Function DecodificaData (strdata As String, sesso As Integer) As String
Dim i As Integer
    Dim mesi, risultato As String
        
    'MESI CODIFICATI
    Const mesi = "ABCDEHLMPRST"

    risultato = Right$ (strdata, 2)							‘Legge anno
    risultato = risultato + Mid$ (mesi, Val(Mid$(strdata, 3, 2)), 1)			‘codifica mese in lettera
    risultato = risultato + Right$ ("0" + Trim(Str(Val(Left$(strdata, 2)) + 40 * sesso)), 2)	‘legge giorno + sesso * 40

    DecodificaData = risultato							‘data nel formato AAMGG
End Function

Programmi di esempio per l’eliminazione dei simboli

VBScript
'stringa  =  stringa da cui eliminare i simboli
Function EliminaSimboli (stringa As String) As String
    Dim i As Integer, risultato As String, car As String * 1
    
    stringa = UCase$(stringa)
    For i = 1 To Len(stringa)
        car = Mid$(stringa, i, 1)
        If car >= "0" And car <= "Z" Then			'considera solo (?) i numeri e le lettere maiuscole
            risultato = risultato + car
        End If
    Next i
    EliminaSimboli = risultato
End Function

Programmi di esempio per la codifica del nome o del cognome

VBScript
'stringa  =  nome o cognome passati alternativamente
'nc = 1     codifica nome, nc = 0     codifica cognome
Function CodificaCognomeNome (stringa As String, nc As Integer) As String
    Dim i As Integer, vocali As String
    Dim conson As String, car As String * 1
    
    stringa = EliminaSimboli (stringa)
    For i = 1 To Len(stringa)
        car = Mid$(stringa, i, 1)
        If InStr("AEIOU", car) <> 0 Then				'separa le consonanti dalle vocali
            vocali = vocali + car
        Else
            conson = conson + car
        End If
    Next i
    CodificaCognomeNome = Left$(conson + vocali + "X", 3)
    If nc = 1 And Len(conson) > 3 Then				'nome
        CodificaCognomeNome = Left$(conson, 1) + Mid$(conson + vocali, 3, 2) + vocali + "X"
    End If
End Function
Potrebbe interessarti anche: