Advertisement
NelloRizzo

[PHP] Calcolo del Codice Fiscale

Jun 25th, 2019
539
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.22 KB | None | 0 0
  1. <?php
  2.  
  3.  
  4. function separa_lettere($c) {
  5.     $consonanti = "";
  6.     $vocali = "";
  7.     // devo scorrere il testo passato carattere per carattere
  8.     $lungh = strlen($c); // calcola la lunghezza di una stringa
  9.     for($i = 0; $i < $lungh; $i++) {
  10.         $car = $c[$i]; // accede all'i-esimo carattere della stringa
  11.         if ($car >= 'A' && $car <= 'Z') { // controllo se il carattere è ALFABETICO!!!
  12.         // se il carattere è una vocale
  13.             if ($car == 'A' || $car == 'O' || $car == 'I' || $car == 'U' || $car == 'E') // si tratta di una vocale!!!
  14.         // lo devo aggiungere alle vocali
  15.                 $vocali .= $car;
  16.         // altrimenti
  17.             else
  18.         // lo devo aggiungere alle consonanti
  19.                 $consonanti .= $car;
  20.         }
  21.     }
  22.     // restituiamo consonanti e vocali in un array ASSOCIATIVO
  23.     // così, ad esempio, per accedere alle vocali scriveremo $variabile["voc"]
  24.     return array("cons" => $consonanti, "voc" => $vocali);
  25. }
  26.  
  27. function gestisci_cognome($c) {
  28. /*
  29. Cognome
  30. Sono necessari 3 caratteri per rappresentare il cognome, e sono la prima la seconda e la terza consonante del cognome.
  31. E' possibile che le consonanti siano meno di tre, in questo caso è possibile aggiungere le vocali nell'ordine in cui compaiono nel cognome.
  32. Per cognomi più corti di 3 caratteri, è possibile sostituire il carattere mancante con la lettera X.
  33. Chiaramente se ci sono cognomi con più parti, è necessario rimuovere gli spazi e considerare tutto come un cognome unico.
  34. */  
  35.     // metto in maiuscolo il cognome
  36.     $c = strtoupper($c); // funzione di libreria che restituisce la versione maiuscola di una stringa
  37.     // dall'analisi deriva che mi servono le consonanti e le vocali separate le une dalle altre
  38.     $variabile = separa_lettere($c); // chiamiamo la funzione che separa consonanti e vocali
  39.     $risultato = $variabile["cons"];
  40.     if (strlen($risultato) < 3) $risultato .= $variabile["voc"]; // se ci sono meno di tre consonanti aggiungo le vocali
  41.     if (strlen($risultato) < 3) $risultato .= "X"; // se ancora non ci sono tre lettere ci metto una X!!!!
  42.     // poi con esse devo costruire la parte relativa al cognome
  43.     return substr($risultato, 0, 3);
  44. }
  45. function gestisci_nome($n) {
  46.  /*
  47. Nome
  48. Per il nome il discorso è analogo con la particolarità che se il nome è composto da 4 o più consonanti
  49. vengono prese nell'ordine la prima, la terza e la quarta.
  50. Anche qui potremmo trovarci nella situazione di un numero di consonanti minore di 3 e allo stesso modo si aggiungo le vocali.
  51. Ripetiamo anche qui che se il nome è più corto di 3 lettere è possibile sostituire i caratteri mancanti con delle X.
  52. Se il nome fosse composto da più nomi, bisogna considerarlo tutto assieme.
  53. */  
  54.     $n = strtoupper($n); // metto in maiuscolo il nome
  55.     $lettere = separa_lettere($n); // separo le lettere...
  56.     $consonanti = $lettere["cons"];
  57.     // se ci sono più di 3 consonanti
  58.     if (strlen($consonanti) > 3)
  59.         // prendo la prima e poi quelle che vanno dalla terza in poi
  60.         $consonanti = $consonanti[0] . $consonanti[2] . $consonanti[3];
  61.     return substr($consonanti . $lettere["voc"] . "XXX", 0, 3);
  62. }
  63. function gestisci_data($d, $s) {
  64. /*
  65. Anno di nascita
  66. Per l'anno vengono prese semplicemente le ultime due cifre.
  67. Mese
  68. Per quanto riguarda il mese c'è una tabella di conversione che riportiamo qui di seguito.
  69. Ad ogni mese corrisponde una lettera dell'alfabeto:
  70. Giorno
  71. In questo caso è sufficiente riportare il numero del giorno, con il particolare che per le donne questo
  72. numero dev'essere aumentato di 40!
  73. */
  74.     $anno = date_format($d, 'y'); // prende l'anno a due cifre dalla data passata come parametro
  75.    
  76.     $mese = date_format($d, 'n'); // prende il mese dalla data passata come parametro
  77.     $lettere_mesi = array('A', 'B', 'C', 'D', 'E', 'H', 'L', 'M', 'P', 'R', 'S', 'T');
  78.  
  79.     $giorno = date_format($d, 'd'); // prende il giorno dalla data passata come parametro
  80.    
  81.     // se si tratta di una donna
  82.     if ($s == 'f' || $s == 'F')
  83.         // aggiunge 40 al giorno
  84.         $giorno = 40 + $giorno;
  85.  
  86.     $risultato = $anno . $lettere_mesi[$mese - 1] . $giorno;
  87.     return $risultato;
  88. }
  89. function gestisci_comune($c) {
  90. /*
  91. Comune di nascita
  92. E' composto da quattro caratteri alfanumerici. E' il codice del comune rilevati dai volumi dei codici dei comuni italiani. Ci sono database che contengono tutti i comuni d'italia con relativi codici.
  93. */    
  94.     return strtoupper($c);
  95. }
  96. function calcola_codice_controllo($cf) {
  97.     $posizioni_dispari = array(
  98.         1,0,5,7,9,13,15,17,19,21,2,4,
  99.         18,20,11,3,6,8,12,14,16,10,22,25,24,23
  100.     );
  101. /*
  102. Si comincia con il prendere i caratteri del codice fiscale fin qui calcolato che sono 15,
  103. */
  104.     $somma = 0; // la somma dei valori associati ai diversi caratteri del c.f.
  105.     for($i = 0; $i < 15; $i++) {
  106.         $c = $cf[$i]; // prendo l'i-esimo carattere e lo metto nella variabile $c
  107.         if ($c >= '0' && $c <= '9')
  108.             // si tratta di una cifra
  109.             $spiazzamento = ord($c) - ord('0'); // ord() converte il carattere nel codice ASCII ad esso associato
  110.         else
  111.             // si tratta di una lettera
  112.             $spiazzamento = ord($c) - ord('A');
  113. /*
  114. si prendono quelli in posizione pari e si convertono con i numeri corrispondenti della prima tabella.
  115. Tutti questi numeri vengono sommati.
  116. */
  117.         if ($i % 2 != 0) { // comincio a contare da 0, quindi pari e dispari sono invertiti
  118.             // qui gestisco i caratteri di posizione pari
  119.             $somma += $spiazzamento;
  120.         }
  121. /*
  122. Allo stesso modo con i caratteri dispari che devono essere convertiti però utilizzando la seconda tabella
  123. e vengono tutti sommati.
  124. */
  125.         else {
  126.             // qui gestisco i caratteri di posizione dispari
  127.             $somma += $posizioni_dispari[$spiazzamento];
  128.         }
  129.     }
  130. /*
  131. I valori ottenuti vengono a loro volta sommati e il totale viene diviso per 26.
  132. Il resto della divisione dev'essere convertito usando l'ultima tabella.
  133. Il carattere corrispondente è il codice di controllo!
  134. */    
  135.     $risultato = chr($somma % 26 + ord('A'));
  136.     return $risultato;
  137.  }
  138.  
  139. // Calcolo del codice fiscale di una persona
  140. function calcola_cf($nome, $cognome, $data_nascita, $sesso, $citta) {
  141.     $risultato = ""; // questa variabile conterrà il codice fiscale calcolato
  142. /*
  143. - 3 lettere per il cognome
  144. - 3 lettere per il nome
  145. - l'anno di nascita (numero), il mese della data di nascita (lettera), il giorno della data di nascita (numero)
  146. - il codice del comune di nascita
  147. - il carattere di controllo
  148. */
  149.     $risultato .= gestisci_cognome($cognome);
  150.     $risultato .= gestisci_nome($nome);
  151.     $risultato .= gestisci_data($data_nascita, $sesso);
  152.     $risultato .= gestisci_comune($citta);
  153.     $risultato .= calcola_codice_controllo($risultato);
  154.     return $risultato; // qui il risultato sarà reso disponibile per l'utilizzo nell'applicazione
  155. }
  156.  
  157. echo calcola_cf("Al", "Box", date_create('1968-6-6'), 'm', 'L628') . "\n";
  158. echo calcola_cf("Paperon", "De Paperoni", date_create('1944-7-6'), 'm', 'P000') . "\n";
  159. echo calcola_cf("Nonna", "Papera", date_create('1900-1-1'), 'f', 'A549') . "\n";
  160. echo calcola_cf("Nello", "Rizzo", date_create('1968-6-6'), 'm', 'l628') . "\n";
  161. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement