Home/
 www.icosaedro.it 

 Controllo del codice fiscale e della partita IVA

Ultimo aggiornamento: 2017-09-28

Le funzioni per controllare l'inserimento del codice fiscale e della partita IVA scritte in Bash, C, Delphi, Go, Java, JavaScript, M2, Perl, PHP, Python, Xojo (già REALbasic), Ruby, Smalltalk, Swift e Visual Basic.


ATTENZIONE!

In questa pagina si discute solo di come si verifica il carattere di controllo del codice fiscale e della partita IVA. Non si discute di come si generano questi codici: per avere questa informazione dovrai cercare altrove (in fondo alla pagina, nei riferimenti, ci sono interessanti link al riguardo). Inoltre, il solo fatto che il codice di controllo sia corretto non garantisce che il codice sia esistente né garantisce che corrisponda al soggetto atteso. Lo scopo del carattere di controllo è solo quello di prevenire banali errori di trascrizione.


Indice dei contenuti

Storico degli aggiornamenti
Cosa fanno queste routine
Soluzione con script JavaScript
Miti, superstizioni e falsità
Licenza
Implementazioni in vari linguaggi
Come contribuire
Algoritmi
Riferimenti
Argomenti correlati

Storico degli aggiornamenti

Questo elenco include le nuove implementazioni degli algoritmi in altri linguaggi e le eventuali correzioni alle implementazioni esistenti.

2017-09-28 Realizzate le funzioni di controllo anche in Ruby (contributo di Filippo Zanella).
2017-05-03 Realizzate le funzioni di controllo anche in Go (contributo di Marco Banfi).
2016-12-05 Corretto grave bug introdotto nei sorgenti Javascript e Delphi perché contenevano caratteri non ASCII. I sorgenti si sono corrotti lo scorso luglio nel passaggio al nuovo server quando il programma di trasferimento file ha deciso di convertirli subdolamente in ISO-8859-1 dall'originale UTF-8. Grazie a Marco Banfi per la segnalazione. Con l'occasione ho anche rinnovato il codice delle routines Javascript per renderlo più elegante.
2016-08-21 Realizzate le funzioni di controllo anche in Python (contributo di Gabriele Muciaccia).
2016-03-21 Realizzate le funzioni di controllo anche in Swift (contributo di Rino Setola).
2012-05-12 Aggiornate routine PHP in modo da usare preg_match() al posto della funzione ereg() ormai obsoleta (suggerimento di Niki Romagnoli).
2009-10-15 Corretta funzione P.IVA in REALbasic (Vincenzo).
2009-09-04 Realizzate le funzioni di controllo anche in Smalltalk (contributo di Laura Frigerio).
2007-03-27 Rimosso suggerimento per il controllo del C.F. usando una espressione regolare.
2004-02-16 Suggerimento per il controllo del C.F. usando una espressione regolare (contributo di Alan Lenni).
2003-09-13 Realizzate le funzioni di controllo anche in REALbasic (contributo di Giovanni Gualeni).
2003-06-30 Realizzate le funzioni di controllo anche in Delphi (contributo di Luca Leoncavallo).
2003-05-29 Realizzate le funzioni di controllo anche in Visual Basic (contributo di Carlo Marchesini).
2002-07-27 Descrizione degli algoritmi usati.
2002-04-06 Realizzate le funzioni di controllo anche in Java.
2002-04-06 Realizzate le funzioni di controllo anche in C e Perl.
2001-10-25 Realizzate le funzioni di controllo anche in JavaScript, con la possibilità di provarle on-line in questa stessa pagina.
2001-09-23 Corretta implementazione in bash del controllo codice fiscale.

Cosa fanno queste routine

Riporto qui l'implementazione delle solite funzioni per il controllo del codice fiscale e della partita IVA, utili per validare il data entry nei programmi e nel form del WEB. Sono realizzate in vari linguaggi per il controllo lato server nelle applicazioni WEB e nei programmi stand-alone, e in JavaScript per il controllo lato client nelle applicazioni WEB. Un ringraziamento particolare va a tutti coloro che hanno contribuito con le implementazioni in vari linguaggi.

