Verificação da Inscrição
Estadual
Cálculos e exemplos de validação
por Marcos P. Gomes
Ultimamente tenho recebido inúmeros e-mails pedindo a fórmula para checar o número da Inscrição Estadual. Devido a essa demanda, nessa matéria vamos fazer uma função passo a passo que verifica se o número da Inscrição Estadual informado está correto.
Mas antes disso é preciso fazer uma observação importante: A Inscrição Estadual, como o próprio nome diz, é um número controlado pelo Estado, ou seja, cada Estado tem seu número. Então você pode estar pensando: “Será que vou ter que fazer uma fórmula para cada Estado?”. Infelizmente, a resposta é sim. Cada estado tem sua própria fórmula para efetuar o cálculo. Nessa matéria vamos mostrar como fazer o cálculo somente para o estado de São Paulo e somente para as indústrias e comércios, pois a inscrição estadual para os produtores rurais também tem sua formula diferenciada.
Depois você pode usar essa rotina como guia para fazer seu sistema checar o dígito para os demais estados.
As fórmulas para o cálculo do dígito verificador dos outros estados você encontra no site www.sintegra.gov.br. Lá, além da fórmula para cada Estado, é também fornecida uma DLL para que você possa usar juntamente com o Delphi ou com qualquer outra ferramenta que utilize esse recurso. Junto com essa DLL, o Sintegra nos dá dois exemplos de uso, um com o Delphi e outro com o Access. Assim fica em suas mãos decidir o que será mais fácil – usar uma DLL ou fazer o código para os outros Estados.
O cálculo
Mas agora chega de conversa e vamos por a mão na massa! Vamos à fórmula do cálculo do dígito verificador da Inscrição Estadual (módulo 11).
Uma regra geral: em todas as contagens de posições de caracteres
e cálculos efetuados deverão ser ignorados caracteres diferentes da letra
"P" e dos algarismos 0, 1, 2, 3, 4, 5, 6,7, 8 e 9.
Industriais e comerciantes
Para Industriais e comerciantes (exceto produtores rurais a eles não equiparados, para checar a Inscrição para Produtores Rurais confira a formula no site do sintegra.), a inscrição tem as seguintes características:
Formato: 12 dígitos sendo que o 9º e o 12º são dígitos verificadores
Exemplo: Inscrição Estadual 110.042.490.114
a) Cálculo do 1º dígito verificador, ou seja, do 9º dígito contado a da esquerda para direita.
- Atribui-se um peso a cada dígito da Inscrição Estadual seguindo a ordem utilizada abaixo:
|
Insc. Estadual |
|
Pessos
|
Total
|
|
1 |
x |
1 |
1 |
|
1 |
x |
3 |
3 |
|
0 |
x |
4 |
0 |
|
0 |
x |
5 |
0 |
|
4 |
x |
6 |
24 |
|
2 |
x |
7 |
14 |
|
4 |
x |
8 |
32 |
|
9 |
x |
10 |
90 |
|
Soma dos Resultados |
164 |
||
- O 9o. dígito será o resto da divisão da soma 164 dos resultados acima por 11
164/11 = 14 com resto = 10, então o 1º dígito verificador (9ª posição) é 0
b) Cálculo do 2º dígito verificador, ou seja, do 12º dígito contado da esquerda para direita
Atribui-se um peso a cada dígito da Inscrição Estadual seguindo a ordem utilizada abaixo:
|
Insc. Estadual |
|
Pesos |
Total
|
|
|
1 |
x |
3 |
3 |
|
|
1 |
x |
2 |
2 |
|
|
0 |
x |
10 |
0 |
|
|
0 |
x |
9 |
0 |
|
|
4 |
x |
8 |
32 |
|
|
2 |
x |
7 |
14 |
|
|
4 |
x |
6 |
24 |
|
|
9 |
x |
5 |
45 |
|
|
0 |
x |
4 |
0 |
|
|
1 |
x |
3 |
3 |
|
|
1 |
x |
2 |
2 |
|
|
Soma dos Resultados |
125 |
|||
O 12o. dígito será o resto da divisão da soma 125 dos resultados acima por 11
125/11 = 11 com resto = 4, então o 2º dígito verificador (12ª posição) é 4
Fica então formada a inscrição 110.042.490.114
No Delphi
Bem, acima foi explicada a fórmula para gerar o dígito verificador da Inscrição Estadual para o estado de São Paulo. Nessa fórmula também é mostrado como fazer para checar o dígito da Inscrição Estadual para a Indústria, o Comércio e Produtores Rurais, porém vamos montar a fórmula somente para checar Indústria e Comércio.Vamos ver como fica dentro do Delphi.
Crie um novo projeto no Delphi, e declare a seguinte função com o nome checaie. Essa função receberá dois parâmetros, o primeiro é a Unidade Federal e o segundo é o número da Inscrição Estadual e a função retornará True ou False.
edtUf: TEdit;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
function checaie(uf : string;ie : string) :
boolean;
{ Public declarations }
end;
Após declarar o cabeçalho da função, vamos criar o corpo dela, onde será implementado o código para checagem do número. Para isso pressione SHIFT+CTRL+C. Isso fará com que ele crie um bloco de código e aparecerá uma tela semelhante a essa, onde será implementado nosso código.
function
TForm2.checaie(uf, ie: string): boolean;
begin
end;
Bem, agora vamos declarar duas constantes, chamadas Peso1 e Peso2. Essas constantes armazenarão os pesos para o cálculo do primeiro e do segundo dígito.
function
TForm1.checaie(uf, ie: string): boolean;
Const
//Define Peso1 e peso2 com os pesos para o calculo do
//1o. digito e 2o. Digito
Peso1 : array[1..8] of Integer = (1,3,4,5,6,7,8,10);
Peso2 : array[1..11] of Integer =
(3,2,10,9,8,7,6,5,4,3,2);
Agora vamos definir as variáveis que terão seu conteúdo alterado no decorrer da função. Para isso vamos usar quatro variáveis inteiras e uma do tipo String:
Tmp – Temporária apenas para que possamos usar o comando For
Soma – Será gravado a soma da multiplicação do número pelo peso.
Dig1 – Será gravado o Primeiro dígito
Dig2 – Será gravado o Segundo dígito
FimIE – É o número da Inscrição achada pelo nosso código
function
TForm1.checaie(uf, ie: string): boolean;
Const
//Define Peso1 e peso2 com os pesos para o calculo do
//1o. digito e 2o. Digito
Peso1 : array[1..8] of Integer =
(1,3,4,5,6,7,8,10);
Peso2 : array[1..11] of Integer =
(3,2,10,9,8,7,6,5,4,3,2);
Var
tmp,soma,dig1,dig2 : Integer;
FimIE : String;
Begin
Depois disso, vamos inicializar as nossas variáveis, para certificar de que elas realmente estarão zeradas.
Soma := 0;
tmp := 0; //Zera todas as variaveis
dig1 := 0;
dig2 := 0;
FimIE := '';
Vamos fazer um teste condicional para certificar de que o estado é realmente de São Paulo e em seguida vamos efetuar o cálculo do primeiro dígito.
If upperCase(uf) = 'SP' Then
Begin
//Vamos achar o valor do 1o. digito
for tmp := 1 to 8 do
Soma := Soma + ( StrToInt(ie[tmp]) * Peso1[tmp]);
Dig1 := Soma mod 11; //Grava o resto da divisão de soma por 11
if (Dig1 >= 10) Then
Dig1 := 0;
//faz a junção dos 8 primeiros numeros com o digito encontrado,
//apartir desse ponto acharemos o segundo digito.
FimIE := Copy(Ie,1,8) + IntToStr(Dig1) + Copy(Ie,10,2);
No trecho anterior, o sistema vai pegar cada número do parâmetro que foi recebido pela função checaie através da variável ie e multiplicará por cada item do array Peso1. Dessa forma o valor que vai ser gravado na variável FimIE são os 8 primeiros caracteres da variável IE e concatenado o valor do primeiro dígito que está na variável dig2. Após isso também será concatenado o décimo e o décimo primeiro valor da variável IE.
Até aqui já conseguimos achar o primeiro dígito de nossa Inscrição Estadual, agora vamos partir para achar o segundo dígito.
Soma := 0;
For
tmp := 1 To 11 Do
Soma := Soma + ( StrToInt( FimIE[tmp] )
* Peso2[tmp] );
Dig2 := Soma mod 11;
If Dig2 >= 10 Then
Dig2 := 0;
//Faz a junção do 2o. digito
FimIE := FimIE + Inttostr(Dig2);
If FimIE = IE Then
Result := True
else
Result := False;
End;
end;
O trecho anterior mostra como achar o segundo dígito, e em seguida compara o número de inscrição achado pelo sistema com o número informado, se os números forem iguais, retorna verdadeiro, caso contrário retorna falso.
Exemplo de uso
Vamos ver um exemplo de uso:
1. Cole dois edit´s em seu formulário e um botão.
2. Clique duas vezes no botão e adicione o seguinte código
if checaie(Edit1.Text, Edit1.Text) Then
ShowMessage('Ok')
else
ShowMessage('Inscrição Estadual Inválida');
Onde o Edit1 será a UF e o Edit2 será o número da Inscrição Estadual.
Marcos P. Gomes trabalha como desenvolvedor de sistemas em uma empresa do ramo automobilístico, desenvolve sistemas em diversas linguagens e é um dos fundadores do site http://www.delphibr.com.br/. Também faz parte do grupo de moderadores da lista de discussão lista-delphi@yahoogrupos.com.br. Pode ser contatado pelo e-mail marcos@delphibr.com.br.