Codice fiscale/ partita IVA

Moderator: Enrico Maria Giordano

Post Reply
User avatar
Marco Turco
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London
Contact:

Codice fiscale/ partita IVA

Post by Marco Turco »

Salve a tutti,
qualcuno di voi ha una routine di controllo/generazione codice fiscale e controllo partita iva ?

Grazie.

Marco
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: Codice fiscale/ partita IVA

Post by Enrico Maria Giordano »

Controllo Codice Fiscale:

Code: Select all

FUNCTION ISCOD( cCod )

    LOCAL aCod := { 1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23 }
    LOCAL nChr, cChr, nPos, nCod := 0

    IF LEN( ALLTRIM( cCod ) ) != 16; RETURN .F.; ENDIF

    FOR nChr = 1 TO 15
        cChr = SUBSTR( cCod, nChr, 1 )
        IF !ISALPHA( cChr ) .AND. !ISDIGIT( cChr ); RETURN .F.; ENDIF
        nPos = ASC( cChr ) - IF( ISALPHA( cChr ), ASC( "A" ), ASC( "0" ) )
        nCod += IF( nChr % 2 = 0, nPos, aCod[ nPos + 1 ] )
    NEXT

    RETURN nCod % 26 = ASC( SUBSTR( cCod, nChr, 1 ) ) - ASC( "A" )
Controllo Partita IVA:

Code: Select all

FUNCTION ISIVA( cCod )

    LOCAL nChr, nPos, nCod := 0

    IF LEN( RTRIM( cCod ) ) != 11 .OR. cCod = "00000000000"; RETURN .F.; ENDIF

    FOR nChr = 1 TO 10
        nPos = ASC( SUBSTR( cCod, nChr, 1 ) ) - ASC( "0" )
        nCod += IF( nChr % 2 = 0, INT( nPos * 2 / 10 + ( nPos * 2 ) % 10 ), nPos )
    NEXT

    RETURN ( 10 - nCod % 10 ) % 10 = ASC( SUBSTR( cCod, nChr, 1 ) ) - ASC( "0" )
Per quanto riguarda la generazione, avrei quella per il Codice Fiscale ma richiede anche il database aggiornato dei codici dei comuni.

Se ti serve dimmelo (ma il mio DBF dei codici dei comuni non so quanto sia aggiornato).

EMG
User avatar
Silvio
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Post by Silvio »

io avrei tutto un programma che genera i codici fiscali :sarebbe troppo grande da mettere qui.

Poi ci vuole l'archivio comuni che potrebbe essere reperibile in giro
Best Regards, Saludos

Falconi Silvio
User avatar
Silvio
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Post by Silvio »

Per il controllo dell'iva io uso

Code: Select all