Queste implementazioni fanno uso delle convenzioni seguenti:

Spesso funzioni di utilità del tipo qui presentate si usano per convalidare l'input dell'utente su di un form HTML: i vari campi di input devono essere controllati uno ad uno, e gli eventuali errori devono essere individuati e segnalati all'utente. E' cosa sana e giusta verificare tutti i campi di input e, se ci sono errori, segnalarli all'utente in una soluzione unica. Un modo semplice per realizzare la cosa è quello di inizializzare una variabile $err alla stringa vuota, e in essa accumulare i messaggi diagnostici man mano che vengono rilevati errori. Al termine dei controlli, se questa variabile è ancora una stringa vuota, allora non ci sono errori nei dati inseriti dall'utente; altrimenti, la variabile stessa contiene l'elenco completo sui problemi trovati.
Esempio in PHP:

    # in $err accumulo tutti i messaggi diagnostici:
    $err = "";

    # controllo i vari campi della maschera di input, accumulando in
    # $err i vari messaggi diagnostici, in modo da proporli in seguito
    # tutti insieme:
    # ...

    # controllo del C.F.:
    if( strlen($cf) == 0 ){
        $err = $err . "<li>Hai omesso il codice fiscale.\n";
    } else {
        $err = $err . ControllaCF($cf);
    }

    if( strlen($err) > 0 ){
        echo("<html><body><h1>ERRORE</h1><ul>$err</ul></body></html>");
        exit(0);
    }

Le routine di controllo del codice fiscale qui proposte si limitano a verificare il carattere di controllo, e al più verificano che siano presenti solo lettere e cifre in un ordine qualsiasi. In generale in certe posizioni del CF ci sono delle lettere, e in altre ci sono delle cifre, ma questo non è sempre vero. Esistono casi di persone diverse che risultano avere CF uguali (omocodie) per cui il ministero sostituisce alcune cifre con delle lettere secondo una particolare tabella fino a risolvere la collisione. Ne segue che non è possibile un controllo più stringente, per esempio tramite una espressione regolare. Le routine presentate in questa pagina hanno l'unica utilità di rilevare eventuali banali errori di trascrizione.

Soluzione con script JavaScript

Il controllo dei dati immessi deve sempre essere eseguito lato server. Tuttavia, per velocizzare l'interazione, è utile eseguire un controllo preventivo anche lato client. Ormai tutti i browser WEB supportano il linguaggio di scripting JavaScript di Netscape: usiamolo! Ecco ad esempio un piccolo strumento di verifica on-line così realizzato: inserire un C.F. o una P.IVA, e il sorgente JavaScript incorporato in questa pagina mostrerà l'esito del controllo:


Codice Fiscale o Partita IVA:

Naturalmente è necessario avere abilitato l'interprete JavaScript nel proprio browser, come di norma è per default. Si può guardare al sorgente di questa pagina per vedere un esempio di impiego di questa soluzione.

Potete fare liberamente le vostre prove: i dati immessi vengono elaborati localmente al vostro computer, e quindi non attraversano la rete nè vengono memorizzati altrove se non nella pagina del vostro browser.


ATTENZIONE!

Se il carattere di controllo risulta "valido" questo NON ASSICURA che il codice fiscale o la partita IVA inserita esistano realmente. Ad esempio la partita IVA 00000000000 costituita da 11 cifre zero risulta "valida" nel senso che l'ultimo carattere è proprio il carattere di controllo corretto per i precedenti 10.


Miti, superstizioni e falsità

Ci sono molte credenze sbagliate intorno alla verifica del C.F. e della P.IVA. Esaminiamo le più comuni.

1. La credenza più comune è che il C.F. si possa costruire una volta noto il nome della persona, il suo sesso e la data e il luogo di nascita. Addirittura ci sono siti WEB e programmi che "costruiscono" il C.F. a partire dai dati anagrafici. Sebbene questi programmi diano spesso la risposta giusta, in generale il valore fornito non è affidabile né potrebbe esserlo, perché solo il Ministero delle Entrate può attribuire questi codici e risolvere le omocodie.

