CREATE FUNCTION FN_VALIDA_IE(
     Ds_UF varchar(2),
     Ds_Inscricao_Estadual varchar(18)
)
RETURNS INTEGER
AS

     DECLARE counter INT;
     DECLARE b INT;
     DECLARE soma INT;
     DECLARE dig INT;

     --auxiliares
     DECLARE p INT;
     DECLARE d INT;
     DECLARE i VARCHAR(18);
     DECLARE die VARCHAR(13);

BEGIN

     IF (CHAR_LENGTH(Ds_Inscricao_Estadual) > 0 AND CHAR_LENGTH(Ds_UF) = 2) then
     BEGIN

         --retira caracteres especiais da IE
         Ds_Inscricao_Estadual = REPLACE(REPLACE(REPLACE(FN_LTRIM(FN_RTRIM(Ds_Inscricao_Estadual)), '.', ''),'-', ''), '/', '');

         -- verifica IE para o estado AC
         IF (Ds_UF = 'AC') THEN
         BEGIN

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) <> 13 OR SUBSTRING(Ds_Inscricao_Estadual from 1 for 2) <> '01') then
                 RETURN(0);

             --calcula primeiro digito verificador
             counter = 1;
             b = 4;
             soma = 0;
             WHILE (counter < 12) do
             BEGIN
                  soma = soma + (SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF(b = 1) then
                     b = 9;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                 dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 12 for 1)) then
                 RETURN (0);

             --calcula segundo digito verificador
             counter = 1;
             b = 5;
             soma = 0;
             WHILE (counter < 13) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF (b = 1) then
                      b = 9;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 13 for 1)) then
                 RETURN (0);

         END
         --AC

         -- verifica IE para o estado AL
         ELSE IF (Ds_UF = 'AL') then
         BEGIN

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) <> 9 OR SUBSTRING(Ds_Inscricao_Estadual from 1 for 2) <> '24') then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              soma = soma * 10;
              dig = soma - FLOOR(soma / 11) * 11;

             IF (dig = 10) then
                  dig = 0;

             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --AL

         -- verifica IE para o estado AM
         ELSE IF (Ds_UF = 'AM') then
         BEGIN

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) <> 9) then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
             IF (soma < 11) then
                 dig = 11 - soma;
             ELSE
                 IF (soma / 11 <= 1) then
                      dig = 0;
                 ELSE
                      dig = 11 - ( soma / 11 );
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --AM

         -- verifica IE para o estado AP
         ELSE IF (Ds_UF = 'AP') then
         BEGIN

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) <> 9)then
                 RETURN(0);

             --calcula primeiro digito verificador
              p = 0;
              d = 0;
              i = SUBSTRING(Ds_Inscricao_Estadual from 1 for 8);
             IF (i >= 3000001 AND i <= 3017000) then
             BEGIN
                  p = 5;
                  d = 0;
             END
             ELSE
                 IF (i >= 3017001 AND i <= 3019022) then
                 BEGIN
                      p = 9;
                      d = 1;
                 END
              counter = 1;
              b = 9;
              soma = p;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(i from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = 11 - ( soma / 11 );
             IF (dig = 10) then
                  dig = 0;
             ELSE
                 IF (dig = 11) then
                     dig = d;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --AP

         -- verifica IE para o estado BA
         ELSE IF (Ds_UF = 'BA') then
         BEGIN

             --verifica tamanho da IE
             IF(CHAR_LENGTH(Ds_Inscricao_Estadual) <> 8) then
                 RETURN(0);

             --calcula segundo digito verificador
              counter = 1;
              b = 7;
              soma = 0;
             WHILE (counter < 7) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
             IF (SUBSTRING(Ds_Inscricao_Estadual from 1 for 1) IN ( '0','1', '2', '3', '4', '5', '8' )) then
                  dig = 10 - ( soma / 10 );
             ELSE
             BEGIN
                  dig = 11 - ( soma / 11 );
                 IF (dig <= 1) then
                      dig = 0;
             END
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 8 for 1)) then
                 RETURN (0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 8;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                 IF (counter <> 7) then
                 BEGIN
                      soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                      b = b - 1;
                 END
                  counter = counter + 1;
             END
             IF (SUBSTRING(Ds_Inscricao_Estadual from 1 for 1) IN ( '0','1', '2', '3', '4', '5', '8' )) then
                  dig = 10 - ( soma / 10 );
             ELSE
             BEGIN
                  dig = 11 - ( soma / 11 );
                 IF (dig <= 1) then
                      dig = 0;
             END
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 7 for 1)) then
                 RETURN (0);
         END
         --BA

         -- verifica IE para o estado CE
         ELSE IF (Ds_UF = 'CE') then
         BEGIN

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) > 9) then
                 RETURN(0);
              die = Ds_Inscricao_Estadual;
             IF ( CHAR_LENGTH(Ds_Inscricao_Estadual) < 9 ) then
             BEGIN
                 WHILE (CHAR_LENGTH(die) <= 8) do
                 BEGIN
                      die = '0' + die;
                 END
             END
             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(die from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --CE

         -- verifica IE para o estado DF
         ELSE IF (Ds_UF = 'DF') then
         BEGIN

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) <> 13 OR SUBSTRING(Ds_Inscricao_Estadual from 1 for 2) <> '07') then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 4;
              soma = 0;
             WHILE (counter < 12) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF (b = 1) then
                      b = 9;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 12 for 1)) then
                 RETURN (0);

             --calcula segundo digito verificador
              counter = 1;
              b = 5;
              soma = 0;
             WHILE (counter < 13) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF (b = 1) then
                      b = 9;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 13 for 1)) then
                 RETURN (0);

         END
         --DF

         -- verifica IE para o estado ES
         ELSE IF (Ds_UF = 'ES') then
         BEGIN

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) <> 9) then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = soma / 11;
             IF (dig < 2) then
                  dig = 0;
             ELSE
                  dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --ES

         -- verifica IE para o estado GO
         ELSE IF (Ds_UF = 'GO') then
         BEGIN

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) <> 9 OR SUBSTRING(Ds_Inscricao_Estadual from 1 for 2) NOT IN ( '10', '11', '15'))then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = soma / 11;
             IF ( dig = 1 ) then
             BEGIN
                 IF (SUBSTRING(Ds_Inscricao_Estadual from 1 for 8) >= 10103105 AND SUBSTRING(Ds_Inscricao_Estadual from 1 for 8) <= 10119997)then
                      dig = 1;
                 ELSE
                      dig = 0;
             END
             ELSE
                 IF (dig > 1) then
                      dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --GO

         -- verifica IE para o estado MA
         ELSE IF (Ds_UF = 'MA') then
         BEGIN

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) <> 9 OR SUBSTRING(Ds_Inscricao_Estadual from 1 for 2) <> '12') then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = soma / 11;
             IF (dig <= 1) then
                  dig = 0;
             ELSE
                dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --MA

         -- verifica IE para o estado MG
         ELSE IF (Ds_UF = 'MG') then
         BEGIN

             IF (SUBSTRING(Ds_Inscricao_Estadual from 1 for 2) = 'PR' OR 
SUBSTRING(Ds_Inscricao_Estadual from 1 for 5) = 'ISENT')then
                 RETURN(1);

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) <> 13) then
                 RETURN(0);

              die = SUBSTRING(Ds_Inscricao_Estadual from 1 for 3) + '0' + SUBSTRING(Ds_Inscricao_Estadual from 4 for 11);
             --calcula primeiro digito verificador
              counter = 1;
              b = 1;
              soma = 0;
             WHILE (counter < 13) do
             BEGIN
                 IF ((SUBSTRING(die from counter for 1) * b ) >= 10) then
                      soma = soma + ( ( SUBSTRING(die from counter for 1) * b ) - 9 );
                 ELSE
                      soma = soma + ( SUBSTRING(die from counter for 1) * b );
                  counter = counter + 1;
                  b = b + 1;
                 IF (b = 3) then
                      b = 1;
             END
              dig = ( ( FLOOR(soma / 10) + 1 ) * 10 ) - soma;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 12 for 1)) then
                 RETURN (0);

             --calcula segundo digito verificador
              counter = 1;
              b = 3;
              soma = 0;
             WHILE (counter < 13) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF (b = 1) then
                      b = 11;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 13 for 1)) then
                 RETURN (0);

         END
         --MG

         -- verifica IE para o estado MT
         ELSE IF (Ds_UF = 'MT') then
         BEGIN

             --verifica tamanho da IE
             IF (CHAR_LENGTH(Ds_Inscricao_Estadual) < 9) then
                 RETURN(0);

              die = Ds_Inscricao_Estadual;
             IF ( CHAR_LENGTH(Ds_Inscricao_Estadual) < 11 ) then
             BEGIN
                 WHILE (CHAR_LENGTH(die) <= 11) do
                 BEGIN
                      die = '0' + die;
                 END
             END
             --calcula primeiro digito verificador
              counter = 1;
              b = 3;
              soma = 0;
             WHILE (counter < 11) do
             BEGIN
                  soma = soma + ( SUBSTRING(die from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF (b = 1) then
                      b = 9;
             END
              dig = soma / 11;
             IF (dig <= 1) then
                  dig = 0;
             ELSE
                  dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 11 for 1)) then
                 RETURN (0);
         END
         --MT

         -- verifica IE para o estado MS
         ELSE IF (Ds_UF = 'MS') then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 9 OR 
