Ferramentas / Validador de Inscrição Estadual de SP

Validador de Inscrição Estadual de SP

Digite a IE de São Paulo e veja na hora se o tamanho e os dois dígitos verificadores conferem.

    Atenção: cada UF tem regra própria de inscrição estadual. Esta ferramenta valida somente São Paulo.

    Processamento local: nada do que você digita sai do seu navegador.

    Como usar

    Digite a inscrição estadual de SP com 12 dígitos, com ou sem pontos. A resposta aparece enquanto você digita e informa qual dígito verificador está errado.

    Atenção: cada UF tem sua regra

    A inscrição estadual não segue um padrão nacional: cada estado define tamanho e cálculo próprios. Esta ferramenta valida somente a IE de São Paulo (contribuinte industrial e comercial, 12 dígitos). Para outros estados, o resultado aqui não vale. A IE de produtor rural de SP (começa com P) também não é tratada.

    Como o cálculo funciona

    Formato NNNNNNNN D NN D. O 1º dígito (9ª posição) é a soma dos 8 primeiros dígitos com pesos 1, 3, 4, 5, 6, 7, 8, 10, módulo 11, mantendo só o último algarismo do resto. O 2º (12ª posição) usa os 11 primeiros dígitos com pesos 3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2 e a mesma redução. Isso confere a consistência do número; não consulta a Sefaz nem confirma a situação cadastral.

    Como implementar em código

    Exemplos prontos para usar no seu projeto.

    // Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D
    function ieSpValida(valor) {
      const n = String(valor).replace(/\D/g, '');
      if (n.length !== 12) return false;
      const d = n.split('').map(Number);
      const p1 = [1, 3, 4, 5, 6, 7, 8, 10];
      const p2 = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2];
      const dv1 = (p1.reduce((s, p, i) => s + p * d[i], 0) % 11) % 10;   // 9ª posição
      const base = [...d.slice(0, 8), dv1, d[9], d[10]];
      const dv2 = (p2.reduce((s, p, i) => s + p * base[i], 0) % 11) % 10; // 12ª posição
      return dv1 === d[8] && dv2 === d[11];
    }
    
    console.log(ieSpValida('110.042.490.114')); // true
    import re
    
    def ie_sp_valida(valor: str) -> bool:
        """Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D."""
        n = re.sub(r"\D", "", valor)
        if len(n) != 12:
            return False
        d = [int(c) for c in n]
        p1 = [1, 3, 4, 5, 6, 7, 8, 10]
        p2 = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2]
        dv1 = sum(p * x for p, x in zip(p1, d)) % 11 % 10             # 9ª posição
        base = d[:8] + [dv1, d[9], d[10]]
        dv2 = sum(p * x for p, x in zip(p2, base)) % 11 % 10          # 12ª posição
        return dv1 == d[8] and dv2 == d[11]
    
    print(ie_sp_valida("110.042.490.114"))  # True
    import "regexp"
    
    var naoDigito = regexp.MustCompile(`\D`)
    
    // IeSpValida valida a Inscrição Estadual de SP (12 dígitos, 2 DVs).
    func IeSpValida(valor string) bool {
    	n := naoDigito.ReplaceAllString(valor, "")
    	if len(n) != 12 {
    		return false
    	}
    	d := make([]int, 12)
    	for i := range d {
    		d[i] = int(n[i] - '0')
    	}
    	p1 := []int{1, 3, 4, 5, 6, 7, 8, 10}
    	p2 := []int{3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2}
    	s := 0
    	for i, p := range p1 {
    		s += p * d[i]
    	}
    	dv1 := s % 11 % 10 // 9ª posição
    	base := append(append([]int{}, d[:8]...), dv1, d[9], d[10])
    	s = 0
    	for i, p := range p2 {
    		s += p * base[i]
    	}
    	dv2 := s % 11 % 10 // 12ª posição
    	return dv1 == d[8] && dv2 == d[11]
    }
    /// Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D.
    bool ieSpValida(String valor) {
      final n = valor.replaceAll(RegExp(r'\D'), '');
      if (n.length != 12) return false;
      final d = n.split('').map(int.parse).toList();
      const p1 = [1, 3, 4, 5, 6, 7, 8, 10];
      const p2 = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2];
      var s = 0;
      for (var i = 0; i < 8; i++) {
        s += p1[i] * d[i];
      }
      final dv1 = s % 11 % 10; // 9ª posição
      final base = [...d.sublist(0, 8), dv1, d[9], d[10]];
      s = 0;
      for (var i = 0; i < 11; i++) {
        s += p2[i] * base[i];
      }
      final dv2 = s % 11 % 10; // 12ª posição
      return dv1 == d[8] && dv2 == d[11];
    }
    final class Validador {
        /** Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D. */
        static boolean ieSpValida(String valor) {
            String n = valor.replaceAll("\\D", "");
            if (n.length() != 12) return false;
            int[] d = new int[12];
            for (int i = 0; i < 12; i++) d[i] = n.charAt(i) - '0';
            int[] p1 = {1, 3, 4, 5, 6, 7, 8, 10};
            int[] p2 = {3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2};
            int s = 0;
            for (int i = 0; i < 8; i++) s += p1[i] * d[i];
            int dv1 = s % 11 % 10;                                   // 9ª posição
            int[] base = {d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], dv1, d[9], d[10]};
            s = 0;
            for (int i = 0; i < 11; i++) s += p2[i] * base[i];
            int dv2 = s % 11 % 10;                                   // 12ª posição
            return dv1 == d[8] && dv2 == d[11];
        }
    }
    <?php
    // Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D
    function ieSpValida(string $valor): bool {
        $n = preg_replace('/\D/', '', $valor);
        if (strlen($n) !== 12) return false;
        $d = array_map('intval', str_split($n));
        $p1 = [1, 3, 4, 5, 6, 7, 8, 10];
        $p2 = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2];
        $s = 0;
        foreach ($p1 as $i => $p) $s += $p * $d[$i];
        $dv1 = $s % 11 % 10;                                          // 9ª posição
        $base = array_merge(array_slice($d, 0, 8), [$dv1, $d[9], $d[10]]);
        $s = 0;
        foreach ($p2 as $i => $p) $s += $p * $base[$i];
        $dv2 = $s % 11 % 10;                                          // 12ª posição
        return $dv1 === $d[8] && $dv2 === $d[11];
    }
    using System.Linq;
    using System.Text.RegularExpressions;
    
    public static class Validador
    {
        // Inscrição Estadual de SP (12 dígitos): NNNNNNNN D NN D
        public static bool IeSpValida(string valor)
        {
            var n = Regex.Replace(valor, @"\D", "");
            if (n.Length != 12) return false;
            var d = n.Select(c => c - '0').ToArray();
            int[] p1 = { 1, 3, 4, 5, 6, 7, 8, 10 };
            int[] p2 = { 3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            int s = 0;
            for (int i = 0; i < 8; i++) s += p1[i] * d[i];
            int dv1 = s % 11 % 10;                                   // 9ª posição
            var b = d.Take(8).Concat(new[] { dv1, d[9], d[10] }).ToArray();
            s = 0;
            for (int i = 0; i < 11; i++) s += p2[i] * b[i];
            int dv2 = s % 11 % 10;                                   // 12ª posição
            return dv1 == d[8] && dv2 == d[11];
        }
    }

    Perguntas frequentes

    A regra serve para outros estados?

    Não. Cada UF tem tamanho e algoritmo próprios para a inscrição estadual. Esta ferramenta valida apenas São Paulo.

    A validação consulta a Sefaz?

    Não. Só confere os dígitos verificadores. A situação cadastral só é obtida em consulta oficial.

    E a IE de produtor rural?

    A IE de produtor rural de SP (começa com a letra P) tem formato diferente e não é tratada por esta ferramenta.

    Veja também

    Precisa de um sistema ou app sob medida?

    A VcInova desenvolve software, aplicativos e integrações para empresas de todo o Brasil.

    Fale com a VcInova