Salve a tutti,
qualcuno di voi ha una routine di controllo/generazione codice fiscale e controllo partita iva ?
Grazie.
Marco
Moderator: Enrico Maria Giordano
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" )
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" )
/***************************
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.
*ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
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.)
Return to All products support
Users browsing this forum: No registered users and 14 guests