Codice fiscale/ partita IVA

Moderator: Enrico Maria Giordano

Codice fiscale/ partita IVA

Postby Marco Turco » Sat Apr 15, 2006 6:17 am

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

Grazie.

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

Re: Codice fiscale/ partita IVA

Postby Enrico Maria Giordano » Sat Apr 15, 2006 9:23 am

Controllo Codice Fiscale:

Code: Select all  Expand view
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  Expand view
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
Enrico Maria Giordano
 
Posts: 8715
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby Silvio » Sat Apr 15, 2006 3:38 pm

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

Postby Silvio » Sat Apr 15, 2006 3:45 pm

Per il controllo dell'iva io uso
Code: Select all  Expand view
/***************************

  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

Postby Silvio » Sat Apr 15, 2006 3:48 pm

Per il controllo del CF io uso :
Code: Select all  Expand view
*ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
  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
Silvio
 
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Postby Marco Turco » Wed Apr 26, 2006 8:54 am

Grazie EMG e Silvio.

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


Return to All products support

Who is online

Users browsing this forum: No registered users and 14 guests