Newsgroup: it.comp.lang.perl
Titolo: Controllo Cod.Fiscale e Part.IVA

Salve
per caso nei meandri del vostro HD
vi trovate una script in perl per il
controllo del codice fisc. e partita iva......
Grazie in anticipo.
Carmine

controllo del codice fisc. e partita iva......
Per il codice fiscale non ho nulla, per la partita IVA ho scritto la
seguente funzione:
-----
# Funzione per il controllo delle partita IVA
# Versione in Perl di Michele Beltrame, convertita da una funzione
# Visual Basic di AntoGal.
# Codice rilasciato liberamente sotto GPL (
http://www.gnu.org
)
sub CheckIva {
    my ($piva) = shift;
    my ($i, $sumdisp, $sumpari, $radd, $sumtot, $check);
    # ### Controlla che la partita IVA sia di 11 cifre ###
    if ($piva !~ /^\d{11}$/) {
        return 0;
    }
    # ### Controlla l'ultima cifra ###
    # Anzitutto si sommano le cifre in posizione pari (0, 2, 4, 6, 8)
    for ($i=0; $i<=8; $i+=2) {
        $sumdisp += substr($piva, $i, 1);
    }
    # Si raddoppia il valore delle cifre in posizione dispari (1, 3, 5, 7, 9)
    # Se il risultato della somma e` un numero di due cifre, esso va ridotto
    # ad una sola cifra che e` la somma delle due (es.: 12 ==> 1+2 = 3)
    for ($i=1; $i<=9; $i+=2) {
        $radd = 2 * substr($piva, $i, 1);
        if ($radd > 9) {
            $radd = substr($radd, 0, 1) + substr($radd, -1, 1);
        }
        $sumpari += $radd;
    }
    # Ora si sommando i precedenti risultati (cifre dispari e cifre pari
    # raddoppiate) e si determina il totale
    $sumtot = $sumpari + $sumdisp;
    # Si preleva solo la cifra delle unita` dal risultato (es. 36 ==> 6)
    $sumtot = $sumtot % 10;
    # Si sottrae la cifra ottenuta dal numero 10, come da art.9 del DM del
    # 23/12/1976 che regola l'attribuzione dei coidici fiscali
    $check = (10 - $sumtot) % 10;
    # Il risultato della sottrazione e` la cifra di controllo
    if ($check == substr($piva, -1, 1)) {
        return 1;
    } else {
        return 0;
    }
}
-----
	A presto, Michele.
-- 
Michele Beltrame
m...@io.com
http://www.io.com/~mick/
ICQ# 76660101
==> Visita il sito di it.comp.lang.perl: 
http://www.perl-it.org
==> Sei del triveneto e vuoi unirti ai Perl Mongers? Scrivimi!

 seguente funzione:
Per il codice fiscale e' circolato un mesetto fa un abbozzo di programma.
Lo dovresti ancora trovare in qualche archivio.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

 Lo dovresti ancora trovare in qualche archivio.
Siccome oggi mi sento buono <g> e quello era proprio un abbozzo (derivava da
un CGI esageratamente lungo e scritto praticamente in C che era stato
postato da qualcuno in lista), ho speso qualche minuto a rielaborare quella 
roba ed ecco qui la splendida e perfetta subroutine check_CF() :)
---
sub check_CF {
# Input: stringa di 16 lettere contenente il codice fiscale
# Output: 1 se il CF e' corretto, 0 se c'e' qualche errore
# Si ritorna 0 se:
#   - la stringa non e' di 16 lettere una volta rimossi tutti gli spazi e
#     l'eventuale \n in fondo alla riga
#   - non viene passato esattamente un parametro
#   - il codice e' effettivamente errato
return 0 unless (@_ == 1);
my $codice = uc shift;
chomp $codice;
$codice =~ s/\s//g;
return 0 unless ((length $codice) == 16);
my (%pari,%dispari,@risp_co,@codice);
my $contr;
@pari{'A'..'Z',0..9}=(0..25,0..9);
@dispari{'A'..'Z',0..9} = (1,0,5,7,9,13,15,17,19,21,2,4,18,20,
                  11,3,6,8,12,14,16,20,22,25,24,23,
                  1,0,5,7,9,13,15,17,19,21);
@risp_co = ('A'..'Z');
@codice = split (//,$codice);
$contr = 0;
foreach my $i (0..6)
 {
   $contr += $dispari{$codice[2*$i]}+$pari{$codice[2*$i+1]};
 }
$contr += $dispari{$codice[14]};
$contr %= 26;
return ($risp_co[$contr] eq $codice[15] ? 1 : 0); 
}
----
Funziona almeno con due codici fiscali: il mio e quello di un mio amico, ma
non escludo la possibilita' che ci sia ancora qualche baco.
Ovviamente si puo' migliorare la gestione degli errori o la flessibilita'
d'uso, ma per un uso veloce dovrebbe essere sufficiente.
Buon divertimento.


 Lo dovresti ancora trovare in qualche archivio.
Siccome oggi mi sento buono <g> e quello era proprio un abbozzo (derivava da
un CGI esageratamente lungo e scritto praticamente in C che era stato
postato da qualcuno in lista), ho speso qualche minuto a rielaborare quella 
roba ed ecco qui la splendida e perfetta subroutine check_CF() :)
---
sub check_CF {
# Input: stringa di 16 lettere contenente il codice fiscale
# Output: 1 se il CF e' corretto, 0 se c'e' qualche errore
# Si ritorna 0 se:
#   - la stringa non e' di 16 lettere una volta rimossi tutti gli spazi e
#     l'eventuale \n in fondo alla riga
#   - non viene passato esattamente un parametro
#   - il codice e' effettivamente errato
# (C) 2000 by Munasoft (Maurizio M. Munafo')
return 0 unless (@_ == 1);
my $codice = uc shift;
chomp $codice;
$codice =~ s/\s//g;
return 0 unless ((length $codice) == 16);
my (%pari,%dispari,@risp_co,@codice);
my $contr;
@pari{'A'..'Z',0..9}=(0..25,0..9);
@dispari{'A'..'Z',0..9} = (1,0,5,7,9,13,15,17,19,21,2,4,18,20,
                  11,3,6,8,12,14,16,20,22,25,24,23,
                  1,0,5,7,9,13,15,17,19,21);
@risp_co = ('A'..'Z');
@codice = split (//,$codice);
$contr = 0;
foreach my $i (0..6)
 {
   $contr += $dispari{$codice[2*$i]}+$pari{$codice[2*$i+1]};
 }
$contr += $dispari{$codice[14]};
$contr %= 26;
return ($risp_co[$contr] eq $codice[15] ? 1 : 0); 
}
----
Funziona almeno con due codici fiscali: il mio e quello di un mio amico, ma
non escludo la possibilita' che ci sia ancora qualche baco.
Ovviamente si puo' migliorare la gestione degli errori o la flessibilita'
d'uso, ma per un uso veloce dovrebbe essere sufficiente.
Naturalmente potete farci quasi tutto con il codice precedente, a parte
forse pubblicarlo su qualche rivista o su qualche sito web a vostro nome :)
