Home/
 www.icosaedro.it 

 Controllo del codice fiscale e della partita IVA

Ultimo aggiornamento: 2009-09-04

Le funzioni per controllare l'inserimento del codice fiscale e della partita IVA scritte in Bash, C, Delphi, Java, JavaScript, M2, Perl, PHP, REALbasic, Smalltalk 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.


Storico degli aggiornamenti

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'anonimo 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.N.C. forniranno sempre un codice verosimile per non destare sospetti, mentre soggetti del tutto in buona fede ma sfortunatamente dotati di un codice particolarmente "simmetrico" verranno rifiutati dal programma.

Morale: non aggiungere controlli 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.

DOWNLOAD

Linguaggio Algoritmo
Codice Fiscale Partita I.V.A.
Bash
C
Delphi (1) (1)
Java
JavaScript
M2
Perl
PHP
REALbasic (2) (2)
Smalltalk (3) (3)
Visual Basic (4) (4)
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>.

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;
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=47
4. r=7
5. c=3
6. OK.

Riferimenti

Argomenti correlati


Umberto Salsi

Contatto
Mappa
Home/

Segue un estratto degli ultimi commenti lasciati dai visitatori di questa pagina WEB. Usare il link Commenti qui sopra per leggere tutti i messaggi o inviare il tuo contributo.

2010-07-08 by Anonymous
correttezza del CF
Io credo che sia comunque importante fornire uno strumento di controllo della correttezza del CF a patto però che in caso di non superamento di esso si limiti ad un avvertimento. Mostro un ipotetico scenario: una persona che si chiama CARLO ALBERTO ROSSI (nome inventato)per associarsi ad un centro XXX deve compilare i dati per la privacy: siccome questa persona viene regolarmente chiamata CARLO, [...]

2010-02-26 by Anonymous
Il controllo di P.IVA e la Repubblica di San Marino
Volevo ricordare a quanti hanno letto questo interessantissimo articolo (per cui ringrazio l'autore) che l'algoritmo per il controllo della Partiva Iva ha ovviamente senso solo per Partita IVA italiana. Recentemente mi sono imbattuto in una partiva iva della Repubblica di San Marino che ha il formato SM12345 (ovvero SM+5 numeri!) di cui ignoro la validazione. Restano quindi sempre valide le [...]

2009-08-03 by Anonymous
codice fiscale - ulteriore restrizione nel check
l' algoritmo proposto dorebbe validare anche questo codice fiscale errato: TLSHLH77RO8Z249T dove al posta di zero otto e' scritto lettera O otto. Dal sito dell' agenzia delle entrare a http://www.agenziaentrate.it/ilwwcm/connect/Nsi/Documentazione/Guide+Fiscali/Annuario+2008+guida/4_Codice_fscale_e_tessera_sanitaria.html dove parla di omocodia si legge: La distinzione avviene effettuando, [...]

2009-04-14 by Umberto Salsi
Re: miglioramento alla funzione
Anonymous wrote: [...] Secondo il mio modo di pensare, i casi sono due: o l'operatore ha introdotto un dato corretto oppure è sbagliato. Se il dato è corretto, allora il programma deve accettarlo senza ulteriori modifiche o artefatti. Se invece il dato è sbagliato, allora il programma deve rifiutarlo con motivazione, e quindi deve riproporre all'operatore il dato sbagliato esattamente così come [...]

2009-03-23 by Anonymous
miglioramento alla funzione
Dato che spessissimo gli utenti inseriscono il CF esattamente come compare (cioè con gli spazi) basta inserire una piccola modifica per migliorare l'efficacia della funzione php. nella funzione che ho implementato ho inserito l'errore in un parametro secondario mentre la funziona ritorna il CF "normalizzato" (tutto maiuscolo e senza caratteri spuri) Da function ControllaCF($cf) { if( $cf == '' ) [...]

2008-01-29 by Umberto Salsi
Re: Algoritmo di Generazione Codice Fiscale
Anonymous wrote: [...] L'unico posto dove si parla di 14-esimo carattere è al punto 3 dell'algoritmo del CF, cioè dove di devono considerare i caratteri di posto pari. Il 15-esimo ha posto dispari e quindi lì non c'entra proprio. Per cui non capisco l'obiezione.

(...)