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.

 

 

Clique aqui e faça download do código fonte desse artigo.

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.