doc-br-validator
Version:
Validador e gerador de documentos brasileiros (CPF, CNPJ...)
119 lines (94 loc) • 3.05 kB
text/typescript
import axios from "axios";
// Validação matemática (sua implementação com pequenos ajustes)
function validarCNPJMatematico(cnpj: string): boolean {
cnpj = cnpj.replace(/\D/g, "");
if (cnpj.length !== 14 || /^(\d)\1{13}$/.test(cnpj)) {
return false;
}
// Valida primeiro dígito
let tamanho = cnpj.length - 2;
let numeros = cnpj.substring(0, tamanho);
const digitos = cnpj.substring(tamanho);
let soma = 0;
let pos = tamanho - 7;
for (let i = tamanho; i >= 1; i--) {
soma += parseInt(numeros.charAt(tamanho - i)) * pos--;
if (pos < 2) pos = 9;
}
let resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11);
if (resultado !== parseInt(digitos.charAt(0))) {
return false;
}
// Valida segundo dígito
tamanho += 1;
numeros = cnpj.substring(0, tamanho);
soma = 0;
pos = tamanho - 7;
for (let i = tamanho; i >= 1; i--) {
soma += parseInt(numeros.charAt(tamanho - i)) * pos--;
if (pos < 2) pos = 9;
}
resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11);
if (resultado !== parseInt(digitos.charAt(1))) {
return false;
}
return true;
}
// Função para consultar a API ReceitaWS
async function consultarCNPJReceitaWS(cnpj: string): Promise<boolean> {
try {
const cnpjLimpo = cnpj.replace(/\D/g, "");
const response = await axios.get(
`https://www.receitaws.com.br/v1/cnpj/${cnpjLimpo}`,
{
timeout: 5000, // timeout de 5 segundos
}
);
console.log(response.data)
return response.data.situacao === "ATIVA";
} catch (error) {
console.error("Erro na consulta externa:", error);
return false;
}
}
// Validador completo com fallback
export async function validarCNPJ(cnpj: string): Promise<boolean> {
const validoMatematicamente = validarCNPJMatematico(cnpj);
if (validoMatematicamente) {
return true;
}
return await consultarCNPJReceitaWS(cnpj);
}
// Suas funções existentes (com pequena melhoria no gerador)
export function formatarCNPJ(cnpj: string): string {
cnpj = cnpj.replace(/\D/g, "");
return cnpj.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/, "$1.$2.$3/$4-$5");
}
export function gerarCNPJ(): string {
let cnpj = "";
// Gera 8 dígitos aleatórios
for (let i = 0; i < 8; i++) {
cnpj += Math.floor(Math.random() * 10);
}
// Adiciona sequência padrão (0001 para matriz)
cnpj += "0001";
// Cálculo do primeiro dígito verificador
let soma = 0;
let peso = 5;
for (let i = 0; i < 12; i++) {
soma += parseInt(cnpj.charAt(i)) * peso;
peso = peso === 2 ? 9 : peso - 1;
}
const digito1 = soma % 11 < 2 ? 0 : 11 - (soma % 11);
cnpj += digito1;
// Cálculo do segundo dígito verificador
soma = 0;
peso = 6;
for (let i = 0; i < 13; i++) {
soma += parseInt(cnpj.charAt(i)) * peso;
peso = peso === 2 ? 9 : peso - 1;
}
const digito2 = soma % 11 < 2 ? 0 : 11 - (soma % 11);
cnpj += digito2;
return cnpj;
}