UNPKG

n8n-nodes-br-data-utils

Version:

Valida e higieniza dados brasileiros (CPF, CNPJ, telefone, CEP e mais) em workflows do n8n.

83 lines (82 loc) 3.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateCnpj = validateCnpj; exports.formatCnpj = formatCnpj; /** * Remove apenas os caracteres de formatação esperados para CNPJ (pontos, barra e hífen) * e valida se o formato básico está correto */ function sanitizeCnpj(value) { // Remove espaços no início e fim const trimmed = value.trim(); // Aceita apenas números, pontos, barra e hífen if (!/^[\d./-]+$/.test(trimmed)) { return { cleaned: '', isValidFormat: false }; } // Remove apenas pontos, barra e hífen const cleaned = trimmed.replace(/[./-]/g, ''); // Verifica se restaram apenas números if (!/^\d+$/.test(cleaned)) { return { cleaned: '', isValidFormat: false }; } return { cleaned, isValidFormat: true }; } /** * Valida um CNPJ brasileiro */ function validateCnpj(cnpj, options = {}) { try { const { cleaned: cleanCnpj, isValidFormat } = sanitizeCnpj(cnpj); if (!isValidFormat) { return { isValid: false, error: 'CNPJ contém caracteres inválidos' }; } // Verifica se tem 14 dígitos if (cleanCnpj.length !== 14) { return { isValid: false, error: 'CNPJ deve ter 14 dígitos' }; } // Verifica se todos os dígitos são iguais if (/^(\d)\1+$/.test(cleanCnpj)) { return { isValid: false, error: 'CNPJ não pode ter todos os dígitos iguais' }; } // Validação do primeiro dígito verificador const weights1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; let sum = 0; for (let i = 0; i < 12; i++) { sum += parseInt(cleanCnpj.charAt(i)) * weights1[i]; } let remainder = sum % 11; const firstDigit = remainder < 2 ? 0 : 11 - remainder; if (firstDigit !== parseInt(cleanCnpj.charAt(12))) { return { isValid: false, error: 'CNPJ inválido - primeiro dígito verificador' }; } // Validação do segundo dígito verificador const weights2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; sum = 0; for (let i = 0; i < 13; i++) { sum += parseInt(cleanCnpj.charAt(i)) * weights2[i]; } remainder = sum % 11; const secondDigit = remainder < 2 ? 0 : 11 - remainder; if (secondDigit !== parseInt(cleanCnpj.charAt(13))) { return { isValid: false, error: 'CNPJ inválido - segundo dígito verificador' }; } return { isValid: true, unmasked: cleanCnpj, masked: formatCnpj(cleanCnpj), }; } catch (error) { return { isValid: false, error: 'Erro ao validar CNPJ' }; } } /** * Formata um CNPJ no padrão XX.XXX.XXX/XXXX-XX */ function formatCnpj(cnpj) { const { cleaned: cleanCnpj, isValidFormat } = sanitizeCnpj(cnpj); if (!isValidFormat || cleanCnpj.length !== 14) { return cnpj; } return cleanCnpj.replace(/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/, '$1.$2.$3/$4-$5'); }