Algoritmo Ufficiale Agenzia delle Entrate

Calcolo Codice Fiscale in PHP

Guida tecnica e script PHP completo per il calcolo e la validazione del Codice Fiscale italiano. Prova la demo interattiva, copia il codice sorgente o scarica la classe già pronta per i tuoi progetti.

Demo Interattiva Live

Inserisci i dati anagrafici per testare in tempo reale il funzionamento dell'algoritmo:

Codice Fiscale Generato:
RSSMRA85C15H501R

Codice Sorgente PHP da Copiare

Ecco l'implementazione completa e autonoma in PHP della classe CodiceFiscale. Include la pulizia dei caratteri speciali, la selezione fonetica per nome e cognome e il calcolo del carattere di controllo (CIN).

CodiceFiscale.php
<?php
/**
 * Classe per il Calcolo del Codice Fiscale Italiano in PHP
 * Conforme all'algoritmo ufficiale dell'Agenzia delle Entrate.
 * Sviluppato per Creasito.dev
 */
class CodiceFiscale
{
    private static $mesi = [
        1 => 'A', 2 => 'B', 3 => 'C', 4 => 'D', 5 => 'E', 6 => 'H',
        7 => 'L', 8 => 'M', 9 => 'P', 10 => 'R', 11 => 'S', 12 => 'T'
    ];

    private static $valoriDispari = [
        '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
    ];

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

    /**
     * Calcola il Codice Fiscale completo (16 caratteri alfanumerici)
     *
     * @param string $cognome Cognome della persona
     * @param string $nome Nome della persona
     * @param string $sesso 'M' oppure 'F'
     * @param string $dataNascita Data nel formato 'YYYY-MM-DD'
     * @param string $codiceCatastale Codice catastale del comune di nascita (es. 'H501')
     * @return string Codice Fiscale di 16 caratteri in maiuscolo
     */
    public static function calcola(string $cognome, string $nome, string $sesso, string $dataNascita, string $codiceCatastale): string
    {
        $codCognome = self::calcolaCognome($cognome);
        $codNome    = self::calcolaNome($nome);
        $codData    = self::calcolaDataSesso($dataNascita, $sesso);
        $codComune  = strtoupper(trim($codiceCatastale));

        $parziale = $codCognome . $codNome . $codData . $codComune;
        $cin      = self::calcolaCarattereControllo($parziale);

        return $parziale . $cin;
    }

    private static function pulisciStringa(string $str): string
    {
        $accenti = [
            'À'=>'A','È'=>'E','É'=>'E','Ì'=>'I','Ò'=>'O','Ù'=>'U',
            'à'=>'A','è'=>'E','é'=>'E','ì'=>'I','ò'=>'O','ù'=>'U',
            ' '=>'','\''=>''
        ];
        $clean = strtoupper(strtr($str, $accenti));
        return preg_replace('/[^A-Z]/', '', $clean);
    }

    private static function calcolaCognome(string $cognome): string
    {
        $str = self::pulisciStringa($cognome);
        $consonanti = preg_replace('/[AEIOU]/', '', $str);
        $vocali     = preg_replace('/[^AEIOU]/', '', $str);
        $res = $consonanti . $vocali . 'XXX';
        return substr($res, 0, 3);
    }

    private static function calcolaNome(string $nome): string
    {
        $str = self::pulisciStringa($nome);
        $consonanti = preg_replace('/[AEIOU]/', '', $str);
        $vocali     = preg_replace('/[^AEIOU]/', '', $str);

        // Regola ufficiale: se le consonanti sono 4 o più, si prendono la 1ª, la 3ª e la 4ª
        if (strlen($consonanti) >= 4) {
            return $consonanti[0] . $consonanti[2] . $consonanti[3];
        }

        $res = $consonanti . $vocali . 'XXX';
        return substr($res, 0, 3);
    }

    private static function calcolaDataSesso(string $dataNascita, string $sesso): string
    {
        $time = strtotime($dataNascita);
        $anno = date('y', $time);
        $mese = self::$mesi[(int)date('n', $time)];
        $giorno = (int)date('j', $time);

        if (strtoupper($sesso) === 'F') {
            $giorno += 40;
        }

        return $anno . $mese . str_pad((string)$giorno, 2, '0', STR_PAD_LEFT);
    }

    private static function calcolaCarattereControllo(string $parziale): string
    {
        $parziale = strtoupper($parziale);
        $somma = 0;
        for ($i = 0; $i < 15; $i++) {
            $char = $parziale[$i];
            // Posizione dispari (1ª, 3ª, 5ª... indice 0, 2, 4...)
            if ($i % 2 === 0) {
                $somma += self::$valoriDispari[$char] ?? 0;
            } else {
                // Posizione pari (2ª, 4ª, 6ª... indice 1, 3, 5...)
                $somma += self::$valoriPari[$char] ?? 0;
            }
        }
        return chr(65 + ($somma % 26));
    }
}

// =========================================================================
// ESEMPIO DI UTILIZZO PRATICO:
// =========================================================================
$cognome  = 'Rossi';
$nome     = 'Mario';
$sesso    = 'M';
$nascita  = '1985-03-15';
$comune   = 'H501'; // Codice Catastale di Roma

$codiceFiscale = CodiceFiscale::calcola($cognome, $nome, $sesso, $nascita, $comune);

echo "Codice Fiscale generato: " . $codiceFiscale . PHP_EOL;
// Output atteso: RSSMRA85C15H501R
?>

Come Funziona l'Algoritmo (16 Caratteri)

Cognome (3 Caratteri)

Si estraggono le prime 3 consonanti del cognome. Se non sono sufficienti, si aggiungono le vocali nell'ordine in cui compaiono. Se il cognome è inferiore a 3 caratteri, si aggiungono delle "X".

Nome (3 Caratteri)

Se il nome contiene 4 o più consonanti, la legge prevede di prendere la 1ª, la 3ª e la 4ª consonante. Se ne ha meno di 4, si prendono le prime 3 (o si integrano con vocali e "X").

Anno, Mese e Giorno

2 cifre per l'anno (es. 85), 1 lettera per il mese (A=Gen, B=Feb, C=Mar, D=Apr...) e 2 cifre per il giorno. Per le donne, al numero del giorno di nascita si aggiunge 40 (es. 15 diventa 55).

Comune di Nascita (4 Caratteri)

Codice catastale univoco assegnato dall'Agenzia delle Entrate per ogni comune italiano o stato estero (es. Roma è H501, Milano è F205, Napoli è F639).

Carattere di Controllo CIN (1 Carattere)

I primi 15 caratteri vengono convertiti in valori numerici in base a due tabelle separate per i caratteri di posizione pari e dispari. La somma totale viene divisa per 26 (modulo 26) e il resto determina la lettera di chiusura (da A=0 a Z=25).

Hai bisogno di integrare il Codice Fiscale nel tuo software?

Se gestisci un e-commerce PrestaShop, un sito WordPress o una web application personalizzata e desideri automatizzare la fatturazione elettronica e l'acquisizione dei dati fiscali, siamo qui per aiutarti.