Salve a tutti,
qualcuno di voi ha una routine di controllo/generazione codice fiscale e controllo partita iva ?
Grazie.
Marco
Codice fiscale/ partita IVA
Moderator: Enrico Maria Giordano
- Marco Turco
- Posts: 858
- Joined: Fri Oct 07, 2005 12:00 pm
- Location: London
- Contact:
- Enrico Maria Giordano
- Posts: 7355
- Joined: Thu Oct 06, 2005 8:17 pm
- Location: Roma - Italia
- Contact:
Re: Codice fiscale/ partita IVA
Controllo Codice Fiscale:
Controllo Partita IVA:
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
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" )
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" )
Se ti serve dimmelo (ma il mio DBF dei codici dei comuni non so quanto sia aggiornato).
EMG
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
Falconi Silvio
Per il controllo del CF io uso :
eh..spero che ti serva e .....Buona Pasqua!!!!!!!!
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.)
Best Regards, Saludos
Falconi Silvio
Falconi Silvio
- Marco Turco
- Posts: 858
- Joined: Fri Oct 07, 2005 12:00 pm
- Location: London
- Contact: