UNPKG

doc-br-validator

Version:

Validador e gerador de documentos brasileiros (CPF, CNPJ...)

119 lines (94 loc) 3.05 kB
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; }