[Objc] Calcolo codice fiscale

Il codice fiscale in Italia è un codice alfanumerico a lunghezza fissa di 16 caratteri, ispirato dall’uso biblioteconomico, che serve a identificare in modo univoco ai fini fiscali e amministrativi i cittadini, le associazioni non riconosciute, i contribuenti e gli stranieri nati e domiciliati nel territorio italiano.

http://it.wikipedia.org/wiki/Codice_fiscale

Nota: questo post è in Italiano, visto che il codice fiscale… è italiano!

Generazione codice fiscale

Questo un esempio di codice fiscale di Rossi Mario, a caso: RSSMRA84R28F205D

COGNOME

Vengono prese le consonanti del cognome (o dei cognomi, se ve ne è più di uno) nel loro ordine (primo cognome, di seguito il secondo e così via). Se le consonanti sono insufficienti, si prelevano anche le vocali, sempre nel loro ordine e, comunque, le vocali vengono riportate dopo le consonanti. Nel caso in cui un cognome abbia meno di tre lettere, la parte di codice viene completata aggiungendo la lettera X (per esempio: Fo → FOX). Per le donne, viene preso in considerazione il solo cognome da nubile.

NOME

Vengono prese le consonanti del nome (o dei nomi, se ve ne è più di uno) nel loro ordine (primo nome, di seguito il secondo e così via) in questo modo: se il nome contiene quattro o più consonanti, si scelgono la prima, la terza e la quarta, altrimenti le prime tre in ordine. Se il nome non ha consonanti a sufficienza, si prendono anche le vocali; in ogni caso le vocali vengono riportate dopo le consonanti. Nel caso in cui il nome abbia meno di tre lettere la parte di codice viene completata aggiungendo la lettera X.

ANNO NASCITA

si prendono le ultime due cifre dell’anno di nascita

MESE NASCITA

a ogni mese dell’anno viene associata una lettera in base a questa tabella:

Lettera Mese Lettera Mese Lettera Mese
A gennaio E maggio P settembre
B febbraio H giugno R ottobre
C marzo L luglio S novembre
D aprile M agosto T dicembre
GIORNO NASCITA (e SESSO)

si prendono le due cifre del giorno di nascita (se è compreso tra 1 e 9 si pone uno zero come prima cifra); per i soggetti di sesso femminile, a tale cifra va sommato il numero 40. In questo modo il campo contiene la doppia informazione giorno di nascita e sesso

COMUNE NASCITA

Per identificare il comune di nascita si utilizza il codice detto Belfiore, composto da una lettera e tre cifre numeriche (es: E815). Per i nati al di fuori del territorio italiano, sia cittadini stranieri che cittadini italiani nati all’estero, si considera lo stato estero di nascita; in tal caso la sigla inizia con la lettera Z, seguita dal numero identificativo dello stato.

CARATTERE DI CONTROLLO

A partire dai quindici caratteri alfanumerici ricavati in precedenza, si determina il carattere di controllo in base a un particolare algoritmo che opera in questo modo:

  • si mettono da una parte i caratteri alfanumerici che si trovano in posizione dispari (il primo, il terzo eccetera) e da un’altra quelli che si trovano in posizione pari (il secondo, il quarto eccetera);
  • fatto questo, i caratteri vengono convertiti in valori numerici secondo le seguenti tabelle:
CARATTERI ALFANUMERICI DISPARI
Carattere Valore Carattere Valore Carattere Valore Carattere Valore
0 1 9 21 I 19 R 8
1 0 A 1 J 21 S 12
2 5 B 0 K 2 T 14
3 7 C 5 L 4 U 16
4 9 D 7 M 18 V 10
5 13 E 9 N 20 W 22
6 15 F 13 O 11 X 25
7 17 G 15 P 3 Y 24
8 19 H 17 Q 6 Z 23
CARATTERI ALFANUMERICI PARI
Carattere Valore Carattere Valore Carattere Valore Carattere Valore
0 0 9 9 I 8 R 17
1 1 A 0 J 9 S 18
2 2 B 1 K 10 T 19
3 3 C 2 L 11 U 20
4 4 D 3 M 12 V 21
5 5 E 4 N 13 W 22
6 6 F 5 O 14 X 23
7 7 G 6 P 15 Y 24
8 8 H 7 Q 16 Z 25
  • a questo punto, i valori che si ottengono dai caratteri alfanumerici pari e dispari vanno sommati tra di loro e il risultato va diviso per 26; il resto della divisione fornirà il codice identificativo, ottenuto dalla seguente tabella di conversione:
RESTO
Resto Lettera Resto Lettera Resto Lettera Resto Lettera
0 A 7 H 14 O 21 V
1 B 8 I 15 P 22 W
2 C 9 J 16 Q 23 X
3 D 10 K 17 R 24 Y
4 E 11 L 18 S 25 Z
5 F 12 M 19 T
6 G 13 N 20 U
OMOCODIA

Due diverse persone potrebbero avere uguali tutte e sedici le lettere/cifre generate usando questo schema (omocodia). In questo caso, l’Agenzia delle entrate provvede a sostituire sistematicamente i soli caratteri numerici (a partire dal carattere numerico più a destra) con una lettera, secondo la seguente tabella di corrispondenza:

Cifra Lettera Cifra Lettera Cifra Lettera
0 L 4 Q 8 U
1 M 5 R 9 V
2 N 6 S
3 P 7 T

L’omocodia non può essere calcolata con un algoritmo, ma è gestita dall’Agenzia delle Entrate.

Libreria in objectivec

Non metto il sorgente, anche perché, a sviluppare l’algoritmo sopra citato, ci si mette 1 ora.

Come si usa?

Scarica lo zip da qui: APCodiceFiscale.zip
Il file deve contenere 3 file, tra cui:

  • APCodiceFiscale.h – l’header
  • codici.bundle – il bundle con i codici comune italiani e stati esteri
  • libAPCodiceFiscale.a – la libreria statica

Bisogna importare nel progetto i file e instanziare la classe:

#import "APCodiceFiscale.h"
[...]
APCodiceFiscale *cod = [[APCodiceFiscale alloc] init];

e impostare i valori desiderati:

cod.Nome       = @"mario";
cod.Cognome    = @"rossi";
cod.BirthDay   = @"28";
cod.BirthMonth = @"10";
cod.BirthYear  = @"1984";
cod.Estero     = APCodFiscStateItalia;
cod.Sesso      = APCodFiscSessoMaschio;
cod.Comune     = @"milano";
cf =  [ cod calcola ];
NSLog(@"%@", cf);

Nel caso ci fosse bisogno di mostrare a video la lista dei comuni italiani e/o gli stati esteri, è possibile recuperare un NSDictionary dalle due proprietà readonlydell’header, fatto in chiave/valore e contenente le voci “COMUNE”:”CODICE”:

NSDictionary *ita = cod.CodiciItaliani;
NSDictionary *ext = cod.CodiciEsteri;
NSLog(@"%@", ita);
NSLog(@"%@", ext);

et voilà!

Questo il vostro output:
CodiceFiscale[2314:70b] ***** CODICE FISCALE: RSSMRA84R28F205D *****
CodiceFiscale[2314:70b] RSSMRA84R28F205D

L’omocodia, ovviamente non viene supportata, di conseguenza, in questi casi il codice generato potrebbe risultare sbagliato.

Se qualcosa non funziona, fatemelo notare.

enjoy.

Rif:
albertopasca.it
wikipedia.it

 

Alberto Pasca

Software engineer @ Pirelli & C. S.p.A. with a strong passion for mobile  development, security, and connected things.