SUBSTRING(Ds_Inscricao_Estadual from 1 for 2) <> '28') then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = soma / 11;
             IF (dig <= 1) then
                  dig = 0;
             ELSE
                  dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --MS

         -- verifica IE para o estado PA
         ELSE IF (Ds_UF = 'PA') then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 9 OR 
SUBSTRING(Ds_Inscricao_Estadual from 1 for 2) <> '15')then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = soma / 11;
             IF (dig <= 1) then
                  dig = 0;
             ELSE
                  dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --PA

         -- verifica IE para o estado PA
         ELSE IF (Ds_UF = 'PA') then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 9 OR 
SUBSTRING(Ds_Inscricao_Estadual from 1 for 2) <> '15')then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = soma / 11;
             IF (dig <= 1) then
                 dig = 0;
             ELSE
                 dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --PA

         -- verifica IE para o estado PB
         ELSE IF (Ds_UF = 'PB') then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 9) then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + (SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = soma / 11;
             IF (dig <= 1) then
                  dig = 0;
             ELSE
                  dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1))then
                 RETURN (0);
         END
         --PB

         -- verifica IE para o estado PR
         ELSE IF (Ds_UF = 'PR') then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 10) then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 3;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF (b = 1) then
                      b = 7;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);

             --calcula segundo digito verificador
              counter = 1;
              b = 4;
              soma = 0;
             WHILE (counter < 10) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF (b = 1)then
                     b = 7;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 10 for 1))then
                 RETURN (0);

         END
         --PR

         -- verifica IE para o estado PE
         ELSE IF (Ds_UF = 'PE')then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 9)then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 8;
              soma = 0;
             WHILE (counter < 8)do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10)then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 8 for 1))then
                 RETURN (0);

             --calcula segundo digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + (SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1))then
                 RETURN (0);

         END
         --PE

         -- verifica IE para o estado PI
         ELSE IF (Ds_UF = 'PI') then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 9) then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = soma / 11;
             IF (dig <= 1) then
                  dig = 0;
             ELSE
                  dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1)) then
                 RETURN (0);
         END
         --PI

         -- verifica IE para o estado RJ
         ELSE IF (Ds_UF = 'RJ') then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 8) then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 2;
              soma = 0;
             WHILE (counter < 8) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF (b = 1) then
                      b = 7;
             END
              dig = soma / 11;
             IF (dig <= 1) then
                  dig = 0;
             ELSE
                  dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 8 for 1))then
                 RETURN (0);
         END
         --RJ

         -- verifica IE para o estado RN
         ELSE IF (Ds_UF = 'RN') then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 9) then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from 
counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              soma = soma * 10;
              dig = soma / 11;
             IF (dig = 10) then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1))then
                 RETURN (0);
         END
         --RN

         -- verifica IE para o estado RS
         ELSE IF (Ds_UF = 'RS') then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 10 OR 
SUBSTRING(Ds_Inscricao_Estadual from 1 for 3) > '467') then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 2;
              soma = 0;
             WHILE (counter < 10) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF (b = 1) then
                      b = 9;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 10 for 1))then
                 RETURN (0);
         END
         --RS

         -- verifica IE para o estado RO
         ELSE IF (Ds_UF = 'RO')then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 14)then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 6;
              soma = 0;
             WHILE (counter < 14)do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
                 IF (b = 1)then
                      b = 9;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10) then
                  dig = dig - 10;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 14 for 1))then
                 RETURN (0);
         END
         --RO

         -- verifica IE para o estado RR
         ELSE IF (Ds_UF = 'RR')then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 9 OR 
SUBSTRING(Ds_Inscricao_Estadual from 1 for 2) <> '24')then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 1;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b + 1;
             END

              dig = soma / 9;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1))then
                 RETURN (0);
         END
         --RR

         -- verifica IE para o estado SC
         ELSE IF (Ds_UF = 'SC')then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 9)then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9) do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = soma / 11;
             IF (dig <= 1)then
                  dig = 0;
             ELSE
                  dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1))then
                 RETURN (0);
         END
         --SC

         -- verifica IE para o estado SP
         ELSE IF (Ds_UF = 'SP') then
         BEGIN

             IF (SUBSTRING(Ds_Inscricao_Estadual from 1 for 1) = 'P')then
             BEGIN
                  die = SUBSTRING(Ds_Inscricao_Estadual from 2 for 9);
                  soma = ( SUBSTRING(die from 1 for 1) * 1 ) + ( 
SUBSTRING(die from 2 for 1) * 3 ) + ( SUBSTRING(die from 3 for 1) * 4 ) 
+ ( SUBSTRING(die from 4 for 1) * 5 ) + ( SUBSTRING(die from 5 for 1) * 
6 ) + ( SUBSTRING(die from 6 for 1) * 7 ) + ( SUBSTRING(die from 7 for 
1) * 8 ) + ( SUBSTRING(die from 8 for 1) * 10 );
                  dig = soma / 11;
                 IF (dig >= 10)then
                      dig = 0;
                 IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 10 for 1))then
                     RETURN (0);
             END
             ELSE
             BEGIN
                 IF (LEN(Ds_Inscricao_Estadual) < 12)then
                     RETURN(0);
                  soma = ( SUBSTRING(Ds_Inscricao_Estadual from 1 for 1)
* 1 ) + ( SUBSTRING(Ds_Inscricao_Estadual from 2 for 1) * 3 ) + (
SUBSTRING(Ds_Inscricao_Estadual from 3 for 1) * 4 ) + ( 
SUBSTRING(Ds_Inscricao_Estadual from 4 for 1) * 5 ) + ( 
SUBSTRING(Ds_Inscricao_Estadual from 5 for 1) * 6 ) + ( 
SUBSTRING(Ds_Inscricao_Estadual from 6 for 1) * 7 ) + ( 
SUBSTRING(Ds_Inscricao_Estadual from 7 for 1) * 8 ) + ( 
SUBSTRING(Ds_Inscricao_Estadual from 8 for 1) * 10 );
                  dig = soma / 11;
                 IF (dig >= 10) then
                      dig = 0;
                 IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1))then
                     RETURN (0);

                  counter = 1;
                  b = 3;
                  soma = 0;
                 WHILE (counter < 12) do
                 BEGIN
                      soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from counter for 1) * b );
                      counter = counter + 1;
                      b = b - 1;
                     IF (b = 1)then
                          b = 10;
                 END
                  dig = soma / 11;
                 IF (dig >= 10)then
                      dig = 0;
                 IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 12 for 1))then
                     RETURN (0);
             END
         END
         --SP

         -- verifica IE para o estado SE
         ELSE IF (Ds_UF = 'SE') then
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 9)then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 9)do
             BEGIN
                  soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual from 