2. Alcuni ritengono che, sebbene gli algoritmi che ricostruiscono il C.F. non possano essere affidabili, la percentuale di errori commessi sia comunque trascurabile, e quindi valga la pena aggiungere comunque anche questo controllo. Questo controllo ulteriore sarebbe utile soprattutto nei siti WEB, in modo da filtrare via le persone che tentano di registrarsi o di fare acquisti fornendo dati fasulli. E' un errore, perché chi vuole fornire dati fasulli ha l'accortezza di fornire dati verosimili e che non destino sospetti, e quindi inventerà l'identità fittizia di un Mario Rossi qualsiasi e fornirà un C.F. apparentemente corretto superando ogni validazione. Invece alcune persone del tutto oneste si vedranno rifiutare l'acquisto o la registrazione perché il loro C.F. risulta non valido secondo questi algoritmi. E' il problema che mi hanno sottoposto alcune persone che, per effetto delle omocodie, hanno delle cifre al posto delle lettere. Ho suggerito a queste persone di segnalare il problema ai gestori del sito e poi cambiare sito WEB. Applicare questi algoritmi di costruzione del C.F. non scoraggia le persone malevoli mentre crea problemi alle persone in buona fede.

3. Alcuni osservano che i primi 6 caratteri del C.F. sono sempre lettere, cui seguono 2 cifre, poi una lettera, ecc. e pertanto sottopongono il C.F. a un controllo ulteriore mediante una espressione regolare. E' un errore che ho fatto anche io. Sempre a causa del problema delle omocodie, al posto delle lettere possono apparire delle cifre. Applicare una regex in questo caso significa ricadere nel problema del punto precedente, cioè penalizzare le persone in buona fede senza impensierire minimamente l'improbabile Mario Rossi nato l'1/1/1900 codice fiscale tarocco MRORSS00A00A000U.

4. Alcuni propongono di sottoporre il C.F. e la P.IVA ad ulteriori controlli di verosimiglianza euristici. Per esempio la P.IVA 00000000000 sembra evidentemente falsa, come anche 44444444440, oppure 12345678903 e molti altri valori "sospetti". Altro errore. Nulla garantisce che qualche persona fisica o giuridica non possegga uno di tali codici ridondanti. Il signor Mario Rossi col C.F. tarocco, oppure la ditta fantasma Truffe & Bidoni s.r.l. forniranno sempre un codice verosimile per non destare sospetti, mentre soggetti del tutto in buona fede ma sfortunatamente dotati di un codice particolarmente "regolare" verranno rifiutati dal programma.

Morale: non aggiungere controlli euristici arbitrari perché:

Licenza

I programmi qui pubblicati sono assolutamente gratuiti (free) e di pubblico dominio per qualsiasi uso; anche i sorgenti sono utilizzabili liberamente e sono di pubblico dominio. Non è necessario citare l'autore o la fonte, sebbene sarebbe deontologicamente corretto farlo. Citare la fonte sarebbe anche utile per facilitare la ricerca di eventuali aggiornamenti e correzioni, che verrebbero pubblicati in questa pagina e citati nello storico che appare all'inizio.

Sebbene io e gli altri autori delle routine abbiamo posto la massima cura nel realizzare questi programmi e nel verificare la loro validità, tuttavia non ci assumiamo nessuna responsabilità nel caso venissero riscontrati malfunzionamenti o altri difetti. Sarò grato a chiunque voglia segnalarmi eventuali problemi riscontrati.

Implementazioni in vari linguaggi

Linguaggio Algoritmo
Codice Fiscale Partita I.V.A.
Bash
C
Delphi (1) (1)
Go (7) (7)
Java
JavaScript
M2
Perl
PHP
Python (6) (6)
Ruby (8) (8)
Smalltalk (3) (3)
Swift (5) (5)
Visual Basic (4) (4)
Xojo (già REALbasic) (2) (2)
1. Contributo di Luca Leoncavallo <lleoncavalloeconb.com>.
2. Contributo di Giovanni Gualeni <ggualenilibero.it>.
3. Contributo di Laura Frigerio <laura.frigeriolifeware.ch>.
4. Contributo di Carlo Marchesini <archmarchesini-it.com>.
5. Contributo di Rino Setola <rinosetolagmail.com>.
6. Contributo di Gabriele Muciaccia <gabrielemuciacciaonenetbeyond.org>.
7. Contributo di Marco Banfi <mbanfigmail.com>.
8. Contributo di Filippo Zanella <filipposellfapp.com>.

