Classe IV E Sia modulo didattico: creazione del codice fiscale con il Php e Msqli utilizzando la tabella Comuni per calcolare il CF


Il codice fiscale è un codice alfanumerico di 16 caratteri che serve a identificare in modo univoco le persone fisiche residenti su tutto il territorio italiano.
Introdotto con Decreto del Presidente della Repubblica (605/1973) per rendere più efficiente l'Amministrazione Finanziaria, esso viene attribuito e rilasciato a ciascun cittadino italiano e straniero dall'Agenzia delle Entrate.
Ai neonati il codice fiscale viene attribuito dai Comuni, al momento della prima iscrizione nei registri d'anagrafe della popolazione residente, attraverso il sistema telematico di collegamento con l'Anagrafe tributaria. Gli stranieri lo ottengono direttamente agli sportelli unici per l'immigrazione dove hanno presentato domanda di ingresso nel territorio italiano, mentre i cittadini residenti all'estero possono chiedere l'attribuzione del codice fiscale alla rappresentanza diplomatico-consolare italiana nel paese di residenza.

In passato il codice fiscale era riportato su un tesserino di plastica con banda magnetica che indicava anche il cognome, nome, sesso, luogo di nascita, provincia di nascita, data di nascita e l'anno di emissione. Oggi il tesserino del codice fiscale è stato sostituito dalla tessera sanitaria.

Generazione del Codice Fiscale 
Esiste un preciso algoritmo da seguire per poter calcolare il codice fiscale: anche se alcuni strumenti automatici permettono di calcolare il codice fiscale, l'unico codice valido è quello rilasciato al soggetto dall'Agenzia delle Entrate.

Il codice fiscale è composto da 16 caratteri alfanumerici, ricavati in questo modo:

Cognome (3 lettere)
Vengono prese le consonanti del cognome (o dei cognomi, se ve ne è più di uno) nel loro ordine: solo se sono insufficienti, si prelevano anche le vocali, sempre nel loro ordine: 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 (ad esempio il cognome RE diventerà REX). Per le donne, viene preso in considerazione il solo cognome da nubile.

Nome (3 lettere)
Vengono prese le consonanti del nome (o dei nomi, se ve ne è più di uno) 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. Solo se il nome non ha consonanti a sufficienza, si prendono anche le vocali: comunque, 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.
Un caso estremo si incontra in alcuni soggetti provenienti dall'India nel passaporto dei quali è riportata una sola parola al posto del cognome e del nome. Si userà allora quella parola per generare le prime tre lettere del codice e, non esistendo il nome, la seconda terzina di lettere del codice sarà XXX.

Data di nascita e sesso (5 caratteri alfanumerici)
Anno di nascita (2 cifre): si prendono le ultime due cifre dell'anno di nascita;
Mese di nascita (1 lettera): ad ogni mese dell'anno viene associata una lettera in base alla seguente tabella:
LetteraMese
Agennaio
Bfebbraio
Cmarzo
Daprile
Emaggio
Hgiugno
Lluglio
Magosto
Psettembre
Rottobre
Snovembre
Tdicembre
  • Giorno di nascita e sesso (2 cifre): 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.


Comune di nascita (4 caratteri alfanumerici)
Per questa parte di codice viene utilizzato il codice catastale del comune di nascita composta da una lettera e 3 cifre numeriche. Per i nati al di fuori del territorio italiano si considera lo Stato estero di nascita: in tal caso la sigla inizia con la lettera Z seguita dal numero identificativo della nazione.

Codice di controllo (1 lettera)
A partire dai 15 caratteri alfanumerici ricavati in precedenza, si determina il codice di controllo in base ad un particolare algoritmo: si mettono da una parte i caratteri alfanumerici che si trovano in posizione dispari (il 1º, il 3º ecc.) e da un'altra quelli che si trovano in posizione pari (il 2º, il 4º ecc.). Fatto questo, i caratteri vengono convertiti in valori numerici rispettando le seguenti tabelle:
CARATTERI ALFANUMERICI DISPARI
CarattereValore
01
10
25
37
49
513
615
717
819
921
A1
B0
C5
D7
E9
F13
G15
H17
I19
J21
K2
L4
M18
N20
O11
P3
Q6
R8
S12
T14
U16
V10
W22
X25
Y24
Z23
CARATTERI ALFANUMERICI PARI
CarattereValore
00
11
22
33
44
55
66
77
88
99
A0
B1
C2
D3
E4
F5
G6
H7
I8
J9
K10
L11
M12
N13
O14
P15
Q16
R17
S18
T19
U20
V21
W22
X23
Y24
Z25

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
RestoLetteraRestoLetteraRestoLetteraRestoLettera
0A7H14O21V
1B8I15P22W
2C9J16Q23X
3D10K17R24Y
4E11L18S25Z
5F12M19T
6G13N20U

