Código: Selecionar todos
// UF NOME CEP INÍCIO CEP FINAL VALIDAÇÃO DA IE MÁSCARA
// ---- --------------------- ---------- ---------- ---------------------- --------------------
static aBaseUF := {{"AC", "Acre" , "69900050", "69918430", {|cIE|ValidIE_AC(cIE)}, "99.999.999/999-99" },;
{"AL", "Alagoas" , "57010000", "57607620", {|cIE|ValidIE_AL(cIE)}, "99.9.99999-9" },;
{"AM", "Amazonas" , "69005000", "69153500", {|cIE|ValidIE_AM(cIE)}, "99.999.999-9" },;
{"AP", "Amapá" , "68900001", "68909790", {|cIE|ValidIE_AP(cIE)}, "99.999.999-9" },;
{"BA", "Bahia" , "40010000", "48909810", {|cIE|ValidIE_BA(cIE)}, "999999-99" },;
{"CE", "Ceará" , "60010000", "63133150", {|cIE|ValidIE_CE(cIE)}, "99.999.999-9" },;
{"DF", "Distrito Federal" , "70040000", "73380600", {|cIE|ValidIE_DF(cIE)}, "99.999999.999-99" },;
{"ES", "Espírito Santo" , "29010001", "29906660", {|cIE|ValidIE_ES(cIE)}, "99.999.999-9" },;
{"GO", "Goiás" , "73750005", "75909390", {|cIE|ValidIE_GO(cIE)}, "99.999.999-9" },;
{"MA", "Maranhão" , "65005402", "65919360", {|cIE|ValidIE_MA(cIE)}, "99.999.999-9" },;
{"MG", "Minas Gerais" , "30110000", "39804705", {|cIE|ValidIE_MG(cIE)}, "999.999.999/9999" },;
{"MS", "Mato Grosso do Sul" , "79002000", "79843300", {|cIE|ValidIE_MS(cIE)}, "99.999.999-9" },;
{"MT", "Mato Grosso" , "78005000", "78750680", {|cIE|ValidIE_MT(cIE)}, "9999999999-9" },;
{"PA", "Pará" , "66010000", "68746350", {|cIE|ValidIE_PA(cIE)}, "99.999.999-9" },;
{"PB", "Paraíba" , "58010000", "58808500", {|cIE|ValidIE_PB(cIE)}, "99.999.999-9" },;
{"PE", "Pernambuco" , "50010000", "56915130", {|cIE|ValidIE_PE(cIE)}, "99.9.999.9999999-9"},;
{"PI", "Piauí" , "64000010", "64218860", {|cIE|ValidIE_PI(cIE)}, "99.999.999-9" },;
{"PR", "Paraná" , "80010000", "87711550", {|cIE|ValidIE_PR(cIE)}, "999.99999-99" },;
{"RJ", "Rio de Janeiro" , "20010000", "28924210", {|cIE|ValidIE_RJ(cIE)}, "99.999.99-9" },;
{"RN", "Rio Grande do Norte", "59010000", "59635100", {|cIE|ValidIE_RN(cIE)}, "99.999.999-9" },;
{"RO", "Rondônia" , "78900005", "78977335", {|cIE|ValidIE_RO(cIE)}, "99999999.99999-9" },;
{"RR", "Roraima" , "69301000", "69316387", {|cIE|ValidIE_RR(cIE)}, "99.999.999-9" },;
{"RS", "Rio Grande do Sul" , "90010000", "99074570", {|cIE|ValidIE_RS(cIE)}, "999/999999-9" },;
{"SC", "Santa Catarina" , "88010000", "89815640", {|cIE|ValidIE_SC(cIE)}, "999.999.999" },;
{"SE", "Sergipe" , "49010000", "49097690", {|cIE|ValidIE_SE(cIE)}, "99.999.999-9" },;
{"SP", "São Paulo" , "01001000", "19915680", {|cIE|ValidIE_SP(cIE)}, "!.99999999.9/999" },;
{"TO", "Tocantins" , "77003020", "77828400", {|cIE|ValidIE_TO(cIE)}, "99.99.999999-9" } ;
}
#define _kUF_SIGLA 1
#define _kUF_NOME 2
#define _kUF_CEP1 3
#define _kUF_CEP2 4
#define _kUF_IE_VALID 5
#define _kUF_IE_PICTURE 6
//**************************************************************************************************
function ListSigUF() // Retorna uma lista com as siglas de todos os Estados
local aLst := {}
AEval(aBaseUF,{|aUF|AAdd(aLst,aUF[_kUF_SIGLA])})
ASort(aLst ,,,{|x,y|x[1]<y[1]})
return aLst
//**************************************************************************************************
function NomeUF(cUF) // Retorna o nome do Estado
local i
return if((i := AScan(aBaseUF,{|aUF|aUF[_kUF_SIGLA]==cUF})) = 0, "", aUF[i][_kUF_NOME])
//**************************************************************************************************
function PictureIE(cUF) // Retorna a máscara de validação do Estado
local i
return if((i := AScan(aBaseUF,{|aUF|aUF[_kUF_SIGLA]==cUF})) = 0, Replicate("!",14), "@R "+aBaseUF[i][_kUF_IE_PICTURE])
//**************************************************************************************************
function UniFedCEP(cCEP) // Dado um número de CEP, retorna o Estado a qual pertence
local i := AScan(aBaseUF,{|aUF| cCEP >= aUF[_kUF_CEP1] .and. cCEP <= aUF[_kUF_CEP2]})
return if(i=0, "", aBaseUF[i][_kUF_SIGLA])
//**************************************************************************************************
function ValidIE(cUF,cIE) // Valida a IE (algumas IEs devem ser completadas com zeros a esquerda)
local i
if (i := AScan(aBaseUF,{|aUF|aUF[_kUF_SIGLA]==cUF})) > 0
return Eval(aBaseUF[i][_kUF_IE_VALID],StrTran(cIE," "))
end
return .F. // erro na UF fornecida
//**************************************************************************************************
function ValidUF(cUF,lEX) // Valida a UF informada
// EX, em nível de escrituração fiscal, significa um país do EXterior
default lEX to .F.
return if(cUF="EX", lEX, AScan(aBaseUF,{|aUF|aUF[_kUF_SIGLA]==cUF}) > 0)
//**************************************************************************************************
function Modulo11(cStr,nPeso1,nPeso2) // módulo 11, com pesos nPeso1 (inicial) a nPeso2 (final), que
local nTot := 0 // serão utilizados no multiplicador dos dígitos, apanhados da
local nMul := nPeso1 // direita para a esquerda. Tal multiplicador será reciclado e
local i // voltará para nPeso1, quando o limite (nPeso2) for atingido.
*
for i := Len(cStr) to 1 step -1
nTot += Val(SubStr(cStr,i,1)) * nMul
nMul := if(nMul=nPeso2, nPeso1, nMul+1)
next
return if(nTot%11 < 2, "0", Str(11-(nTot%11),1))
/*
FUNÇÕES DE VALIDAÇÃO DAS IEs DE TODOS OS ESTADOS
*/
//**************************************************************************************************
static function ValidIE_AC(cIE)
return SubStr(cIE, 1,2) = "01" .and.;
SubStr(cIE,12,1) = Modulo11(Left(cIE,11),2,9) .and.;
SubStr(cIE,13,1) = Modulo11(Left(cIE,12),2,9)
//**************************************************************************************************
static function ValidIE_AL(cIE)
return SubStr(cIE,1,2) = "24" .and.; // código do Estado
SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_AM(cIE)
return SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_AP(cIE)
local nTot
local cDVe
local i
*
if !Left(cIE,2) = "03"
return .F.
end
*
if(cIE <= "03017000", (nTot := 5 , cDVe := "0"),;
if(cIE <= "03019022", (nTot := 9 , cDVe := "1"),;
(nTot := 0 , cDVe := "0") ))
for i := 1 to 8
nTot += Val(SubStr(cIE,i,1)) * (10-i)
next
return SubStr(cIE,9,1) == if(nTot%11=0, "0", if(nTot%11=1, cDVe, Str(11-(nTot%11),1)))
//**************************************************************************************************
static function ValidIE_BA(cIE)
local cStr := Left(cIE,6)
local nMod := if(Left(cIE,1) $ "679", 11, 10)
local nTot := 0
local i,k
*
for i := 1 to 2
for k := Len(cStr) to 1 step -1
nTot += Val(SubStr(cStr,k,1)) * ((7+i)-k)
next
cStr += if(nTot%nMod < nMod-9, "0", Str(nMod-(nTot%nMod),1))
nTot := 0
next
return SubStr(cStr,8,1)+SubStr(cStr,7,1) == SubStr(cIE,7,2)
//**************************************************************************************************
static function ValidIE_CE(cIE)
return SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_DF(cIE)
local cStr := Left(cIE,11)
local nTot := 0
local nMul
local i,k
*
for i := 1 to 2
nMul := 2
for k := Len(cStr) to 1 step -1
nTot += Val(SubStr(cStr,k,1)) * nMul
nMul := if(nMul=9, 2, nMul+1)
next
cStr += if(nTot%11 < 2, "0", Str(11-(nTot%11),1))
nTot := 0
next
return Right(cStr,2) == SubStr(cIE,12,2)
//**************************************************************************************************
static function ValidIE_ES(cIE)
return SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_GO(cIE)
local nTot := 0
local nMul := 2
*
if !Left(cIE,2) $ "10.11.15"
return .F.
end
for i := 8 to 1 step -1
nTot += Val(SubStr(cIE,i,1)) * nMul
nMul := if(nMul=9, 2, nMul+1)
next
if (nTot := nTot%11) < 2
nTot := if(nTot=0, 0, if(Left(cIE,8)="11094402", 1,;
if(Left(cIE,8)<"10103105" .or. Left(cIE,8)>"10119997", 0, 1)))
else
nTot := 11-nTot
end
return Str(nTot,1) = Right(cIE,1)
//**************************************************************************************************
static function ValidIE_MA(cIE)
return SubStr(cIE,1,2) = "12" .and.;
SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_MG(cIE)
local cStr := Stuff(cIE,4,0,"0")
local nTot := 0
local nSub
local i
*
for i := 1 to 12
nSub := Val(SubStr(cStr,i,1))*if(i%2=0,2,1)
nTot += if(nSub>9, Int(nSub/10)+(nSub%10), nSub)
next
cStr := Left(cIE,11) + if(nTot%10=0, "0", Str(((Int(nTot/10)+1)*10)-nTot,1))
cStr += Modulo11(cStr,2,11)
*
return Right(cStr,2) == SubStr(cIE,12,2)
//**************************************************************************************************
static function ValidIE_MS(cIE)
return SubStr(cIE,1,2) = "28" .and.;
SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_MT(cIE)
return SubStr(cIE,11,1) = Modulo11(Left(cIE,10),2,9)
//**************************************************************************************************
static function ValidIE_PA(cIE)
return SubStr(cIE,1,2) = "15" .and.;
SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_PB(cIE)
return SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_PE(cIE)
local nTot := 0
local nMul := 2
local i
*
for i := 13 to 1 step -1
nTot += Val(SubStr(cIE,i,1)) * nMul
nMul := if(nMul=9, 1, nMul+1)
next
nTot := 11-(nTot%11)
return SubStr(cIE,14,1) = Str(if(nTot>9, nTot-10, nTot),1)
//**************************************************************************************************
static function ValidIE_PI(cIE)
return SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_PR(cIE)
local cDVs := SubStr(cIE,9,2)
*
cIE := Left(cIE,8)
cIE += Modulo11(cIE,2,7)
cIE += Modulo11(cIE,2,7)
return cDVs = Right(cIE,2)
//**************************************************************************************************
static function ValidIE_RJ(cIE)
return SubStr(cIE,8,1) = Modulo11(Left(cIE,7),2,7)
//**************************************************************************************************
static function ValidIE_RN(cIE)
local cStr := Left(cIE,8)
local nTot := 0
local nMul := 2
local i
*
for i := Len(cStr) to 1 step -1
nTot += Val(SubStr(cStr,i,1)) * nMul
nMul := if(nMul=9, 2, nMul+1)
next
nTot := (nTot*10)%11
return SubStr(cIE,9,1) = Str(if(nTot=10, "0", nTot),1)
//**************************************************************************************************
static function ValidIE_RO(cIE)
local cStr := Left(cIE,13)
local nTot := 0
local nMul := 2
local i
*
// Fórmula adotada a partir de 01/08/2000
for i := Len(cStr) to 1 step -1
nTot += Val(SubStr(cStr,i,1)) * nMul
nMul := if(nMul=9, 2, nMul+1)
next
nTot := 11-(nTot%11)
return SubStr(cIE,14,1) = Str(if(nTot>9, nTot-10, nTot),1)
//**************************************************************************************************
static function ValidIE_RR(cIE)
local cStr := Left(cIE,8)
local nTot := 0
local i
*
for i := 1 to Len(cStr)
nTot += Val(SubStr(cStr,i,1)) * i
next
return SubStr(cIE,9,1) = Str(nTot%9,1)
//**************************************************************************************************
static function ValidIE_RS(cIE)
return SubStr(cIE,10,1) = Modulo11(Left(cIE,9),2,9)
//**************************************************************************************************
static function ValidIE_SC(cIE)
return SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_SE(cIE)
return SubStr(cIE,9,1) = Modulo11(Left(cIE,8),2,9)
//**************************************************************************************************
static function ValidIE_SP(cIE)
local cStr
local nTot
local nMul
local aMul := {1,3,4,5,6,7,8,10}
local i
*
if Left(cIE,1) = "P"
cStr := SubStr(cIE,2,8)
nTot := 0
for i := 1 to 8
nTot += Val(SubStr(cStr,i,1)) * aMul[i]
next
return SubStr(cIE,10,1) = Right(Str(Int(nTot%11)),1)
else
cStr := Left(cIE,8)
nTot := 0
for i := 1 to 8
nTot += Val(SubStr(cStr,i,1)) * aMul[i]
next
cStr += Right(Str(Int(nTot%11)),1) + SubStr(cIE,10,2)
*
nMul := 2
nTot := 0
for i := 11 to 1 step -1
nTot += Val(SubStr(cStr,i,1)) * nMul
nMul := if(nMul=10, 2, nMul+1)
next
return SubStr(cIE,9,4) == SubStr(cStr,9,3)+Right(Str(Int(nTot%11)),1)
end
//**************************************************************************************************
static function ValidIE_TO(cIE)
return SubStr(cIE, 1,2) = "29" .and.; // código do Estado
SubStr(cIE, 3,2) $ "01.02.03.99" .and.; // posições excluídas do cálculo
SubStr(cIE,11,1) = Modulo11(Left(Stuff(cIE,3,2,""),8),2,9)