Come contribuire

Hai realizzato le routine del controllo CF e PIVA nel linguaggio X e vorresti vederle pubblicate qui? Ecco come fare:

Algoritmi

Ecco la spiegazione degli algoritmi che si usano per la verifica del codice fiscale e della partita iva.

Codice fiscale. E' composto da 16 caratteri alfanumerici. L'ultimo carattere è il carattere di controllo che vogliamo verificare:

1. si pone s=0
2. si considerano i caratteri di posto dispari dal primo al
   quindicesimo e si convertono in numeri secondo questa tabella:

    0 -> 1
    1 -> 0
    2 -> 5
    3 -> 7
    4 -> 9
    5 -> 13
    6 -> 15
    7 -> 17
    8 -> 19
    9 -> 21
    A -> 1
    B -> 0
    C -> 5
    D -> 7
    E -> 9
    F -> 13
    G -> 15
    H -> 17
    I -> 19
    J -> 21
    K -> 2
    L -> 4
    M -> 18
    N -> 20
    O -> 11
    P -> 3
    Q -> 6
    R -> 8
    S -> 12
    T -> 14
    U -> 16
    V -> 10
    W -> 22
    X -> 25
    Y -> 24
    Z -> 23

I numeri corrispondenti a ciascun carattere vanno sommati ad s.

3. si considerano i caratteri di posto pari dal secondo al
   quattordicesimo e si convertono in numeri secondo questa
   tabella:

    0 -> 0
    1 -> 1
    2 -> 2
    ...
    9 -> 9
    A -> 0
    B -> 1
    C -> 2
    ...
    Z -> 25

Notare che alle cifre corrisponde il valore stesso, mentre alle lettere
A-Z corrispondono i numeri 0-25.
I numeri corrispondenti a ciascun carattere vanno sommati ad s.

4. si calcola il resto della divisione di s per 26:
   r=s%26 cioe' r=s-26*int(s/26); risulta un numero tra 0 e 25;
5. si converte r in una lettera associando a 0 la A, a 1 la B, ...,
   a 25 la Z
6. la lettera ottenuta al punto 5 deve corrispondere all'ultimo
   carattere del cod.fiscale (che e' sempre una lettera).
Esempio: ABCDEF12B23P432P
1. s=0
2. s=1+5+9+0+0+7+9+5
3. s=s+1+3+5+2+2+15+3=67
4. r=67%26=15
5. al 15 corrisponde la lettera "P"
6. OK.

Partita I.V.A. E' composta da 11 cifre. L'ultima cifra è il carattere di controllo che vogliamo verificare:

1. si pone s=0
2. sommare ad s le cifre di posto dispari (dalla prima alla nona)
3. per ogni cifra di posto pari (dalla seconda alla decima),
   moltiplicare la cifra per due e, se risulta piu' di 9,
   sottrarre 9; quindi aggiungere il risultato a s;

   ATTENZIONE!   L'operazione "se risulta piu' di 9, sottrarre 9"
   ===========   e' molto simile ma non equivalente al resto modulo 9!
                 Infatti se la cifra e' 9 allora 2*9=18 per cui si
                 sottrae 9 ottenendo ancora 9, mentre (2*9)%9=0 che
                 e' sbagliato.

4. si calcola il resto della divisione di s per 10:
   r=s%10 cioe' r=s-10*int(s/10); risulta un numero tra 0 e 9;
5. se r=0 si pone c=0, altrimenti si pone c=10-r
6. l'ultima cifra del cod. fisc. deve valere c.
Esempio: 12345678903
1. s=0
2. s=1+3+5+7+9=25
3. s=s+4+8+3+7+0=47
4. r=7
5. c=3
6. OK.

Riferimenti

Argomenti correlati


Umberto Salsi
Contatto
Mappa
Home/