Problemi e casi particolari
  • Omocodia: l'omocodia si presenta quando 2 o più individui presentano lo stesso codice fiscale. Situazione tutt'altro che impossibile (sono oltre 20'000 le omocodie in Italia) ma gestibile sostituendo consecutivamente (a partire dall'ultima) le cifre con una lettera. Utilizzando tutte le combinazioni possibili di sostituzioni dei numeri con lettera, si possono gestire al massimo 128 codici differenti. Il caso dei soggetti cosiddetti "omocodici", inizialmente molto limitato per quanto riguarda i cittadini italiani, si è notevolmente incrementato nel tempo prevalentemente per gli stranieri, con una concentrazione particolare per i nati nei paesi nei quali manca l'indicazione del giorno esatto della nascita.
  • Luogo di nascita: la codifica degli stati non tiene conto delle variazioni storiche intervenute. Oggi, l'attribuzione del codice a cittadini delle repubbliche ex sovietiche provoca problemi simili: ad esempio, persone nate in Unione Sovietica a Kiev si vedono attribuire il codice dell'Ucraina, o ancor peggio della Russia. Lo stesso discorso vale per chi è nato in passato in una delle 2 divisioni della Germania, che allora avevano codici diversi, e ora ne hanno uno solo.
    La codifica dei comuni di nascita invece tiene conto delle variazioni storiche. Può succedere che un comune venga soppresso e accorpato ad uno limitrofo, o ne nasca uno nuovo. In questo caso i nati in quel comune manterranno nel proprio codice fiscale il codice catastale del comune di nascita inalterato, anche se non esiste più (ad esempio come i nati nel comune di Borgo Panigale). Fanno eccezione alcuni cittadini che negli anni settanta, pur nati in territorio italiano, si erano visti attribuire un codice catastale estero, in quanto il comune era diventato territorio straniero dopo la Seconda Guerra Mondiale.
  • Carattere di controllo: l'algoritmo di calcolo del carattere di controllo non è in grado di riconoscere alcune tipologie frequenti di errori di battitura, quali ad esempio lo scambio di due lettere in posizione dispari.
  • Cambio di nome: i contribuenti che cambiano il loro cognome o il nome durante la vita sono costretti ad aggiornare anche il proprio codice fiscale. Il problema, inizialmente limitato, sta diventando sempre più evidente con gli immigrati stranieri: molti, nell'ottenere la cittadinanza italiana, sono costretti a cambiare il cognome in quanto le regole di attribuzione del cognome italiano sono diverse rispetto al loro paese d'origine (ad esempio, i cittadini delle nazioni sudamericane acquisiscono alla nascita il doppio cognome del padre e della madre, perdendo quest'ultimo quando divengono cittadini italiani).
  • Banche dati inquinate: in diverse banche dati gestite da enti pubblici e privati sono registrate informazioni con associato il codice fiscale. Nei casi di cittadini che hanno cambiato codice fiscale o ai quali è stato sostituito il codice fiscale successivamente alla scoperta di un'omocodia, ci si trova nella situazione di avere dei collegamenti con informazioni di altri cittadini o di non avere un collegamento con le proprie informazioni. Inoltre, in alcune banche dati il codice fiscale, non presente all'atto dell'immissione dei dati iniziale, è stato ricavato dai dati anagrafici presenti nella stessa banca dati e non validato con i dati presenti nell'Anagrafe Tributaria in modo da evitare associazioni errate.
fonte: http://www.nomix.it/come_si_calcola_il_codice_fiscale.php


Calcolo Codice Fiscale con Php e Msqli

1. Assicurarsi che il proprio WebServer abbia installato PhpMyAdmin
2. importare il file comuni.sql all'interno del proprio database
3. Prima di eseguire la pagina php modificare:
$dbname = "inserire il nome del tuo database";
$link = mysqli_connect("localhost","root","inserire la password oppure lasciare vuoto","$dbname") or die("Error " . mysqli_error($link));
if (!$link)
echo "Attenzione impossibile connettersi al server verificare la connessione";
Eseguite lo script.

link per scaricare la cartella zippata con comuni.sql e codicefiscale.php:
http://www.webalice.it/paolo.latella/Codice_Fiscale.zip


Lo script della pagina codicefiscale.php


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

   "http://www.w3.org/TR/html4/loose.dtd">
<html>
<?php

$dbname = "inserire il nome del tuo database";

$vocali=array("A","E","I","O","U");
$alfabetoMesi = array( 'A', 'B', 'C', 'D', 'E',
                       'H', 'L', 'M', 'P', 'R',
                       'S', 'T');

$alfabeto = array( 'A', 'B', 'C', 'D', 'E',
  'F', 'G', 'H', 'I', 'J',
                    'K', 'L', 'M', 'N', 'O',
  'P', 'Q', 'R', 'S', 'T',
  'U', 'V', 'W', 'X', 'Y', 'Z');

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

// Mesi
$mese[0] = "Gennaio";
$mese[1] = "Febbraio";
$mese[2] = "Marzo";
$mese[3] = "Aprile";
$mese[4] = "Maggio";
$mese[5] = "Giugno";
$mese[6] = "Luglio";
$mese[7] = "Agosto";
$mese[8] = "Settembre";
$mese[9] = "Ottobre";
$mese[10] = "Novembre";
$mese[11] = "Dicembre";

$gender[0] = "Maschile";
$gender[1] = "Femminile";

$link = mysqli_connect("localhost","root","inserire la password oppure lasciare vuoto","$dbname") or die("Error " . mysqli_error($link));
if (!$link)
   echo "Attenzione impossibile connettersi al server verificare la connessione";


$query = "SELECT `city_name` FROM `comuni` ORDER BY `city_name`";
$result = mysqli_query($link, $query);

?>
<head>
  <title></title>
</head>

<body>
Informazioni persona: <p>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
<table>
<tr><td>Cognome:</td><td><input name="cognome"></td></tr>
<tr><td>Nome:</td><td><input name="nome"></td></tr>
<tr><td>Data di nascita</td>
<td>
<select name="DDN_Giorno">
<option> - Giorno - </option>
<?php for($i = 1; $i <= 31; $i++) echo "<option value='$i'>$i</option>"; ?>
</select>
<select name="DDN_Mese">
<option> - Mese - </option>
<?php foreach($mese as $m) echo "<option value='$m'>$m</option>" ?>
</select>
<select name="DDN_Anno">
<option> - Anno - </option>
<?php for($i = 1900; $i <= 2013; $i++) echo "<option value='$i'>$i</option>"; ?>
</select></td>
<tr>
<td>Sesso:</td>
<td><select name="Sesso">
<?php foreach($gender as $g) echo "<option value='$g'>$g</option>" ?>
</select>
</td>
<tr>
<td>Comune di nascita:</td>
<td><select name="Comune">
<?php
while ($row = mysqli_fetch_row($result)) {
echo "<option value='" . $row[0] . "'>" . $row[0] . "</option>";
        }
mysqli_free_result($result);
 ?>
</select></td>
</tr>
<tr> <td><input type="submit"><input type="reset"></td>
</tr>
</table>
</form>

<?php if($_POST)  {


$cognome = $_POST['cognome'];
$nome = $_POST['nome'];
$DG = $_POST['DDN_Giorno'];
$DM = $_POST['DDN_Mese'];
$DA = $_POST['DDN_Anno'];
$gender = $_POST['Sesso'];
$comune= $_POST['Comune'];
// Il codice fiscale è formato da 7 parti
$parte[0] = "";
$parte[1] = "";
$parte[2] = "";
$parte[3] = "";
$parte[4] = "";
$parte[5] = "";
$parte[6] = "";
// CODICE PER IL COGNOME (consonanti n°1-2-3 + eventuali vocali)
$cognome = strtoupper($cognome);
$nvocali = preg_match_all('/[AEIOU]/i',$cognome,$matches1);
$nconsonanti = preg_match_all('/[BCDFGHJKLMNPQRSTVWZXYZ]/i',$cognome,$matches2);
if($nconsonanti>=3)  $parte[0] = $matches2[0][0] . $matches2[0][1] . $matches2[0][2];
else
{
  
      for($i = 0; $i < $nconsonanti; $i++)
      {
            $parte[0] = $parte[0] . $matches2[0][$i];
      }
      $n = 3-strlen($parte[0]);
      for($i = 0; $i < $n; $i++)
      {
            $parte[0] = $parte[0] . $matches1[0][$i];
      }
      $n = 3-strlen($parte[0]);
      for($i = 0; $i < $n; $i++)  $parte[0] = $parte[0] . "X";
}

// CODICE PER IL NOME (consonanti n°1-3-4, oppure 1-2-3 se sono 3; se sono meno di 3: vocali)
$nome = strtoupper($nome);
$nvocali = preg_match_all('/[AEIOU]/i',$nome,$matches1);
$nconsonanti = preg_match_all('/[BCDFGHJKLMNPQRSTVWZXYZ]/i',$nome,$matches2);
if($nconsonanti>=4) $parte[1] = $matches2[0][0] . $matches2[0][2] . $matches2[0][3];
else if($nconsonanti==3)  $parte[1] = $matches2[0][0] . $matches2[0][1] . $matches2[0][2];
else
{
      for($i = 0; $i < $nconsonanti; $i++)
      {
            $parte[1] = $parte[1] . $matches2[0][$i];
      }
      $n = 3-strlen($parte[1]);
      for($i = 0; $i < $n; $i++)
      {
            $parte[1] = $parte[1] . $matches1[0][$i];
      }
      $n = 3-strlen($parte[1]);
      for($i = 0; $i < $n; $i++)  $parte[1] = $parte[1] . "X";
}

// CODICE ANNO (Ultime 2 cifre dell'anno)
$arrAnno = str_split($DA);
$parte[2] = $arrAnno[2] . $arrAnno[3];

// CODICE MESE (A = Gennaio, B = Febbraio, ecc.)
$m = array_search($DM, $mese);
$parte[3] = $alfabetoMesi[$m];

// CODICE GIORNO (se uomo; n. giorno (DD); altrimenti n. giorno + 40)
if($gender == "Maschile") $parte[4] = $DG;
else $parte[4] = $DG +40;
if(strlen($parte[4]) == 1) $parte[4] = "0" . $parte[4];

// CODICE COMUNE
$query = "SELECT city_code_land FROM comuni WHERE city_name = \"$comune\"";
$result = mysqli_query($link, $query);
while ($row = mysqli_fetch_row($result))
{
       $parte[5] = $row[0];
}
mysqli_free_result($result);

// CODICE DI CONTROLLO ((caratteri posiz pari + posiz dispari) / 26 -> Carattere di controllo)
$arrCOD = $parte[0] . $parte[1] . $parte[2] . $parte[3] . $parte[4] . $parte[5];
$arrCOD = str_split($arrCOD);
$index = count($arrCOD);
/* posizione pari */
$somma1 = 0;
for($i = 0; $i < 15; $i++)
if(($i+1)%2==0)
        {
              if(!in_array($arrCOD[$i], $alfabeto)) $somma1 += $arrCOD[$i];
              else
              {
                   $n = array_search($arrCOD[$i], $alfabeto);
                   $somma1 += $n;
              }
       }
/* posizione dispari */
$somma2 = 0;
for($i = 0; $i < 15; $i++)
if(($i+1)%2!=0)
        {
          $somma2 += $PD["$arrCOD[$i]"];
        }
$somma = $somma1+$somma2;
$parte[6] = ($somma % 26);
$parte[6] = $alfabeto[$parte[6]];
// OUTPUT
echo "Codice fiscale: $parte[0] $parte[1] $parte[2] $parte[3] $parte[4] $parte[5] $parte[6]";

mysqli_close($link);
} ?>

</body>

</html>

Commenti

Post popolari in questo blog

Simulazioni di reti (con Cisco Packet Tracer)

Esercizi sulla rappresentazione della virgola mobile IEEE 754 (Floating Point)