validate_ie
Version:
Biblioteca de validação de inscrições estaduais
641 lines (489 loc) • 15.6 kB
JavaScript
/* global window */
/* global define */
'use strict';
function eIndefinido(objeto){
return typeof objeto === typeof undefined;
}
function tamanhoNaoE(string, tamanho){
if(eIndefinido(tamanho)) {
tamanho = 9;
}
return string.length !== tamanho;
}
function tamanhoE(string, tamanho){
return !tamanhoNaoE(string, tamanho);
}
function serie(de, ate){
var resultado = [];
while(de <= ate) {
resultado.push(de++);
}
return resultado;
}
function primeiros(string, quantidade){
if(eIndefinido(quantidade)) {
quantidade = 8;
}
return string.substring(0, quantidade);
}
function substracaoPor11SeMaiorQue2CasoContrario0(valor){
return valor < 2 ? 0 : 11 - valor;
}
function mod(valor, multiplicadores, divisor){
if(eIndefinido(divisor)) {
divisor = 11;
}
if(eIndefinido(multiplicadores)) {
multiplicadores = serie(2, 9);
}
var i = 0;
return valor.split('').reduceRight(function(anterior, atual) {
if(i > multiplicadores.length - 1) {
i = 0;
}
return (multiplicadores[i++] * parseInt(atual, 10)) + anterior;
}, 0) % divisor;
}
function calculoTrivial(valor, base, validarTamanho){
if(!validarTamanho && tamanhoNaoE(valor)) {
return false;
}
if(eIndefinido(base)) {
base = primeiros(valor);
}
var digito = substracaoPor11SeMaiorQue2CasoContrario0(mod(base));
return valor === base + digito;
}
function naoComecaCom(string, valor){
return string.substring(0, valor.length) !== valor;
}
function entre(valor, limiteInferior, limiteSuperior){
if(typeof valor === 'string') {
valor = parseInt(valor, 10);
}
return valor >= limiteInferior && valor <= limiteSuperior;
}
var funcoes = {
ba: function(valor){
if(tamanhoNaoE(valor, 8) && tamanhoNaoE(valor)) {
return false;
}
var base = primeiros(valor, valor.length - 2);
var primeiroDigito, segundoDigito;
var segundoMultiplicador = serie(2, 7);
var primeiroMultiplicador = serie(2, 8);
var primeiroResto, segundoResto;
var digitoComparacao = valor.substring(0, 1);
if(tamanhoE(valor, 9)) {
segundoMultiplicador.push(8);
primeiroMultiplicador.push(9);
digitoComparacao = valor.substring(1, 2);
}
if('0123458'.split('').indexOf(digitoComparacao) !== -1) {
segundoResto = mod(base, segundoMultiplicador, 10);
segundoDigito = segundoResto === 0 ? 0 : 10 - segundoResto;
primeiroResto = mod(base + segundoDigito, primeiroMultiplicador, 10);
primeiroDigito = primeiroResto === 0 ? 0 : 10 - primeiroResto;
} else {
segundoResto = mod(base, segundoMultiplicador);
segundoDigito = substracaoPor11SeMaiorQue2CasoContrario0(segundoResto);
primeiroResto = mod(base + segundoDigito, primeiroMultiplicador);
primeiroDigito = substracaoPor11SeMaiorQue2CasoContrario0(primeiroResto);
}
return valor === base + primeiroDigito + segundoDigito;
},
se: function(valor){
if(tamanhoNaoE(valor)) {
return false;
}
return calculoTrivial(valor);
},
al: function(valor){
if(tamanhoNaoE(valor)) {
return false;
}
if(naoComecaCom(valor, '24')) {
return false;
}
//
// Removi a validação do tipo da empresa abaixo
// devido a ambiguidade entre a especificação do
// Sintegra (http://www.sintegra.gov.br/Cad_Estados/cad_AL.html) e do
// site do da Sefaz do Alagoas (http://www.sefaz.al.gov.br/sintegra/cad_AL.asp).
// Veja o issue #4 - https://github.com/gammasoft/ie/issues/4
//
// if('03578'.split('').indexOf(valor.substring(2, 3)) === -1) {
// return false;
// }
var base = primeiros(valor);
var resto = mod(base) * 10;
resto = resto - (parseInt(resto/11, 10) * 11);
var digito = resto === 10 ? 0 : resto;
return valor === base + digito;
},
pb: function(valor){
if(tamanhoNaoE(valor)) {
return false;
}
return calculoTrivial(valor);
},
rn: function(valor){
if(tamanhoNaoE(valor) && tamanhoNaoE(valor, 10)) {
return false;
}
if(naoComecaCom(valor, '20')) {
return false;
}
var base = valor.substring(0, valor.length - 1);
var multiplicadores = serie(2, 9);
if(tamanhoE(valor, 10)) {
multiplicadores.push(10);
}
var resto = (mod(base, multiplicadores) * 10) % 11;
var digito = resto === 10 ? 0 : resto;
return valor === base + digito;
},
ap: function(valor){
if(tamanhoNaoE(valor)) {
return false;
}
if(naoComecaCom(valor, '03')) {
return false;
}
var base = primeiros(valor);
var p, d;
if(entre(base, 3000001, 3017000)) {
p = 5;
d = 0;
} else if(entre(base, 3017001, 3019022)) {
p = 9;
d = 1;
} else {
p = 0;
d = 0;
}
var resto = mod(p + base, [2, 3, 4, 5, 6, 7, 8, 9, 1]);
var digito;
if(resto === 1) {
digito = 0;
} else if(resto === 0) {
digito = d;
} else {
digito = 11 - resto;
}
return valor === base + digito;
},
rr: function(valor){
if(tamanhoNaoE(valor)) {
return false;
}
if(naoComecaCom(valor, '24')) {
return false;
}
var base = primeiros(valor);
var digito = mod(base, [8, 7, 6, 5, 4, 3, 2, 1], 9);
return valor === base + digito;
},
am: function(valor){
if(tamanhoNaoE(valor)) {
return false;
}
return calculoTrivial(valor);
},
ro: function(valor){
var base, digito, resultadoMod;
if(tamanhoE(valor, 9)) {
base = valor.substring(3, 8);
digito = substracaoPor11SeMaiorQue2CasoContrario0(mod(base));
return valor === valor.substring(0, 3) + base + digito;
} else if(tamanhoE(valor, 14)) {
base = primeiros(valor, 13);
resultadoMod = mod(base);
digito = resultadoMod <= 1 ? 1 : 11 - resultadoMod;
return valor === base + digito;
} else {
return false;
}
},
rj: function(valor){
if(tamanhoNaoE(valor, 8)) {
return false;
}
var base = primeiros(valor, 7);
var digito = substracaoPor11SeMaiorQue2CasoContrario0(mod(base, serie(2, 7)));
return valor === base + digito;
},
sc: function(valor){
return calculoTrivial(valor);
},
pi: function(valor){
return calculoTrivial(valor);
},
es: function(valor){
return calculoTrivial(valor);
},
pr: function(valor){
if(tamanhoNaoE(valor, 10)) {
return false;
}
var base = primeiros(valor);
var restoPrimeiro = mod(base, serie(2, 7));
var primeiro = 11 - restoPrimeiro >= 10 ? 0 : 11 - restoPrimeiro;
var restoSegundo = mod(base + primeiro, serie(2, 7));
var segundo = 11 - restoSegundo >= 10 ? 0 : 11 - restoSegundo;
return valor === base + primeiro + segundo;
},
pa: function(valor){
if(tamanhoNaoE(valor)) {
return false;
}
if(naoComecaCom(valor, '15')) {
return false;
}
return calculoTrivial(valor);
},
ce: function(valor){
if(tamanhoNaoE(valor)) {
return false;
}
if(naoComecaCom(valor, '06')) {
return false;
}
return calculoTrivial(valor);
},
pe: function(valor){
var base = valor.substring(0, valor.length - 2);
var restoPrimeiro = mod(base);
var primeiro = 11 - restoPrimeiro >= 10 ? 0 : 11 - restoPrimeiro;
var restoSegundo = mod(base + primeiro);
var segundo = 11 - restoSegundo >= 10 ? 0 : 11 - restoSegundo;
return valor === base + primeiro + segundo;
},
ma: function(valor){
if(tamanhoNaoE(valor)) {
return false;
}
if(naoComecaCom(valor, '12')) {
return false;
}
return calculoTrivial(valor);
},
ac: function(valor){
if(tamanhoNaoE(valor, 13)) {
return false;
}
if(naoComecaCom(valor, '01')) {
return false;
}
var base = primeiros(valor, 11);
var primeiroDigito = substracaoPor11SeMaiorQue2CasoContrario0(mod(base));
var segundoDigito = substracaoPor11SeMaiorQue2CasoContrario0(mod(base + primeiroDigito));
return valor === base + primeiroDigito + segundoDigito;
},
rs: function(valor){
if(tamanhoNaoE(valor, 10)) {
return false;
}
var base = primeiros(valor, 9);
return calculoTrivial(valor, base, true);
},
mt: function(valor){
if(tamanhoNaoE(valor, 11) && tamanhoNaoE(valor)) {
return false;
}
var base = tamanhoE(valor, 11) ? valor.substring(0, 10) : primeiros(valor);
return calculoTrivial(valor, base);
},
sp: function(valor){
valor = valor.toUpperCase();
var segundaBase;
if(valor.substr(0, 1) === 'P') {
if(tamanhoNaoE(valor, 13)) {
return false;
}
var base = valor.substring(1, 9);
segundaBase = valor.substring(10, 13);
var resto = mod(base, [10, 8, 7, 6, 5, 4, 3, 1]).toString();
var digito = resto.length > 1 ? resto[1] : resto[0];
return valor === 'P' + base + digito + segundaBase;
} else {
if(tamanhoNaoE(valor, 12)) {
return false;
}
var primeiraBase = primeiros(valor);
segundaBase = valor.substring(9, 11);
var primeiroResto = mod(primeiraBase, [10, 8, 7, 6, 5, 4, 3, 1]).toString();
var primeiro = primeiroResto.length > 1 ? primeiroResto[1] : primeiroResto[0];
var segundoResto = mod(primeiraBase + primeiro + segundaBase, serie(2, 10)).toString();
var segundo = segundoResto.length > 1 ? segundoResto[1] : segundoResto[0];
return valor === primeiraBase + primeiro + segundaBase + segundo;
}
},
mg: function(valor){
if(tamanhoNaoE(valor, 13)) {
return false;
}
var base = primeiros(valor, 11);
var baseComZero = valor.substring(0, 3) + '0' + valor.substring(3, 11);
var i = 0;
var produtorioLiteral = baseComZero.split('').reduceRight(function(anterior, atual) {
if(i > [2, 1].length - 1) {
i = 0;
}
return ([2, 1][i++] * parseInt(atual, 10)).toString() + anterior.toString();
}, '').split('').reduce(function(anterior, atual){
return anterior + parseInt(atual);
}, 0);
var primeiro = ((parseInt(produtorioLiteral / 10) + 1) * 10) - produtorioLiteral;
if(primeiro === 10) {
primeiro = 0;
}
var segundo = substracaoPor11SeMaiorQue2CasoContrario0(mod(base + primeiro, serie(2, 11)));
return valor === base + primeiro + segundo;
},
to: function(valor){
if(tamanhoNaoE(valor) && tamanhoNaoE(valor, 11)) {
return false;
}
var base;
if(tamanhoE(valor, 11)){
if(['01', '02', '03', '99'].indexOf(valor.substring(2, 4)) === -1) {
return false;
}
base = valor.substring(0, 2) + valor.substring(4, 10);
} else {
base = primeiros(valor);
}
var digito = substracaoPor11SeMaiorQue2CasoContrario0(mod(base));
return valor === valor.substring(0, valor.length - 1) + digito;
},
go: function(valor){
if(tamanhoNaoE(valor)) {
return false;
}
if(['10', '11', '15'].indexOf(valor.substring(0, 2)) === -1) {
return false;
}
var base = primeiros(valor);
if(base === '11094402') {
return valor.substr(8) === '1' || valor.substr(8) === '0';
}
var resto = mod(base);
var digito;
if(resto === 0) {
digito = 0;
} else if(resto === 1) {
if(entre(base, 10103105, 10119997)) {
digito = 1;
} else {
digito = 0;
}
} else {
digito = 11 - resto;
}
return valor === base + digito;
},
ms: function(valor){
if(naoComecaCom(valor, '28')) {
return false;
}
return calculoTrivial(valor);
},
df: function(valor){
if(tamanhoNaoE(valor, 13)) {
return false;
}
var base = primeiros(valor, 11);
var primeiro = substracaoPor11SeMaiorQue2CasoContrario0(mod(base));
var segundo = substracaoPor11SeMaiorQue2CasoContrario0(mod(base + primeiro));
return valor === base + primeiro + segundo;
}
};
function lookup(ie){
var resultado = [];
for (var estado in funcoes) {
if(funcoes[estado](ie)) {
resultado.push(estado);
}
}
if(tamanhoE(resultado, 0)) {
return false;
} else {
return resultado;
}
}
var codigosIBGE = {
11: 'RO',
13: 'AM',
12: 'AC',
14: 'RR',
15: 'PA',
16: 'AP',
17: 'TO',
21: 'MA',
22: 'PI',
23: 'CE',
24: 'RN',
25: 'PB',
26: 'PE',
27: 'AL',
28: 'SE',
29: 'BA',
31: 'MG',
32: 'ES',
33: 'RJ',
35: 'SP',
41: 'PR',
42: 'SC',
43: 'RS',
50: 'MS',
51: 'MT',
52: 'GO',
53: 'DF',
};
function validar(ie, estado){
if(estado && !isNaN(estado)) {
if(!Object.keys(codigosIBGE).includes(String(estado))){
throw new Error('código não é valido');
}
estado = codigosIBGE[estado];
}
if(eIndefinido(estado) || estado === null){
estado = '';
}
estado = estado.toLowerCase();
if(estado !== '' && !(estado in funcoes)) {
throw new Error('estado não é válido');
}
if(eIndefinido(ie)) {
throw new Error('ie deve ser fornecida');
}
if(Array.isArray(ie)) {
return ie.map(function(ie){ return validar(ie, estado); });
}
if(typeof ie !== 'string') {
throw new Error('ie deve ser string ou array de strings');
}
if(ie.match(/^ISENTO$/i)) {
return true;
}
ie = ie.replace(/[\.|\-|\/|\s]/g, '');
if(estado === '') {
return lookup(ie);
}
if(/^\d+$/.test(ie) || estado === 'sp') {
return funcoes[estado](ie);
}
return false;
}
if(typeof exports !== 'undefined' && typeof module !== 'undefined' && module.exports) {
module.exports = validar;
} else {
if(typeof define !== 'undefined') {
define([], function() {
return validar;
});
} else {
window.inscricaoEstadual = validar;
}
}