counter for 1) * b );
                  counter = counter + 1;
                  b = b - 1;
             END
              dig = 11 - ( soma / 11 );
             IF (dig >= 10)then
                  dig = 0;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 9 for 1))then
                 RETURN (0);
         END
         --SE

         -- verifica IE para o estado TO
         ELSE IF (Ds_UF = 'TO')THEN
         BEGIN

             --verifica tamanho da IE
             IF (LEN(Ds_Inscricao_Estadual) <> 11 OR 
SUBSTRING(Ds_Inscricao_Estadual from 3 for 2) NOT IN ( '01', '02', '03', '99' ))then
                 RETURN(0);

             --calcula primeiro digito verificador
              counter = 1;
              b = 9;
              soma = 0;
             WHILE (counter < 11)do
             BEGIN
                 IF (counter NOT IN ( 3, 4 ))then
                 BEGIN
                      soma = soma + ( SUBSTRING(Ds_Inscricao_Estadual 
from counter for 1) * b );
                      b = b - 1;
                 END
                  counter = counter + 1;
             END
              dig = soma / 11;
             IF (dig < 2) then
                  dig = 0;
             ELSE
                  dig = 11 - dig;
             IF (dig <> SUBSTRING(Ds_Inscricao_Estadual from 11 for 1))then
                 RETURN (0);
         END
         --TO


         ELSE
             RETURN(0);
     END
     ELSE
         RETURN(0);

     --retorna true
     RETURN(1);
END;