/***************************

  function OKIVA( PI, obbligo )

//***************************
// Syntax:  OKIVA( <ExpC>, [<ExpL>] )
// <ExpC> Š il n. di partita iva (Š una stringa!)
// <ExpL> se Š .T. la partita IVA Š obbligatoria (default), altrimenti pu• essere vuota
// Restituisce .t.=tutto ok ; .f.= errata

local  s := 0, i, t, pi1, pi2, ok := .f.

IF pcount() = 1
    obbligo = .f.    // default non obbligatoria
ENDIF

s := 0

IF empty( pi )
    return( if( obbligo, .f., .t. ) )  // se obbligatoria ritorna .F.
ENDIF

IF len( alltrim( pi ) ) != 11
    return(.f.)  // .f.
ENDIF

// non vengono controllati gli uffici iva, tanto c'Š il cecksum...
//IF val(subst(pi,8,3))<1 .or. val(substr(pi,8,3))>100
//    * uffici iva (il 100 esiste - Firenze)
//    return(ok)  // .f.
//ENDIF

i := 1
WHILE i < 11
    pi1 := val(substr(pi,i,1))
    pi2 := val(substr(pi,i+1,1))
    s := s+pi1+2*pi2-9*int(pi2/5)
    i := i+2
ENDDO

t := 10-(s-int(s/10)*10)
IF t = 10
    t := 0
ENDIF

IF t # val(substr(pi,11,1))
    return( ok )  // .f.
ENDIF

ok := .t.
return( ok )  // .T.

Best Regards, Saludos

Falconi Silvio
User avatar
Silvio
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Post by Silvio »

Per il controllo del CF io uso :

Code: Select all

*ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  FUNCTION CFISC( CF, obbligo, CfNasc, CfSex )
*ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß


// controllo codice fiscale

// Syntax: cfisc(<ExpC>, [<ExpL>])
// dove <ExpC> èil numero di codice fiscale da controllare
//      <ExpL> indica se si accetta anche il CF vuoto (default) =.f.
//                                    oppure se è obbligatorio = .t.
// Restituisce: se errato restituisce  .F.
//              se corretto restituisce .T.
//
// Se esistono il 3. e 4. parametro (passati per referenza) 
// vi vengono scritti   CFNasc  (Data di nascita)   tutti formati europei
//                      CFSex   (Sesso  = M F)
//
// per il GET sul Codice Fiscale si consiglia questa Picture:
// @ 10,10 get cod pict "@! AAAAAA99A99A999A"
//                      es: TNLMRZ56C15L552S

local td := "0100050709131517192102041820110306081214161022252423"
local mn := "ABCDEHLMPRST"
local f4 := 0, pp := 0, p := 1
local i, p1, j, CfDataNascita, CfSesso, sep := "", DataVuota

IF obbligo == NIL
    obbligo := .f.  // accetta anche CF vuoto
ENDIF

if CfNasc != NIL
    // Separatori data (formato europeo) possibili:   / - .
    sep := substr(dtoc(date()),3,1)
    // Default
    CfNasc := ctod("  "+sep+"  "+sep+"  ")
    CfSex := " "
endif

CF := upper( alltrim(CF) )
IF LEN(CF) = 0
    // accetta anche Cod fisc. vuoto
    return( !obbligo )   // se CF obbligatorio non passato controllo
ENDIF

IF len(CF) < 16
    return( .f. )  // errore!
ENDIF

FOR I := 1 TO 15
    P1 := ASC( substr( CF, I, 1 ) )
    
    IF P1 > 47 .and. P1 < 58
        P1 -= 48
    ENDIF
    
    IF P1 > 64 .and. P1 < 91
        P1 -= 65
    ENDIF
    
    IF P = 0
        PP += P1
        P := 1
    ELSE
        PP += VAL( substr( TD, (P1*2+1), 2 ) )
        P := 0
    ENDIF
NEXT

PP := (PP - (INT (PP/26) ) * 26) + 65

if chr(pp) != right(cf, 1)
    // codice fiscale errato
    return(.f.)
ENDIF

P1 := VAL( substr( Cf, 10, 2 ) )
CfSesso := "M"
IF P1 > 40
    P1 -= 40
    CfSesso := "F"
ENDIF

IF P1 < 10
    CfDataNascita := "0" + RIGHT( STR( P1, 2 ), 1 )
    J := 0
ELSE
    CfDataNascita := RIGHT( STR( P1, 2 ), 2 )
    J := 0
ENDIF

FOR I := 1 TO 12
    IF substr( Cf, 9, 1) == substr( MN, I, 1 )
        J := I
        I := 12
    ENDIF
NEXT

IF J = 0
    // codice fiscale errato
    return(.f.)
ENDIF

IF J < 10
    CfDataNascita += sep + "0" + RIGHT( STR( J, 2 ), 1 )
ELSE
    CfDataNascita += sep + RIGHT( STR( J, 2 ), 2 )
ENDIF

CfDataNascita += sep + substr( Cf, 7, 2 )

CfNasc := ctod( CfDataNasc )
CfSex := Cfsesso

return(.t.)

eh..spero che ti serva e .....Buona Pasqua!!!!!!!!
Best Regards, Saludos

Falconi Silvio
User avatar
Marco Turco
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London
Contact:

Post by Marco Turco »

Grazie EMG e Silvio.

Marco
Post Reply